Monday, November 08, 2010 at 12:07 AM.
system.verbs.builtins.xml.rss.getHtmlRendering
on getHtmlRendering (adrservice, boxTitle=nil, width=125, frameColor="#000000", titleBarTextColor="#000000", titleBarColor="#ADD8E6", boxFillColor="#FFFFFF", timeZone="PST", maxItems=infinity, timeZoneOffsetHours=0) { <<Changes: <<10/21/01; 9:35:58 PM by DW <<All items have bullets, even if they don't have sources. <<05/07/01; 8:17:37 PM by JES <<New optional parameter, timeZoneOffsetHours, used for adjusting time display, according to a Manila site's time zone pref setting. Bug fix: display the time if the channel was updated in the last 24 hours. Formerly, the update time was displayed as a date, even if it had been updated one minute ago, at 12:00 AM. <<3/28/01; 2:18:17 PM by PBS <<Added alt attributes to img tags, for proper HTML. <<02/09/01; 6:50:57 PM by PBS <<New optional maxItems parameter, defaults to infinity (current behavior), allows the caller to specify the maximum number of news items that appear in the HTML rendering. <<1/6/2001; 2:45:19 PM by DW <<In the box title, replace all spaces with non-breaking spaces. <<1/6/2001; 2:41:15 PM by DW <<Use a different bullet, one that displays well on a non-white background. <<01/04/01; 5:38:13 PM by JES <<Changed the width attribute for the inner-most td tags to 100%, since IE for Windows wasn't respecting the absolute width attribute. <<1/4/2001; 3:49:55 PM by JES <<Fixed HTML validation error, and problem with width specification. <<1/4/2001; 8:19:02 AM by DW <<More tweaks to formatting w/o box. <<1/2/2001; 1:31:26 PM by DW <<Minor tweaks to formatting w/o box. <<1/2/01; 12:22:56 PM by DW <<If width is infinity, don't do the box. local (flbox = width != infinity); local (adrtable = @adrservice^.compilation); on neuter (s) { s = string.replaceall (s, "{", "{"); //neuter macros s = string.replaceall (s, "'", "'"); return (s)}; local (htmltext = "\r\n", indentlevel = 0); on add (s) { htmltext = htmltext + string.filledString ("\t", indentlevel) + s + "\r\n"}; if boxTitle == nil { boxTitle = neuter (adrtable^.channelTitle)}; boxTitle = string.replaceAll (boxTitle, " ", " "); add ("<!-- RSS-to-HTML rendering done by UserLand on " + date.netstandardstring (clock.now ()) + " -->"); if flbox { add ("<table width=\"" + width + "\" cellspacing=\"0\" cellpadding=\"1\" border=\"0\">"); indentlevel++; add ("<tr bgcolor=\"" + framecolor + "\">"); indentlevel++; add ("<td width=\"" + width + "\">"); indentlevel++; add ("<table width=\"" + width + "\" cellspacing=\"0\" cellpadding=\"7\" border=\"0\">"); indentlevel++}; local (timeString); bundle { //add title bar row bundle { //set timestring local (day, month, year, hour, minute, second); local (yesterday = date.yesterday (clock.now ()) + (timeZoneOffsetHours * 3600)); local (timeLastChange = adrservice^.timeLastChange + (timeZoneOffsetHours * 3600)); date.get (timeLastChange, @day, @month, @year, @hour, @minute, @second); if timeLastChange > yesterday { //only show time minute = string.padwithzeros (minute, 2); if hour == 0 { timeString = "12:" + minute + "AM"} else { if hour < 12 { timeString = hour + ":" + minute + "AM"} else { if hour == 12 { timeString = hour + ":" + minute + "PM"} else { timeString = (hour - 12) + ":" + minute + "PM"}}}; timestring = timeString + " " + timeZone} else { timeString = month + "/" + day + "/" + year}}; if flbox { add ("<tr bgcolor=\"" + titleBarColor + "\">"); indentlevel++; add ("<td width=\"" + width + "\" height=\"22\" nowrap><a href=\"" + adrtable^.channelLink + "\"><b><font color=\"" + titleBarTextColor + "\">" + boxTitle + "</font></b></a></td><td> </td><td nowrap align=\"right\"><font color=\"" + titleBarTextColor + "\" size=\"-1\">" + "" + timeString + "</font></td>"); add ("</tr>"); indentlevel--}}; bundle { //add one-pixel row in the frame color if flbox { add ("<tr bgcolor=\"" + frameColor + "\"><td width=\"" + width + "\" height=\"1\"></td></tr>")}}; bundle { //add the body local (imageLink = ""); if defined (adrtable^.imagelink) { //the image is optional imageLink = "<a href=\"" + adrtable^.imagelink + "\"><img src=\"" + adrtable^.imageurl + "\" border=\"0\" align=\"right\" vspace=\"3\" alt=\"\"></a>"}; //PBS 03/28/01: alt tag required if flbox { add ("<tr bgcolor=\"" + boxFillColor + "\">"); indentlevel++; add ("<td width=\"100%\" colspan=\"3\">"); indentlevel++} else { add ("<table cellspacing=\"0\" cellpadding=\"5\" border=\"0\">"); indentlevel++}; <<add ("<tr><td></td><td><font size=\"-1\">XML</font></td></tr>") bundle { //generate the news items local (storyLink, i, ct = 0); if sizeof (imagelink) > 0 { add (imagelink)}; for i = sizeof (adrtable^.items) downto 1 { local (adritem = @adrtable^.items [i], bullet = ""); bundle { //set bullet local (align = ""); if flbox { align = " hspace=\"10\" vspace=\"2\" align=\"left\""}; if defined (adritem^.sourceChannelTitle) { bullet = "<a href=\"" + adritem^.sourceChannelUrl + "\" title=\"Source: " + adritem^.sourceChannelTitle + "\"><img src=\"http://www.scripting.com/images/bullet.gif\" height=\"10\" width=\"5\"" + align + " border=\"0\" alt=\"Source: " + adrItem^.sourceChannelTitle + "\"></a>"} //PBS 03/28/01: add alt tag -- it's the name of the source <<http://static.userland.com/shortcuts/images/qbullets/text.gif else { bullet = "<img src=\"http://www.scripting.com/images/bullet.gif\" height=\"10\" width=\"5\"" + align + " border=\"0\" alt=\"Bullet\">"}}; if flbox { add (bullet + neuter (adritem^.title) + "<br><br>")} else { add ("<tr>"); indentlevel++; add ("<td valign=\"top\"><center>" + bullet + "</center></td>"); add ("<td>" + neuter (adritem^.title) + "</td>"); add ("</tr>"); indentlevel--; add ("<tr height=\"8\"><td colspan=\"2\"></td></tr>")}; ct++; if ct == maxItems { //PBS 02/08/01: respect maxItems parameter break}}}; if not flbox { add ("<tr height=\"8\"><td colspan=\"2\"></td></tr>"); add ("<tr><td colspan=\"2\"><font size=\"-1\"><i>Source: <a href=\"" + adrservice^.xmlurl + "\" title=\"Click on this link to see the XML version of the '" + boxTitle + "' channel.\">" + boxTitle + "</a>; Updated: " + timeString + ".</i></font></td></tr>"); add ("</table>"); indentlevel--}; if defined (adrtable^.textInputTitle) { //add the textinput form add ("<form name=\"my.userland.com textinput\" action=\"" + adrtable^.textInputLink + "\" method=\"GET\"><font size=\"-0\">"); indentlevel++; add ("<b>" + adrtable^.textInputDescription + "</b>:<br>"); add ("<input type=\"text\" name=\"" + adrtable^.textInputName + "\" size=\"20\" maxlength=\"100\" value=\"\">"); add ("<input type=\"submit\" value=\"" + neuter (adrtable^.textInputTitle) + "\">"); add ("</form></font>"); indentlevel--}; if flbox { add ("</td>"); indentlevel--; add ("</tr>"); indentlevel--}}; if flbox { add ("</table>"); indentlevel--; add ("</td>"); indentlevel--; add ("</tr>"); indentlevel--; add ("</table>"); indentlevel--}; adrservice^.htmlRendering = htmltext; <<scratchpad.service = adrservice^ return (htmltext)} <<bundle //test code <<webbrowser.displaytext (getHtmlRendering (@scratchpad.service, width:300))
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.