diff --git a/bin/werc.rc b/bin/werc.rc index 44fb523..c74f24d 100755 --- a/bin/werc.rc +++ b/bin/werc.rc @@ -6,23 +6,30 @@ forbidden_uri_chars='[^a-zA-Z0-9_+\-\/\.]' # Expected input: ls -F style, $sitedir/path/to/files/ # -dirfilter='s/\*$//; s,/+\./+,/,g; s,^\./,,; /\/[._][^\/]/d; /'^$forbidden_uri_chars^'/d; /^\/(robots|sitemap)\.txt$|\/index\.(md|html|txt|tpl)$/d; /_werc\/?$/d; ' +dirfilter='s/\*$//; s,/+\./+,/,g; s,^\./,,; /\/[._][^\/]/d; /'$forbidden_uri_chars'/d; /^\/(robots|sitemap)\.txt$|\/index\.(md|html|txt|tpl)$/d; /_werc\/?$/d; ' dirclean=' s/\.(md|html|txt)$//; ' # To be used from config files -fn hide_paths { +fn conf_perm_redirect { + if(~ $#* 1) + perm_redirect $1 + if not + perm_redir_patterns=($perm_redir_patterns $1 $2) +} + +fn conf_hide_paths { for(i in $*) dirfilter=$dirfilter^'/^'$i'$/d; ' } -# Sidebar +# Standard handlers fn nav_tree { if(! ~ $#sideBarNavTitle 0) echo '

'$"sideBarNavTitle':

' # Ignore stderr, last path element might be a file that doesn't exist (eg., foo for foo.md) # /./ to deal with p9p's ls failure to follow dir symlinks otherwise ls -F $sitedir/./$req_paths_list >[2]/dev/null \ - | sed 's!^'$sitedir'!!; '^$dirfilter^'/\/[^_.\/][^\/]*(\.(md|txt|html)|\/)$/!d; '^$dirclean \ + | sed 's!^'$sitedir'!!; '$dirfilter'/\/[^_.\/][^\/]*(\.(md|txt|html)|\/)$/!d; '$dirclean \ | sort -u | awk -F/ ' function p(x, y, s) { for(i=0; i < x-y; i+=1) print s } { @@ -48,7 +55,6 @@ fn nav_tree { } -# Handlers fn md_handler { $formatter < $1 } fn tpl_handler { template $* } @@ -77,6 +83,12 @@ fn dir_listing_handler { echo '' } +fn notices_handler { + for(type in notify_errors notify_notes notify_success) + for(n in $$type) + echo '
'$"n'
' +} + fn setup_handlers { if(test -f $local_path.md) @@ -133,13 +145,6 @@ sitesdir=sites for(i in siteTitle siteSubTitle pageTitle extraHeaders) $i = '' -# TODO: Per-req variables should move after initrc loading. -site=$SERVER_NAME -base_url=http://$site/ -sitedir=$sitesdir/$site -master_template=`{get_lib_file default_master.tpl} -current_date_time=`{date} - . ./etc/initrc if(test -f etc/initrc.local) @@ -148,71 +153,83 @@ if(test -f etc/initrc.local) for(a in $werc_apps) . ./$a/app.rc -# Parse request URL -# NOTE: $REQUEST_URI is not officially in CGI 1.1, but seems to be de-facto -req_path=`{echo -n $REQUEST_URI | sed 's/\?.*//; s/'^$forbidden_uri_chars^'//g; s/\.\.*/./g; 1q'} -local_path=$sitedir$req_path -ifs='/' { args=`{echo -n $req_path} } +fn werc_exec_request { + site=$SERVER_NAME + base_url=http://$site + sitedir=$sitesdir/$site + master_template=`{get_lib_file default_master.tpl} + current_date_time=`{date} -# Hack: preload post data so we can access it from templates where cgi's stdin is not accesible -if(~ $REQUEST_METHOD POST) { - load_post_args - login_user -} + # Note: $REQUEST_URI is not officially in CGI 1.1, but seems to be de-facto + req_path=`{echo -n $REQUEST_URI | sed 's/\?.*//; s!//+!/!g; s/'^$forbidden_uri_chars^'//g; s/\.\.*/./g; 1q'} + local_path=$sitedir$req_path + ifs='/' { args=`{echo -n $req_path} } -if(! ~ $#args 0) - pageTitle=`{ echo $args|sed -e 's/ / - /g' -e 's/_/ /g' } - -if(~ $req_path */index) - perm_redirect `{echo $req_path | sed 's,/index$,/,'} - -if(~ $local_path */) { - if(test -d $local_path) - local_path=$local_path^'index' - if not # XXX: This redir might step on apps with synthetic dirs. - perm_redirect `{echo $req_path|sed 's,/+$,,'} -} -if not if(test -d $local_path) - perm_redirect $req_path^'/' - -cd $sitedir -req_paths_list='/' # Note: req_paths_list doesn't include 'stnythetic' dirs. -conf_wd='/' # Used in config files to know where we are in the document tree. -if(test -f _werc/config) - . _werc/config -for(i in $args) { - conf_wd=$conf_wd^$i - req_paths_list=($req_paths_list $conf_wd) - if(test -d $i) { - conf_wd=$conf_wd^'/' - cd $i - if(test -f _werc/config) - . _werc/config + # Preload post args for templates where cgi's stdin is not accessible + if(~ $REQUEST_METHOD POST) { + load_post_args + login_user } -} -cd $werc_root -# Redirections and other preprocessing -if(~ $#redirectPermanent 1) { - perm_redirect $"redirectPermanent -} -if not if(~ $#redirectPermanent 2) { - from='http://'^$SERVER_NAME^$req_path - to=`{echo $from|sed 's@'^$redirectPermanent(1)^'@'^$redirectPermanent(2)^'@'} - if(! ~ $to $from) - perm_redirect $to + if(~ $req_path */index) + perm_redirect `{echo $req_path | sed 's,/index$,/,'} + + if(~ $local_path */) { + if(test -d $local_path) + local_path=$local_path^'index' + if not # XXX: This redir might step on apps with synthetic dirs. + perm_redirect `{echo $req_path|sed 's,/+$,,'} + } + if not if(test -d $local_path) + perm_redirect $base_url^$req_path^'/' + + if(! ~ $#args 0) + pageTitle=`{ echo $args|sed -e 's/ / - /g' -e 's/_/ /g' } + + cd $sitedir + req_paths_list='/' # Note: req_paths_list doesn't include 'stnythetic' dirs. + conf_wd='/' # Used in config files to know where we are in the document tree. + if(test -f _werc/config) + . _werc/config + for(i in $args) { + conf_wd=$conf_wd^$i + req_paths_list=($req_paths_list $conf_wd) + if(test -d $i) { + conf_wd=$conf_wd'/' + cd $i + if(test -f _werc/config) + . _werc/config + } + } + cd $werc_root + + f=();t=() + for(i in $perm_redir_patterns) { + if(~ $#f 0) + f=$i + if not { + t=$i + from=$base_url^$req_path + to=`{ echo $from | sed 's!'$f'!'$t'!' } + if(! ~ $to $from) + perm_redirect $to + f=() + } + } + + # Set Page title + if(~ $pageTitle '') + pageTitle=$siteTitle' '$siteSubTitle + if not + pageTitle=$"pageTitle' | '$"siteTitle' '$"siteSubTitle + + setup_handlers + + if(! ~ $#debug 0) + dprint $"SERVER_NAME^$"REQUEST_URI - $"HTTP_USER_AGENT - $"REQUEST_METHOD - $"handler_body_main - $"master_template + + template $headers $master_template | awk_buffer + echo $res_tail } -# Set Page title -if(~ $pageTitle '') - pageTitle=$siteTitle^' '^$siteSubTitle -if not - pageTitle=$"pageTitle^' | '^$"siteTitle^' '^$"siteSubTitle - -setup_handlers - -if(! ~ $#debug 0) - dprint ' '$"SERVER_NAME^$"REQUEST_URI' - '$"HTTP_USER_AGENT' - '$"REQUEST_METHOD' - '$"handler_body_main - $"master_template - -template $headers $master_template | awk_buffer -echo $res_tail +werc_exec_request