<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss1full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://purl.org/rss/1.0/" xmlns:arto="http://ar.to/" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
  <channel rdf:about="http://ar.to/tags/drupal.rss">
    <title xml:lang="en">Arto Bendiken on Drupal</title>
    <link>http://ar.to/tags/drupal</link>
    <description xml:lang="en" />
    <items rdf:nodeID="b1"><rdf:Seq><rdf:li rdf:resource="http://ar.to/node/193" /><rdf:li rdf:resource="http://ar.to/node/49" /></rdf:Seq></items>
    <cc:license rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
  <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/bendiken/drupal" type="application/rss+xml" /></channel>
  <rdf:Seq rdf:nodeID="b1">
    <rdf:li>http://ar.to/node/193</rdf:li>
    <rdf:li>http://ar.to/node/49</rdf:li>
  </rdf:Seq>
  <item rdf:about="http://ar.to/node/193">
    <title>RDFizing Drupal: Upgrading the RSS Feeds</title>
    <link>http://feedproxy.google.com/~r/bendiken/drupal/~3/a90Xey3QruY/rdfizing-drupal-rss-feeds</link>
    <description>&lt;p&gt;&lt;em&gt;This is the first part in a series of articles on &lt;a href="http://ar.to/articles/rdfizing-drupal"&gt;RDFizing Drupal&lt;/a&gt;, showing how you can make use of the &lt;a href="http://drupal.org/project/rdf"&gt;RDF module&lt;/a&gt; for Drupal 6.x to set your data free and connect your Drupal site to the emerging &lt;a href="http://linkeddata.org/"&gt;Linked Data&lt;/a&gt; web.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
If you've been wanting to use &lt;a href="http://drupal.org/"&gt;Drupal&lt;/a&gt; 6.x for creating &lt;a href="http://drupal.org/node/219862" title="Resource Description Framework"&gt;RDF&lt;/a&gt;-enabled websites you've probably been annoyed at the fact that Drupal outputs feeds in &lt;acronym title="Really Simple Syndication"&gt;RSS&lt;/acronym&gt; 2.0 format, which isn't based on RDF. This article will show you, step by step, how to upgrade&lt;a href="#footnote-rss"&gt;&lt;sup&gt;[1]&lt;/sup&gt;&lt;/a&gt; all of Drupal's RSS feeds into clean, extensible and RDF-compatible &lt;a href="http://web.resource.org/rss/1.0/"&gt;&lt;acronym title="RDF Site Summary"&gt;RSS&lt;/acronym&gt; 1.0&lt;/a&gt; format.
&lt;/p&gt;

&lt;p&gt;
To get started you must first, of course, install the &lt;a href="http://drupal.org/project/rdf"&gt;RDF module&lt;/a&gt;. Any version of the module since RDF 6.x-1.0-alpha6 ought to do fine. There are no dependencies that you need to care about&lt;a href="#footnote-xmlwriter"&gt;&lt;sup&gt;[2]&lt;/sup&gt;&lt;/a&gt; other than ensuring your PHP version is sufficiently recent (PHP 5.2.0 or newer). Just follow the installation instructions in the accompanying &lt;a href="http://cvs.drupal.org/viewvc.py/drupal/contributions/modules/rdf/INSTALL.txt?view=markup" title="How to install the Drupal RDF module"&gt;INSTALL.txt&lt;/a&gt; file, and then enable the module at &lt;em&gt;Administer &amp;raquo; Site building &amp;raquo; Modules&lt;/em&gt;:
&lt;/p&gt;

&lt;a name="image-module"&gt;&lt;/a&gt;
&lt;img src="http://ar.to/2009/03/rdfizing-drupal-rss-feeds/module.png"
  alt="Administer &amp;gt; Site building &amp;gt; Modules"
  width="727" height="172" border="0"/&gt;

&lt;p&gt;
After enabling the module, navigate to &lt;em&gt;Administer &amp;raquo; Site configuration &amp;raquo; RDF settings &amp;raquo; Feeds&lt;/em&gt;:
&lt;/p&gt;

&lt;a name="image-breadcrumb"&gt;&lt;/a&gt;
&lt;img src="http://ar.to/2009/03/rdfizing-drupal-rss-feeds/breadcrumb.png"
  alt="Home &amp;gt; Administer &amp;gt; Site configuration &amp;gt; RDF settings"
  width="727" height="57" border="0"/&gt;

&lt;p&gt;
On this screen you'll see a listing of all the available RSS feeds output by Drupal's core modules. These are published, in Drupal 6.x, by the &lt;em&gt;Node&lt;/em&gt;, &lt;em&gt;Taxonomy&lt;/em&gt;, &lt;em&gt;Blog&lt;/em&gt; and &lt;em&gt;Aggregator&lt;/em&gt; modules. (If you've installed the &lt;a href="http://drupal.org/project/views"&gt;Views&lt;/a&gt; module, this screen will also list any RDF feeds you've enabled for your views&lt;a href="#footnote-hook_rdf_feeds"&gt;&lt;sup&gt;[3]&lt;/sup&gt;&lt;/a&gt;.)
&lt;/p&gt;

&lt;a name="image-feeds"&gt;&lt;/a&gt;
&lt;img src="http://ar.to/2009/03/rdfizing-drupal-rss-feeds/feeds.png"
  alt="Home &amp;gt; Administer &amp;gt; Site configuration &amp;gt; RDF settings &amp;gt; Feeds"
  width="727" height="327" border="0"/&gt;

&lt;p&gt;
To upgrade any of the core feeds to RDF format, simply use the &lt;em&gt;enable&lt;/em&gt; action. This will present you with the following choice:
&lt;/p&gt;

&lt;a name="image-config"&gt;&lt;/a&gt;
&lt;img src="http://ar.to/2009/03/rdfizing-drupal-rss-feeds/config.png"
  alt="Configure RDF feed"
  width="727" height="337" border="0"/&gt;

&lt;p&gt;
Note that you can downgrade back to the default RSS 2.0 feeds at any time, so don't be afraid to experiment. To RDFize your feed, simply select the RSS 1.0 option and save the configuration. You will be returned to the same screen with a status message indicating that the feed was upgraded:
&lt;/p&gt;

&lt;a name="image-config-upgrade"&gt;&lt;/a&gt;
&lt;img src="http://ar.to/2009/03/rdfizing-drupal-rss-feeds/config-upgrade.png"
  alt="The feed rss.xml has been upgraded for RDF compatibility."
  width="727" height="277" border="0"/&gt;

&lt;p&gt;
Once you've upgraded a feed, some additional configuration options will be made available to you. (Note that you &lt;em&gt;don't&lt;/em&gt; need to change any of these settings if you don't want to, and everything will work just as before using the defaults; feel free to skip ahead several paragraphs if you don't care to tinker with this at the moment.)
&lt;/p&gt;

&lt;p&gt;
In the &lt;em&gt;Channel settings&lt;/em&gt; section, you will find settings that implement the &lt;a href="http://web.resource.org/rss/1.0/modules/syndication/"&gt;RSS 1.0 syndication hints&lt;/a&gt; specification. This is a standard that specifies advisory metadata that you can include in your feed to tell feed readers how often your feed is updated. This allows aggregators to optimize how often they'll re-fetch your feed, and hence also affords you some potential control over your bandwidth usage:
&lt;/p&gt;

&lt;a name="image-config-channel"&gt;&lt;/a&gt;
&lt;img src="http://ar.to/2009/03/rdfizing-drupal-rss-feeds/config-channel.png"
  alt="Configure RDF feed - channel settings"
  width="727" height="442" border="0"/&gt;

&lt;p&gt;
Here you can also change the RSS feed's serialization format. RDF can be represented in a wide variety of &lt;a href="http://en.wikipedia.org/wiki/Resource_Description_Framework#Serialization_formats"&gt;serialization formats&lt;/a&gt;, and the RDF module provides support for some of the most popular ones (if you install the optional &lt;a href="http://arc.semsol.org/"&gt;ARC&lt;/a&gt; RDF library, you will get support for yet more formats). However, only explicitly RDF-aware feed aggregators can handle anything else than the default RDF/XML serialization, so be advised that changing this setting is probably a rather bad idea for the time being.
&lt;/p&gt;

&lt;p&gt;
Below the channel settings you will find a section for configuring how feed items (that is, Drupal nodes, taxonomy terms, and such) are output in the RSS feed. At the moment, you have additional two settings: you can configure how body fields get output (using the teaser only, or including the full text), and you can configure whether date/time information in the feed includes the time zone component (if applicable, such as for &lt;a href="http://drupal.org/project/date"&gt;Date&lt;/a&gt; module fields) or whether all times will be output in UTC:
&lt;/p&gt;

&lt;a name="image-config-item"&gt;&lt;/a&gt;
&lt;img src="http://ar.to/2009/03/rdfizing-drupal-rss-feeds/config-item.png"
  alt="Configure RDF feed - item settings"
  width="727" height="297" border="0"/&gt;

&lt;p&gt;
Once you're done with the feed settings, save the configuration and you'll be returned to the RDF feed management screen. Notice that the &lt;em&gt;Operations&lt;/em&gt; column indicates which feeds have been upgraded to RDF, with the &lt;em&gt;enable&lt;/em&gt; action changing to &lt;em&gt;configure&lt;/em&gt; where applicable:
&lt;/p&gt;

&lt;a name="image-config-save"&gt;&lt;/a&gt;
&lt;img src="http://ar.to/2009/03/rdfizing-drupal-rss-feeds/config-save.png"
  alt="The feed configuration for rss.xml has been updated."
  width="727" height="362" border="0"/&gt;

&lt;p&gt;
A special note on Drupal's front page feed, &lt;tt&gt;rss.xml&lt;/tt&gt;: once you've RDFized this feed, it isn't ideal that it still has the all-too-generic URL extension &lt;tt&gt;.xml&lt;/tt&gt;. You can certainly keep it that way if you wish (feed aggregators parse feeds based on the MIME content type, not the file extension), but Drupal makes it so trivially easy to rename the feed's URL that I'd recommend doing so. A more appropriate extension for RSS 1.0 feeds would be &lt;tt&gt;.rss&lt;/tt&gt; or &lt;tt&gt;.rdf&lt;/tt&gt;. You can rename the feed URL by navigating to &lt;em&gt;Administer &amp;raquo; Site building &amp;raquo; URL aliases &amp;raquo; Add alias&lt;/em&gt; and entering something like the following:
&lt;/p&gt;

&lt;a name="image-alias"&gt;&lt;/a&gt;
&lt;img src="http://ar.to/2009/03/rdfizing-drupal-rss-feeds/alias.png"
  alt="Home &amp;gt; Administer &amp;gt; Site building &amp;gt; URL aliases &amp;gt; Add alias"
  width="727" height="367" border="0"/&gt;

&lt;p&gt;
Based on the feeds listed at &lt;a href="http://planetrdf.com/"&gt;Planet RDF&lt;/a&gt;, &lt;tt&gt;index.rdf&lt;/tt&gt; would seem to be the most popular URL for a front page feed, so that's a data point to take into consideration. (I've been contrarian on this, myself, and named my blog's feed simply &lt;tt&gt;blog.rss&lt;/tt&gt;, intending it to only include blog posts. I'm using the &lt;tt&gt;.rss&lt;/tt&gt; extension to differentiate my RSS feeds from other RDF data that I will publish here later using the usual &lt;tt&gt;.rdf&lt;/tt&gt; extension.)
&lt;/p&gt;

&lt;p&gt;
Now, in a similar way as you would rename Drupal's &lt;tt&gt;rss.xml&lt;/tt&gt;, you can  also define URL aliases for any of the other non-wildcard feeds listed on the RDF feeds management screen:
&lt;/p&gt;

&lt;a name="image-feeds-aliased"&gt;&lt;/a&gt;
&lt;img src="http://ar.to/2009/03/rdfizing-drupal-rss-feeds/feeds-aliased.png"
  alt="Home &amp;gt; Administer &amp;gt; Site configuration &amp;gt; RDF settings &amp;gt; Feeds"
  width="727" height="327" border="0"/&gt;

&lt;p&gt;
And if you'd like to rename any of the displayed wildcard feeds, such as the taxonomy feeds at paths of the form &lt;tt&gt;taxonomy/term/%/0/feed&lt;/tt&gt;, that's easy enough to do by installing the excellent &lt;a href="http://drupal.org/project/pathauto"&gt;Pathauto&lt;/a&gt; module that will automatically create such URL aliases where needed. Here on my blog, for instance, all my &lt;a href="http://ar.to/tags"&gt;tags&lt;/a&gt; have RDFized feeds with URLs of the form &lt;a href="http://ar.to/tags/drupal.rss"&gt;http://ar.to/tags/drupal.rss&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
If you're a perfectionist, consider also installing the &lt;a href="http://drupal.org/project/globalredirect"&gt;Global Redirect&lt;/a&gt; module to ensure that attempts to access a non-aliased feed URL will result in an HTTP redirect to the canonical aliased URL. For example, should you try to load up &lt;a href="http://ar.to/rss.xml" title="My non-aliased RSS feed"&gt;http://ar.to/rss.xml&lt;/a&gt;, you will be redirected to &lt;a href="http://ar.to/blog.rss" title="My aliased RSS feed"&gt;http://ar.to/blog.rss&lt;/a&gt; which is the alias I've defined for my front page feed. Among other benefits, this makes sure that search engines won't index both URLs.
&lt;/p&gt;

&lt;p&gt;
Once you've RDFized your feeds, you may want to use &lt;a href="http://www.w3.org/RDF/Validator/"&gt;W3C's RDF Validation Service&lt;/a&gt; to double-check that everything turned out a-okay and that your feeds are indeed valid RDF. My blog feed is clearly bursting at the seams with RDFness, as &lt;a href="http://www.w3.org/RDF/Validator/ARPServlet?URI=http%3A%2F%2Far.to%2Fblog.rss&amp;amp;PARSE=Parse+URI%3A+&amp;amp;TRIPLES_AND_GRAPH=PRINT_BOTH&amp;amp;FORMAT=PNG_EMBED"&gt;validating it&lt;/a&gt; yields the following reassuring message:
&lt;/p&gt;

&lt;a name="image-validate"&gt;&lt;/a&gt;
&lt;img src="http://ar.to/2009/03/rdfizing-drupal-rss-feeds/validate.png"
  alt="W3C RDF Validation Service"
  width="727" height="227" border="0"/&gt;

&lt;p&gt;
In case you are still learning RDF, the validation service is also a great way to view the underlying &lt;a href="http://en.wikipedia.org/wiki/Resource_Description_Framework#Overview"&gt;triples&lt;/a&gt; (RDF statements) that constitute RDF documents such as your RSS feed. You can get the triples listed both in table format and rendered as a graph in a variety of graphics formats; this can really be helpful in grokking how simple RDF actually is beneath all that &lt;acronym title="Extensible Markup Language"&gt;XML&lt;/acronym&gt; verbiage.
&lt;/p&gt;

&lt;p&gt;
Well, that's all for now. Go forth and RDFize all your feeds; you know you want to. I will add a link here to the first several people who upgrade their Drupal feeds per these instructions (just &lt;a href="http://ar.to/contact" title="Contact Me"&gt;leave me a note&lt;/a&gt; with a link to your site). And should you run into any trouble with these instructions, please &lt;a href="http://drupal.org/node/add/project-issue/rdf"&gt;post an issue&lt;/a&gt; at drupal.org and we'll see if we can sort it out.
&lt;/p&gt;

&lt;p&gt;
&lt;em&gt;In the next couple parts of this article series, I'll be talking about how you can include additional &lt;a href="http://drupal.org/project/cck"&gt;CCK&lt;/a&gt; fields in your RSS feeds, and how to enable &lt;a href="http://rdfa.info/"&gt;RDFa&lt;/a&gt; (affectionately known as "microformats on steroids") on your Drupal site. Be sure to subscribe to the aforementioned &lt;a href="http://ar.to/blog.rss"&gt;feed&lt;/a&gt; to get these upcoming articles!&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; &lt;a href="http://www.juliakm.com/"&gt;Julia Kulla-Mader&lt;/a&gt; (&lt;a href="http://www.juliakm.com/rss.rdf"&gt;RSS&lt;/a&gt;) and &lt;a href="http://web3.ee/"&gt;Kaido Toomingas&lt;/a&gt; (&lt;a href="http://web3.ee/rss.rdf"&gt;RSS&lt;/a&gt;) are the first pioneers to brave these waters and RDFize their feeds. &lt;a href="http://groups.drupal.org/node/20529"&gt;Anyone else?&lt;/a&gt;
&lt;/p&gt;

&lt;br/&gt;

&lt;p&gt;
&lt;small&gt;&lt;a name="footnote-rss" href="#footnote-rss"&gt;&lt;sup&gt;[1]&lt;/sup&gt;&lt;/a&gt;
I won't here delve into &lt;a href="http://en.wikipedia.org/wiki/RSS#History"&gt;the history&lt;/a&gt; of the &lt;a href="http://en.wikipedia.org/wiki/RSS#Variants"&gt;RSS 2.0 controversy&lt;/a&gt;, but sufficient to say that RSS 2.0 ("Really Simple Syndication") represents a downgrade from RSS 1.0 ("RDF Site Summary") in terms of capabilities and potential. You've heard of "embrace and extend", right? Well, try "co-opt and cripple" on for size. (&lt;strong&gt;Update:&lt;/strong&gt; I posted some more on this at the &lt;a href="http://www.reddit.com/r/programming/comments/87d5h/rdfizing_drupal_upgrading_the_rss_feeds/"&gt;Reddit&lt;/a&gt; thread and at &lt;a href="http://groups.drupal.org/node/20529"&gt;groups.drupal.org&lt;/a&gt;.)&lt;/small&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;small&gt;&lt;a name="footnote-xmlwriter" href="#footnote-xmlwriter"&gt;&lt;sup&gt;[2]&lt;/sup&gt;&lt;/a&gt;
Note that for the purposes described in this article, you &lt;em&gt;don't&lt;/em&gt; have to install the optional &lt;a href="http://arc.semsol.org/"&gt;ARC&lt;/a&gt; RDF library; the RDF module includes native support for &lt;a href="http://www.w3.org/TR/rdf-syntax-grammar/"&gt;RDF/XML&lt;/a&gt; output using PHP's &lt;a href="http://php.net/manual/en/book.xmlwriter.php"&gt;XMLWriter&lt;/a&gt; extension. This extension is &lt;a href="http://php.net/manual/en/xmlwriter.installation.php"&gt;available by default&lt;/a&gt; since PHP 5.1.2, though FreeBSD users may need to explicitly install the &lt;a href="http://www.freshports.org/textproc/php5-xmlwriter/"&gt;php5-xmlwriter&lt;/a&gt; package.&lt;/small&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;small&gt;&lt;a name="footnote-hook_rdf_feeds" href="#footnote-hook_rdf_feeds"&gt;&lt;sup&gt;[3]&lt;/sup&gt;&lt;/a&gt;
Developers: see &lt;tt&gt;hook_rdf_feeds()&lt;/tt&gt; in &lt;tt&gt;rdf.module&lt;/tt&gt; for an example on how you can declare RDF-compatible feeds that will be listed on this screen.&lt;/small&gt;
&lt;/p&gt;</description>
    <dc:date rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2009-03-24T23:00:00Z</dc:date>
    <dc:creator>Arto</dc:creator>
    <dc:subject>Drupal</dc:subject>
    <dc:subject>Linked Data</dc:subject>
    <dc:subject>RDF</dc:subject>
    <dc:subject>RSS</dc:subject>
    <dc:subject>Semantic Web</dc:subject>
    <dc:subject>RDFizing Drupal</dc:subject>
    <cc:license rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
  <feedburner:origLink>http://ar.to/2009/03/rdfizing-drupal-rss-feeds</feedburner:origLink></item>
  <item rdf:about="http://ar.to/node/49">
    <title>The Universal Timeline Aggregator</title>
    <link>http://feedproxy.google.com/~r/bendiken/drupal/~3/csbU3_XP6DE/the-universal-timeline-aggregator</link>
    <description>&lt;p&gt;&lt;img alt="Timeline" src="http://ar.to/2006/12/the-universal-timeline-aggregator/timeline-sundial.png" width="150" height="150" border="0" align="left" style="margin-right: 15px;" /&gt;&lt;/p&gt;

&lt;p&gt;For those who haven&amp;#8217;t yet come across it somewhere on the web, may I recommend checking out the &lt;a href="http://simile.mit.edu/timeline/"&gt;Timeline&lt;/a&gt; widget developed by &lt;a href="http://people.csail.mit.edu/people/dfhuynh/"&gt;David F. Huynh&lt;/a&gt; of the &lt;a href="http://simile.mit.edu/"&gt;&lt;span class="caps"&gt;MIT&lt;/span&gt; Simile&lt;/a&gt; project. It&amp;#8217;s a snazzy DHTML/JavaScript tool for visualizing chronological events on a scrollable, graphical timeline &amp;#8212; sort of a Google Maps for temporal information.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;ve been working quite a bit with the Simile widget lately, co-developing (with &lt;a href="http://drdonohue.com/"&gt;David Donohue&lt;/a&gt;) a &lt;a href="http://drupal.org/project/timeline"&gt;module&lt;/a&gt; that integrates the widget into &lt;a href="http://drupal.org/"&gt;Drupal&lt;/a&gt;, allowing Drupal sites to display any &lt;a href="http://drupal.org/project/cck"&gt;CCK&lt;/a&gt; / &lt;a href="http://drupal.org/project/views"&gt;Views&lt;/a&gt; content as graphical timelines.&lt;/p&gt;

&lt;p&gt;Today, inspired by &lt;a href="http://apassant.net/blog/"&gt;Alexandre Passant&amp;#8217;s&lt;/a&gt; &lt;a href="http://apassant.net/home/2006/07/rss2timeline/"&gt;RSS2Timeline&lt;/a&gt; implementation, I sat down to code up a generic web service that can take any Atom or &lt;span class="caps"&gt;RSS&lt;/span&gt; feed and convert it into a &lt;a href="http://en.wikipedia.org/wiki/JSON"&gt;JSON-based&lt;/a&gt; event source for the Timeline widget. My goal was to make it absolutely trivial to embed live Atom/&lt;span class="caps"&gt;RSS&lt;/span&gt; timelines into blogs and whatnot, so that anyone with basic &lt;span class="caps"&gt;HTML&lt;/span&gt; skills could use timelines without having to go through the relatively complex technical setup the widget requires.&lt;/p&gt;

&lt;p&gt;I hereby present the &lt;strong&gt; &lt;a href="http://timeline.to/"&gt;Universal Timeline Aggregator&lt;/a&gt; &lt;/strong&gt;, available at &lt;strong&gt; &lt;a href="http://timeline.to/"&gt;http://timeline.to/&lt;/a&gt; &lt;/strong&gt; (I&amp;#8217;ve been snapping up Tonga&amp;#8217;s &lt;a href="http://en.wikipedia.org/wiki/.to"&gt;dot-to domains&lt;/a&gt; since getting the ultimate &lt;a href="http://en.wikipedia.org/wiki/Vanity_domain"&gt;vanity domain&lt;/a&gt;, &lt;a href="http://ar.to/"&gt;ar.to&lt;/a&gt;, as a Christmas present; the &amp;#8220;to&amp;#8221; preposition works rather nicely for the present purpose, too.)&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s a screen capture (and live example, if you click on it) of the sort of timeline display you can create in a minute or two using the &lt;strong&gt; &lt;a href="http://timeline.to/"&gt;timeline.to&lt;/a&gt; &lt;/strong&gt; service:&lt;/p&gt;

&lt;div class="screenshot"&gt;
&lt;a href="http://timeline.to/?url=http%3A%2F%2Fdev.rubyonrails.org%2Ftimeline%3Fchangeset%3Don%26max%3D50%26format%3Drss" target="_blank"&gt;&lt;img alt="Ruby on Rails Trac" src="http://ar.to/2006/12/the-universal-timeline-aggregator/timeline-trac-rails.png" width="500" height="400" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;

&lt;span&gt;Timeline view of &amp;#8220;recent Ruby on Rails development&amp;#8221;:http://dev.rubyonrails.org/timeline.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;Embedding a live, interactive Atom or &lt;span class="caps"&gt;RSS&lt;/span&gt; timeline into any site is now as easy as copying and pasting the following &lt;span class="caps"&gt;HTML&lt;/span&gt; snippet, with the appropriate modifications:&lt;/p&gt;

&lt;pre&gt;&lt;code class="html"&gt;&amp;lt;iframe src="http://timeline.to/http://www.mysite.com/rss.xml"
  width="500" height="400"
  scrolling="no" frameborder="1"
  marginwidth="0" marginheight="0"&amp;gt;&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Just replace &lt;tt&gt;http://www.mysite.com/rss.xml&lt;/tt&gt; with a real &lt;span class="caps"&gt;URL&lt;/span&gt; address to an Atom or &lt;span class="caps"&gt;RSS&lt;/span&gt; feed, and modify the width and height as you like. &lt;a href="http://diveintomark.org/archives/2002/08/15/ultraliberal_rss_locator"&gt;Autodiscovery&lt;/a&gt; of feeds is supported to a reasonable extent, so in most cases you won&amp;#8217;t even need the exact &lt;span class="caps"&gt;URL&lt;/span&gt; to the feed; the website&amp;#8217;s &lt;span class="caps"&gt;URL&lt;/span&gt; address itself will do.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s another example as a screen capture, this time showing the popup box that opens when a timeline event is clicked:&lt;/p&gt;

&lt;div class="screenshot"&gt;
&lt;a href="http://timeline.to/?url=http%3A%2F%2Fwww.scheme.dk%2Fplanet%2F" target="_blank"&gt;&lt;img alt="Planet Scheme" src="http://ar.to/2006/12/the-universal-timeline-aggregator/timeline-planet-scheme.png" width="500" height="400" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;

&lt;span&gt;Timeline view of &lt;a href="http://www.scheme.dk/planet/"&gt;Planet Scheme&lt;/a&gt;, showing a preview of a blog entry.&lt;/span&gt;
&lt;/div&gt;

&lt;p&gt;Starting out on the &lt;strong&gt; &lt;a href="http://timeline.to/"&gt;timeline.to&lt;/a&gt; &lt;/strong&gt; implementation today, I had to actually pause a moment to contemplate which technology to use: Python, Ruby or &lt;span class="caps"&gt;PHP&lt;/span&gt; &amp;#8212; it wasn&amp;#8217;t quite as clear-cut a decision as usual.&lt;/p&gt;

&lt;p&gt;Case in point, while I haven&amp;#8217;t done much Python coding recently (since defecting to the Ruby camp), the language does have some excellent libraries and frameworks going for it &amp;#8212; including arguably the best Atom/&lt;span class="caps"&gt;RSS&lt;/span&gt; parser in existence, the &lt;a href="http://feedparser.org/"&gt;Universal Feed Parser&lt;/a&gt; written by &lt;a href="http://diveintomark.org/"&gt;Mark Pilgrim&lt;/a&gt;. Considering the &lt;a href="http://diveintomark.org/archives/2002/08/20/how_liberal_is_too_liberal"&gt;staggering number&lt;/a&gt; &lt;a href="http://diveintomark.org/archives/2003/01/22/parse_at_all_costs"&gt;of malformed and invalid feeds&lt;/a&gt; out there, a good parser is essential (I won&amp;#8217;t get further, right this moment, into the delicious irony of having to parse &lt;span class="caps"&gt;XML&lt;/span&gt; formats using regular expressions).&lt;/p&gt;

&lt;p&gt;On the other hand, Ruby also has (at least) two relatively comprehensive and decent libraries for feed parsing, &lt;a href="http://rubyforge.org/projects/feedtools/"&gt;FeedTools&lt;/a&gt; and &lt;a href="http://rubyforge.org/projects/syndication/"&gt;Syndication&lt;/a&gt;. Unfortunately, in my experience neither library is quite up there with the Universal Feed Parser yet, and neither seems &lt;a href="http://rubyforge.org/tracker/index.php?func=detail&amp;#38;aid=4843&amp;#38;group_id=775&amp;#38;atid=3061"&gt;particularly active&lt;/a&gt; recently.&lt;/p&gt;

&lt;p&gt;In the end, underdog &lt;span class="caps"&gt;PHP&lt;/span&gt; won out on this project on purely practical points: since my &lt;a href="http://drupal.org/project/timeline"&gt;Timeline module&lt;/a&gt; for &lt;a href="http://drupal.org/"&gt;Drupal&lt;/a&gt; is written in &lt;span class="caps"&gt;PHP&lt;/span&gt;, it makes sense to try and reuse code both ways between the &lt;strong&gt; &lt;a href="http://timeline.to/"&gt;timeline.to&lt;/a&gt; &lt;/strong&gt; service and Drupal.&lt;/p&gt;

&lt;p&gt;Investigating the current best way to parse both Atom and &lt;span class="caps"&gt;RSS&lt;/span&gt; feeds with &lt;span class="caps"&gt;PHP&lt;/span&gt;, I learned of a new feed parser library for &lt;span class="caps"&gt;PHP&lt;/span&gt; called &lt;a href="http://simplepie.org/"&gt;SimplePie&lt;/a&gt;, which has been gaining a lot of momentum lately (indeed, it seems to be on track for eventually surpassing &lt;a href="http://magpierss.sourceforge.net/"&gt;MagpieRSS&lt;/a&gt; as the de-facto &lt;span class="caps"&gt;RSS&lt;/span&gt; parser for &lt;span class="caps"&gt;PHP&lt;/span&gt;). The SimplePie developers are apparently in the process of porting the 3000+ unit tests from Pilgrim&amp;#8217;s parser, which certainly seems a promising prospect for creating a truly robust parser.&lt;/p&gt;

&lt;p&gt;SimplePie is also bundled with the &lt;a href="http://drupal.org/project/feedparser"&gt;Feedparser&lt;/a&gt; Drupal module, so again, it all just makes sense. The library turned out to be quite painless to work with, and has, so far, been able to parse all the feeds I&amp;#8217;ve thrown at it. (I did have to disable SimplePie&amp;#8217;s ad-removal feature, as that was eating up the entry descriptions on some Atom feeds.)&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ar.to/contact"&gt;Feedback&lt;/a&gt; on the &lt;strong&gt; &lt;a href="http://timeline.to/"&gt;timeline.to&lt;/a&gt; &lt;/strong&gt; service is welcome. If there&amp;#8217;s sufficient interest, I will consider adding further functionality such as &lt;a href="http://en.wikipedia.org/wiki/ICalendar"&gt;iCalendar&lt;/a&gt; support, and perhaps &lt;a href="http://en.wikipedia.org/wiki/Mashup_%28web_application_hybrid%29"&gt;mashup&lt;/a&gt; features allowing multiple feeds and data sources to be combined into a single timeline display.&lt;/p&gt;</description>
    <dc:date rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2006-12-29T17:37:02Z</dc:date>
    <dc:creator>Arto</dc:creator>
    <dc:subject>atom</dc:subject>
    <dc:subject>Drupal</dc:subject>
    <dc:subject>JSON</dc:subject>
    <dc:subject>mashups</dc:subject>
    <dc:subject>projects</dc:subject>
    <dc:subject>RSS</dc:subject>
    <dc:subject>services</dc:subject>
    <dc:subject>SimplePie</dc:subject>
    <dc:subject>timeline</dc:subject>
    <cc:license rdf:resource="http://creativecommons.org/publicdomain/zero/1.0/" />
  <feedburner:origLink>http://ar.to/2006/12/the-universal-timeline-aggregator</feedburner:origLink></item>
</rdf:RDF>
