handlers.rc - swerc - anselm's simpler werc fork | |
git clone git://git.suckless.org/swerc | |
Log | |
Files | |
Refs | |
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 exis… | |
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!^'$sited… | |
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 … | |
35 pa = path | |
36 gsub(/[^\/]$/, "&/", pa) | |
37 | |
38 if(index(ENVIRON["req_path"] "/", pa) == 1) | |
39 print "<li><a href=\"" path "\" class=\"thisPage\"> " bname … | |
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 cla… | |
62 # Symlinks suck: '/.' forces ls to list the linked dir if $d is a sy… | |
63 ls -F $dir_listing_ls_opts $sitedir$d/. | sed $dirfilter$dirclean | … | |
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^… | |
102 } | |
103 | |
104 fn run_handlers { for(h in $*) run_handler $$h } | |
105 fn run_handler { $*(1) $*(2-) } | |
106 |