You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@couchdb.apache.org by Michael Lenahan <mi...@gmail.com> on 2010/07/22 22:27:40 UTC

georss atom feed

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))
        });

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

- or are there other things I need to consider before referencing these db
elements?

Thanks!

Michael

Re: georss atom feed

Posted by "Mark J. Reed" <ma...@gmail.com>.
In JavaScript, foo.bar is just shorthand for foo['bar'].  You can only
use the dot syntax for keys that are simple identifiers known at
compile time,but you can use the bracket syntax with any string
expression.  So entry['georss::point'] works for cases where you need
such a key.

On Friday, July 23, 2010, Andy Ennamorato <vi...@gmail.com> wrote:
> Thanks for sharing this info - very similar to what I want to try and do with couchdb.
>
> Sent from my iPhone
>
> On Jul 23, 2010, at 1:28 PM, Michael Lenahan <mi...@gmail.com> wrote:
>
>
> (Resending because I forgot to add a section I amended in templates/edit.html)
>
>
> ---------- Forwarded message ----------
> From: Michael Lenahan <mi...@gmail.com>
> Date: 23 July 2010 20:23
> Subject: Re: georss atom feed
> To: user@couchdb.apache.org
>
>
> 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://mick.couchone.com/blog/_design/geosofa/_list/index/recent-posts?descending=true&limit=10&format=atom
>
> 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>
>        <!-- -->
>
> (... this is further down in templates/edit.html)
>
>        // apply docForm at login.
>        $("#account").evently({
>          loggedIn : function(e,r) {
>            var userCtx = r.userCtx;
>            postForm = app.docForm("form#new-post", {
>              id : {{ docid }},
>              //fields : ["title", "body", "tags"],
>              fields : ["title", "latitude", "longitude", "body", "tags"],
>              template : {
>                type : "post",
>                format : "markdown",
>                author : userCtx.name
>              },
>
> 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 <jc...@couch.io> wrote:
>
>
> On Jul 22, 2010, at 1:27 PM, Mich
>

-- 
Mark J. Reed <ma...@gmail.com>

Re: georss atom feed

Posted by Andy Ennamorato <vi...@gmail.com>.
Thanks for sharing this info - very similar to what I want to try and  
do with couchdb.

Sent from my iPhone

On Jul 23, 2010, at 1:28 PM, Michael Lenahan  
<mi...@gmail.com> wrote:

> (Resending because I forgot to add a section I amended in templates/ 
> edit.html)
>
>
> ---------- Forwarded message ----------
> From: Michael Lenahan <mi...@gmail.com>
> Date: 23 July 2010 20:23
> Subject: Re: georss atom feed
> To: user@couchdb.apache.org
>
>
> 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
>
> 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>
>        <!-- -->
>
> (... this is further down in templates/edit.html)
>
>        // apply docForm at login.
>        $("#account").evently({
>          loggedIn : function(e,r) {
>            var userCtx = r.userCtx;
>            postForm = app.docForm("form#new-post", {
>              id : {{ docid }},
>              //fields : ["title", "body", "tags"],
>              fields : ["title", "latitude", "longitude", "body",  
> "tags"],
>              template : {
>                type : "post",
>                format : "markdown",
>                author : userCtx.name
>              },
>
> 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 <jc...@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
>>
>>

Fwd: georss atom feed

Posted by Michael Lenahan <mi...@gmail.com>.
(Resending because I forgot to add a section I amended in templates/edit.html)


---------- Forwarded message ----------
From: Michael Lenahan <mi...@gmail.com>
Date: 23 July 2010 20:23
Subject: Re: georss atom feed
To: user@couchdb.apache.org


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

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>
       <!-- -->

(... this is further down in templates/edit.html)

        // apply docForm at login.
        $("#account").evently({
          loggedIn : function(e,r) {
            var userCtx = r.userCtx;
            postForm = app.docForm("form#new-post", {
              id : {{ docid }},
              //fields : ["title", "body", "tags"],
              fields : ["title", "latitude", "longitude", "body", "tags"],
              template : {
                type : "post",
                format : "markdown",
                author : userCtx.name
              },

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 <jc...@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
>
>

Re: georss atom feed

Posted by Michael Lenahan <mi...@gmail.com>.
Dear all

I have completed the MSc project I've been working on during the summer.

It examines how to use CouchDB to output GeoRSS documents, and is pitched at
a fairly introductory level.

I hope some of you find it useful - here it is: http://klena02.wordpress.com
.

Best wishes

Michael
http://uk.linkedin.com/pub/michael-lenahan/25/533/a3b


On 24 July 2010 21:07, Michael Lenahan <mi...@gmail.com> wrote:

> Here's the github page:
> http://github.com/michaellenahan/sofa
>
> I'm very new to this so it's all good learning.
>
> The code is the same as described in my earlier email.
>
> Some points:
>
> 1. Mark - I tried your suggestion
> entry['georss::point'], entry['georss:point'] and some other variants
> in vendor/couchapp/lib/atom.js, but with no success - when I try these
> the point is omitted from the output altogether.
>
> 2. Any pointers on how to make latitude and longitude required fields
> in edit.html?
>
> Eventually I'd like to find a way to make it easier for users to
> choose locations from a dropdown and not enter co-ordinates manually.
>
> For now, I'd just like to make the fields compulsory. I'm probably
> missing something very simple, but I wasn't able to find a way to do
> that.
>
> Thanks!
>
> Michael
>
> On 24 July 2010 10:33, Michael Lenahan <mi...@gmail.com> wrote:
> > Thanks everyone. Looks like my task for today is to learn git:
> > http://progit.org/book/.
> >
> > On 24 July 2010 02:30, J Chris Anderson <jc...@gmail.com> wrote:
> >>
> >> 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 <jc...@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
> >>>>
> >>>>
> >>
> >>
> >
>

Re: georss atom feed

Posted by Michael Lenahan <mi...@gmail.com>.
Here's the github page:
http://github.com/michaellenahan/sofa

I'm very new to this so it's all good learning.

The code is the same as described in my earlier email.

Some points:

1. Mark - I tried your suggestion
entry['georss::point'], entry['georss:point'] and some other variants
in vendor/couchapp/lib/atom.js, but with no success - when I try these
the point is omitted from the output altogether.

2. Any pointers on how to make latitude and longitude required fields
in edit.html?

Eventually I'd like to find a way to make it easier for users to
choose locations from a dropdown and not enter co-ordinates manually.

For now, I'd just like to make the fields compulsory. I'm probably
missing something very simple, but I wasn't able to find a way to do
that.

Thanks!

Michael

On 24 July 2010 10:33, Michael Lenahan <mi...@gmail.com> wrote:
> Thanks everyone. Looks like my task for today is to learn git:
> http://progit.org/book/.
>
> On 24 July 2010 02:30, J Chris Anderson <jc...@gmail.com> wrote:
>>
>> 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 <jc...@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
>>>>
>>>>
>>
>>
>

Re: georss atom feed

Posted by Michael Lenahan <mi...@gmail.com>.
Thanks everyone. Looks like my task for today is to learn git:
http://progit.org/book/.

On 24 July 2010 02:30, J Chris Anderson <jc...@gmail.com> wrote:
>
> 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 <jc...@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
>>>
>>>
>
>

Re: georss atom feed

Posted by J Chris Anderson <jc...@gmail.com>.
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 <jc...@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
>> 
>> 


Re: georss atom feed

Posted by Michael Lenahan <mi...@gmail.com>.
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

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 <jc...@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
>
>

Re: georss atom feed

Posted by J Chris Anderson <jc...@couch.io>.
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