When I'm following a breaking news story or there's delayed developments or even a random thought occurs, I want to inform my readers in the most convenient way. If it's big enough, a whole new post may be warranted (with a link back to the earlier post). Otherwise, I ask myself: should it be done with a comment or with a manual update to the bottom of the original post? Thanks to Hearsay (and other recent comments hacks), a comment will have visibility across all blog pages, informing all visitors (but not subscribers). If there's a lot of comments on a particular post or a high rate of commenting on the blog, important updates can get lost. Alternatively, appending an update (or follow-up, postscript, addendum, errata or correction) to the post may not get out to subscribers and visitors who are interested.
I've tried to get the best of both worlds by using Yahoo Pipes to automatically generate an update feed for my blog. This feed consists of the most recent updates (to any post on my blog) and can be offered to subscribers, much like a regular post or comment feed. It can also be combined with Hearsay to produce a friendly sidebar panel to display the most recent updates to your site visitors.
The rest of this article introduces the Blogger Update Extractor pipe, explains its operation and how you can use it in your blog. I conclude with some possible alternative uses and pointers on future developments.
First of all, to get a clearer idea about the problem I'm talking about (and my solution), have a look at this post about a court case I was following. As you can see, there were five updates (each about two paragraphs) over the twelve months after the original post. This is fairly common with my posts - perhaps a quarter of them feature one or more updates like this.
I have long adopted the convention of using *** UPDATE *** to indicate that the subsequent text has been appended to the original post. I also use a named anchor (eg <a name="update1"> ... </a>) on each update heading. Why? Two reasons. Firstly, it gives me a unique URL for each update (ie http://...#update1) in case someone wishes to bookmark it. Secondly, my Blog-Nav system picks up anchors so that users can jump up and down the page (use the up/down arrow in the top right to see).
What the Update Extractor pipe does is gather my blog's RSS feed (not Atom - see below) and parse out the updates, returning a new RSS feed that consists of just the most recent updates. This works because of handy feature in Blogger's RSS feed that is not present in Atom: when you update any post it automatically goes to the top of your RSS feed. The rest is just straightforward regular expressions in Yahoo's Pipes.
With this new feed, you can offer it to readers (perhaps after burning it through FeedBurner for stats) and/or display it in your blog's sidebar to let all readers know. The links will point to the actual update, not just the post (eg http://...#update1)
Now, the latest Blogger has support for displaying arbitrary RSS feeds: you can simply use that. Or, you can create a "special" feed that will work with the Hearsay hack to give you a bit more control over presentation.
If you want an RSS feed of your recent updates, use this URL:
http://pipes.yahoo.com/pipes/pipe.run?BlogID=xxxxxxxx&_id=pAQ35A322xGwxdeMouNLYQ&_run=1&_render=rss
(replace xxxxxxxx with your blog's Blogger ID)
If you want a Hearsay-style sidebar panel of your recent updates, insert this code into your Blogger template sidebar:
<div id="recent-updates" ><center><br/><br/><br/>Please wait ... <br/>loading updates.<br/><br/><img src="http://ghill.customer.netspace.net.au/snake_transparent.gif"/></center></div>
<script type="text/javascript" src="http://ghill.customer.netspace.net.au/hearsay/hearsay-v01c.js"></script>
<script type="text/javascript">
hearsay("http://pipes.yahoo.com/pipes/pipe.run?BlogID=xxxxxxxx&_id=Ik9FeAz22xGZT18tqWIyXQ&_run=1&_render=json", "recent-updates", true);
</script>
(Again, where xxxxxxxx is your blog's Blogger ID.)
The Update Extractor comes in three flavours: "Full" grabs all the text following an update (ie to the end of the post); "Partial" grabs just the next (substantial) paragraph and "Hearsay" grabs the partial feed but prepares it for display by the Hearsay script. Please feel free to clone and modify the pipes as needed; I'd appreciate it if you could put a comment here so I can have a look.
NB: Using more Pipes, your blog's update feed can be merged easily with your blog's comment feed if that would make more sense for your blog.
One downside of this solution is when there are multiple updates to a post: it will only "see" the most recent (ie physically last) update. This is okay for low-frequency updates but completely inadequate if you put your updates at the top of the blog.
The problem is that the feed doesn't contain any information about the time of all the updates, just the first publication timestamp and the most-recent update timestamp. To deal with this, I'm now using a new convention whereby instead of naming my anchors "update1", "update2" etc I'm using a timestamp "update1177829961000". Future versions of the pipe will be able to see this and handle multiple updates per post intelligently.
Rather than typing all that in each time, I've made a bookmarklet to help out. (See below for code.) The automatically generated update heading looks like this:
<center><a title="Sunday, 29 April 2007 04:59:21 PM" name="update1177829961000"><span style="font-weight:bold;">*** UPDATE ***</span></a></center>
This same basic approach - mark out content with an anchor, process the RSS feed through Pipes and display via JSON - can apply to other content too. For example, I quote heavily from newspapers in my blog posts, so I could create a feed just of quotes. You could also make a feed for hat-tips, code, links, images, citations, headings or pretty much anything else.
So there you have it: blog update feeds for your subscribers and visitors. As usual, comments, criticisms and suggestions are most welcome.
Timestamp Anchor Bookmarklet Code:
javascript:var insert_date= new Date(); insert_timestamp=Date.parse(insert_date); insert_html='<center><a title=%22'+insert_date.toLocaleString()+'%22 name=%22update'+insert_timestamp+'%22><span style=%22font-weight:bold;%22>*** UPDATE ***</span></a></center>'; document.forms.stuffform.htmlPostBody.value+=insert_html; void(0);
It occurs to me that maybe a live working example on this page might help. This is what I mean by an update - some content added some hours laters. If you mouseover the update heading thingy above, you'll note that it gives you the time of update. At the risk of inducing recursive madness, here's Freshblog's update feed. Note that the embedded link in the feed doesn't just point to this post, it points to this update (via the named anchor).
After noticing "something screwy" going on, I've modified this Yahoo Pipe to append the now-required orderby=updated to the feed fetch module. Props to Phydeaux3 for the explanation and syntax.
Filed in: blogtech, blogger-hacks, feeds, how-to