Monday, November 08, 2010 at 12:07 AM.
system.verbs.builtins.xml.aggregator.storyArrivedCallback
on storyArrivedCallback (adrservice, adritem) { <<Changes <<8/23/06; 6:05:00 AM by DW <<We already copy the permalink if it's available, if it's not, and there's a guid, copy that. <<This makes it possible for the NYTimesRiver app to work for pubs that only have guids. <<Duplicate stories are a nuisance, on a PDA screen they're ridiculous. <<6/27/06; 11:18:22 AM by DW <<The opmlDirectory code could read a feed, but we don't need to save stories in aggregatorData.stories. The table quickly gets huge and slows down the server. So we klooge in a flag keeps the stories from being saved in this circumstance. See opmldirectorySuite.walk for the other side. <<6/12/03; 1:02:12 PM by JES <<If the pref is set to save item data (adrdata^.prefs.flSaveItemData == true), copy the item's data table to the story table. <<1/23/03; 11:31:45 AM by DW <<If the item has a permalink, copy it in into the story. <<10/17/02; 5:22:07 PM by JES <<If the item has comments, copy the url into the story. <<4/25/02; 12:10:02 PM by DW <<Don't pass the enclosure table through html.neuterJavaScript, it's a senseless thing to do. Whoever added this code must not have looked to see that the enclosure is a table, not a string. <<1/28/02; 6:34:48 PM by JES <<Don't convert the channelTitle and storyText to Mac text (on MacOS), since this is already done in xml.rss.compileService. <<11/7/01; 7:13:04 PM by DW <<Change system.temp.aggregator to adrdata^.stats.lastRun. <<2/22/01; 10:09:33 PM by JES <<If this is a Mac, convert the channel title and story text to Mac text. <<2/20/01; 4:18:21 PM by PBS <<Make sure JavaScript is neutered. Curly braces are already neutered by xml.rss.compileService. <<1/13/01; 6:47:08 PM by DW <<If the item has an enclosure copy it into the story. <<1/8/01; 10:37:11 AM by DW <<Clear the viewStories cache when a story arrives. <<Monday, December 18, 2000 at 8:39:44 AM by DW <<Created. adrservice points to the service that contains the story, adritem points to an item in a channel compilation. local (flskip = false); bundle { //6/27/06; 11:16:14 AM by DW try { if not system.temp.opmlDirectory.flSaveStories { flskip = true}}}; if not flskip { <<bundle //stack dump, 6/27/06; 11:24:31 AM by DW <<local (adrdumps = @scratchpad.dumps) <<if not defined (adrdumps^) <<new (tabletype, adrdumps) <<local (adrdump = @adrdumps^.[string.padwithzeros (sizeof (adrdumps^), 5)]) <<if not defined (adrdump^) <<new (tabletype, adrdump) <<thread.getstackdump (adrdump) local (adrdata = xml.aggregator.init ()); adrdata^.stats.lastRun.ctNewStories++; semaphore.lock (this, 2600); local (adrstory = @adrdata^.stories.[string.padwithzeros (adrdata^.prefs.nextStoryNum++, 8)]); semaphore.unlock (this); new (tabletype, adrstory); adrstory^.url = html.neuterJavaScript (nameof (adrservice^)); adrstory^.channeltitle = html.neuterJavaScript (adrservice^.compilation.channeltitle); adrstory^.storytext = html.neuterJavaScript (adritem^.title); adrstory^.time = clock.now (); <<if system.environment.isMac <<adrstory^.channeltitle = latinToMac.convert (adrstory^.channeltitle) <<adrstory^.storytext = latinToMac.convert (adrstory^.storytext) if defined (adritem^.enclosure) { adrstory^.enclosure = adritem^.enclosure}; if defined (adritem^.comments) { adrstory^.comments = adritem^.comments}; if defined (adritem^.permalink) { adrstory^.permalink = adritem^.permalink}; if defined (adritem^.guid) { //8/23/06 by DW adrstory^.guid = adritem^.guid}; if adrdata^.prefs.flSaveItemData { //JES 6/12/03: Save item data if the pref is set if defined (adritem^.data) { adrstory^.data = adritem^.data}}; bundle { //PBS 02/20/01: make sure the compilation table for this service has its JavaScript neutered <<This should be fast, because html.neuterJavaScript returns right away if a string doesn't contain a < character, and none of these items should contain a < character. In the case where one does, it's a good thing we're doing this neutering. if defined (adrService^.compilation) { local (adr); for adr in @adrService^.compilation { if typeOf (adr^) == stringType { adr^ = html.neuterJavaScript (adr^)}}}}; <<adrstory^.data = adritem^ bundle { //call the callbacks try { local (adrcallback); for adrcallback in @adrdata^.callbacks.storyArrived { while typeOf (adrcallback^) == addressType { adrcallback = adrcallback^}; adrcallback^ (adrservice, adrItem)}}}; xml.aggregator.clearCache (); return (adrstory)}} <<bundle //test code <<storyArrivedCallback (@aggregatorData.services.["http://betterbadnews.com/rss20_xml"], @aggregatorData.services.["http://betterbadnews.com/rss20_xml"].compilation.items.["00003"])
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.