Monday, April 04, 2011 at 1:08 AM.
radio2Suite.buildHtmlArchive
on buildHtmlArchive (adruser, adrfeed) { <<Changes <<3/17/11; 12:58:12 AM by DW <<Add item-level permalinks. <<3/10/11; 9:04:12 AM by DW <<Get the template from the user's prefs table. <<3/3/11; 10:56:55 PM by DW <<Properly handle items with links in the HTML rendering. Example: http://static.reallysimple.org/users/dave/wikileaks.html. <<3/1/11; 9:54:24 PM by DW <<Account for the fact that string.urlsplit can fail if the link isn't properly formatted. <<3/1/11; 4:25:08 PM by DW <<Fixed bug where it would fail if an item had an empty link. <<2/28/11; 7:00:19 PM by DW <<Build the HTML archive. local (t, now = clock.now (), templatetext, imgPermalink); bundle { //set up images imgPermalink = string (radio2Suite.data.html.permalink)}; bundle { //setup t new (tabletype, @t); t.title = adrfeed^.prefs.htmlArchive.pagetitle; t.feedUrl = adrfeed^.stats.feedUrl; t.xmlIcon = string (radio2Suite.data.html.xmlFull); //3/10/11 by DW t.now = now}; bundle { //generate t.reportText local (htmltext = "", indentlevel = 0, lastday = date (0)); local (htmlarray, ct=0, maxct = adrfeed^.prefs.htmlArchive.maxct, currentdaytext = "", flfirstday = true); local (imgleftarrow = string (radio2Suite.data.html.blueLeftArrow)); new (tabletype, @htmlarray); on add (s) { if sizeof (htmltext) > 50000 { htmlarray.[string.padwithzeros (sizeof (htmlarray), 5)] = htmltext; htmltext = ""}; htmltext = htmltext + string.filledstring ("\t", indentlevel) + s + "\r\n";}; on visit (adritem) { local (when = adritem^.when, domain = ""); if not date.sameday (lastday, when) { local (aname, leftarrow); bundle { //set aname, leftarrow local (day, month, year, hour, minute, second); date.get (when, @day, @month, @year, @hour, @minute, @second); local (label = "linksFor" + day + date.monthtostring (month) + year); aname = "<a name=\"" + label + "\"></a>"; leftarrow = " <a href=\"#" + label + "\">" + imgleftarrow + "</a>"}; add ("<h4>" + aname + date.longstring (when) + leftarrow + "</h4>"); add (""); <<msg (lastday) <<bundle //handle callback on first day's text <<if flfirstday and (sizeof (currentdaytext) > 0) <<local (adrscript) <<for adrscript in @adrdata^.callbacks.buildArchiveDay <<while typeof (adrscript^) == addresstype <<adrscript = adrscript^ <<try <<adrscript^ (currentdaytext, lastday) <<else <<scratchpad.lastbuilderror = tryerror <<flfirstday = false <<currentdaytext = "" lastday = when}; bundle { //set domain if sizeof (adritem^.link) > 0 { local (link = adritem^.link); try { //string.urlsplit can fail if the link isn't properly formatted. local (ul = string.urlsplit (link)); domain = string.lower (ul [2]); if domain beginswith "www." { domain = string.delete (domain, 1, 4)}}}}; <<if domain endswith ".co.uk" //do an extra popsuffix <<domain = string.popsuffix (domain) <<domain = string.popsuffix (domain) //get rid of .com, .net, .org <<if domain contains "." <<domain = string.lastfield (domain, ".") <<adritem^.domainFull = domain local (s, title = string.trimwhitespace (adritem^.title), permalink = "p" + number (nameof (adritem^))); bundle { //set s local (i); s = "<a name=\"" + permalink + "\"></a>" + string.trimwhitespace (adritem^.description); if s endswith "</a>" { //if it ends with a link, pop it off for i = sizeof (s) downto 1 { if s [i] == ' ' { s = string.mid (s, 1, i-3); break}}}}; if sizeof (title) == 0 { if sizeof (domain) > 0 { s = s + " <a href=\"" + adritem^.link + "\">" + domain + "</a>"}} else { s = "<a href=\"" + adritem^.link + "\">" + title + "</a> " + s}; s = s + " <a href=\"#" + permalink + "\">" + imgPermalink + "</a><br /><br />"; add (s); currentdaytext = currentdaytext + s; //12/6/10 by DW return (ct++ < maxct)}; mainresponder.calendar.visitReverseChronologic (@adrfeed^.calendar, @visit); bundle { //build t.reportText from htmlarray local (i); t.reportText = ""; for i = 1 to sizeof (htmlarray) { t.reportText = t.reportText + htmlarray [i]}; t.reportText = t.reportText + htmltext}}; bundle { //save file local (s = string.multiplereplaceall (string (adruser^.prefs.htmlArchiveTemplate), @t, false, "<%", "%>")); adrfeed^.stats.htmlUrl = radio2Suite.writeStaticFile (adruser, adrfeed^.prefs.htmlArchive.filename, s); adrfeed^.stats.ctArchiveBuilds++; adrfeed^.stats.whenLastArchiveBuild = clock.now ()}}; bundle { //test code buildhtmlarchive (@config.radio2.users.dave, @config.radio2.users.dave.feeds.["linkblog.xml"])}
This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.