Monday, November 08, 2010 at 12:05 AM.
system.verbs.builtins.radio.hotlist.main
on main () {
<<Changes:
<<1/6/02; 3:46:25 AM by JES
<<Added table css classes.
<<11/28/01; 11:08:16 PM by JES
<<Set pta^.title to the localized title.
<<11/13/01; 5:48:11 PM by DW
<<Prepared for localization.
<<11/9/01; 10:34:03 PM by DW
<<Rewrite.
<<10/20/01; 12:16:27 AM by JES
<<Set adraggregatordata^.settings.flSubscriptionsChanged to true, after unsubscribing from a channel. Causes mySubscriptions.opml to be re-written.
<<8/12/01; 4:22:32 PM by JES
<<Fixed a typo when checking to see if the cache needs clearing: if defined, not if defind. (Duh.)
<<8/8/01; 10:23:21 PM by JES
<<Ported to builtins.radio.
<<3/4/01; 6:15:58 PM by JES
<<Toss the homepage cache when unsubscribing from a channel.
<<2/25/01; 2:24:50 PM by JES
<<If rendering for a remote browser, delete the remote stories cache, not the local machine cache, when subscribing to a new channel.
<<2/25/01; 1:37:10 PM by PBS
<<Set up a second cache for when it's not the same machine.
<<2/25/01; 1:26:29 PM by JES
<<Toss the homepage cache after reading a newly subscribed channel.
<<2/25/01; 1:07:46 PM by JES
<<When subscribing to new channels, read the channel right away. Stories appear on the homepage, and the channel appears on the Subscriptions page.
<<2/24/01; 5:10:36 PM by PBS
<<Terminology: channels, not sources.
<<Help link next to the description.
<<2/23/01; 10:25:03 PM by PBS
<<When subscribing or unsubscribing, set the flag so that mySubscriptions.opml gets rebuilt.
<<2/20/01; 5:10:58 PM by PBS
<<No need to call myUserLandSuite.unTaint here, as data is untainted when it enters the system.
<<2/15/01; 3:12:26 PM by PBS
<<Fixed a typo in the text at the top of the page. Prevented macros from being executed.
<<2/12/01; 5:13:48 PM by PBS
<<XML buttons get link titles, consistent with other pages.
<<2/8/01; 7:41:08 AM by DW
<<Some sources don't have descriptions, so don't fail if you encounter one.
<<2/4/01; 3:11:19 PM by DW
<<Wrapped in a procedure to facilitate debugging.
<<1/24/01; 7:23:42 AM by DW
<<Oops, when I added the caching I didn't allow for POSTs, which must not be cached.
<<1/23/01; 2:12:28 PM by DW
<<Added "Last update" string at top of page.
<<Cache the rendering.
local (flUseCache = false); //set true when not debugging
local (pta = html.getpagetableaddress ());
pta^.title = radio.string.getlocalizedstring ("hotlist.title");
<<scratchpad.params = pta^; edit (@scratchpad.params) //debugging
local (adrdata = radio.hotlist.init ());
local (adraggregatordata = xml.aggregator.init ());
local (xmlimg = radio.images.systemImageRef ("icons/xml", flFileUrl:pta^.radioResponder.flSameMachine));
local (htmltext = "", indentlevel = 0);
on add (s) {
htmltext = htmltext + string.filledstring ("\t", indentlevel) + s + "\r\n"};
bundle { //if it's been more than 24 hours since we loaded the hotlist data, reload it
if adrdata^.prefs.dateLastRead <= date.yesterday (clock.now ()) {
radio.hotlist.reload ()}};
local (adrincache);
bundle { //set adrincache
if pta^.radioResponder.flSameMachine {
adrincache = @adrdata^.cache.main}
else {
adrincache = @adrdata^.cache.mainRemote}};
bundle { //use the cache if you can
if (pta^.method == "GET") and defined (adrincache^) and flUseCache {
return (string (adrincache^))}};
if pta^.method == "POST" {
local (adrargs = @pta^.radioResponder.postArgs);
<<scratchpad.args = adrargs^; edit (@scratchpad.args)
try {delete (@adrargs^.subscribe)};
bundle { //subscribe to checked channels that we aren't subscribed to
local (adrarg, adrhotlistservice, adrservice);
for adrarg in adrargs {
adrhotlistservice = @adrdata^.top100 [number (nameof (adrarg^))];
adrservice = @adraggregatordata^.services.[adrhotlistservice^.xmlUrl];
if not defined (adrservice^) { //not subscribed
local (errorstring);
xml.aggregator.subscribeService (adrhotlistservice^.xmlUrl, @errorstring)}}};
bundle { //unsubscribe from unchecked channels that we are subscribed to
local (i, adrhotlistservice, adrservice);
for i = 1 to sizeof (adrdata^.top100) {
if not defined (adrargs^.[string.padwithzeros (i, 3)]) {
adrhotlistservice = @adrdata^.top100 [i];
adrservice = @adraggregatordata^.services.[adrhotlistservice^.xmlUrl];
if defined (adrservice^) { //the user is subscribed to this channel
xml.aggregator.unsubscribeService (adrhotlistservice^.xmlUrl)}}}}};
add ("<form method=\"POST\">"); indentlevel++;
bundle { //add the Subscribe button
add ("<table align=\"right\" cellspacing=\"0\" cellpadding=\"7\"><tr><td valign=\"top\"> <input type=\"submit\" name=\"subscribe\" value=\"" + radio.string.getlocalizedstring ("hotlist.subscribeButton") + "\"></td></tr></table>")};
bundle { //add the Description, Last Update text and Help icon
pta^.title = radio.string.getlocalizedstring ("hotlist.title");
add (radio.string.getlocalizedstring ("hotlist.intro"));
add ("<i>" + radio.string.getlocalizedstring ("hotlist.lastUpdate") + ": " + radio.string.getDateString (adrdata^.prefs.dateLastRead) + ".</i> " + radio.userinterface.helplink ("The Hotlist page") + "<p>")};
add ("<table class=\"dwsFrameTable\" cellspacing=\"0\" cellpadding=\"0\"><tr bgcolor=\"" + radio.data.htmlColors.framecolor + "\"><td>"); indentlevel++;
add ("<table class=\"dwsTable\" border=\"0\" cellspacing=\"1\" cellpadding=\"5\">"); indentlevel++;
local (adr, ct = 0);
for adr in @adrdata^.top100 {
ct++;
add ("<tr bgcolor=\"" + radio.data.htmlColors.cellbgcolor + "\">"); indentlevel++;
bundle { //add checkbox
local (name = number (nameof (adrpost^)));
local (checkboxval = "xxx ");
if defined (adraggregatordata^.services.[adr^.xmlUrl]) {
checkboxval = checkboxval + "checked"};
add ("<td class=\"dwsTableCell\" valign=\"top\"><input type=\"checkbox\" name=\"" + string.padwithzeros (ct, 3) + "\" value=" + checkboxval + "></td>")};
add ("<td class=\"dwsTableCell\" align=\"right\" valign=\"top\"><font size=\"-1\">" + ct + "</font></td>");
add ("<td class=\"dwsTableCell\" valign=\"top\"><a href=\"" + adr^.htmlUrl + "\">" + adr^.title + "</a></td>");
local (description = "");
if defined (adr^.description) {
description = adr^.description};
add ("<td class=\"dwsTableCell\" valign=\"top\">" + description + "</td>");
add ("<td class=\"dwsTableCell\" align=\"right\" valign=\"top\"><font size=\"-1\">" + adr^.ctSubscribers + "</font></td>");
add ("<td class=\"dwsTableCell\" valign=\"top\"><a href=\"" + adr^.xmlUrl + "\" title=\"" + radio.data.strings.xmltooltip + "\">" + xmlimg + "</a></td>");
add ("</tr>"); indentlevel--};
add ("</table>"); indentlevel--;
add ("</td></tr></table>"); indentlevel--;
add ("</form>"); indentlevel--;
adrincache^ = htmltext;
return (htmlText)}
<<bundle //test code
<<html.setPageTableAddress (@scratchpad.params)
<<main ()
<<html.deletePageTableAddress ()
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.