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