Friday, March 25, 2011 at 12:00 AM.
system.verbs.builtins.log2.view
on view (when=clock.now (), source=nil, maxitems=100, flHeaderFooter=false, flSingleDay=true, flNestedTable=true) { <<Changes: <<3/24/11; 11:43:55 PM by DW <<New optional param, flNestedTable. If true, we display the table inside another table so there is a solid line betw cells. If it's false, you get a single table. <<9/12/10; 12:12:32 AM by DW <<Call new verb, date.viewDate to display the time/date of the log item. <<9/4/10; 3:12:20 PM by DW <<When displaying the time/date of the update, if it happened today, show the time -- if it happened before today, show the date. <<8/28/09; 10:13:46 AM by DW <<Add optional param, flSingleDay, default true. If false we go back into previous days if there are less than "maxitems" entries today. <<7/17/09; 8:28:40 AM by DW <<Turn off cache, for debugging. (Not clear it helps perf much. <<7/17/09; 8:02:31 AM by DW <<Add an optional parameter, flHeaderFooter, default false. If true, we display a navigation header and footer for the log readout. <<7/16/09; 2:25:05 PM by DW <<Remove dependencies on photoFanSuite. <<7/16/09; 1:27:37 PM by DW <<Add source param. If non-nil, we only include log elements from that source. Add maxitems param. Make the cache really work. <<2/5/08; 12:32:18 PM by DW <<Handle the case where there is no previous day (i.e. when you first install the software). <<1/20/08; 5:28:03 AM by DW <<Overhaul for new calendar-based event log. Accept a parameter that says what date to display events for. <<11/25/07; 6:27:10 PM by DW <<Relocate the cache to system.temp.photoFan.cache.viewEventsLog. <<11/25/07; 6:23:46 PM by DW <<Remove various FlickrRivr dependencies. <<11/25/07; 5:15:03 PM by DW <<Ported from FlickrRivr. local (adrdata = log2.init (), framecolor = "DCDCDC", cellBgColor = "FFFFFF"); local (adrcal = @adrdata^.calendar, now = clock.now ()); local (flusecache = false, adrcache = @system.temp.log2.viewLogCache); if flusecache { if not defined (adrcache^) { new (tabletype, adrcache)}; if source == nil { adrcache = @adrcache^.["nil"]} else { adrcache = @adrcache^.[string (source)]}; if defined (adrcache^) { return (adrcache^)}}; <<local (pta = html.getpagetableaddress ()) local (htmltext = "\r", indentlevel = 0, navtable); on add (s) { htmltext = htmltext + string.filledstring ("\t", indentlevel) + s + "\r"}; bundle { //add next/prev links if flHeaderFooter { local (prevlink = "Previous", nextlink = "Next"); bundle { //set prevlink local (nomad = when); loop { nomad = date.yesterday (nomad); if date.sameday (nomad, mainresponder.calendar.getfirstday (adrcal)) { break}; try { local (adrtable = mainresponder.calendar.getdayaddress (adrcal, nomad, false)); if defined (adrtable^) { local (day, month, year, hour, minute, second); date.get (nomad, @day, @month, @year, @hour, @minute, @second); month = string.padwithzeros (month, 2); day = string.padwithzeros (day, 2); prevlink = "<a href=\"" + pta^.uri + "?d=" + year + "/" + month + "/" + day + "\">" + prevlink + "</a>"; break}} else { break}}}; bundle { //set nextlink local (nomad = when); loop { if date.sameday (nomad, now) { break}; nomad = date.tomorrow (nomad); local (adrtable = mainresponder.calendar.getdayaddress (adrcal, nomad, false)); if defined (adrtable^) { local (day, month, year, hour, minute, second); date.get (nomad, @day, @month, @year, @hour, @minute, @second); month = string.padwithzeros (month, 2); day = string.padwithzeros (day, 2); nextlink = "<a href=\"" + pta^.uri + "?d=" + year + "/" + month + "/" + day + "\">" + nextlink + "</a>"; break}}}; navtable = "<table border=\"0\" width=\"100%\" cellpadding=\"0\" cellspacing=\"0\"><tr><td>" + date.longstring (when) + "</td><td align=\"right\">" + prevlink + " / " + nextlink + "</td></tr></table>"; add (navtable + "<br>")}}; add ("<center>"); indentlevel++; if flNestedTable { add ("<table cellspacing=\"0\" cellpadding=\"0\"><tr bgcolor=\"" + frameColor + "\"><td>"); indentlevel++}; add ("<table border=\"0\" cellspacing=\"1\" cellpadding=\"5\">"); indentlevel++; bundle { //add header add ("<tr bgcolor=\"" + cellBgColor + "\">"); indentlevel++; add ("<td><b>Event</b></td>"); add ("<td><b>What Happened</b></td>"); <<add ("<td><center><b>Picture</b></center></td>") //11/23/07 by DW -- disabled add ("<td align=\"right\"><b>When</b></td>"); add ("<td align=\"right\"><b>Seconds</b></td>"); add ("</tr>"); indentlevel--}; local (ct = 0); on doOneItem (adritem) { if source != nil { //7/16/09 by DW if adritem^.source != source { continue}}; if flusecache and defined (adritem^.cache) { add (adritem^.cache)} else { local (s); if flNestedTable { s = s + "<tr bgcolor=\"" + cellBgColor + "\">"} else { s = s + "<tr>"}; s = s + "<td valign=\"top\" nowrap>" + adritem^.eventType + " </td>"; bundle { //add htmltext local (htt = adritem^.htmlText); htt = string.replaceall (htt, "/frimg/", "/pfi/"); s = s + "<td valign=\"top\">" + htt + "</td>"}; <<bundle //imghtml, you can simplify this tomorrow, //11/23/07 by DW -- disabled <<if defined (adritem^.imghtml) <<s = s + "<td valign=\"top\"><center>" + adritem^.imghtml + "</center></td>" <<else <<s = s + "<td valign=\"top\"> </td>" local (when = date (xml.convertToDisplayName (nameof (adritem^)))); s = s + "<td valign=\"top\" align=\"right\" nowrap>" + date.viewDate (when) + "</td>"; s = s + "<td valign=\"top\" align=\"right\" nowrap>" + adritem^.secs + "</td>"; s = s + "</tr>"; adritem^.cache = s; add (s)}; return (++ct < maxitems)}; if flSingleDay { local (adrday = mainresponder.calendar.getdayaddress (adrcal, when), i); for i = sizeof (adrday^) downto 1 { if not doOneItem (@adrday^ [i]) { break}}} else { mainresponder.calendar.visitReverseChronologic (adrcal, @doOneItem)}; if flNestedTable { add ("</td></tr></table>"); indentlevel--}; add ("</table>"); indentlevel--; add ("</center>"); indentlevel--; if flHeaderFooter { add ("<br>" + navtable)}; filemenu.savemyroot (adrcal); if flusecache { adrcache^ = htmlText}; return (htmlText)}; bundle { //test code webbrowser.displaytext (view (source:"river2"))}
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.