Monday, November 08, 2010 at 12:07 AM.
system.verbs.builtins.xml.rss.formatDrivers.NewYorkTimes.compile
on compile (adrservice, flSaveData, adrStoryArrivedCallback) { <<Changes <<3/20/02; 8:56:12 AM by DW <<Sam Devore and others got hit by a limit in xml.getAddressList re the length of addresses. If they get too long the kernel starts doing weird things. Work around it by working with a copy of the compiled XML structure. <<3/19/02; 5:42:21 PM by DW <<Handle case where byline is empty. <<Decode the timestamp into the internal date format. <<3/19/02; 1:31:15 PM by DW <<Assume one section only per feed, include the section title in the channel title. <<3/15/02; 2:58:27 PM by DW <<Created. on decode (s) { return (xml.rss.decodeString (s))}; on easy2readname (name) { <<Convert BULL MANCUSO to Bull Mancuso. local (s = "", flcap = true, ch); while sizeof (name) > 0 { ch = name [1]; name = string.delete (name, 1, 1); if not flcap { ch = string.lower (ch)}; s = s + ch; flcap = ch == " "}; return (s)}; on converttimestamp (nytimesformatdate) { <<Convert something like 20020319140340 to a date type. local (day, month, year, hour, minute, second); date.get (clock.now (), @day, @month, @year, @hour, @minute, @second); try {year = number (string.mid (nytimesformatdate, 1, 4))}; try {month = number (string.mid (nytimesformatdate, 5, 2))}; try {day = number (string.mid (nytimesformatdate, 7, 2))}; try {hour = number (string.mid (nytimesformatdate, 9, 2))}; try {minute = number (string.mid (nytimesformatdate, 11, 2))}; try {second = number (string.mid (nytimesformatdate, 13, 2))}; return (date.set (day, month, year, hour, minute, second))}; on addToHistory (adritem, categorylist={}) { local (title = adritem^.title); if sizeOf (title) > 0 { local (adrinhistory = @adrcompilation^.itemHistory.[title]); if not defined (adrinhistory^) { //it's a new story if adrStoryArrivedCallback != nil { adrStoryArrivedCallback^ (adrservice, adritem)}}; adrinhistory^ = true}}; //it's current local (xstructcopy = adrservice^.xmlstruct, adrxstruct = @xstructcopy); local (adrcompilation = @adrservice^.compilation); local (adrnewyorktimes = xml.getAddress (adrxstruct, "NewYorkTimes")); new (tabletype, @adrcompilation^.items); local (sectionlist = xml.getAddressList (adrnewyorktimes, "Section"), ct = 1, i); local (section = sectionlist [1]); local (sectionname = xml.getAttributeValue (section, "name")); bundle { //set channeltitle, channellink, channeldescription adrcompilation^.channeltitle = "New York Times: " + sectionname; adrcompilation^.channellink = "http://radio.userland.com/newYorkTimes"; adrcompilation^.channeldescription = "Headlines, abstracts and links for the latest New York Times articles, for Radio UserLand."}; local (articlelist = xml.getAddressList (section, "article"), article); for j = sizeof (articlelist) downto 1 { local (article = articlelist [j]); adritem = @adrcompilation^.items.[string.padwithzeros (ct++, 5)]; new (tabletype, adritem); local (link = decode (xml.getValue (article, "url"))); local (title = decode (xml.getValue (article, "headline"))); local (byline = easy2readname (decode (xml.getValue (article, "byline")))); local (description = decode (xml.getValue (article, "abstract"))); adritem^.title = "<a href=\"" + link + "\">" + title + "</a>. " + description; if sizeof (byline) > 0 { adritem^.title = adritem^.title + " " + byline + "."}; if flSaveData { local (adrdata = @adritem^.data); new (tabletype, adrdata); adrdata^.link = link; adrdata^.title = title; adrdata^.description = description; adrdata^.byline = byline; adrdata^.timestamp = converttimestamp (decode (xml.getValue (article, "timestamp")))}; addToHistory (adritem)}; return (true)} <<bundle //test code <<local (url = "http://radiouser:Csm!]-tvMm@partners.userland.com/nyt/business.xml") <<local (adrservice = xml.rss.initService (url, @aggregatorData.services)) <<new (tabletype, @adrservice^.compilation) <<new (tabletype, @adrservice^.compilation.itemHistory) <<adrservice^.xmltext = tcp.httpReadUrl (url) <<xml.compile (adrservice^.xmltext, @adrservice^.xmlstruct) <<compile (adrservice, true, @xml.aggregator.storyArrivedCallback)
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.