{"id":441,"date":"2003-04-17T03:00:00","date_gmt":"2003-04-17T03:00:00","guid":{"rendered":"http:\/\/adam.rosi-kessel.org\/weblog\/free_software\/code\/blog.pm.html.html"},"modified":"-0001-11-30T00:00:00","modified_gmt":"1970-01-01T05:00:00","slug":"blogpmhtml","status":"publish","type":"post","link":"http:\/\/adam.rosi-kessel.org\/weblog\/2003\/04\/17\/blogpmhtml","title":{"rendered":"<html>"},"content":{"rendered":"<p><head> <title>bin\/blog.pm<\/title> <\/head> <body bgcolor=\"#ffffff\" text=\"#000000\"> <\/p>\n<pre> <font color=\"#444444\">#!\/usr\/bin\/perl -w <\/font><strong>use<\/strong> strict; <strong>use<\/strong> POSIX <font color=\"a52a2a\"><strong>qw<\/strong><\/font><font color=\"4444FF\"><strong>(<\/strong><\/font>strftime<font color=\"4444FF\"><strong>)<\/strong><\/font>; <strong>use<\/strong> Time::Local; <strong>use<\/strong> URI::Heuristic; <strong>use<\/strong> Text::Wrap; <strong>use<\/strong> vars<font color=\"#008000\"> qw\/$CGIPath $blogPath $documentRoot $documentURL $sidebarFile $syntaxChecksFile $styleSheet $followup_root $heading $title $admin_email\/<\/font>; <font color=\"#2040a0\">$CGIPath<\/font> = <font color=\"#008000\">'\/home\/adam\/public_html\/cgi-bin'<\/font>; <font color=\"#2040a0\">$blogPath<\/font> = <font color=\"#008000\">'\/adam\/cgi-bin\/weblog.pl'<\/font>; <font color=\"#2040a0\">$documentRoot<\/font> = <font color=\"#008000\">'\/home\/adam\/public_html\/blog'<\/font>; <font color=\"#2040a0\">$followup_root<\/font> = <font color=\"#2040a0\">$documentRoot<\/font> . <font color=\"#008000\">'\/followups'<\/font>; <font color=\"#2040a0\">$documentURL<\/font> = <font color=\"#008000\">'\/~adam\/blog\/'<\/font>; <font color=\"#2040a0\">$sidebarFile<\/font> = <font color=\"#008000\">\"<font color=\"#2040a0\">$documentRoot<\/font>\/sidebar\"<\/font>; <font color=\"#2040a0\">$syntaxChecksFile<\/font> = <font color=\"#008000\">\"<font color=\"#2040a0\">$documentRoot<\/font>\/syntax_checks\"<\/font>; <font color=\"#2040a0\">$title<\/font> = <font color=\"#008000\">\"Adam Kessel's Weblog\"<\/font>; <font color=\"#2040a0\">$heading<\/font> = <font color=\"#008000\">\"Adam Kessel&rsquo;s Weblog\"<\/font>; <font color=\"#2040a0\">$styleSheet<\/font> = <font color=\"#008000\">\"\/~adam\/style.css\"<\/font>; <font color=\"#2040a0\">$admin_email<\/font> = <font color=\"#008000\">\"adam<font color=\"#77dd77\">\\@<\/font>bostoncoop.net\"<\/font>; <font color=\"#2040a0\">$Text<\/font>::Wrap::columns = 100; <font color=\"#444444\"># for wrapping HTML <\/font><strong>sub<font color=\"ff0000\"> PrintFollowUps<\/font> {<\/strong> <strong>my<\/strong> <font color=\"#2040a0\">$entry_name<\/font> = <font color=\"a52a2a\"><strong>shift<\/strong><\/font>; <strong>my<\/strong> <font color=\"#2040a0\">$followup_text<\/font> = <font color=\"#008000\">\"\"<\/font>; <strong>my<\/strong> <font color=\"#2040a0\">$date_string<\/font>; <font color=\"#2040a0\">$entry_name<\/font> =~ s<^<font color=\"#2040a0\">$documentRoot<\/font>\/><>g; <strong>if<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font>-e <font color=\"#008000\">\"<font color=\"#2040a0\">$followup_root<\/font>\/<font color=\"#2040a0\">$entry_name<\/font>\"<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font> <font color=\"a52a2a\"><strong>open<\/strong><\/font> IN, <font color=\"#008000\">\"<font color=\"#2040a0\">$followup_root<\/font>\/<font color=\"#2040a0\">$entry_name<\/font>\"<\/font> || <strong>return<\/strong> <font color=\"#008000\">\"\"<\/font>; <font color=\"#2040a0\">$followup_text<\/font> = <font color=\"#008000\">\"<table width='100<font color=\"#2040a0\">%'<\/font>><font color=\"#77dd77\">\\n<\/font><tr><th colspan='2' align='left' class='responses'>Linked Responses<\/th><\/tr>\"<\/font>; <strong>while<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font><in><font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font> <strong>my<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$epoch<\/font>, <font color=\"#2040a0\">$url<\/font>, <font color=\"#2040a0\">$comment<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> = <font color=\"b000d0\"> m\/^(.*?)\\t(.*?)\\t(.*)$\/<\/font>; <font color=\"#2040a0\">$date_string<\/font> = &EpochToShortDate<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$epoch<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"#2040a0\">$followup_text<\/font> .= <font color=\"#008000\">\"<tr><td width='80<font color=\"#2040a0\">%'<\/font> class='responses'><a href='<font color=\"#2040a0\">$url<\/font>'><font color=\"#2040a0\">$comment<\/font><\/a><\/td><font color=\"#77dd77\">\\n<\/font><td class='responses' align='right'><font color=\"#2040a0\">$date_string<\/font><\/td><\/tr>\"<\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"#2040a0\">$followup_text<\/font> .= <font color=\"#008000\">\"<\/table>\"<\/font>; <font color=\"a52a2a\"><strong>close<\/strong><\/font> IN; <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>return<\/strong> <font color=\"#2040a0\">$followup_text<\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>sub<font color=\"ff0000\"> AddFollowUp<\/font> {<\/strong> <strong>my<\/strong> <font color=\"#2040a0\">$file_name<\/font> = <font color=\"a52a2a\"><strong>shift<\/strong><\/font>; <strong>my<\/strong> <font color=\"#2040a0\">$url<\/font> = <font color=\"a52a2a\"><strong>shift<\/strong><\/font>; <strong>my<\/strong> <font color=\"#2040a0\">$comment<\/font> = <font color=\"a52a2a\"><strong>shift<\/strong><\/font>; <strong>my<\/strong> <font color=\"#2040a0\">$epoch<\/font> = timelocal<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"a52a2a\"><strong>localtime<\/strong><\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$url<\/font> = URI::Heuristic::uf_urlstr<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$url<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> <strong>and<\/strong> <font color=\"#2040a0\">$comment<\/font> <strong>and<\/strong> <font color=\"#2040a0\">$file_name<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> || <strong>return<\/strong> 0; <font color=\"a52a2a\"><strong>open<\/strong><\/font> OUT, <font color=\"#008000\">\">><font color=\"#2040a0\">$followup_root<\/font>\/<font color=\"#2040a0\">$file_name<\/font>\"<\/font> || <strong>return<\/strong> 0; <font color=\"a52a2a\"><strong>print<\/strong><\/font> OUT <font color=\"#2040a0\">$epoch<\/font> . <font color=\"#008000\">\"<font color=\"#77dd77\">\\t<\/font>\"<\/font> . <font color=\"#2040a0\">$url<\/font> . <font color=\"#008000\">\"<font color=\"#77dd77\">\\t<\/font>\"<\/font> . <font color=\"#2040a0\">$comment<\/font> . <font color=\"#008000\">\"<font color=\"#77dd77\">\\n<\/font>\"<\/font>; <font color=\"a52a2a\"><strong>close<\/strong><\/font> OUT; 1; <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>sub<font color=\"ff0000\"> GetMetaData<\/font> {<\/strong> <font color=\"a52a2a\"><strong>open<\/strong><\/font> IN, <font color=\"a52a2a\"><strong>shift<\/strong><\/font> || <strong>return<\/strong>; <font color=\"#2040a0\">$_<\/font> = <font color=\"a52a2a\"><strong>join<\/strong><\/font><font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#008000\">''<\/font>,<in><font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"a52a2a\"><strong>close<\/strong><\/font> IN; <strong>my<\/strong> <font color=\"#2040a0\">%metadata<\/font> = <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <strong>my<\/strong> <font color=\"#2040a0\">@matches<\/font> = m<font color=\"4444FF\"><strong>{<\/strong><\/font><<font color=\"#2040a0\">%<\/font><font color=\"4444FF\"><strong>(<\/strong><\/font>.*<font color=\"4444FF\"><strong>)<\/strong><\/font>\\s*<font color=\"4444FF\"><strong>[<\/strong><\/font>:=<font color=\"4444FF\"><strong>]<\/strong><\/font>\\s*<font color=\"4444FF\"><strong>(<\/strong><\/font>.*?<font color=\"4444FF\"><strong>)<\/strong><\/font>\\s*><font color=\"4444FF\"><strong>}<\/strong><\/font>gi; <strong>while<\/strong><font color=\"4444FF\"><strong>(<\/strong><\/font> <font color=\"#2040a0\">@matches<\/font> <font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font> <strong>my<\/strong> <font color=\"#2040a0\">$key<\/font> = <font color=\"a52a2a\"><strong>lc<\/strong><\/font> <font color=\"a52a2a\"><strong>shift<\/strong><\/font> <font color=\"#2040a0\">@matches<\/font>; <strong>if<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$key<\/font> <strong>eq<\/strong> <font color=\"#008000\">\"title\"<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font> <font color=\"#2040a0\">$metadata<\/font><font color=\"4444FF\"><strong>{<\/strong><\/font><font color=\"#2040a0\">$key<\/font><font color=\"4444FF\"><strong>}<\/strong><\/font> = <font color=\"4444FF\"><strong>[<\/strong><\/font> <font color=\"a52a2a\"><strong>shift<\/strong><\/font> <font color=\"#2040a0\">@matches<\/font> <font color=\"4444FF\"><strong>]<\/strong><\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>else<\/strong> <font color=\"4444FF\"><strong>{<\/strong><\/font> <strong>my<\/strong> <font color=\"#2040a0\">@values<\/font> = <font color=\"a52a2a\"><strong>split<\/strong><\/font><font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"b000d0\"> \/\\s*,\\s*\/<\/font>, <font color=\"a52a2a\"><strong>shift<\/strong><\/font> <font color=\"#2040a0\">@matches<\/font> <font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"#2040a0\">$metadata<\/font><font color=\"4444FF\"><strong>{<\/strong><\/font><font color=\"#2040a0\">$key<\/font><font color=\"4444FF\"><strong>}<\/strong><\/font> = <font color=\"4444FF\"><strong>[<\/strong><\/font><font color=\"#2040a0\">@values<\/font><font color=\"4444FF\"><strong>]<\/strong><\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>return<\/strong> <font color=\"#2040a0\">%metadata<\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>sub<font color=\"ff0000\"> GetTopicStringFromMetaData<\/font> {<\/strong> <strong>my<\/strong> <font color=\"#2040a0\">$topicArray<\/font> = <font color=\"a52a2a\"><strong>shift<\/strong><\/font>; <font color=\"#2040a0\">$topicArray<\/font> <strong>or<\/strong> <strong>return<\/strong> <font color=\"#008000\">\"\"<\/font>; <strong>my<\/strong> <font color=\"#2040a0\">$topicString<\/font> = <font color=\"#008000\">\"<span class='topicindex'>Topics: \"<\/font>; <strong>foreach<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">@{$topicArray}<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font> <strong>my<\/strong> <font color=\"#2040a0\">$topic_filename<\/font> = &MakeTopicFilename<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$_<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"#2040a0\">$topicString<\/font> .= <font color=\"#008000\">\"<a href='<font color=\"#2040a0\">$blogPath<\/font>?rightframe=topic_<font color=\"#2040a0\">$topic_filename<\/font>' class='topicindex'>\"<\/font> . <font color=\"#2040a0\">$_<\/font> . <font color=\"#008000\">\"<\/a>, \"<\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"#2040a0\">$topicString<\/font> =~<font color=\"b000d0\"> s\/, $\/\/g<\/font>; <font color=\"#2040a0\">$topicString<\/font> .= <font color=\"#008000\">\"<\/span>\"<\/font>; <strong>return<\/strong> <font color=\"#2040a0\">$topicString<\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>sub<font color=\"ff0000\"> MakeTopicFilename<\/font> {<\/strong> <strong>my<\/strong> <font color=\"#2040a0\">$topic_filename<\/font> = <font color=\"a52a2a\"><strong>lc<\/strong><\/font> <font color=\"a52a2a\"><strong>shift<\/strong><\/font>; <font color=\"#2040a0\">$topic_filename<\/font> =~<font color=\"b000d0\"> s\/ \/_\/g<\/font>; <font color=\"#2040a0\">$topic_filename<\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>sub<font color=\"ff0000\"> MetaDateToEpoch<\/font> {<\/strong> <font color=\"#2040a0\">$_<\/font> = <font color=\"a52a2a\"><strong>shift<\/strong><\/font>; <strong>my<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$year<\/font>, <font color=\"#2040a0\">$mon<\/font>, <font color=\"#2040a0\">$mday<\/font>, <font color=\"#2040a0\">$hour<\/font>, <font color=\"#2040a0\">$min<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> =<font color=\"b000d0\"> m\/^(\\d{2,4})\\.(\\d{1,2})\\.(\\d{1,2})\\.(\\d{1,2})\\.(\\d{2})\/<\/font>; <font color=\"#2040a0\">$year<\/font> < 100 <strong>and<\/strong> <font color=\"#2040a0\">$year<\/font> += 100 <strong>or<\/strong> <font color=\"#2040a0\">$year<\/font> > 1900 <strong>and<\/strong> <font color=\"#2040a0\">$year<\/font> -= 1900; <font color=\"#444444\"># timelocal wants dates since 1900 <\/font><font color=\"#2040a0\">$mon<\/font> -= 1; timelocal<font color=\"4444FF\"><strong>(<\/strong><\/font>0, <font color=\"#2040a0\">$min<\/font>, <font color=\"#2040a0\">$hour<\/font>, <font color=\"#2040a0\">$mday<\/font>, <font color=\"#2040a0\">$mon<\/font>, <font color=\"#2040a0\">$year<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>sub<font color=\"ff0000\"> EpochToBlogDate<\/font> {<\/strong> <font color=\"#2040a0\">$_<\/font> = <font color=\"a52a2a\"><strong>shift<\/strong><\/font>; strftime<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#008000\">\"<font color=\"#2040a0\">%A<\/font>, <font color=\"#2040a0\">%B<\/font> <font color=\"#2040a0\">%d<\/font>, <font color=\"#2040a0\">%Y<\/font> at <font color=\"#2040a0\">%I<\/font>:<font color=\"#2040a0\">%M<\/font> <font color=\"#2040a0\">%p<\/font>\"<\/font>, <font color=\"a52a2a\"><strong>localtime<\/strong><\/font><font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$_<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>sub<font color=\"ff0000\"> EpochToShortDate<\/font> {<\/strong> <font color=\"#2040a0\">$_<\/font> = <font color=\"a52a2a\"><strong>shift<\/strong><\/font>; strftime<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#008000\">\"<font color=\"#2040a0\">%D<\/font> <font color=\"#2040a0\">%H<\/font>:<font color=\"#2040a0\">%M<\/font>\"<\/font>, <font color=\"a52a2a\"><strong>localtime<\/strong><\/font><font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$_<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>sub<font color=\"ff0000\"> EpochToDateOnly<\/font> {<\/strong> <font color=\"#2040a0\">$_<\/font> = <font color=\"a52a2a\"><strong>shift<\/strong><\/font>; strftime<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#008000\">\"<font color=\"#2040a0\">%D<\/font>\"<\/font>, <font color=\"a52a2a\"><strong>localtime<\/strong><\/font><font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$_<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"#444444\"># Returns the timestamp of the specified blog file, either from the last modified # or from embedded metadata (metadata always takes priority) <\/font><strong>sub<font color=\"ff0000\"> GetBlogFileDate<\/font> {<\/strong> <strong>my<\/strong> <font color=\"#2040a0\">$current_file_name<\/font> = <font color=\"a52a2a\"><strong>shift<\/strong><\/font>; <strong>my<\/strong> <font color=\"#2040a0\">$return_value<\/font> = 0; <strong>my<\/strong> <font color=\"#2040a0\">%meta_data<\/font>; <font color=\"4444FF\"><strong>(<\/strong><\/font>-e <font color=\"#2040a0\">$current_file_name<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> || <strong>return<\/strong> <font color=\"#2040a0\">$return_value<\/font>; <font color=\"#2040a0\">$return_value<\/font> = <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"a52a2a\"><strong>stat<\/strong><\/font><font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$current_file_name<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font><font color=\"4444FF\"><strong>)<\/strong><\/font><font color=\"4444FF\"><strong>[<\/strong><\/font>9<font color=\"4444FF\"><strong>]<\/strong><\/font>; <font color=\"#2040a0\">%meta_data<\/font> = &GetMetaData<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$current_file_name<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <strong>if<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$meta_data<\/font><font color=\"4444FF\"><strong>{<\/strong><\/font><font color=\"#008000\">\"date\"<\/font><font color=\"4444FF\"><strong>}<\/strong><\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font> <font color=\"#2040a0\">$return_value<\/font> = &MetaDateToEpoch<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$meta_data<\/font><font color=\"4444FF\"><strong>{<\/strong><\/font><font color=\"#008000\">\"date\"<\/font><font color=\"4444FF\"><strong>}<\/strong><\/font><font color=\"4444FF\"><strong>[<\/strong><\/font>0<font color=\"4444FF\"><strong>]<\/strong><\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"#2040a0\">$return_value<\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"#444444\"># Despite its name, FastGrep is probably not all that fast; # I think something needs to be done to precompile the pattern--although I wasn't able to figure it out. # It is passed a search string and the material to search; # it parses out the search string by spaces. In order to return true, all term smust appear in the material. # (i.e., 'google' type searching) <\/font><strong>sub<font color=\"ff0000\"> FastGrep<\/font> {<\/strong> <strong>my<\/strong> <font color=\"#2040a0\">$search_string<\/font> = <font color=\"a52a2a\"><strong>shift<\/strong><\/font>; <strong>my<\/strong> <font color=\"#2040a0\">@search_material<\/font> = <font color=\"#2040a0\">@_<\/font>; <strong>my<\/strong> <font color=\"#2040a0\">$found<\/font> = 1; <strong>my<\/strong> <font color=\"#2040a0\">$code<\/font>; <strong>my<\/strong> <font color=\"#2040a0\">@search_string<\/font> = <font color=\"a52a2a\"><strong>split<\/strong><\/font><font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"b000d0\">\/\\s\/<\/font>,<font color=\"#2040a0\">$search_string<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <strong>foreach<\/strong> <strong>my<\/strong> <font color=\"#2040a0\">$current_search<\/font> <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">@search_string<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font> <font color=\"#2040a0\">$found<\/font> = 0 <strong>unless<\/strong> <font color=\"a52a2a\"><strong>grep<\/strong><\/font><font color=\"b000d0\"> \/$current_search\/i<\/font>, <font color=\"#2040a0\">@search_material<\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"#2040a0\">$found<\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>sub<font color=\"ff0000\"> ShowSearchResults<\/font> {<\/strong> <strong>my<\/strong> <font color=\"#2040a0\">$search_string<\/font> = <font color=\"a52a2a\"><strong>shift<\/strong><\/font>; <strong>my<\/strong> <font color=\"#2040a0\">%meta_data<\/font>; <strong>my<\/strong> <font color=\"#2040a0\">@results<\/font>; <strong>foreach<\/strong> <strong>my<\/strong> <font color=\"#2040a0\">$blog_file<\/font> <font color=\"4444FF\"><strong>(<\/strong><\/font><<font color=\"#2040a0\">$documentRoot<\/font>\/*><font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font> <strong>my<\/strong> <font color=\"#2040a0\">$entry_name<\/font> = <font color=\"#2040a0\">$blog_file<\/font>; <font color=\"a52a2a\"><strong>open<\/strong><\/font> IN, <font color=\"#2040a0\">$blog_file<\/font>; <font color=\"a52a2a\"><strong>push<\/strong><\/font> <font color=\"#2040a0\">@results<\/font>, <font color=\"#2040a0\">$blog_file<\/font> <strong>if<\/strong> &FastGrep<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$search_string<\/font>, <in><font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"a52a2a\"><strong>close<\/strong><\/font> IN; <font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"a52a2a\"><strong>print<\/strong><\/font> <font color=\"#008000\">\"<div class='blogtitle'>Search Results<\/div><font color=\"#77dd77\">\\n<\/font>\"<\/font>; <font color=\"a52a2a\"><strong>print<\/strong><\/font> <font color=\"#008000\">\"<p>Sorry, there were no results. You can try a new search if you want. Note that all terms must match; if you want to do an &ldquo;or&rdquo; search, try using a | between your search terms.<\/p>\"<\/font> . &StringSearchBox <strong>unless<\/strong> <font color=\"#2040a0\">@results<\/font>; <strong>foreach<\/strong> <strong>my<\/strong> <font color=\"#2040a0\">$current_file_name<\/font> <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">@results<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font> <strong>my<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$description<\/font>, <font color=\"#2040a0\">$topics<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> = &BlogItemSummary<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$current_file_name<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"a52a2a\"><strong>print<\/strong><\/font> &UniversalFormat<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$description<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>sub<font color=\"ff0000\"> StringSearchBox<\/font> {<\/strong> <<eof; <form action=<font color=\"#008000\">'$blogPath'<\/font> method=<font color=\"#008000\">'post'<\/font>> <p> <span class=<font color=\"#008000\">'feedbackform'<\/font>> <input type=<font color=\"#008000\">'submit'<\/font> value=<font color=\"#008000\">'Search:'<\/font> \/> <input type=<font color=\"#008000\">'text'<\/font> name=<font color=\"#008000\">'search'<\/font> size=<font color=\"#008000\">'20'<\/font> maxlength=<font color=\"#008000\">'40'<\/font> \/> <\/span> <\/p> <\/form> EOF <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>sub<font color=\"ff0000\"> BlogItemSummary<\/font> {<\/strong> <strong>my<\/strong> <font color=\"#2040a0\">$blog_file<\/font> = <font color=\"a52a2a\"><strong>shift<\/strong><\/font>; <strong>my<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$item_description<\/font>, <font color=\"#2040a0\">%meta_data<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <strong>my<\/strong> <font color=\"#2040a0\">$blog_timestamp<\/font> = &GetBlogFileDate<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$blog_file<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <strong>my<\/strong> <font color=\"#2040a0\">@topics<\/font>; <font color=\"#2040a0\">%meta_data<\/font> = &GetMetaData<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$blog_file<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <strong>return<\/strong> <font color=\"#008000\">\"\"<\/font> <strong>unless<\/strong> <font color=\"#2040a0\">$meta_data<\/font><font color=\"4444FF\"><strong>{<\/strong><\/font><font color=\"#008000\">\"title\"<\/font><font color=\"4444FF\"><strong>}<\/strong><\/font>; <font color=\"#2040a0\">$blog_file<\/font> =~ s<^<font color=\"#2040a0\">$documentRoot<\/font>\/><>; <font color=\"#2040a0\">$item_description<\/font>=<font color=\"#008000\">\"<p><rightframe <font color=\"#2040a0\">$blog_file<\/font>>\"<\/font> . <font color=\"#2040a0\">$meta_data<\/font><font color=\"4444FF\"><strong>{<\/strong><\/font><font color=\"#008000\">\"title\"<\/font><font color=\"4444FF\"><strong>}<\/strong><\/font><font color=\"4444FF\"><strong>[<\/strong><\/font>0<font color=\"4444FF\"><strong>]<\/strong><\/font> . <font color=\"#008000\">'<\/a> <br \/> <span class=\"update\"> '<\/font> . EpochToBlogDate<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$blog_timestamp<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> . <font color=\"#008000\">' <\/span> '<\/font>; <strong>if<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font>&GetTopicStringFromMetaData<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$meta_data<\/font><font color=\"4444FF\"><strong>{<\/strong><\/font><font color=\"#008000\">\"keywords\"<\/font><font color=\"4444FF\"><strong>}<\/strong><\/font><font color=\"4444FF\"><strong>)<\/strong><\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font> <font color=\"#2040a0\">$item_description<\/font> .= <font color=\"#008000\">\"<br \/>\"<\/font> . &GetTopicStringFromMetaData<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$meta_data<\/font><font color=\"4444FF\"><strong>{<\/strong><\/font><font color=\"#008000\">\"keywords\"<\/font><font color=\"4444FF\"><strong>}<\/strong><\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> . <font color=\"#008000\">\"<\/p><font color=\"#77dd77\">\\n<\/font>\"<\/font>; <strong>foreach<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">@{$meta_data{\"keywords\"}<\/font><font color=\"4444FF\"><strong>}<\/strong><\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font> <font color=\"a52a2a\"><strong>push<\/strong><\/font> <font color=\"#2040a0\">@topics<\/font>, <font color=\"#2040a0\">$_<\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>return<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$item_description<\/font>, <font color=\"#2040a0\">@topics<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> <strong>sub<font color=\"ff0000\"> UniversalFormat<\/font> {<\/strong> <font color=\"#2040a0\">$_<\/font> = <font color=\"#008000\">\">\"<\/font> . <font color=\"a52a2a\"><strong>join<\/strong><\/font><font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#008000\">''<\/font>,<font color=\"#2040a0\">@_<\/font><font color=\"4444FF\"><strong>)<\/strong><\/font> . <font color=\"#008000\">\"<\"<\/font>; <strong>my<\/strong> <font color=\"#2040a0\">$string<\/font> = <font color=\"#2040a0\">$_<\/font>; <strong>while<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$string<\/font> =~ s<font color=\"4444FF\"><strong>{<\/strong><\/font><<font color=\"#2040a0\">%embed<\/font>:<font color=\"4444FF\"><strong>(<\/strong><\/font>.*?<font color=\"4444FF\"><strong>)<\/strong><\/font>><font color=\"4444FF\"><strong>}<\/strong><\/font><font color=\"4444FF\"><strong>{<\/strong><\/font><!--embed:<font color=\"#2040a0\">$1<\/font>--> REPLACETEXTHERE<font color=\"4444FF\"><strong>}<\/strong><\/font>i<font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font> <strong>my<\/strong> <font color=\"#2040a0\">$embedded_blog_link<\/font> = <font color=\"#2040a0\">$1<\/font>; <strong>my<\/strong> <font color=\"#2040a0\">$embedded_document<\/font> = &show<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"#2040a0\">$documentRoot<\/font> . <font color=\"#008000\">\"\/\"<\/font> . <font color=\"#2040a0\">$embedded_blog_link<\/font>,1<font color=\"4444FF\"><strong>)<\/strong><\/font>; <font color=\"#2040a0\">$embedded_document<\/font> =~ s<font color=\"4444FF\"><strong>{<\/strong><\/font>blogtitle<font color=\"4444FF\"><strong>}<\/strong><\/font><font color=\"4444FF\"><strong>{<\/strong><\/font>blogsubtitle<font color=\"4444FF\"><strong>}<\/strong><\/font>g; <font color=\"#2040a0\">$embedded_document<\/font> =~ s<font color=\"4444FF\"><strong>{<\/strong><\/font><font color=\"4444FF\"><strong>(<\/strong><\/font>blogsubtitle.*?><font color=\"4444FF\"><strong>)<\/strong><\/font><font color=\"4444FF\"><strong>(<\/strong><\/font>.*?<font color=\"4444FF\"><strong>)<\/strong><\/font><font color=\"4444FF\"><strong>(<\/strong><\/font><<font color=\"4444FF\"><strong>)<\/strong><\/font><font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font><font color=\"#2040a0\">$1<\/font><a clas<font color=\"b000d0\">s=\"blogsubtitle\" href=\"$blogPath?rightframe=<\/font><font color=\"#2040a0\">$embedded_blog_link<\/font><font color=\"#008000\">\"><font color=\"#2040a0\">$2<\/font><\/a><font color=\"#2040a0\">$3<\/font>}g; <font color=\"#2040a0\">$string<\/font> =~ s\/REPLACETEXTHERE\/<font color=\"#2040a0\">$embedded_document<\/font>\/; } <font color=\"#2040a0\">$_<\/font> = <font color=\"#2040a0\">$string<\/font>; s{<<font color=\"#2040a0\">%blog<\/font>:(.*?)>} {<div class='blogsubtitle'><font color=\"#2040a0\">$1<\/font><\/div><font color=\"#2040a0\">$&<\/font>}g; s[<<font color=\"#2040a0\">%blogimage<\/font>:(.*?)>] [<img decoding=\"async\" src=\"<\/font><font color=\"#2040a0\">${documentURL}<\/font>image_<font color=\"#2040a0\">$1<\/font><font color=\"#008000\">\" alt=\"<\/font><font color=\"#2040a0\">$1<\/font><font color=\"#008000\">\" \/><font color=\"#2040a0\">$&<\/font>]g; s[<<font color=\"#2040a0\">%rimage<\/font>:(.*?)>] [<img decoding=\"async\" src=\"<\/font><font color=\"#2040a0\">${documentURL}<\/font>image_<font color=\"#2040a0\">$1<\/font><font color=\"#008000\">\" alt=\"<\/font><font color=\"#2040a0\">$1<\/font><font color=\"#008000\">\" class=\"<\/font>insetright<font color=\"#008000\">\" \/><font color=\"#2040a0\">$&<\/font>]g; s[<<font color=\"#2040a0\">%limage<\/font>:(.*?)>] [<img decoding=\"async\" src=\"<\/font><font color=\"#2040a0\">${documentURL}<\/font>image_<font color=\"#2040a0\">$1<\/font><font color=\"#008000\">\" alt=\"<\/font><font color=\"#2040a0\">$1<\/font><font color=\"#008000\">\" class=\"<\/font>insetleft<font color=\"#008000\">\" \/><font color=\"#2040a0\">$&<\/font>]g; s[<<font color=\"#2040a0\">%image<\/font>:(.*?)>] [<img decoding=\"async\" src=\"<\/font><font color=\"#2040a0\">${documentURL}<\/font>image_<font color=\"#2040a0\">$1<\/font><font color=\"#008000\">\" alt=\"<\/font><font color=\"#2040a0\">$1<\/font><font color=\"#008000\">\" class=\"<\/font>insetcenter<font color=\"#008000\">\" \/><font color=\"#2040a0\">$&<\/font>]g; s{<pdf<font color=\"#77dd77\">\\s<\/font>*([^>]*?)>} {<a href=\"<\/font><font color=\"#2040a0\">$documentURL<\/font><font color=\"#2040a0\">$1<\/font>.pdf<font color=\"#008000\">\">PDF version<\/a> [<rightframe pdf>info<\/a>]}gi; s{<rightframe<font color=\"#77dd77\">\\s<\/font>*([^>]*?)>} {<a href=\"<\/font><font color=\"#2040a0\">$blogPath<\/font>?rightframe=<font color=\"#2040a0\">$1<\/font><font color=\"#008000\">\">}g; s{<bloglink<font color=\"#77dd77\">\\s<\/font>*([^>]*?)>} {<a href=\"<\/font><font color=\"#2040a0\">$documentURL<\/font><font color=\"#2040a0\">$1<\/font><font color=\"#008000\">\">}g; s{(<pre>.*<\/pre>\n<p>)} {WEBLOGPLACEHOLDER}is; # Remove a <\/p>\n<pre> section, if there is one, to be put back afterwards my <font color=\"#2040a0\">$preSection<\/font> = <font color=\"#2040a0\">$1<\/font>; s{<br \/>}{<br\/>}gi; s{<hr \/>}{<hr\/>}gi; s{(<img[^>]*[^\/])>}{<font color=\"#2040a0\">$1<\/font> \/>}gi; s{&([^;]*? )}{&amp;<font color=\"#2040a0\">$1<\/font>}g; # Only replace & with &amp; when the & isn't already an HTML escape sequence! while (s{>([^<]*?)``(.*?)''(.*?)<} {><font color=\"#2040a0\">$1<\/font>&ldquo;<font color=\"#2040a0\">$2<\/font>&rdquo;<font color=\"#2040a0\">$3<\/font><}gs) {}; while (s{>([^<]*?)\"<\/font><font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"4444FF\"><strong>[<\/strong><\/font>^<font color=\"#008000\">\"]*?)\"<\/font><font color=\"4444FF\"><strong>(<\/strong><\/font>.*?<font color=\"4444FF\"><strong>)<\/strong><\/font><<font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font>><font color=\"#2040a0\">$1<\/font>&ldquo;<font color=\"#2040a0\">$2<\/font>&rdquo;<font color=\"#2040a0\">$3<\/font><<font color=\"4444FF\"><strong>}<\/strong><\/font>gs<font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font><font color=\"4444FF\"><strong>}<\/strong><\/font>; <strong>while<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font>s<font color=\"4444FF\"><strong>{<\/strong><\/font>><font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"4444FF\"><strong>[<\/strong><\/font>^<<font color=\"4444FF\"><strong>]<\/strong><\/font>*?<font color=\"4444FF\"><strong>)<\/strong><\/font>`<font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"4444FF\"><strong>[<\/strong><\/font>^<font color=\"#008000\">']*)'<\/font><font color=\"4444FF\"><strong>(<\/strong><\/font>.*?<font color=\"4444FF\"><strong>)<\/strong><\/font><<font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font>><font color=\"#2040a0\">$1<\/font>&lsquo;<font color=\"#2040a0\">$2<\/font>&rsquo;<font color=\"#2040a0\">$3<\/font><<font color=\"4444FF\"><strong>}<\/strong><\/font>gs<font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font><font color=\"4444FF\"><strong>}<\/strong><\/font>; <strong>while<\/strong> <font color=\"4444FF\"><strong>(<\/strong><\/font>s<font color=\"4444FF\"><strong>{<\/strong><\/font>><font color=\"4444FF\"><strong>(<\/strong><\/font><font color=\"4444FF\"><strong>[<\/strong><\/font>^<<font color=\"4444FF\"><strong>]<\/strong><\/font>*?\\s<font color=\"4444FF\"><strong>)<\/strong><\/font><font color=\"#008000\">'([^'<\/font><font color=\"4444FF\"><strong>]<\/strong><\/font>*<font color=\"4444FF\"><strong>)<\/strong><\/font><font color=\"#008000\">'([<font color=\"#77dd77\">\\s<\/font>,;<font color=\"#77dd77\">\\.<\/font>].*?)<} {>$1&lsquo;$2&rsquo;$3<}gs) {}; while (s{>([^<]*?)'<\/font><font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font>><font color=\"#2040a0\">$1<\/font>&rsquo;<font color=\"4444FF\"><strong>}<\/strong><\/font>gs<font color=\"4444FF\"><strong>)<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font><font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"b000d0\"> s\/WEBLOGPLACEHOLDER\/$preSection\/<\/font>; <font color=\"#444444\"># Put back any removed <pre> section. <\/font><font color=\"b000d0\">s\/^>|<$\/\/g<\/font>; s<font color=\"4444FF\"><strong>{<\/strong><\/font><<font color=\"#2040a0\">%<\/font><font color=\"4444FF\"><strong>(<\/strong><\/font>.*?<font color=\"4444FF\"><strong>)<\/strong><\/font>><font color=\"4444FF\"><strong>}<\/strong><\/font> <font color=\"4444FF\"><strong>{<\/strong><\/font><!--<font color=\"#2040a0\">$1<\/font>--><font color=\"4444FF\"><strong>}<\/strong><\/font>g; <font color=\"#2040a0\">$_<\/font>; <font color=\"4444FF\"><strong>}<\/strong><\/font> 1; <\/pre>\n<hr \/>\n<p> syntax highlighted by <a href=\"http:\/\/www.palfrader.org\/code2html\">Code2HTML<\/a>, v. 0.9.1 <\/body> <\/html><\/p>\n","protected":false},"excerpt":{"rendered":"<p>bin\/blog.pm #!\/usr\/bin\/perl -w use strict; use POSIX qw(strftime); use Time::Local; use URI::Heuristic; use Text::Wrap; use vars qw\/$CGIPath $blogPath $documentRoot $documentURL $sidebarFile $syntaxChecksFile $styleSheet $followup_root $heading $title $admin_email\/; $CGIPath = &#8216;\/home\/adam\/public_html\/cgi-bin&#8217;; $blogPath = &#8216;\/adam\/cgi-bin\/weblog.pl&#8217;; $documentRoot = &#8216;\/home\/adam\/public_html\/blog&#8217;; $followup_root = $documentRoot . &#8216;\/followups&#8217;; $documentURL = &#8216;\/~adam\/blog\/&#8217;; $sidebarFile = &#8220;$documentRoot\/sidebar&#8221;; $syntaxChecksFile = &#8220;$documentRoot\/syntax_checks&#8221;; $title = &#8220;Adam Kessel&#8217;s Weblog&#8221;; [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[17],"tags":[],"_links":{"self":[{"href":"http:\/\/adam.rosi-kessel.org\/weblog\/wp-json\/wp\/v2\/posts\/441"}],"collection":[{"href":"http:\/\/adam.rosi-kessel.org\/weblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/adam.rosi-kessel.org\/weblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/adam.rosi-kessel.org\/weblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/adam.rosi-kessel.org\/weblog\/wp-json\/wp\/v2\/comments?post=441"}],"version-history":[{"count":0,"href":"http:\/\/adam.rosi-kessel.org\/weblog\/wp-json\/wp\/v2\/posts\/441\/revisions"}],"wp:attachment":[{"href":"http:\/\/adam.rosi-kessel.org\/weblog\/wp-json\/wp\/v2\/media?parent=441"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/adam.rosi-kessel.org\/weblog\/wp-json\/wp\/v2\/categories?post=441"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/adam.rosi-kessel.org\/weblog\/wp-json\/wp\/v2\/tags?post=441"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}