Commits

Toby Inkster committed 97beb83

Release XML-Atom-Microformats 0.00_00; improve support in HTML-Microformats for the kind of context needed by XML-Atom-Microformats.

Comments (0)

Files changed (14)

+<?xml version="1.0" encoding="UTF-8"?>
+<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:georss="http://www.georss.org/georss" xmlns:activity="http://activitystrea.ms/spec/1.0/" xmlns:media="http://purl.org/syndication/atommedia" xmlns:poco="http://portablecontacts.net/spec/1.0" xmlns:ostatus="http://ostatus.org/schema/1.0">
+ <generator uri="http://status.net" version="0.9.1">StatusNet</generator>
+ <id>http://identi.ca/api/statuses/user_timeline/36737.atom</id>
+ <title>tobyink timeline</title>
+ <subtitle>Updates from tobyink on Identi.ca!</subtitle>
+ <logo>http://avatar.identi.ca/36737-96-20091110101738.jpeg</logo>
+ <updated>2010-04-28T15:54:18+00:00</updated>
+<author>
+ <name>tobyink</name>
+ <uri>http://identi.ca/user/36737</uri>
+</author>
+ <link href="http://identi.ca/tobyink" rel="alternate" type="text/html"/>
+ <link href="http://identi.ca/main/sup#36737" rel="http://api.friendfeed.com/2008/03#sup" type="application/json"/>
+ <link href="http://identi.ca/main/push/hub" rel="hub"/>
+ <link href="http://identi.ca/main/salmon/user/36737" rel="http://salmon-protocol.org/ns/salmon-replies"/>
+ <link href="http://identi.ca/main/salmon/user/36737" rel="http://salmon-protocol.org/ns/salmon-mention"/>
+ <link href="http://identi.ca/api/statuses/user_timeline/36737.atom" rel="self" type="application/atom+xml"/>
+<activity:subject>
+ <activity:object-type>http://activitystrea.ms/schema/1.0/person</activity:object-type>
+ <id>http://identi.ca/user/36737</id>
+ <title>Toby Inkster</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/tobyink"/>
+ <link rel="avatar" type="image/jpeg" media:width="178" media:height="178" href="http://avatar.identi.ca/36737-178-20091110101738.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="96" media:height="96" href="http://avatar.identi.ca/36737-96-20091110101738.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="48" media:height="48" href="http://avatar.identi.ca/36737-48-20091110101738.jpeg"/>
+ <link rel="avatar" type="image/jpeg" media:width="24" media:height="24" href="http://avatar.identi.ca/36737-24-20091110101738.jpeg"/>
+<poco:preferredUsername>tobyink</poco:preferredUsername>
+<poco:displayName>Toby Inkster</poco:displayName>
+<poco:note>I like to eat my breakfast cereal with a teaspoon because it makes me feel like a giant.</poco:note>
+<poco:address>
+ <poco:formatted>East Sussex, GB</poco:formatted>
+</poco:address>
+<poco:urls>
+ <poco:type>homepage</poco:type>
+ <poco:value>http://tobyinkster.co.uk/</poco:value>
+ <poco:primary>true</poco:primary>
+</poco:urls>
+</activity:subject>
+<entry>
+ <title>#Open_Graph_Protocol to #JSON converter: http://srv.buzzword.org.uk/opengraph-to-json.html</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/29945724"/>
+ <id>http://identi.ca/notice/29945724</id>
+ <published>2010-04-25T18:09:29+00:00</published>
+ <updated>2010-04-25T18:09:29+00:00</updated>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/29870951"/>
+ <content type="html">#&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/opengraphprotocol&quot; rel=&quot;tag&quot;&gt;Open_Graph_Protocol&lt;/a&gt;&lt;/span&gt; to #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/json&quot; rel=&quot;tag&quot;&gt;JSON&lt;/a&gt;&lt;/span&gt; converter: &lt;a href=&quot;http://srv.buzzword.org.uk/opengraph-to-json.html&quot; title=&quot;http://srv.buzzword.org.uk/opengraph-to-json.html&quot; rel=&quot;external&quot;&gt;http://srv.buzzword.org.uk/opengraph-to-json.html&lt;/a&gt;</content>
+ <category term="json"></category>
+ <category term="opengraphprotocol"></category>
+</entry>
+<entry>
+ <title>Stupid bloody #daylight-savings #ritual...</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/26332859"/>
+ <id>http://identi.ca/notice/26332859</id>
+ <published>2010-03-28T00:11:45+00:00</published>
+ <updated>2010-03-28T00:11:45+00:00</updated>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/26318766"/>
+ <content type="html">Stupid bloody #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/daylightsavings&quot; rel=&quot;tag&quot;&gt;daylight-savings&lt;/a&gt;&lt;/span&gt; #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/ritual&quot; rel=&quot;tag&quot;&gt;ritual...&lt;/a&gt;&lt;/span&gt;</content>
+ <category term="daylightsavings"></category>
+ <category term="ritual"></category>
+</entry>
+<entry>
+ <title>RT @danja @danbri pet ns doc back up (may be some dead links) http://purl.org/stuff/pets</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/18663283"/>
+ <id>http://identi.ca/notice/18663283</id>
+ <published>2010-01-10T19:04:19+00:00</published>
+ <updated>2010-01-10T19:04:19+00:00</updated>
+ <link rel="related" href="http://identi.ca/notice/18659256"/>
+ <thr:in-reply-to ref="http://identi.ca/notice/18659256" href="http://identi.ca/notice/18659256"></thr:in-reply-to>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/18659256"/>
+ <link rel="ostatus:attention" href="http://identi.ca/user/114"/>
+ <link rel="ostatus:attention" href="http://identi.ca/user/226"/>
+ <ostatus:forward ref="http://identi.ca/notice/18659256" href="http://identi.ca/notice/18659256"></ostatus:forward>
+ <content type="html">RT @&lt;span class=&quot;vcard&quot;&gt;&lt;a href=&quot;http://identi.ca/user/114&quot; class=&quot;url&quot; title=&quot;Danny Ayers (danja)&quot;&gt;&lt;span class=&quot;fn nickname&quot;&gt;danja&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; @&lt;span class=&quot;vcard&quot;&gt;&lt;a href=&quot;http://identi.ca/user/226&quot; class=&quot;url&quot; title=&quot;Dan Brickley (danbri)&quot;&gt;&lt;span class=&quot;fn nickname&quot;&gt;danbri&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; pet ns doc back up (may be some dead links) &lt;a href=&quot;http://purl.org/stuff/pets&quot; title=&quot;http://hyperdata.org/xmlns/pets/&quot; rel=&quot;external&quot;&gt;http://purl.org/stuff/pets&lt;/a&gt;</content>
+</entry>
+<entry>
+ <title>#ChristmasDinner: Beef Wellington, roast potatoes, parsnips, mange tout, green beans, Chantenay carrots, gravy, horseradish &amp; Burgundy. Yum!</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/17471482"/>
+ <id>http://identi.ca/notice/17471482</id>
+ <published>2009-12-25T18:43:31+00:00</published>
+ <updated>2009-12-25T18:43:31+00:00</updated>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/17471482"/>
+ <content type="html">#&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/christmasdinner&quot; rel=&quot;tag&quot;&gt;ChristmasDinner&lt;/a&gt;&lt;/span&gt;: Beef Wellington, roast potatoes, parsnips, mange tout, green beans, Chantenay carrots, gravy, horseradish &amp;amp; Burgundy. Yum!</content>
+ <category term="christmasdinner"></category>
+</entry>
+<entry>
+ <title>Ah, Opera's URL blocking feature seems to cut the mustard.</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/17189690"/>
+ <id>http://identi.ca/notice/17189690</id>
+ <published>2009-12-21T23:20:19+00:00</published>
+ <updated>2009-12-21T23:20:19+00:00</updated>
+ <link rel="related" href="http://identi.ca/notice/17189150"/>
+ <thr:in-reply-to ref="http://identi.ca/notice/17189150" href="http://identi.ca/notice/17189150"></thr:in-reply-to>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/17189150"/>
+ <content type="html">Ah, Opera's URL blocking feature seems to cut the mustard.</content>
+</entry>
+<entry>
+ <title>Disabling Javascript on #identi.ca until there's a way to switch off Meteor in my account preferences.</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/17189150"/>
+ <id>http://identi.ca/notice/17189150</id>
+ <published>2009-12-21T23:12:25+00:00</published>
+ <updated>2009-12-21T23:12:25+00:00</updated>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/17189150"/>
+ <content type="html">Disabling Javascript on #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/identica&quot; rel=&quot;tag&quot;&gt;identi.ca&lt;/a&gt;&lt;/span&gt; until there's a way to switch off Meteor in my account preferences.</content>
+ <category term="identica"></category>
+</entry>
+<entry>
+ <title>OK, so we can have 20000 tunes in our pocket; we can have rich 5.1 channel sound; but we can't have audible announcements at train stations?</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/17188844"/>
+ <id>http://identi.ca/notice/17188844</id>
+ <published>2009-12-21T23:07:47+00:00</published>
+ <updated>2009-12-21T23:07:47+00:00</updated>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/17188844"/>
+ <content type="html">OK, so we can have 20000 tunes in our pocket; we can have rich 5.1 channel sound; but we can't have audible announcements at train stations?</content>
+</entry>
+<entry>
+ <title>Damn you #identi.ca! I'm not camped out in Parliament Square!</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/16125386"/>
+ <id>http://identi.ca/notice/16125386</id>
+ <published>2009-12-05T14:43:08+00:00</published>
+ <updated>2009-12-05T14:43:08+00:00</updated>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/16125386"/>
+ <content type="html">Damn you #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/identica&quot; rel=&quot;tag&quot;&gt;identi.ca&lt;/a&gt;&lt;/span&gt;! I'm not camped out in Parliament Square!</content>
+ <category term="identica"></category>
+</entry>
+<entry>
+ <title>shepard: No, it doesn't. It's a really cheap player. (I think it was £15 a year or two ago.)</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/15333357"/>
+ <id>http://identi.ca/notice/15333357</id>
+ <published>2009-11-22T22:47:32+00:00</published>
+ <updated>2009-11-22T22:47:32+00:00</updated>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/15333357"/>
+ <content type="html">shepard: No, it doesn't. It's a really cheap player. (I think it was £15 a year or two ago.)</content>
+</entry>
+<entry>
+ <title>Installing ogg2mp3. Yes, #ogg #vorbis is better but my cheap MP3 player can't handle them, Hence temporary MP3 conversions for its benefit.</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/15332612"/>
+ <id>http://identi.ca/notice/15332612</id>
+ <published>2009-11-22T22:30:07+00:00</published>
+ <updated>2009-11-22T22:30:07+00:00</updated>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/15332612"/>
+ <content type="html">Installing ogg2mp3. Yes, #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/ogg&quot; rel=&quot;tag&quot;&gt;ogg&lt;/a&gt;&lt;/span&gt; #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/vorbis&quot; rel=&quot;tag&quot;&gt;vorbis&lt;/a&gt;&lt;/span&gt; is better but my cheap MP3 player can't handle them, Hence temporary MP3 conversions for its benefit.</content>
+ <category term="ogg"></category>
+ <category term="vorbis"></category>
+</entry>
+<entry>
+ <title>@tobyink Hmmm... not very. (Hint: I'm not currently in the Palace of Westminster. I'm about 50 miles away from it.)</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/15204230"/>
+ <id>http://identi.ca/notice/15204230</id>
+ <published>2009-11-20T18:26:00+00:00</published>
+ <updated>2009-11-20T18:26:00+00:00</updated>
+ <link rel="related" href="http://identi.ca/notice/15204034"/>
+ <thr:in-reply-to ref="http://identi.ca/notice/15204034" href="http://identi.ca/notice/15204034"></thr:in-reply-to>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/15204034"/>
+ <link rel="ostatus:attention" href="http://identi.ca/user/36737"/>
+ <content type="html">@&lt;span class=&quot;vcard&quot;&gt;&lt;a href=&quot;http://identi.ca/user/36737&quot; class=&quot;url&quot; title=&quot;Toby Inkster (tobyink)&quot;&gt;&lt;span class=&quot;fn nickname&quot;&gt;tobyink&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; Hmmm... not very. (Hint: I'm not currently in the Palace of Westminster. I'm about 50 miles away from it.)</content>
+</entry>
+<entry>
+ <title>OK, so I wonder how accurate Firefox's #geolocation functionality is...</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/15204034"/>
+ <id>http://identi.ca/notice/15204034</id>
+ <published>2009-11-20T18:22:42+00:00</published>
+ <updated>2009-11-20T18:22:42+00:00</updated>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/15204034"/>
+ <content type="html">OK, so I wonder how accurate Firefox's #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/geolocation&quot; rel=&quot;tag&quot;&gt;geolocation&lt;/a&gt;&lt;/span&gt; functionality is...</content>
+ <category term="geolocation"></category>
+ <georss:point>51.5001520 -0.1262360</georss:point>
+</entry>
+<entry>
+ <title>@schestowitz It's unfair to say #Microsoft can't make decent #hardware. Every single key of my Microsoft #keyboard works (most of the time).</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/15084452"/>
+ <id>http://identi.ca/notice/15084452</id>
+ <published>2009-11-19T09:30:34+00:00</published>
+ <updated>2009-11-19T09:30:34+00:00</updated>
+ <link rel="related" href="http://identi.ca/notice/15062239"/>
+ <thr:in-reply-to ref="http://identi.ca/notice/15062239" href="http://identi.ca/notice/15062239"></thr:in-reply-to>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/15062239"/>
+ <link rel="ostatus:attention" href="http://identi.ca/user/40262"/>
+ <content type="html">@&lt;span class=&quot;vcard&quot;&gt;&lt;a href=&quot;http://identi.ca/user/40262&quot; class=&quot;url&quot; title=&quot;Roy Schestowitz (schestowitz)&quot;&gt;&lt;span class=&quot;fn nickname&quot;&gt;schestowitz&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; It's unfair to say #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/microsoft&quot; rel=&quot;tag&quot;&gt;Microsoft&lt;/a&gt;&lt;/span&gt; can't make decent #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/hardware&quot; rel=&quot;tag&quot;&gt;hardware.&lt;/a&gt;&lt;/span&gt; Every single key of my Microsoft #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/keyboard&quot; rel=&quot;tag&quot;&gt;keyboard&lt;/a&gt;&lt;/span&gt; works (most of the time).</content>
+ <category term="hardware"></category>
+ <category term="keyboard"></category>
+ <category term="microsoft"></category>
+</entry>
+<entry>
+ <title>BBC's #NickRobinson wonders who will be writing next years' Queen's speech. Asserts &quot;she doesn't get to choose&quot;. Well, technically...</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/15043254"/>
+ <id>http://identi.ca/notice/15043254</id>
+ <published>2009-11-18T22:27:24+00:00</published>
+ <updated>2009-11-18T22:27:24+00:00</updated>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/15043254"/>
+ <content type="html">BBC's #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/nickrobinson&quot; rel=&quot;tag&quot;&gt;NickRobinson&lt;/a&gt;&lt;/span&gt; wonders who will be writing next years' Queen's speech. Asserts &amp;quot;she doesn't get to choose&amp;quot;. Well, technically...</content>
+ <category term="nickrobinson"></category>
+</entry>
+<entry>
+ <title>#MichaelHowardMP tells Kent County Council that Channel Tunnel lorry park will be built &quot;over [his] dead body&quot;. #MostPeoplePreferHeadstones</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/15042946"/>
+ <id>http://identi.ca/notice/15042946</id>
+ <published>2009-11-18T22:22:29+00:00</published>
+ <updated>2009-11-18T22:22:29+00:00</updated>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/15042946"/>
+ <content type="html">#&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/michaelhowardmp&quot; rel=&quot;tag&quot;&gt;MichaelHowardMP&lt;/a&gt;&lt;/span&gt; tells Kent County Council that Channel Tunnel lorry park will be built &amp;quot;over [his] dead body&amp;quot;. #&lt;span class=&quot;tag&quot;&gt;&lt;a href=&quot;http://identi.ca/tag/mostpeoplepreferheadstones&quot; rel=&quot;tag&quot;&gt;MostPeoplePreferHeadstones&lt;/a&gt;&lt;/span&gt;</content>
+ <category term="michaelhowardmp"></category>
+ <category term="mostpeoplepreferheadstones"></category>
+</entry>
+<entry>
+ <title>@danja Indeed - air is heavy. The Eiffel Tower weighs less than an equivalent volume of air. http://is.gd/4RQHv</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/14298585"/>
+ <id>http://identi.ca/notice/14298585</id>
+ <published>2009-11-10T16:30:59+00:00</published>
+ <updated>2009-11-10T16:30:59+00:00</updated>
+ <link rel="related" href="http://identi.ca/notice/14295702"/>
+ <thr:in-reply-to ref="http://identi.ca/notice/14295702" href="http://identi.ca/notice/14295702"></thr:in-reply-to>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/14295702"/>
+ <link rel="ostatus:attention" href="http://identi.ca/user/114"/>
+ <content type="html">@&lt;span class=&quot;vcard&quot;&gt;&lt;a href=&quot;http://identi.ca/user/114&quot; class=&quot;url&quot; title=&quot;Danny Ayers (danja)&quot;&gt;&lt;span class=&quot;fn nickname&quot;&gt;danja&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; Indeed - air is heavy. The Eiffel Tower weighs less than an equivalent volume of air. &lt;a href=&quot;http://is.gd/4RQHv&quot; rel=&quot;external&quot;&gt;http://is.gd/4RQHv&lt;/a&gt;</content>
+</entry>
+<entry>
+ <title>@danbri Good idea. !rdf now has a bunch more admins too.</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/13959298"/>
+ <id>http://identi.ca/notice/13959298</id>
+ <published>2009-11-06T18:31:07+00:00</published>
+ <updated>2009-11-06T18:31:07+00:00</updated>
+ <link rel="related" href="http://identi.ca/notice/13955793"/>
+ <thr:in-reply-to ref="http://identi.ca/notice/13955793" href="http://identi.ca/notice/13955793"></thr:in-reply-to>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/13955793"/>
+ <link rel="ostatus:attention" href="http://identi.ca/user/226"/>
+ <link rel="ostatus:attention" href="http://identi.ca/group/233/id"/>
+ <content type="html">@&lt;span class=&quot;vcard&quot;&gt;&lt;a href=&quot;http://identi.ca/user/226&quot; class=&quot;url&quot; title=&quot;Dan Brickley (danbri)&quot;&gt;&lt;span class=&quot;fn nickname&quot;&gt;danbri&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; Good idea. !&lt;span class=&quot;vcard&quot;&gt;&lt;a href=&quot;http://identi.ca/group/233/id&quot; class=&quot;url&quot; title=&quot;Data on the web (rdf)&quot;&gt;&lt;span class=&quot;fn nickname&quot;&gt;rdf&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; now has a bunch more admins too.</content>
+ <category term="rdf"></category>
+</entry>
+<entry>
+ <title>@danbri, you seem to have made @getafreelancer an admin of !semweb instead of blocking him/her/it.</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/13947525"/>
+ <id>http://identi.ca/notice/13947525</id>
+ <published>2009-11-06T15:49:03+00:00</published>
+ <updated>2009-11-06T15:49:03+00:00</updated>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/13947525"/>
+ <link rel="ostatus:attention" href="http://identi.ca/user/226"/>
+ <link rel="ostatus:attention" href="http://identi.ca/user/67582"/>
+ <link rel="ostatus:attention" href="http://identi.ca/group/169/id"/>
+ <content type="html">@&lt;span class=&quot;vcard&quot;&gt;&lt;a href=&quot;http://identi.ca/user/226&quot; class=&quot;url&quot; title=&quot;Dan Brickley (danbri)&quot;&gt;&lt;span class=&quot;fn nickname&quot;&gt;danbri&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;, you seem to have made @&lt;span class=&quot;vcard&quot;&gt;&lt;a href=&quot;http://identi.ca/user/67582&quot; class=&quot;url&quot; title=&quot;GetaFreelancer (getafreelancer)&quot;&gt;&lt;span class=&quot;fn nickname&quot;&gt;getafreelancer&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; an admin of !&lt;span class=&quot;vcard&quot;&gt;&lt;a href=&quot;http://identi.ca/group/169/id&quot; class=&quot;url&quot; title=&quot;Semantic Web project (semweb)&quot;&gt;&lt;span class=&quot;fn nickname&quot;&gt;semweb&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; instead of blocking him/her/it.</content>
+ <category term="semweb"></category>
+</entry>
+<entry>
+ <title>Wow! identichat.prosody.im even allows me to reply back to identi.ca! Sayonara update@identi.ca.</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/13831989"/>
+ <id>http://identi.ca/notice/13831989</id>
+ <published>2009-11-05T11:06:57+00:00</published>
+ <updated>2009-11-05T11:06:57+00:00</updated>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/13831989"/>
+ <content type="html">Wow! &lt;a href=&quot;http://identichat.prosody.im/&quot; rel=&quot;external&quot;&gt;identichat.prosody.im&lt;/a&gt; even allows me to reply back to &lt;a href=&quot;http://identi.ca/&quot; rel=&quot;external&quot;&gt;identi.ca&lt;/a&gt;! Sayonara &lt;a href=&quot;mailto:update@identi.ca&quot; rel=&quot;external&quot;&gt;update@identi.ca&lt;/a&gt;.</content>
+</entry>
+<entry>
+ <title>@1sw !spamreport</title>
+ <link rel="alternate" type="text/html" href="http://identi.ca/notice/13828820"/>
+ <id>http://identi.ca/notice/13828820</id>
+ <published>2009-11-05T10:14:57+00:00</published>
+ <updated>2009-11-05T10:14:57+00:00</updated>
+ <link rel="ostatus:conversation" href="http://identi.ca/conversation/13828820"/>
+ <link rel="ostatus:attention" href="http://identi.ca/group/47/id"/>
+ <content type="html">@&lt;span class=&quot;vcard&quot;&gt;&lt;a href=&quot;http://identi.ca/user/92777&quot; class=&quot;url&quot; title=&quot;FIRST PORN DUMP - FREE PORN ONLINE (1sw)&quot;&gt;&lt;span class=&quot;fn nickname&quot;&gt;1sw&lt;/span&gt;&lt;/a&gt;&lt;/span&gt; !&lt;span class=&quot;vcard&quot;&gt;&lt;a href=&quot;http://identi.ca/group/47/id&quot; class=&quot;url&quot; title=&quot;spamreport (spamreport)&quot;&gt;&lt;span class=&quot;fn nickname&quot;&gt;spamreport&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;</content>
+ <category term="spamreport"></category>
+</entry>
+</feed>
+############################################################################
+## Changes #################################################################
+############################################################################
+
+XML-Atom-Microformats
+=====================
+
+Created:      2010-04-14
+Home page:    <http://search.cpan.org/dist/XML-Atom-Microformats/>
+Bug tracker:  <http://rt.cpan.org/Dist/Display.html?Queue=XML-Atom-Microformats>
+Maintainer:   Toby Inkster <mailto:tobyink@cpan.org>
+
+0.00_00 [2010-04-28]
+
 <>
 
 	dc:title         "Changes" ;
-	dc:description   "Revision history for Perl extension Example::Example."@en ;
+	dc:description   "Revision history for Perl extension XML::Atom::Microformats."@en ;
 	dc:subject       my:project ;
 	dc:creator       toby:i .
 
 #############################################################
 
-my:v_0-01
+my:v_0-00_00
 
 	a               :Version ;
-	dc:issued       "2000-01-01"^^xsd:date ;
-	:revision       "0.01"^^xsd:string ;
-	:file-release   <http://backpan.cpan.org/authors/id/T/TO/TOBYINK/Example-Example-0.01.tar.gz> ;
-	rdfs:comment    "Original version"@en .
+	dc:issued       "2010-04-28"^^xsd:date ;
+	:revision       "0.00_00"^^xsd:string ;
+	:file-release   <http://backpan.cpan.org/authors/id/T/TO/TOBYINK/XML-Atom-Microformats-0.00_00.tar.gz> ;
+	rdfs:comment    "Initial preview"@en .
 
 #############################################################
 
 my:project
 
 	a               :Project ;
-	:name           "Example-Example" ;
-	:shortdesc      "Example Project"@en ;
+	:name           "XML-Atom-Microformats" ;
+	:shortdesc      "parse microformats in Atom feeds"@en ;
 	:programming-language  "Perl" ;
-	:homepage       <http://search.cpan.org/dist/Example-Example/> ;
-	:download-page  <http://search.cpan.org/dist/Example-Example/> ;
-	:bug-database   <http://rt.cpan.org/Dist/Display.html?Queue=Example-Example> ;
-	:repository     [ a :SVNRepository ; :browse <http://goddamn.co.uk/viewvc/perlmods/Example-Example/> ] ;
+	:homepage       <http://search.cpan.org/dist/XML-Atom-Microformats/> ;
+	:download-page  <http://search.cpan.org/dist/XML-Atom-Microformats/> ;
+	:bug-database   <http://rt.cpan.org/Dist/Display.html?Queue=XML-Atom-Microformats> ;
+	:repository     [ a :SVNRepository ; :browse <http://goddamn.co.uk/viewvc/perlmods/XML-Atom-Microformats/> ] ;
 	:maintainer     toby:i ;
 	:developer      toby:i ;
 	:documenter     toby:i ;
 	:tester         toby:i ;
-	:created        "2000-01-01"^^xsd:date ;
+	:created        "2010-04-14"^^xsd:date ;
 	:license        <http://dev.perl.org/licenses/> ;
-	:release        my:v_0-01 .
+	:release        my:v_0-00_00 .
 
 #############################################################
 
 	foaf:name       "Toby Inkster" ;
 	foaf:homepage   <http://tobyinkster.co.uk/> ;
 	foaf:page       <http://search.cpan.org/~tobyink/> ;
-	foaf:mbox       <mailto:tobyink@cpan.org> .
+	foaf:mbox       <mailto:tobyink@cpan.org> ;
+	<http://www.w3.org/2002/07/owl#sameAs> <http://purl.org/NET/cpan-uri/person/tobyink> .
 
 #############################################################
+<?xml version="1.0" encoding="utf-8"?>
+<rdf:RDF
+   xmlns:dc="http://purl.org/dc/terms/"
+   xmlns:dcs="http://ontologi.es/doap-changeset#"
+   xmlns:foaf="http://xmlns.com/foaf/0.1/"
+   xmlns:my="http://purl.org/NET/cpan-uri/dist/XML-Atom-Microformats/"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
+   xmlns:toby="http://tobyinkster.co.uk/#"
+   xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
+   xmlns="http://usefulinc.com/ns/doap#">
+  <rdf:Description rdf:about="file:///home/tai/src/perlmods/XML-Atom-Microformats/Changes.ttl">
+    <dc:creator rdf:resource="http://tobyinkster.co.uk/#i"/>
+    <dc:description xml:lang="en">Revision history for Perl extension XML::Atom::Microformats.</dc:description>
+    <dc:subject rdf:resource="http://purl.org/NET/cpan-uri/dist/XML-Atom-Microformats/project"/>
+    <dc:title>Changes</dc:title>
+  </rdf:Description>
+  <Version rdf:about="http://purl.org/NET/cpan-uri/dist/XML-Atom-Microformats/v_0-00_00">
+    <dc:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2010-04-28</dc:issued>
+    <file-release rdf:resource="http://backpan.cpan.org/authors/id/T/TO/TOBYINK/XML-Atom-Microformats-0.00_00.tar.gz"/>
+    <revision rdf:datatype="http://www.w3.org/2001/XMLSchema#string">0.00_00</revision>
+    <rdfs:comment xml:lang="en">Initial preview</rdfs:comment>
+  </Version>
+  <Project rdf:about="http://purl.org/NET/cpan-uri/dist/XML-Atom-Microformats/project">
+    <bug-database rdf:resource="http://rt.cpan.org/Dist/Display.html?Queue=XML-Atom-Microformats"/>
+    <created rdf:datatype="http://www.w3.org/2001/XMLSchema#date">2010-04-14</created>
+    <developer rdf:resource="http://tobyinkster.co.uk/#i"/>
+    <documenter rdf:resource="http://tobyinkster.co.uk/#i"/>
+    <download-page rdf:resource="http://search.cpan.org/dist/XML-Atom-Microformats/"/>
+    <homepage rdf:resource="http://search.cpan.org/dist/XML-Atom-Microformats/"/>
+    <license rdf:resource="http://dev.perl.org/licenses/"/>
+    <maintainer rdf:resource="http://tobyinkster.co.uk/#i"/>
+    <name>XML-Atom-Microformats</name>
+    <programming-language>Perl</programming-language>
+    <release rdf:resource="http://purl.org/NET/cpan-uri/dist/XML-Atom-Microformats/v_0-00_00"/>
+    <repository>
+      <SVNRepository>
+        <browse rdf:resource="http://goddamn.co.uk/viewvc/perlmods/XML-Atom-Microformats/"/>
+      </SVNRepository>
+    </repository>
+    <shortdesc xml:lang="en">parse microformats in Atom feeds</shortdesc>
+    <tester rdf:resource="http://tobyinkster.co.uk/#i"/>
+  </Project>
+  <foaf:Person rdf:about="http://tobyinkster.co.uk/#i">
+    <ns1:sameAs xmlns:ns1="http://www.w3.org/2002/07/owl#" rdf:resource="http://purl.org/NET/cpan-uri/person/tobyink"/>
+    <foaf:homepage rdf:resource="http://tobyinkster.co.uk/"/>
+    <foaf:mbox rdf:resource="mailto:tobyink@cpan.org"/>
+    <foaf:name>Toby Inkster</foaf:name>
+    <foaf:page rdf:resource="http://search.cpan.org/~tobyink/"/>
+  </foaf:Person>
+</rdf:RDF>
 SIGNATURE
 
 lib/XML/Atom/Microformats.pm
-lib/XML/Atom/Microformats/_context.pm
 
 t/00sig.t
 t/01basic.t
+
+inc/Module/AutoInstall.pm
+inc/Module/Install/AutoInstall.pm
+inc/Module/Install/Base.pm
+inc/Module/Install/Can.pm
+inc/Module/Install/DOAPChangeSets.pm
+inc/Module/Install/Fetch.pm
+inc/Module/Install/Include.pm
+inc/Module/Install/Makefile.pm
+inc/Module/Install/Metadata.pm
+inc/Module/Install.pm
+inc/Module/Install/ReadmeFromPod.pm
+inc/Module/Install/Win32.pm
+inc/Module/Install/WriteAll.pm
+inc/Test/Signature.pm
 \.svn
 ^example.*\.pl$
 ^[^/]+\.(tar\.gz|tar\.bz2|tgz|tbz2|tbz|zip|tar)$
-^MYMETA..yml
+^MYMETA.yml
+---
+abstract: 'parse microformats in Atom feeds'
+author:
+  - 'Toby Inkster <tobyink@cpan.org>'
+build_requires:
+  ExtUtils::MakeMaker: 6.42
+  Test::More: 0.61
+configure_requires:
+  ExtUtils::MakeMaker: 6.42
+distribution_type: module
+generated_by: 'Module::Install version 0.95'
+license: perl
+meta-spec:
+  url: http://module-build.sourceforge.net/META-spec-v1.4.html
+  version: 1.4
+name: XML-Atom-Microformats
+no_index:
+  directory:
+    - inc
+    - t
+recommends:
+  RDF::RDFa::Parser: 1.09_04
+requires:
+  HTML::Microformats: 0
+  RDF::Trine: 0.112
+  XML::Atom::OWL: 0
+  XML::LibXML: 1.60
+  perl: 5.8.0
+resources:
+  bugtracker: http://rt.cpan.org/Dist/Display.html?Queue=XML-Atom-Microformats
+  homepage: http://search.cpan.org/dist/XML-Atom-Microformats/
+  license: http://dev.perl.org/licenses/
+  repository: http://goddamn.co.uk/viewvc/perlmods/XML-Atom-Microformats/
+version: 0.00_00
 
 test_requires       'Test::More' => '0.61';
 
-requires            'Carp'               => '1.00';
 requires            'HTML::Microformats' => 0;
-requires            'HTML::HTML5::Parser'=> 0;
 requires            'RDF::Trine'         => '0.112';
-requires            'URI'                => '1.30';
 requires            'XML::Atom::OWL'     => 0;
 requires            'XML::LibXML'        => '1.60';
 
-recommends          'RDF::RDFa::Parser'  => '1.00';
+recommends          'RDF::RDFa::Parser'  => '1.09_04';
 
 resources(
 	'homepage'   => "http://search.cpan.org/dist/$dist/",
+NAME
+    XML::Atom::Microformats - parse microformats in Atom feeds
+
+SYNOPSIS
+     use XML::Atom::Microformats;
+ 
+     my $feed = HTML::Microformats
+                 ->new_feed($xml, $base_uri)
+                 ->assume_profile(qw(hCard hCalendar));
+     print $feed->json(pretty => 1);
+ 
+     use RDF::TrineShortcuts qw(rdf_query);
+     my $results = rdf_query($sparql, $feed->model);
+
+VERSION
+    0.00_00
+
+DESCRIPTION
+    The XML::Atom::Microformats module brings the functionality of
+    HTML::Microformats to Atom 1.0 Syndication feeds. It finds microformats
+    embedded in the <content> elements (note: not <summary>) of Atom
+    entries.
+
+    The general pattern of usage is to create an XML::Atom::Microformats
+    object (which corresponds to an Atom 1.0 feed) using the "new_feed"
+    method; then ask for the data, as a Perl hashref, a JSON string, or an
+    RDF::Trine model.
+
+  Constructor
+    "$feed = XML::Atom::Microformats->new_feed($xml, $base_url)"
+        Constructs a feed object.
+
+        $xml is the Atom source (string) or an XML::LibXML::Document.
+
+        $base_url is the feed URL, important for resolving relative URL
+        references.
+
+  Profile Management
+    HTML::Microformats uses HTML profiles (i.e. the profile attribute on the
+    HTML <head> element) to detect which Microformats are used on a page.
+    Any microformats which do not have a profile URI declared will not be
+    parsed.
+
+    XML::Atom::Microformats uses a similar mechanism. Because Atom does not
+    have a <head> element, Atom <link> is used instead:
+
+      <link rel="profile" href="http://ufs.cc/x/hcalendar" />
+
+    These links can be used on a per-entry basis, or for the whole feed.
+
+    Because many pages fail to properly declare which profiles they use,
+    there are various profile management methods to tell
+    XML::Atom::Microformats to assume the presence of particular profile
+    URIs, even if they're actually missing.
+
+    "$feed->add_profile(@profiles)", "$feed->entry_add_profile($entryid,
+    @profiles)"
+        Using "add_profile" you can add one or more profile URIs, and they
+        are treated as if they were found on the document.
+
+        For example:
+
+         $feed->add_profile('http://microformats.org/profile/rel-tag')
+
+        This is useful for adding profile URIs declared outside the document
+        itself (e.g. in HTTP headers).
+
+        "entry_add_profile" is a variant to allow you to add a profile which
+        applies only to one specific entry within the feed, if you know that
+        entry's ID.
+
+    "$feed->assume_profile(@microformats)",
+    "$feed->entry_assume_profile($entryid, @profiles)"
+        For example:
+
+         $feed->assume_profile(qw(hCard adr geo))
+
+        This method acts similarly to "add_profile" but allows you to use
+        names of microformats rather than URIs. Microformat names are case
+        sensitive, and must match HTML::Microformats::Foo module names.
+
+        "entry_assume_profile" is a variant to allow you to add a profile
+        which applies only to one specific entry within the feed, if you
+        know that entry's ID.
+
+    "$feed->assume_all_profiles",
+    "$feed->entry_assume_all_profiles($entryid)"
+        This method is equivalent to calling "assume_profile" for all known
+        microformats.
+
+  Parsing Microformats
+    Generally speaking, you can skip this. The "data", "json" and "model"
+    methods will automatically do this for you.
+
+    "$feed->parse_microformats"
+        Scans through the feed, finding microformat objects.
+
+        On subsequent calls, does nothing (as everything is already parsed).
+
+    "$feed->clear_microformats"
+        Forgets information gleaned by "parse_microformats" and thus allows
+        "parse_microformats" to be run again. This is useful if you've
+        modified added some profiles between runs of "parse_microformats".
+
+  Retrieving Data
+    These methods allow you to retrieve the feed's data, and do things with
+    it.
+
+    "$feed->objects($format)", "$feed->entry_objects($entryid, $format)"
+        $format is, for example, 'hCard', 'adr' or 'RelTag'.
+
+        Returns a list of objects of that type. (If called in scalar
+        context, returns an arrayref.)
+
+        Each object is, for example, an HTML::Microformat::hCard object, or
+        an HTML::Microformat::RelTag object, etc. See the relevent
+        documentation for details.
+
+        "entry_objects" is a variant to allow you to fetch data for one
+        specific entry within the feed, if you know that entry's ID.
+
+    "$feed->all_objects", "$feed->entry_all_objects($entryid)"
+        Returns a hashref of data. Each hashref key is the name of a
+        microformat (e.g. 'hCard', 'RelTag', etc), and the values are
+        arrayrefs of objects.
+
+        Each object is, for example, an HTML::Microformat::hCard object, or
+        an HTML::Microformat::RelTag object, etc. See the relevent
+        documentation for details.
+
+        "entry_all_objects" is a variant to allow you to fetch data for one
+        specific entry within the feed, if you know that entry's ID.
+
+    "$feed->json(%opts)", "$feed->entry_json($entryid, %opts)"
+        Returns data roughly equivalent to the "all_objects" method, but as
+        a JSON string.
+
+        %opts is a hash of options, suitable for passing to the JSON
+        module's to_json function. The 'convert_blessed' and 'utf8' options
+        are enabled by default, but can be disabled by explicitly setting
+        them to 0, e.g.
+
+          print $feed->json( pretty=>1, canonical=>1, utf8=>0 );
+
+        "entry_json" is a variant to allow you to fetch data for one
+        specific entry within the feed, if you know that entry's ID.
+
+    "$feed->model(%opts)", "$feed->entry_model($entryid, %opts)"
+        Returns data as an RDF::Trine::Model, suitable for serialising as
+        RDF or running SPARQL queries. Quads are used (rather than triples)
+        which allows you to trace statements to the entries from which they
+        came.
+
+        "entry_model" is a variant to allow you to fetch data for one
+        specific entry within the feed, if you know that entry's ID.
+
+        $opts{'atomowl'} is a boolean indicating whether or not to include
+        data from XML::Atom::OWL in the returned model. If enabled, this
+        always includes AtomOWL data for the whole feed (not just for a
+        specific entry), even if you use the "entry_model" method.
+
+        If RDF::RDFa::Parser 1.09_04 or above is installed, then
+        $opts{'atomowl'} will automatically pull in DataRSS data too.
+
+    "$feed->add_to_model($model, %opts)", "$feed->entry_add_to_model($entry,
+    $model, %opts)".
+        Adds data to an existing RDF::Trine::Model. Otherwise, the same as
+        "model".
+
+BUGS
+    Please report any bugs to <http://rt.cpan.org/>.
+
+SEE ALSO
+    XML::Atom::OWL, HTML::Microformats, RDF::RDFa::Parser.
+
+    <http://microformats.org/>, <http://www.perlrdf.org/>.
+
+AUTHOR
+    Toby Inkster <tobyink@cpan.org>.
+
+COPYRIGHT
+    Copyright 2010 Toby Inkster
+
+    This library is free software; you can redistribute it and/or modify it
+    under the same terms as Perl itself.
+
Add a comment to this file

XML-Atom-Microformats-0.00_00.tar.gz

Binary file added.

 		<link rel="profile" href="http://ufs.cc/x/hcard" />
 	</entry>
 	<entry>
+		<foo property=":fooble">lala</foo>
 		<id>http://example.com/id/2</id>
 		<content type="text/html">
-			&lt;p class="vcard">&lt;span class="fn">Bob&lt;/span>&lt;/p>
+			&lt;p class="vcard">&lt;a href="/foo" class="fn url">Bob&lt;/a>&lt;/p>
 		</content>
 		<link rel="self" href="http://example.com/article/2" />
 	</entry>
 </feed>
 XML
 
-my $xamf = XML::Atom::Microformats->new($xml, "http://example.net/");
+my $xamf = XML::Atom::Microformats->new_feed($xml, "http://example.net/");
+$xamf->assume_all_profiles;
+print $xamf->json(pretty=>1,canonical=>1);
 
-print $xamf->json(pretty=>1,canonical=>1);
+my $s = RDF::Trine::Serializer::NQuads->new;
+print $s->serialize_model_to_string($xamf->model(atomowl=>1));
+use lib "lib";
+use lib "../XML-Atom-OWL/lib";
+use lib "../HTML-Microformats/lib";
+use Data::Dumper;
+use JSON;
+use XML::Atom::Microformats;
+
+my $xml = `cat 36737.atom`;
+
+my $xamf = XML::Atom::Microformats->new_feed($xml, "http://identi.ca/api/statuses/user_timeline/36737.atom");
+$xamf->assume_profile('hCard');
+print $xamf->json(pretty=>1,canonical=>1);

lib/XML/Atom/Microformats.pm

+=head1 NAME
+
+XML::Atom::Microformats - parse microformats in Atom feeds
+
+=head1 SYNOPSIS
+
+ use XML::Atom::Microformats;
+ 
+ my $feed = HTML::Microformats
+             ->new_feed($xml, $base_uri)
+             ->assume_profile(qw(hCard hCalendar));
+ print $feed->json(pretty => 1);
+ 
+ use RDF::TrineShortcuts qw(rdf_query);
+ my $results = rdf_query($sparql, $feed->model);
+ 
+=cut
+
 package XML::Atom::Microformats;
 
+use common::sense;
+use 5.008;
+
 use HTML::Microformats;
 use JSON;
 use RDF::Query;
 use XML::Atom::OWL;
 
-sub new
+=head1 VERSION
+
+0.00_00
+
+=cut
+
+our $VERSION = '0.00_00';
+our $HAS_RDFA;
+
+BEGIN
+{
+	eval "use RDF::RDFa::Parser; use RDF::RDFa::Parser::Config;";
+	$HAS_RDFA = $@ ? 0 : 1 ;
+}
+
+=head1 DESCRIPTION
+
+The XML::Atom::Microformats module brings the functionality of
+L<HTML::Microformats> to Atom 1.0 Syndication feeds. It finds
+microformats embedded in the E<lt>contentE<gt> elements
+(note: not E<lt>summaryE<gt>) of Atom entries.
+
+The general pattern of usage is to create an XML::Atom::Microformats
+object (which corresponds to an Atom 1.0 feed) using the
+C<new_feed> method; then ask for the data, as a Perl hashref,
+a JSON string, or an RDF::Trine model.
+
+=head2 Constructor
+
+=over 4
+
+=item C<< $feed = XML::Atom::Microformats->new_feed($xml, $base_url) >>
+
+Constructs a feed object.
+
+$xml is the Atom source (string) or an XML::LibXML::Document.
+
+$base_url is the feed URL, important for resolving relative URL references.
+
+=back
+
+=cut
+
+sub new_feed
 {
 	my ($class, $xml, $base_uri) = @_;
-	my $awol = XML::Atom::OWL->new($xml, $base_uri, undef, RDF::Trine::Store::Memory->temporary_store)->consume;
-	my $self = bless { 'AWOL' => $awol }, $class;
 	
+	my $awol;
+
+	if ($HAS_RDFA)
+	{
+		my $cfg = RDF::RDFa::Parser::Config->new('atom', '1.0', atom_parser=>1);
+		$awol = RDF::RDFa::Parser->new($xml, $base_uri, $cfg, RDF::Trine::Store::Memory->temporary_store)->consume;
+	}
+	else
+	{
+		$awol = XML::Atom::OWL->new($xml, $base_uri, undef, RDF::Trine::Store::Memory->temporary_store)->consume;
+	}
+	
+	my $self = bless { 'AWOL' => $awol , 'base' => $base_uri }, $class;
 	return $self->_find_contexts->_prepare_contexts;	
 }
 
 		
 		my $hmf = HTML::Microformats->new_document(
 			$html,
-			($context->{'entrylink'} || $context->{'entryid'}),
+			$self->{'base'},
 			type => $context->{'contenttype'});
 		
 		if ($@ || !defined $hmf)
 			next;
 		}
 		
+		$hmf->{'context'}->{'document_uri'} = $context->{'entrylink'} || $context->{'entryid'};
 		$hmf->add_profile( @{$context->{'profiles'}} );
 		
 		$context->{'HMF'} = $hmf;
 	return $self;
 }
 
+=head2 Profile Management
+
+HTML::Microformats uses HTML profiles (i.e. the profile attribute on the
+HTML <head> element) to detect which Microformats are used on a page. Any
+microformats which do not have a profile URI declared will not be parsed.
+
+XML::Atom::Microformats uses a similar mechanism. Because Atom does not
+have a E<lt>headE<gt> element, Atom E<lt>linkE<gt> is used instead:
+
+  <link rel="profile" href="http://ufs.cc/x/hcalendar" />
+
+These links can be used on a per-entry basis, or for the whole feed.
+
+Because many pages fail to properly declare which profiles they use, there
+are various profile management methods to tell XML::Atom::Microformats to
+assume the presence of particular profile URIs, even if they're actually
+missing.
+
+=over 4
+
+=item C<< $feed->add_profile(@profiles) >>,
+C<< $feed->entry_add_profile($entryid, @profiles) >>
+
+Using C<add_profile> you can add one or more profile URIs, and they are
+treated as if they were found on the document.
+
+For example:
+
+ $feed->add_profile('http://microformats.org/profile/rel-tag')
+
+This is useful for adding profile URIs declared outside the document itself
+(e.g. in HTTP headers).
+
+C<entry_add_profile> is a variant to allow you to add a profile which applies
+only to one specific entry within the feed, if you know that entry's ID.
+
+=cut
+
+sub add_profile
+{
+	my ($self, @profiles) = @_;
+	foreach my $context (@{$self->{'contexts'}})
+	{
+		next unless $context->{'HMF'};
+		$context->{'HMF'}->add_profile(@profiles);
+	}
+	return $self;
+}
+
+sub entry_add_profile
+{
+	my ($self, $entry, @profiles) = @_;
+	foreach my $context (@{$self->{'contexts'}})
+	{
+		next unless $context->{'HMF'};
+		next unless $context->{'entryid'} eq $entry;
+		$context->{'HMF'}->add_profile(@profiles);
+	}
+	return $self;
+}
+
+=item C<< $feed->assume_profile(@microformats) >>,
+C<< $feed->entry_assume_profile($entryid, @profiles) >>
+
+For example:
+
+ $feed->assume_profile(qw(hCard adr geo))
+
+This method acts similarly to C<add_profile> but allows you to use
+names of microformats rather than URIs. Microformat names are case
+sensitive, and must match HTML::Microformats::Foo module names.
+
+C<entry_assume_profile> is a variant to allow you to add a profile which applies
+only to one specific entry within the feed, if you know that entry's ID.
+
+=cut
+
+sub assume_profile
+{
+	my ($self, @profiles) = @_;
+	foreach my $context (@{$self->{'contexts'}})
+	{
+		next unless $context->{'HMF'};
+		$context->{'HMF'}->assume_profile(@profiles);
+	}
+	return $self;
+}
+
+sub entry_assume_profile
+{
+	my ($self, $entry, @profiles) = @_;
+	foreach my $context (@{$self->{'contexts'}})
+	{
+		next unless $context->{'HMF'};
+		next unless $context->{'entryid'} eq $entry;
+		$context->{'HMF'}->assume_profile(@profiles);
+	}
+	return $self;
+}
+
+=item C<< $feed->assume_all_profiles >>,
+C<< $feed->entry_assume_all_profiles($entryid) >>
+
+This method is equivalent to calling C<assume_profile> for
+all known microformats.
+
+=back
+
+=cut
+
+sub assume_all_profiles
+{
+	my ($self) = @_;
+	foreach my $context (@{$self->{'contexts'}})
+	{
+		next unless $context->{'HMF'};
+		$context->{'HMF'}->assume_all_profiles;
+	}
+	return $self;
+}
+
+sub entry_assume_all_profiles
+{
+	my ($self, $entry) = @_;
+	foreach my $context (@{$self->{'contexts'}})
+	{
+		next unless $context->{'HMF'};
+		next unless $context->{'entryid'} eq $entry;
+		$context->{'HMF'}->assume_all_profiles;
+	}
+	return $self;
+}
+
+=head2 Parsing Microformats
+
+Generally speaking, you can skip this. The C<data>, C<json> and
+C<model> methods will automatically do this for you.
+
+=over 4
+
+=item C<< $feed->parse_microformats >>
+
+Scans through the feed, finding microformat objects.
+
+On subsequent calls, does nothing (as everything is already parsed).
+
+=cut
+
 sub parse_microformats
 {
 	my $self = shift;
 	return $self;
 }
 
+=item C<< $feed->clear_microformats >>
+
+Forgets information gleaned by C<parse_microformats> and thus allows
+C<parse_microformats> to be run again. This is useful if you've modified
+added some profiles between runs of C<parse_microformats>.
+
+=back
+
+=cut
+
 sub clear_microformats
 {
 	my $self = shift;
 	return $self;
 }
 
+=head2 Retrieving Data
+
+These methods allow you to retrieve the feed's data, and do things
+with it.
+
+=over 4
+
+=item C<< $feed->objects($format) >>,
+C<< $feed->entry_objects($entryid, $format) >>
+
+$format is, for example, 'hCard', 'adr' or 'RelTag'.
+
+Returns a list of objects of that type. (If called in scalar context,
+returns an arrayref.)
+
+Each object is, for example, an HTML::Microformat::hCard object, or an
+HTML::Microformat::RelTag object, etc. See the relevent documentation
+for details.
+
+C<entry_objects> is a variant to allow you to fetch data for
+one specific entry within the feed, if you know that entry's ID.
+
+=cut
+
 sub objects
 {
 	my ($self, $format, $entry) = @_;
 	return \@rv;
 }
 
+sub entry_objects
+{
+	my ($self, $entry, $format) = @_;
+	return $self->objects($format, $entry);
+}
+
+=item C<< $feed->all_objects >>,
+C<< $feed->entry_all_objects($entryid) >>
+
+Returns a hashref of data. Each hashref key is the name of a microformat
+(e.g. 'hCard', 'RelTag', etc), and the values are arrayrefs of objects.
+
+Each object is, for example, an HTML::Microformat::hCard object, or an
+HTML::Microformat::RelTag object, etc. See the relevent documentation
+for details.
+
+C<entry_all_objects> is a variant to allow you to fetch data for
+one specific entry within the feed, if you know that entry's ID.
+
+=cut
+
 sub all_objects
 {
 	my ($self, $entry) = @_;
 	return $rv;
 }
 
+*entry_all_objects = \&all_objects;
+
 sub TO_JSON
 {
-	return $_[0]->all_objects;
+	return  $_[0]->all_objects;
 }
 
+=item C<< $feed->json(%opts) >>,
+C<< $feed->entry_json($entryid, %opts) >>
+
+Returns data roughly equivalent to the C<all_objects> method, but as a JSON
+string.
+
+%opts is a hash of options, suitable for passing to the L<JSON>
+module's to_json function. The 'convert_blessed' and 'utf8' options are
+enabled by default, but can be disabled by explicitly setting them to 0, e.g.
+
+  print $feed->json( pretty=>1, canonical=>1, utf8=>0 );
+
+C<entry_json> is a variant to allow you to fetch data for
+one specific entry within the feed, if you know that entry's ID.
+
+=cut
+
 sub json
 {
 	my ($self, %opts) = @_;
 	return to_json($self->all_objects, \%opts);
 }
 
-1;
+sub entry_json
+{
+	my ($self, $entry, %opts) = @_;
+	
+	$opts{'convert_blessed'} = 1
+		unless defined $opts{'convert_blessed'};
+	
+	$opts{'utf8'} = 1
+		unless defined $opts{'utf8'};
+
+	return to_json($self->entry_all_objects($entry), \%opts);
+}
+
+=item C<< $feed->model(%opts) >>,
+C<< $feed->entry_model($entryid, %opts) >>
+
+Returns data as an RDF::Trine::Model, suitable for serialising as
+RDF or running SPARQL queries. Quads are used (rather than
+triples) which allows you to trace statements to the entries from
+which they came.
+
+C<entry_model> is a variant to allow you to fetch data for
+one specific entry within the feed, if you know that entry's ID.
+
+$opts{'atomowl'} is a boolean indicating whether or not to
+include data from XML::Atom::OWL in the returned model.
+If enabled, this always includes AtomOWL data for the whole
+feed (not just for a specific entry), even if you use the
+C<entry_model> method.
+
+If RDF::RDFa::Parser 1.09_04 or above is installed, then
+$opts{'atomowl'} will automatically pull in DataRSS data
+too.
+
+=cut
+
+sub model
+{
+	my ($self, %opts)  = @_;
+	my $model = RDF::Trine::Model->temporary_model;
+	$self->add_to_model($model, %opts);
+	return $model;
+}
+
+sub entry_model
+{
+	my ($self, $entry, %opts)  = @_;
+	my $model = RDF::Trine::Model->temporary_model;
+	$self->entry_add_to_model($model, %opts);
+	return $model;
+}
+
+=item C<< $feed->add_to_model($model, %opts) >>,
+C<< $feed->entry_add_to_model($entry, $model, %opts) >>.
+
+Adds data to an existing RDF::Trine::Model. Otherwise, the same as C<model>.
+
+=back
+
+=cut
+
+sub add_to_model
+{
+	my ($self, $model, %opts) = @_;
+	$self->parse_microformats;
+	
+	my %entry_opts = %opts;
+	$entry_opts{'atomowl'} = 0;
+	foreach my $context (@{$self->{'contexts'}})
+	{
+		next unless $context->{'HMF'};
+		$self->entry_add_to_model($context->{'entryid'}, $model, %entry_opts);
+	}
+	
+	if ($opts{'atomowl'})
+	{
+		my $iter = $self->{'AWOL'}->graph->as_stream;
+		while (my $st = $iter->next)
+		{
+			$model->add_statement($st);
+		}
+	}
+	
+	return $self;
+}
+
+sub entry_add_to_model
+{
+	my ($self, $entry, $model, %opts) = @_;
+	$self->parse_microformats;
+	
+	foreach my $context (@{$self->{'contexts'}})
+	{
+		next unless $context->{'HMF'};
+		next unless $entry eq $context->{'entryid'};
+		
+		my $iter = $context->{'HMF'}->model->as_stream;
+		while (my $st = $iter->next)
+		{
+			$model->add_statement($st, RDF::Trine::Node::Resource->new($entry));
+		}
+	}
+	
+	if ($opts{'atomowl'})
+	{
+		my $iter = $self->{'AWOL'}->graph->as_stream;
+		while (my $st = $iter->next)
+		{
+			$model->add_statement($st);
+		}
+	}
+	
+	return $self;
+}
+
+1;
+
+=head1 BUGS
+
+Please report any bugs to L<http://rt.cpan.org/>.
+
+=head1 SEE ALSO
+
+L<XML::Atom::OWL>,
+L<HTML::Microformats>,
+L<RDF::RDFa::Parser>.
+
+L<http://microformats.org/>, L<http://www.perlrdf.org/>.
+
+=head1 AUTHOR
+
+Toby Inkster E<lt>tobyink@cpan.orgE<gt>.
+
+=head1 COPYRIGHT
+
+Copyright 2010 Toby Inkster
+
+This library is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=cut
+
 use Test::More tests => 1;
-BEGIN { use_ok('Example::Example') };
+BEGIN { use_ok('XML::Atom::Microformats') };
 
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.