incubator-couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From J Chris Anderson <jch...@gmail.com>
Subject Re: georss atom feed
Date Sat, 24 Jul 2010 01:30:42 GMT

On Jul 23, 2010, at 12:23 PM, Michael Lenahan wrote:

> Thanks, jchris!
> 
> I now have this:
> http://mick.couchone.com/blog/_design/geosofa/_list/index/recent-posts?descending=true&limit=10&format=atom
> 
> And this is what it looks like in Google Maps:
> http://maps.google.com/maps?f=q&source=s_q&hl=en&geocode=&q=http:%2F%2Fmick.couchone.com%2Fblog%2F_design%2Fgeosofa%2F_list%2Findex%2Frecent-posts%3Fdescending%3Dtrue%26limit%3D10%26format%3Datom&sll=37.0625,-95.677068&sspn=35.547176,56.513672&ie=UTF8&z=3
> 

This is super amazing.

If you are willing to share your changes back to the world via git, I'm sure people will dig
in and help you refine this even further.

Thanks so much for sharing it makes me really happy to see people pushing the boundaries like
this.

Chris

> Here's what I did:
> 
> I copied sofa into a new folder geosofa, and made these changes:
> 
> (at the end of vendor/couchapp/lib/atom.js)
> 
> exports.header = function(data) {
>  //
>  //var f = <feed xmlns="http://www.w3.org/2005/Atom"/>;
>  var f = <feed xmlns="http://www.w3.org/2005/Atom"
> xmlns:georss="http://www.georss.org/georss"/>;
>  //
>  f.title = data.title;
>  f.id = data.feed_id;
>  f.link.@href = data.feed_link;
>  f.link.@rel = "self";
>  f.generator = "CouchApp on CouchDB";
>  f.updated = rfc3339(data.updated);
>  return f.toXMLString().replace(/\<\/feed\>/,'');
> };
> 
> exports.entry = function(data) {
>  var entry = <entry/>;
>  entry.id = data.entry_id;
>  entry.title = data.title;
>  entry.content = data.content;
>  entry.content.@type = (data.content_type || 'html');
>  entry.updated = rfc3339(data.updated);
>  entry.author = <author><name>{data.author}</name></author>;
>  entry.link.@href = data.alternate;
>  entry.link.@rel = "alternate";
>  //
>  entry.point = data.point;
>  //
>  return entry;
> }
> 
> (at the end of lists/index.js)
> 
>          alternate : path.absolute(path.show('post', row.id)),
>          //
>          //point : row.value.loc[1] + " " + row.value.loc[0]
>          point : row.value.latitude + " " + row.value.longitude
>          //
>        });
>        // send the entry to client
>        send(feedEntry);
>      } while (row = getRow());
>    }
> 
>    // close the loop after all rows are rendered
>    return "</feed>";
>  });
> };
> 
> (I also made the following rudimentary changes to templates/edit.html)
> 
>    <!-- form to create a post -->
>    <form id="new-post" action="new.html" method="post">
>      <h1>{{pageTitle}}</h1>
>        <!-- amended for geosofa -->
>        <p><label>Place Name</label>
>          <input type="text" size="50" name="title" value=""></p>
>        <p><label>Latitude</label>
>          <input type="text" size="50" name="latitude" value=""></p>
>        <p><label>Longitude</label>
>          <input type="text" size="50" name="longitude" value=""></p>
>        <!-- -->
> 
> Some issues:
> 
> 1. I wasn't able to edit atom.js to make it take account of the full
> name for georss:point
> 
> entry.georss:point = data.point
> 
> I tried backslash-escaping, quoting, square brackets etc but with no luck.
> 
> In the end I settled with "point" (without the namespace). It works
> but it's a bit wrong.
> 
> 2. I started by saving the data in an array called "loc", since this
> is the way suggested by Volker
> (http://vmx.cx/cgi-bin/blog/index.cgi/geocouch-the-future-is-now:2010-05-03:en,CouchDB,Python,Erlang,geo)
> and more in line with geojson.
> 
> However, I've been tripped up by my lack of knowledge in couchapp - I
> don't know how to write from my couchapp into an array, whereas
> writing into separate latitude, longitude fields was very easy - just
> a matter of adding the text input tags to templates/edit.html
> 
> Thanks very much. Couchapp is simply amazing.
> 
> Michael
> 
> On 22 July 2010 21:34, J Chris Anderson <jchris@couch.io> wrote:
>> 
>> On Jul 22, 2010, at 1:27 PM, Michael Lenahan wrote:
>> 
>>> Hi there - I'm looking to find ways to get CouchDB to serve georss (in this
>>> case, a point with latitude and longitude).
>>> 
>>> I'm taking sofa as my starting point, because it has atom feed capability
>>> built in.
>>> 
>>> So, sofa can generate this:
>>> http://mick.couchone.com/blog/_design/sofa/_list/index/recent-posts?descending=true&limit=10&format=atom
>>> 
>>> In the couchapp files on my local machine I'm looking to amend
>>> sofa/lists/index.js so that the feed entry includes georss:point as
>>> specified here:
>>> http://www.georss.org/simple#Point
>>> 
>>> Currently the relevant part of sofa/lists/index.js looks like this:
>>> 
>>>        // generate the entry for this row
>>>        var feedEntry = Atom.entry({
>>>          entry_id :
>>> path.absolute('/'+encodeURIComponent(req.info.db_name)+'/'+encodeURIComponent(
>>> row.id)),
>>>          title : row.value.title,
>>>          content : html,
>>>          updated : new Date(row.value.created_at),
>>>          author : row.value.author,
>>>          alternate : path.absolute(path.show('post', row.id))
>>>        });
>>> 
>> 
>> you will need to modify atom.js to add the proper xml to the output.
>> 
>> http://github.com/jchris/sofa/blob/master/vendor/couchapp/lib/atom.js#L32
>> 
>> You should just copy this to your app's lib folder (I probably never should have
put it in vendor in the first place, no other app uses it, I think).
>> 
>> I don't know geo rss well enough but if it indeed RSS not Atom you will probably
need to use atom.js as a starting point to write your own XML generator.
>> 
>> 
>> 
>>> Has anyone out there done this already? Specifically I wonder how to handle
>>> the fact of georss:point containing a colon and getting that to work in the
>>> js file.
>>> 
>>> Also - apologies if this is a dumb question - is it simply a matter of
>>> including latitude and longitude in my couchdb database, then concatenating
>>> these at the correct position in this js file -
>>> 
>>> georss:point : row.value.latitude + ' ' + row.value.longitude
>>> 
>> 
>> for this, you can quote the keys, like: "georss:point"
>> 
>>> - or are there other things I need to consider before referencing these db
>>> elements?
>>> 
>>> Thanks!
>>> 
>>> Michael
>> 
>> 


Mime
View raw message