#!/usr/local/plan9/bin/rc
. ./cgilib.rc
cd ..
forbidden_uri_chars='[^a-zA-Z0-9_+\-\/\.]'
response_format=html
fn get_lib_file {
    if(test -f $sitedir/_werc/lib/$1)
    	echo -n $sitedir/_werc/lib/$1
    if not if(! ~ $#masterSite 0 && test -f $sitesdir/$masterSite/_werc/lib/$1)
    	echo -n $sitesdir/$masterSite/_werc/lib/$1
    if not if(test -f lib/$1)
    	echo -n lib/$1
}
# Title
fn gentitle {
    echo '
'
}
# Don't change var name or trailing ';', dirfilter might be changed from _werc/config!
# TODO: Specify the canonical path input format handled by dirfilter
dirfilter='s/\*$//; s,/+\./+,/,g; /\/[._]/d; /'^$forbidden_uri_chars^'/d; /^\/(robots|sitemap)\.txt$|\/index\.(md|html|txt|tpl)$/d; /_werc\/?$/d; s,^\./,,; s,\.(md|html|txt)$,,; '
# To be used from config files
fn hide_paths {
    for(i in $*)
       dirfilter=$dirfilter^'/^'$i'$/d; '
}
# Sidebar 
fn gensidebar {
    # Ignore stderr, last path element might be a file that doesn't exist (eg., foo for foo.md)
    ls -F $sitedir^/./^$req_paths_list >[2]/dev/null | sed 's,^'$sitedir',,; '^$dirfilter | sort -u | awk -F/ ' 
    function p(x, y, s) {
        for(i=0; i < x-y; i+=1)
            print s 
    }
    # XXX Regexp to hide non-document/non-dir stuff, there must be a better way, if we really want this.
    /^\/([a-zA-Z0-9+_\-]+[*\/]?)+$/ { 
        d = ""
        if(match($0, "/$"))
            d = "/"
        sub("/$", "") # Strip trailing / for dirs so NF is consistent 
        p(NF, lNF, "")
        lNF = NF
        bname = $NF d
        path = $0 d
        gsub("_", " ", bname)
        if(index(ENVIRON["REQUEST_URI"] "/", path) == 1)
            print "» " bname "  "
        else 
            print "› " bname " '
    # XXX Insering a blank line between lines in input is good for fortunes.txt, but maybe not for other .txt files
    # XXX Words are not broken, even if they are way beyond 82 chars long
    cat $1 | sed 's/$/\n/g; s/\</g; s/>/\>/g' | fmt -l 82 -j
    echo ' '
}
fn dir_listing_handler {
    d=`{basename -d $1}
    echo $d|sed 's,.*//,,g; s,/$,,; s,/, / ,g; s,.*,&  ,'
    # Symlinks suck: '/.' forces ls to list the linked dir if $d is a symlink.
    ls -F $d/. | sed $dirfilter' s,.*/([^/]+/?)$,\1  '
}
fn blog_dir_handler {
    blogDirs=$*
    tpl_handler lib/feeds/html.tpl
}
fn blog_post_handler {
    gen_blog_post_title $1 | $formatter
    $formatter < $1
}
fn select_handler {
    if(test -f $body.md) {
        if(! ~ $#inBlog 0)
            set_handler blog_post_handler $body.md
        if not
            set_handler md_handler $body.md
        if(! ~ $#allowComments 0 && ~ $REQUEST_METHOD POST) {
            get_post_args comment_text
            d=`{date -n} # FIXME Obvious race
            d=$body.md_werc/comments/$d/
            u=$logged_user
            if(~ $#logged_user 0) {
                get_post_args comment_user_name comment_user_password
                # TODO Should take this path too if the user can login but doesn't
                # belong to required group
                if(! login_user $comment_user_name $comment_user_password) {
                    u=$comment_user_name ':' $comment_user_password
                    d=$d^'_pending'
                }
                if not
                    u = $logged_user
            }
            umask 002
            mkdir -m 775 -p $d
            echo $u > $d/user
            echo $comment_text > $d/body
        }
    }
    if not if(test -f $body.tpl)
        set_handler tpl_handler $body.tpl
    if not if(test -f $body.html)
        set_handler html_handler $body.html
    # Explicit .html urls, unfortunately usually the web server will handle this as static files
    if not if(~ $body *.html && test -f $body)
        perm_redirect `{ echo $REQUEST_URI|sed 's/.html$//' }
    # Rss feeds. TODO: we should check that the request is for a real blog dir
    if not if(~ $REQUEST_URI */index.rss */index.atom) {
        response_format=raw
        uri=`{echo $uri | sed 's/index.(rss|atom)$//'}
        if(~ $#blogDirs 0)
            blogDirs=$sitedir^'/'$uri
        uri=$base_url$"uri
        if(~ $REQUEST_URI */index.rss)
            master_template=feeds/rss20.tpl
        if not if(~ $REQUEST_URI */index.atom)
            master_template=feeds/atom.tpl
    }
    # Blog handler
    if not if(~ $body */[bB]log/index */[bB]log//index || ! ~ $#blogDirs 0) {
        if(~ $#blogDirs 0)
            blogDirs=`{basename -d $body}
        u=`{cleanname $base_url^`{basename -d '/'^$uri}|sed 's,:/,://,'} # Sed recovers '/' in 'http:/' stripped by cleanname
        extraHeaders=$"extraHeaders ^ \
    	'