Big reorganization of blog and rss code, now much better integrated with the rest of the handler system, plus fixed a few bugs along the way.
This will make it easier to add things like .atom feeds and comments later.
This commit is contained in:
		
							parent
							
								
									692f272645
								
							
						
					
					
						commit
						ff35f9ebf6
					
				
					 2 changed files with 80 additions and 63 deletions
				
			
		|  | @ -2,6 +2,9 @@ | ||||||
| cd .. | cd .. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | forbidden_uri_chars='[^a-zA-Z0-9_+\-\/\.]' | ||||||
|  | response_format=html | ||||||
|  | 
 | ||||||
| # Useful functions | # Useful functions | ||||||
| fn dprint { | fn dprint { | ||||||
|     echo $* >[1=2] |     echo $* >[1=2] | ||||||
|  | @ -52,7 +55,7 @@ fn gentitle { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| # Don't change var name or trailing ';', some dirs change the filter! | # Don't change var name or trailing ';', some dirs change the filter! | ||||||
| dirfilter = '/\/[._]/d; /\/robots.\txt$/d; /\/sitemap\.txt$/d; s,^\./,,; s,\.md$,,; s,\.html,,; s,\.txt,,; ' | dirfilter = '/\/[._]/d; /'^$forbidden_uri_chars^'/d; /\/robots.\txt$/d; /\/sitemap\.txt$/d; s,^\./,,; s,\.md$,,; s,\.html,,; s,\.txt,,; ' | ||||||
| 
 | 
 | ||||||
| # To be used from config files | # To be used from config files | ||||||
| fn hide_paths { | fn hide_paths { | ||||||
|  | @ -197,7 +200,7 @@ fn debug_handler { | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| fn select_handler { | fn select_handler { | ||||||
| dprint $body | 
 | ||||||
|     if (test -f $body.md) { |     if (test -f $body.md) { | ||||||
|         if (! ~ $#inBlog 0) |         if (! ~ $#inBlog 0) | ||||||
|             set_handler blog_post_handler $body.md |             set_handler blog_post_handler $body.md | ||||||
|  | @ -212,15 +215,35 @@ dprint $body | ||||||
|     if not if (test -f $body.html) |     if not if (test -f $body.html) | ||||||
|         set_handler html_handler $body.html |         set_handler html_handler $body.html | ||||||
| 
 | 
 | ||||||
|     # Handle eplicit .html urls, this should not happen (the web server will usually handle this anyway) |     # Handle explicit .html urls, this should not happen (the web server will usually handle this anyway) | ||||||
|     # XXX We probably should setup a permanent redirect to $body|sed 's/.html$//' here |     # XXX We probably should setup a permanent redirect to $body|sed 's/.html$//' here | ||||||
|     if not if (~ $body *.html && test -f $body) |     if not if (~ $body *.html && test -f $body) | ||||||
|         set_handler html_handler $body |         set_handler html_handler $body | ||||||
| 
 | 
 | ||||||
|     # This should probably be merged with the blog_dir_handler |     # Blog handler | ||||||
|     if not if (~ $body */[bB]log/index */[bB]log//index && ~ $#blogDirs 0) |     if not if (~ $body */[bB]log/index */[bB]log//index || ! ~ $#blogDirs 0) { | ||||||
|  |         if (~ $#blogDirs 0) | ||||||
|             blogDirs = `{basename -d $body} |             blogDirs = `{basename -d $body} | ||||||
| 
 | 
 | ||||||
|  |         rssuri=`{basename -d $uri} | ||||||
|  |         rssuri=$baseuri`{cleanname $"rssuri^/index.rss} | ||||||
|  |         extraHeaders=$"extraHeaders ^ \ | ||||||
|  |     	'<link rel="alternate" type="application/rss+xml" title="RSS" href="'$rssuri'" /> | ||||||
|  | ' | ||||||
|  | 
 | ||||||
|  |         set_handler blog_dir_handler $blogDirs | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     # Rss feeds. TODO: we should check that the request is for a real blog dir | ||||||
|  |     if not if (~ $REQUEST_URI */index.rss) { | ||||||
|  |         uri = `{echo $uri | sed 's/index.rss$//'} | ||||||
|  |         if(~ $blogDirs 0) | ||||||
|  |             blogDirs = $sitedir^$uri | ||||||
|  |         uri=$baseuri$"uri | ||||||
|  |         master_template=feeds/rss20.tpl | ||||||
|  |         response_format=raw | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     # Global tpl (eg sitemap.tpl) |     # Global tpl (eg sitemap.tpl) | ||||||
|     if not if (test -f lib/^$uri^.tpl) |     if not if (test -f lib/^$uri^.tpl) | ||||||
|         set_handler tpl_handler lib/^$uri^.tpl |         set_handler tpl_handler lib/^$uri^.tpl | ||||||
|  | @ -229,18 +252,16 @@ dprint $body | ||||||
|         set_handler txt_handler $body.txt |         set_handler txt_handler $body.txt | ||||||
| 
 | 
 | ||||||
|     # Dir listing |     # Dir listing | ||||||
|     if not if(~ $body */index && ~ $#blogDirs 0) |     if not if(~ $body */index) | ||||||
|         set_handler dir_listing_handler $body |         set_handler dir_listing_handler $body | ||||||
| 
 | 
 | ||||||
|     # File not found |     # File not found | ||||||
|     if not if(~ $#blogDirs 0) { |     if not { | ||||||
|         set_handler 404_handler $body |         set_handler 404_handler $body | ||||||
|         dprint 'NOT FOUND: '$SERVER_NAME^$REQUEST_URI^' - '^$"HTTP_REFERER^' - '^$"HTTP_USER_AGENT |         dprint 'NOT FOUND: '$SERVER_NAME^$REQUEST_URI^' - '^$"HTTP_REFERER^' - '^$"HTTP_USER_AGENT | ||||||
|         echo 'Status: 404 Not Found' |         echo 'Status: 404 Not Found' | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if(! ~ $#blogDirs 0) |  | ||||||
|         set_handler blog_dir_handler $blogDirs |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -268,7 +289,7 @@ if(test -f etc/initrc.local) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # Parse request URL | # Parse request URL | ||||||
| uri = `{echo -n $REQUEST_URI | sed -e 's/\?.*//; s/[^a-zA-Z0-9_+\-\/\.]//g; s/\.\.*/./g;' -e '1q'} | uri = `{echo -n $REQUEST_URI | sed -e 's/\?.*//; s/'^$forbidden_uri_chars^'//g; s/\.\.*/./g;' -e '1q'} | ||||||
| ifs='/' { | ifs='/' { | ||||||
| 	args = `{echo -n $uri} | 	args = `{echo -n $uri} | ||||||
| } | } | ||||||
|  | @ -325,18 +346,10 @@ if(~ $pageTitle '') | ||||||
| if not | if not | ||||||
| 	pageTitle=$"pageTitle^' | '^$"siteTitle^' '^$"siteSubTitle | 	pageTitle=$"pageTitle^' | '^$"siteTitle^' '^$"siteSubTitle | ||||||
| 
 | 
 | ||||||
| # Template/body selection |  | ||||||
| master_template= `{get_lib_file $master_template } |  | ||||||
| 
 |  | ||||||
| # DEPRECATED |  | ||||||
| if(~ $master_template 0) |  | ||||||
|     master_template=$sitedir/_default.tpl |  | ||||||
| 
 |  | ||||||
| 
 | 
 | ||||||
| body=$sitedir/$body | body=$sitedir/$body | ||||||
| rssuri=$uri | rssuri=$uri | ||||||
| 
 | 
 | ||||||
| 
 |  | ||||||
| if (test -d $body) { | if (test -d $body) { | ||||||
|     if(! ~ $body */) |     if(! ~ $body */) | ||||||
|     	perm_redirect $REQUEST_URI^'/' |     	perm_redirect $REQUEST_URI^'/' | ||||||
|  | @ -344,19 +357,18 @@ if (test -d $body) { | ||||||
|     rssuri=$rssuri/ |     rssuri=$rssuri/ | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| if(! ~ $#blogDirs 0 || ! ~ $#inBlog 0) { |  | ||||||
|     rssuri=`{basename -d $uri} |  | ||||||
|     rssuri=$baseuri`{cleanname $"rssuri^/index.rss} |  | ||||||
|     extraHeaders=$"extraHeaders ^ \ |  | ||||||
|     	'<link rel="alternate" type="application/rss+xml" title="RSS" href="'$rssuri'" /> |  | ||||||
| ' |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| select_handler | select_handler | ||||||
| 
 | 
 | ||||||
| fn template { | # Template/body selection | ||||||
|     template.awk | rc $rcargs | | master_template= `{get_lib_file $master_template} | ||||||
|  | 
 | ||||||
|  | if(~ $master_template 0) { | ||||||
|  |     dprint DEPRECATION WARNING: using $sitedir/_default.tpl, should move to _werc/lib/XXX | ||||||
|  |     master_template=$sitedir/_default.tpl | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | # Is this really useful? | ||||||
|  | fn postfil_awk_buf { | ||||||
|     awk '{ |     awk '{ | ||||||
|         buf = buf $0"\n" |         buf = buf $0"\n" | ||||||
|         if(length(buf) > 8192) { |         if(length(buf) > 8192) { | ||||||
|  | @ -367,40 +379,20 @@ fn template { | ||||||
|     END{ printf "%s", buf }' |     END{ printf "%s", buf }' | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| if(! ~ $REQUEST_URI */index.rss) { | post_filter=postfil_awk_buf | ||||||
|  | 
 | ||||||
|  | # This probably should merge with tpl_handler | ||||||
|  | fn template { | ||||||
|  |     if(~ $#post_filter 0) | ||||||
|  |         template.awk | rc $rcargs | ||||||
|  |     if not | ||||||
|  |         template.awk | rc $rcargs | $post_filter | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | if(~ $response_format html) { | ||||||
| 	cat $headers $master_template | template | 	cat $headers $master_template | template | ||||||
| 	echo '</body></html>' | 	echo '</body></html>' | ||||||
| 	exit |  | ||||||
| } | } | ||||||
| 
 | if not if (~ $response_format raw) { | ||||||
| # RSS | 	template < $master_template  | ||||||
| if (~ $body */[bB]log/index.rss */[bB]log//index.rss && ~ $#blogDirs 0) |  | ||||||
|     blogDirs = `{basename -d $body} |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| uri = `{echo $uri | sed 's/index.rss$//'} |  | ||||||
| uri=$baseuri$"uri |  | ||||||
| 
 |  | ||||||
| fn statpost { |  | ||||||
| 	f = $1 |  | ||||||
| 	uri = `{echo $f | sed 's,^'$sitedir',,'} |  | ||||||
| 	title=`{basename $f | sed 's/^[0-9\-]*_(.*)\.md$/\1/; s/_/ /g' } |  | ||||||
| 	date=`{/bin/date -Rd `{basename $f |sed 's/(^[0-9\-]*).*/\1/; s/-[0-9]$//'}} |  | ||||||
| 	# TODO: use mtime(1) and ls(1) instead of lunix's stat(1) |  | ||||||
| 	stat=`{stat -c '%Y %U' $f} |  | ||||||
| 	#mdate=`{/bin/date -Rd $stat(1)} # Not used because it is unreliable |  | ||||||
| 	uri=$baseuri^`{cleanname `{echo -n $uri | sed 's/\.(md|tpl)//g'}} |  | ||||||
| 	by=$stat(2) |  | ||||||
| 	ifs=() { |  | ||||||
| 		summary=`{awk -v max'='1024 '{ |  | ||||||
| 			nc += 1 + length; |  | ||||||
| 			if(nc > max) { |  | ||||||
| 				print substr($0, 1, nc - max) "..." |  | ||||||
| 				exit |  | ||||||
| } | } | ||||||
| 			print |  | ||||||
| 		}' $f |fmt -j| sed 's/\]\]>/Fucking goddamn XML garbage/g'} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| cat lib/feeds/rss20.tpl | template |  | ||||||
|  |  | ||||||
|  | @ -1,5 +1,30 @@ | ||||||
| Content-Type: text/xml; charset=utf-8 | Content-Type: text/xml; charset=utf-8 | ||||||
| 
 | 
 | ||||||
|  | %{ | ||||||
|  | fn statpost { | ||||||
|  | 	f = $1 | ||||||
|  | 	uri = `{echo $f | sed 's,^'$sitedir',,'} | ||||||
|  | 	title=`{basename $f | sed 's/^[0-9\-]*_(.*)\.md$/\1/; s/_/ /g' } | ||||||
|  | 	date=`{/bin/date -Rd `{basename $f |sed 's/(^[0-9\-]*).*/\1/; s/-[0-9]$//'}} | ||||||
|  | 	# TODO: use mtime(1) and ls(1) instead of lunix's stat(1) | ||||||
|  | 	stat=`{stat -c '%Y %U' $f} | ||||||
|  | 	#mdate=`{/bin/date -Rd $stat(1)} # Not used because it is unreliable | ||||||
|  | 	uri=$baseuri^`{cleanname `{echo -n $uri | sed 's/\.(md|tpl)//g'}} | ||||||
|  | 	by=$stat(2) | ||||||
|  | 	ifs=() { | ||||||
|  | 		summary=`{awk -v max'='1024 '{ | ||||||
|  | 			nc += 1 + length; | ||||||
|  | 			if(nc > max) { | ||||||
|  | 				print substr($0, 1, nc - max) "..." | ||||||
|  | 				exit | ||||||
|  | 			} | ||||||
|  | 			print | ||||||
|  | 		}' $f |fmt -j| sed 's/\]\]>/Fucking goddamn XML garbage/g'} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | %} | ||||||
|  | 
 | ||||||
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||||
| <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> | <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> | ||||||
| 	<channel> | 	<channel> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Uriel
						Uriel