handlers.rc - swerc - anselm's simpler werc fork
 (HTM) git clone git://git.suckless.org/swerc
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
       handlers.rc (3462B)
       ---
            1 # Werc builtin handlers
            2 
            3 fn nav_tree {
            4     echo '<ul>'
            5     if(! ~ $#menuTitle 0) {
            6         if(~ $"req_paths_list /)
            7             echo '<li><a href="/" class="thisPage">'$"menuTitle'</a></li>'
            8         if not
            9             echo '<li><a href="/">'$"menuTitle'</a></li>'
           10     }
           11     # Ignore stderr, last path element might be a file that doesn't exist (eg., foo for foo.md)
           12     # /./ to deal with p9p's ls failure to follow dir symlinks otherwise
           13     ls -F $sitedir/./$req_paths_list >[2]/dev/null \
           14         | { 
           15             sed $dirfilter'/\/[^_.\/][^\/]*(\.(md|1)|\/)$/!d; s!^'$sitedir'!!; '$dirclean 
           16             if(! ~ $#synth_paths 0) echo $synth_paths | tr ' ' $NEW_LINE 
           17         } | sort -u | awk -F/ ' 
           18     function p(x, y, s) { for(i=0; i < x-y; i+=1) print s }
           19     BEGIN { lNF=2; }
           20     { 
           21         d = ""
           22         if(match($0, "/$"))
           23             d = "/"
           24         sub("/$", "") # Strip trailing / for dirs so NF is consistent 
           25 
           26         p(NF, lNF, "<li><ul>")
           27         p(lNF, NF, "</ul></li>")
           28         lNF = NF
           29 
           30         bname = $NF d
           31         path = $0 d
           32         gsub(/[\-_]/, " ", bname)
           33 
           34         # To avoid false matches add trailing / even for plain files to act as delimiter
           35         pa = path
           36         gsub(/[^\/]$/, "&/", pa) 
           37 
           38         if(index(ENVIRON["req_path"] "/", pa) == 1)
           39             print "<li><a href=\"" path "\" class=\"thisPage\"> " bname "</a></li>"
           40         else 
           41             print "<li><a href=\"" path "\">" bname "</a></li>"
           42     }
           43     END { p(lNF, 2, "</ul></li>"); }'
           44     echo '</ul>'
           45 }
           46 
           47 fn md_handler { $formatter $1 }
           48 
           49 fn tpl_handler { template $* }
           50 
           51 fn man_handler {
           52     echo '<pre>'
           53     $man_formatter $1
           54     echo '</pre>'
           55 }
           56 
           57 fn dir_listing_handler {
           58     d=`{basename -d $1}
           59     if(~ $#d 0)
           60         d='/'
           61     echo $d|sed 's,.*//,,g; s,/$,,; s,/, / ,g; s/[\-_]/ /g; s,.*,<h1 class="dir-list-head">&</h1> <ul class="dir-list">,'
           62     # Symlinks suck: '/.' forces ls to list the linked dir if $d is a symlink.
           63     ls -F $dir_listing_ls_opts $sitedir$d/. | sed $dirfilter$dirclean | awk '{match($0, "/[^/]*/?$"); l=substr($0, RSTART+1, RLENGTH-1);n=l; gsub(/[\-_]/, " ", n); print "<li><a href=\""l"\">"n"</a></li>"; }' | uniq
           64     echo '</ul>'
           65 }
           66 
           67 fn setup_handlers {
           68     if(test -f $local_path.md) {
           69         local_file=$local_path.md
           70         handler_body_main=(md_handler $local_file)
           71     }
           72     if not if(test -f $local_path.1) {
           73         local_file=$local_path.1
           74         handler_body_main=(man_handler $local_file)
           75     }
           76     if not if(test -f $local_path.tpl) {
           77         local_file=$local_path.tpl
           78         handler_body_main=(tpl_handler $local_file)
           79     }
           80     if not if(test -f tpl^$req_path^.tpl)
           81         handler_body_main=(tpl_handler tpl^$req_path^.tpl)
           82     if(! ~ $#handler_body_main 0)
           83         { } # We are done
           84     # Dir listing
           85     if not if(~ $local_path */index)
           86         handler_body_main=(dir_listing_handler $req_path)
           87     # Fallback static file handler
           88     if not if(test -f $local_path)
           89         static_file $local_path
           90     if not if(~ $req_path /pub/* && test -f .$req_path)
           91         static_file .$req_path
           92     # File not found
           93     if not
           94         setup_404_handler
           95 }
           96 
           97 # This function allows config files to define their own 404 handlers.
           98 fn setup_404_handler {
           99     handler_body_main=(tpl_handler `{get_tpl_file 404.tpl})
          100     echo 'Status: 404 Not Found'
          101     dprint 'NOT FOUND: '$SERVER_NAME^$"REQUEST_URI^' - '^$"HTTP_REFERER^' - '^$"HTTP_USER_AGENT
          102 }
          103 
          104 fn run_handlers { for(h in $*) run_handler $$h }
          105 fn run_handler { $*(1) $*(2-) }
          106