thirdculture/werc/bin/corehandlers.rc
2024-07-18 14:09:32 -04:00

157 lines
5.4 KiB
Text
Executable file
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Werc builtin handlers
fn nav_tree {
if(! ~ $#sideBarNavTitle 0)
echo '<p class="sideBarTitle">'$"sideBarNavTitle':</p>'
# 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 $dirfilter'/\/[^_.\/][^\/]*(\.(md|txt|html)|\/)$/!d; s!^'$sitedir'!!; '$dirclean
if(! ~ $#synth_paths 0) echo $synth_paths | tr ' ' $NEW_LINE
} | sort -u | awk -F/ '
function p(x, y, s) { for(i=0; i < x-y; i+=1) print s }
BEGIN { lNF=2; print "<ul><li><a href='/'> <span class='dt'>home</span></a></li>" }
{
d = ""
if(match($0, "/$"))
d = "/"
sub("/$", "") # Strip trailing / for dirs so NF is consistent
p(NF, lNF, "<li><ul>")
p(lNF, NF, "</ul></li>")
lNF = NF
bname = $NF d
path = $0 d
gsub(/[\-_]/, " ", bname)
# To avoid false matches add trailing / even for plain files to act as delimiter
pa = path
gsub(/[^\/]$/, "&/", pa)
if(index(ENVIRON["req_path"] "/", pa) == 1)
print "<li><a href=\"" path "\" class=\"thisPage\">&raquo; <i><span class='dt'>" bname "</span></i></a></li>"
else
print "<li><a href=\"" path "\">&rsaquo; <span class='dt'>" bname "</span></a></li>"
}
END { p(lNF, 2, "</ul></li>"); print "</ul>" }'
}
fn link_bar {
if(~ $1 -t) {
echo '<p class="sideBarTitle">'$2'</p>'
shift; shift
}
echo '<ul>'
while(! ~ $#* 0) {
echo '<li><a href="'$2'">- '$1'</a></li>'
shift; shift
}
echo '</ul>'
}
fn md_handler { $formatter $1 }
fn tpl_handler { template $* }
fn html_handler {
# body states: 0 = no <body> found, 2 = after <body>, 1 = after <body></body>, -1 = after </body>
awk 'gsub(".*<[Bb][Oo][Dd][Yy][^>]*>", "") > 0 {body=2}
gsub("</ *[Bb][Oo][Dd][Yy][^>]*>.*", "") > 0 {print; body=body-1}
body==2 {print}
body==0 {buf=buf "\n" $0}
END {if(body<=0) {print buf}}' < $1
}
fn txt_handler {
# Note: Words are not broken, even if they are way beyond 82 chars long
echo '<pre>'
sed 's/</\&lt;/g; s/>/\&gt;/g' < $1 | fmt -l 82 -j
echo '</pre>'
}
fn dir_listing_handler {
d=`{basename -d $1}
if(~ $#d 0)
d='/'
echo $d|sed 's,.*//,,g; s,/$,,; s,/, / ,g; s,.*,<h1 class="dir-list-head">&</h1> <ul class="dir-list">,'
# Symlinks suck: '/.' forces ls to list the linked dir if $d is a symlink.
ls -F $dir_listing_ls_opts $sitedir$d/. | sed $dirfilter$dirclean' s,.*/([^/]+/?)$,<li><a href="\1">\1</a></li>,'
echo '</ul>'
}
fn notices_handler {
for(type in notify_errors notify_notes notify_success)
for(n in $$type)
echo '<div class="'$type'"><b>'$"n'</b></div>'
}
fn setup_handlers {
if(test -f $local_path.md) {
local_file=$local_path.md
handler_body_main=(md_handler $local_file)
}
if not if(test -f $local_path.tpl) {
local_file=$local_path.tpl
handler_body_main=(tpl_handler $local_file)
}
if not if(test -f $local_path.html) {
local_file=$local_path.html
handler_body_main=(html_handler $local_file)
}
# Global tpl (eg sitemap.tpl), should take precedence over txt handler!
if not if(test -f tpl^$req_path^.tpl)
# XXX Should we set $local_file for global .tpls?
handler_body_main=(tpl_handler tpl^$req_path^.tpl)
if not if(test -f $local_path.txt) {
local_file=$local_path.txt
handler_body_main=(txt_handler $local_file)
}
# XXX Should check that $enabled_apps exist in $werc_apps?
# XXX Should split init of apps that provide main handler (eg., blog) and apps that don't (eg., comments)?
if(! ~ $#enabled_apps 0)
for(a in $enabled_apps)
$a^'_init'
if(! ~ $#handler_body_main 0) {
# WE ARE NOT DONE I WANT MY HEADERS
if(test -f $sitedir$req_path'_header.md')
ll_add handlers_body_head md_handler $sitedir$req_path'_header.md'
if(test -f $sitedir$req_path'_footer.md')
ll_add handlers_body_foot md_handler $sitedir$req_path'_footer.md'
} # We are done
# Dir listing
if not if(~ $local_path */index) {
handler_body_main=(dir_listing_handler $req_path)
if(test -f $sitedir$req_path'_header.md')
ll_add handlers_body_head md_handler $sitedir$req_path'_header.md'
if(test -f $sitedir$req_path'_footer.md')
ll_add handlers_body_foot md_handler $sitedir$req_path'_footer.md'
}
# Canonize explicit .html urls, the web server might handle this first!
if not if(~ $local_path *.html && test -f $local_path)
perm_redirect `{ echo $req_path|sed 's/.html$//' }
# Fallback static file handler
if not if(test -f $local_path)
static_file $local_path
if not if(~ $req_path /pub/* && test -f .$req_path)
static_file .$req_path
# File not found
if not
setup_404_handler
}
# This function allows config files to define their own 404 handlers.
fn setup_404_handler {
handler_body_main=(tpl_handler `{get_lib_file 404.tpl})
echo 'Status: 404 Not Found'
dprint 'NOT FOUND: '$SERVER_NAME^$"REQUEST_URI^' - '^$"HTTP_REFERER^' - '^$"HTTP_USER_AGENT
}
fn run_handlers { for(h in $*) run_handler $$h }
fn run_handler { $*(1) $*(2-) }