incubator-couchdb-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael Lenahan <michael.lena...@gmail.com>
Subject Re: georss atom feed
Date Fri, 23 Jul 2010 19:23:38 GMT
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 <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