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.