153 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
		
			Executable File
		
	
	
	
	
| # 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>" }
 | |
|     { 
 | |
|         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\">»<i> " bname "</i></a></li>"
 | |
|         else 
 | |
|             print "<li><a href=\"" path "\">› " bname "</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/</\</g; s/>/\>/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 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-) }
 | |
| 
 | |
| 
 |