Monday, November 08, 2010 at 12:05 AM.
system.verbs.builtins.radio.weblog.isDateOnHomePage
on isDateOnHomePage (d, adrblog=radio.weblog.init (), catname=nil) { <<Changes <<11/13/01; 11:44:10 PM by JES <<New optional parameter: catname. If specified, then the script will return true if the date is on the index page for the given category. Rewrote the algorithm used to find posts for the given date. <<bundle //old, wonky code <<local (ctdays = 0, i) <<local (day, month, year, hour, minute, second) <<local (lastday, lastmonth, lastyear) <<if catname == nil <<for i = ctposts downto 1 //find the newest post that's not on the home page <<date.get (adrposts^[i].when, @day, @month, @year, @hour, @minute, @second) <<if day == lastday and month == lastmonth and year == lastyear <<continue <<ctdays++ <<if ctdays > adrprefs^.ctDaysToDisplay <<break <<lastday = day <<lastmonth = month <<lastyear = year <<return (d >= adrposts^[i].when) <<else <<local (adrpost) <<for i = ctposts downto 1 //find the newest post that's not on the home page <<adrpost = @adrposts^[i] <<bundle //look for reasons to skip the post <<if not defined (adrpost^.categories) //no categories <<continue <<if not defined (adrpost^.categories.[catname]) //never been in this category <<continue <<if not adrpost^.categories.[catname] //removed from this category <<continue <<date.get (adrpost^.when, @day, @month, @year, @hour, @minute, @second) <<if day == lastday and month == lastmonth and year == lastyear //same date as last checked post <<continue <<ctdays++ <<if ctdays > adrprefs^.ctDaysToDisplay <<break <<lastday = day <<lastmonth = month <<lastyear = year <<if defined (adrpost^.categories) <<if defined (adrpost^.categories.[catname]) <<if adrpost^.categories.[catname] <<return (d >= adrpost^.when) <<return (false) <<9/4/01; 12:30:53 AM by JES <<Created. Return true if a given date is on the home page, or false if not. local (adrprefs = @adrblog^.prefs); local (adrposts = @adrblog^.posts); local (ctposts = sizeOf (adrposts^)); local (min = 0, max = ctposts); if max == 0 { //no posts; return false return (false)}; local (ixpost); bundle { //find the index of a post on the last day which appears on the home page local (adrpost); local (lastday, lastmonth, lastyear); local (ctdays = 0); ixpost = ctposts; loop { adrpost = @adrposts^[ixpost]; local (flCheckPost = true); if catname != nil { if not radio.weblog.isPostInCategory (adrpost, catname) { flCheckPost = false}}; if flCheckPost { local (postday, postmonth, postyear, posthour, postminute, postsecond); date.get (adrpost^.when, @postday, @postmonth, @postyear, @posthour, @postminute, @postsecond); if not (postday == lastday and postmonth == lastmonth and postyear == lastyear) { //new day ctdays++}; if ctdays >= adrprefs^.ctDaysToDisplay { //break -- ixpost is on the last day on the home page break}}; ixpost--; if ixpost == 0 { //no posts [for category] found -- any date will be on the home page return (true)}}}; local (adrlastpost = @adrposts^[ixpost]); local (theDay, theMonth, theYear, theHour, theMinute, theSecond); date.get (adrlastpost^.when, @theDay, @theMonth, @theYear, @theHour, @theMinute, @theSecond); local (lastDateOnHomePage = date.set (theDay, theMonth, theYear, 0, 0, 0)); return (d >= lastDateOnHomePage); } <<bundle //broken code <<bundle //first, do a binary search for a post on the given date <<loop <<ixpost = min + ((max - min) / 2) <<if ixpost <= 0 //no posts on, or after the given date <<return (false) <<adrpost = @adrposts^[ixpost] <<local (day, month, year, hour, minute, second) <<date.get (adrpost^.when, @day, @month, @year, @hour, @minute, @second) <<if day == theDay and month == theMonth and year == theYear //got one <<if catname == nil //weblog homepage -- return true <<return (true) <<else //have to find a post in the category -- break and let code below search for the post <<break <<if ixpost == min or ixpost == max //that's it for the search -- break <<break <<if adrpost^.when > d //split downwards <<max = ixpost <<if adrpost^.when < d //split upwards <<min = ixpost << <<bundle //then expand out 'till we find a post for the given day, or return false if none found <<on searchForPostInCategory (ixsearch, direction) <<loop //search more recent posts <<ixsearch = ixsearch + direction <<case direction <<-1 <<if ixsearch == 0 <<break <<1 <<if ixsearch > ctposts <<break <<local (day, month, year, hour, minute, second) <<date.get (adrpost^.when, @day, @month, @year, @hour, @minute, @second) <<if inCat (adrpost) //return true <<return (true) <<if not (day == theDay and month == theMonth and year == theYear) //off the day we're looking for -- break <<break <<return (false) <<if searchForPostInCategory (ixpost, -1) //search downwards <<return (true) <<if searchForPostInCategory (ixpost, 1) //search upwards <<return (true) <<bundle //testing <<local (d = date ("10/27/01")) <<local (d = date ("10/28/01")) <<local (d = date ("11/3/01")) <<local (d = date ("11/7/01")) <<local (d = date ("11/8/01")) <<local (d = date ("11/11/01")) <<local (d = date ("11/12/01")) <<dialog.notify (isDateOnHomePage (d, catname:"foo")) <<dialog.notify (isDateOnHomePage (d, catname:"Quotations")) <<dialog.notify (isDateOnHomePage (d))
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.