Monday, November 08, 2010 at 12:04 AM.
system.verbs.builtins.mainResponder.adminSite.prefs.subscriptions
on subscriptions () { <<Changes <<3/13/03; 3:11:00 AM by JES <<When unsubscribing from a feed, make sure that all installed Manila sites are also unsubscribed. <<3/10/03; 8:44:32 PM by JES <<Set the border attribute for the XML icon IMG tag to "0". <<3/4/03; 3:34:29 PM by JES <<Created. Render the list of subscriptions global to this server, along with a field for adding a new subscription. local (htext); on add (s) { htext = htext + (s + "\r");}; on getDateString (when, flIncludeSeconds=true) { <<Changes <<1/15/01; 11:00:50 AM by DW <<Return the time string if it's today, return the date string if it's earlier. local (day, month, year, hour, minute, second, nowday, nowmonth, nowyear); date.get (when, @day, @month, @year, @hour, @minute, @second); date.get (clock.now (), @nowday, @nowmonth, @nowyear, @hour, @minute, @second); if (day == nowday) and (month == nowmonth) and (year == nowyear) { return (date.timestring (when, flIncludeSeconds))}; return (date.shortstring (when))}; local (xmlimg = "<img src=\"/mainResponderResources/userlandIcons/xml\" height=\"14\" width=\"36\" border=\"0\">"); local (pta = html.getPageTableAddress ()); local (adrdata = xml.aggregator.init ()); pta^.errorString = ""; pta^.adrNewService = nil; pta^.flAddSubmitButton = false; if pta^.method == "POST" { //add or remove subscription(s) local (adrargs = @pta^.postArgs); if defined (adrargs^.subscribe) { //user click the Subscribe button local (rssurl = adrargs^.url); if not (rssurl beginswith "http://") { rssurl = "http://" + rssurl}; if rssurl != "http://" { //add this subscription xml.aggregator.subscribeService (rssurl, @pta^.errorString, @pta^.adrNewService)}}; if defined (adrargs^.unsubscribe) { //user clicked the Unsubscribe button local (i, adr, adrservice); for i = sizeof (adrargs^) downto 1 { adr = @adrargs^[i]; local (urlservice = string.urlDecode (nameof (adr^)) ); adrservice = @adrdata^.services.[urlservice]; if defined (adrservice^) { xml.aggregator.unsubscribeService (nameof (adrservice^))}; local (nomad); for nomad in @config.manila.sites { local (adrsite = nomad^); if defined (adrsite^) { local (adrnewssite = manilaSuite.getNewsSiteAddress (adrsite)); if defined (adrnewssite^) { if defined (adrnewssite^.aggregator) { if defined (adrnewssite^.aggregator.services.[urlservice]) { delete (@adrnewssite^.aggregator.services.[urlservice])}}}}}}}}; bundle { //field to subscribe to a new feed, Subscribe button local (initialurl = "http://"); if defined (pta^.searchArgs) { //try to get the initial URL from a url argument in the request if pta^.searchArgs != "" { local (t); new (tableType, @t); webserver.parseArgs (pta^.searchArgs, @t); if defined (t.url) { initialurl = t.url}}}; add ("<td align=\"left\">" + "URL" + ":</td>"); add ("<td valign=\"top\"><input type=\"text\" name=\"url\" size=\"55\" maxlength=\"255\" value=\"" + initialurl + "\"> <input type=\"submit\" name=\"subscribe\" value=\"Add\"></td>"); if pta^.errorString != "" { //show the error to the user add ("</tr><tr><td colspan=\"2\"><br><i>Can't subscribe to the channel. The most likely cure is to check the URL in a web browser and see if you can get it to read the feed. The following message probably won't help you figure out what went wrong, but we include it here because it might: \"" + errorstring + "\"</i></td>")}; if pta^.adrNewService != nil { //show confirmation to the user local (channeltitle = xml.entityDecode (pta^.adrNewService^.compilation.channeltitle, true, true) ); add ("</tr><tr><td colspan=\"2\"><br><i>Congratulations, you have successfully added the \"" + channeltitle + "\" feed to the news feeds available on this server. It now appears in the list of available feeds below. For subscribed sites, new items will appear on the Aggregator page every hour.</i></td>")}; add ("</td>")}; if sizeOf (adrdata^.services) > 0 { //list of feeds with check boxes and Delete button bundle { //add explanatory text add ("</tr><tr><td colspan=\"2\">"); add ("<br><br>The following table lists the feeds available to sites on this server. Included is the name of the source, linked to its Web page, the time or day it last changed, the number of times it has changed since it was added, and a link to the XML file for the channel. To delete a feed, check it and then click on the Unsubscribe button at the bottom of the page.<br><br>"); add ("</td>")}; add ("</tr><tr><td colspan=\"2\"><blockquote>"); local (sortedtable, adr, adrsort); bundle { //fill sorted table new (tabletype, @sortedtable); for adr in @adrdata^.services { if defined (adr^.compilation) { if sizeof (adr^.compilation) > 0 { try { //missing channeltitle doesn't stop us -- 3/20/02 DW local (channeltitle = adr^.compilation.channeltitle); if sizeof (channeltitle) > 0 { adrsort = @sortedtable.[adr^.compilation.channeltitle]; if defined (adrsort^) { //collision local (ct = 1); loop { adrsort = @sortedtable.[adr^.compilation.channeltitle + "." + ct++]; if not defined (adrsort^) { break}}}; adrsort^ = nameof (adr^)}}}}}}; bundle { //start the HTML table add ("<table cellspacing=\"0\" cellpadding=\"0\"><tr bgcolor=\"DCDCDC\"><td>"); add ("<table cellspacing=\"1\" cellpadding=\"5\" border=\"0\">")}; for adrsort in @sortedtable { //add the table rows for each channel adr = @adrdata^.services.[adrsort^]; if defined (adr^.compilation) { if sizeof (adr^.compilation) > 0 { local (title = adr^.compilation.channeltitle); local (channeldescription = "", channellink = ""); if defined (adr^.compilation.channeldescription) { channeldescription = xml.entityDecode (adr^.compilation.channeldescription, true, true); channeldescription = string.replaceAll (channeldescription, "\"", """); channeldescription = string.replaceAll (channeldescription, "\'", "'"); channeldescription = string.replaceAll (channeldescription, "<", "<"); channeldescription = string.replaceAll (channeldescription, ">", ">")}; if defined (adr^.compilation.channellink) { channellink = adr^.compilation.channellink}; add ("<tr bgcolor=\"white\">"); bundle { //add checkbox local (name = nameof (adr^)); local (checkboxval = "xxx "); if false { checkboxval = checkboxval + "checked"}; add ("<td valign=\"top\"><input type=\"checkbox\" name=\"" + string.urlEncode (nameOf (adr^)) + "\" value=" + checkboxval + "></td>")}; if sizeof (title) > 50 { title = string.mid (title, 1, 50) + "..."}; add ("<td valign=\"top\" title=\"" + channeldescription + "\" nowrap><a href=\"" + channellink + "\">" + xml.entityDecode (title, true, true) + "</a></td>"); add ("<td align=\"right\" valign=\"top\"><nobr><font size=\"-1\">" + getDateString (adr^.timeLastChange, false) + "</font></nobr></td>"); add ("<td align=\"right\" valign=\"top\"><font size=\"-1\">" + adr^.ctChanges + "</font></td>"); add ("<td valign=\"top\"><a href=\"" + nameof (adr^) + "\" title=\"Click to view the current XML source text for the channel.\">" + xmlimg + "</a></td>"); add ("</tr>")}}}; bundle { //end the HTML table add ("</table></td></tr></table>")}; add ("</blockquote></td>"); bundle { //Unsubscribe button add ("</tr><tr><td colspan=\"2\">"); add ("<br><input type=\"submit\" name=\"unsubscribe\" value=\"Unsubscribe\">"); add ("</td>")}}; return (htext)}
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.