diff --git a/docs/templates.html b/docs/templates.html
index 6a2fc32..8d34e1f 100644
--- a/docs/templates.html
+++ b/docs/templates.html
@@ -75,6 +75,10 @@ The data values within the Items
array are as follows:
updated_parsed
date_iso Rfc3399 published_parsed
updated_parsed
+enclosure_href String enclosures[0].href
+enclosure_length String enclosures[0].length
+enclosure_type String enclosures[0].type
+guid_isPermaLink String isPermaLink
id String id
link String links[rel='alternate'].href
new_channel String id
diff --git a/planet/feedparser.py b/planet/feedparser.py
index c5894f4..ef7d75a 100755
--- a/planet/feedparser.py
+++ b/planet/feedparser.py
@@ -218,6 +218,9 @@ class FeedParserDict(UserDict):
def __getitem__(self, key):
if key == 'category':
return UserDict.__getitem__(self, 'tags')[0]['term']
+ if key == 'enclosures':
+ norel = lambda link: FeedParserDict([(name,value) for (name,value) in link.items() if name!='rel'])
+ return [norel(link) for link in UserDict.__getitem__(self, 'links') if link['rel']=='enclosure']
if key == 'categories':
return [(tag['scheme'], tag['term']) for tag in UserDict.__getitem__(self, 'tags')]
realkey = self.keymap.get(key, key)
@@ -1303,15 +1306,15 @@ class _FeedParserMixin:
attrsD.setdefault('type', 'application/atom+xml')
else:
attrsD.setdefault('type', 'text/html')
+ context = self._getContext()
attrsD = self._itsAnHrefDamnIt(attrsD)
if attrsD.has_key('href'):
attrsD['href'] = self.resolveURI(attrsD['href'])
+ if attrsD.get('rel')=='enclosure' and not context.get('id'):
+ context['id'] = attrsD.get('href')
expectingText = self.infeed or self.inentry or self.insource
- context = self._getContext()
context.setdefault('links', [])
context['links'].append(FeedParserDict(attrsD))
- if attrsD['rel'] == 'enclosure':
- self._start_enclosure(attrsD)
if attrsD.has_key('href'):
expectingText = 0
if (attrsD.get('rel') == 'alternate') and (self.mapContentType(attrsD.get('type')) in self.html_types):
@@ -1427,7 +1430,8 @@ class _FeedParserMixin:
def _start_enclosure(self, attrsD):
attrsD = self._itsAnHrefDamnIt(attrsD)
context = self._getContext()
- context.setdefault('enclosures', []).append(FeedParserDict(attrsD))
+ attrsD['rel']='enclosure'
+ context.setdefault('links', []).append(FeedParserDict(attrsD))
href = attrsD.get('href')
if href and not context.get('id'):
context['id'] = href
diff --git a/planet/reconstitute.py b/planet/reconstitute.py
index 30a5cbb..92bbb59 100644
--- a/planet/reconstitute.py
+++ b/planet/reconstitute.py
@@ -100,6 +100,8 @@ def links(xentry, entry):
xlink.setAttribute('type', link.get('type'))
if link.has_key('rel'):
xlink.setAttribute('rel', link.get('rel',None))
+ if link.has_key('length'):
+ xlink.setAttribute('length', link.get('length'))
xentry.appendChild(xlink)
def date(xentry, name, parsed):
diff --git a/planet/shell/tmpl.py b/planet/shell/tmpl.py
index 81a79d5..620f45e 100644
--- a/planet/shell/tmpl.py
+++ b/planet/shell/tmpl.py
@@ -97,6 +97,9 @@ Items = [
['date_822', Rfc822, 'updated_parsed'],
['date_iso', Rfc3399, 'published_parsed'],
['date_iso', Rfc3399, 'updated_parsed'],
+ ['enclosure_href', String, 'links', {'rel': 'enclosure'}, 'href'],
+ ['enclosure_length', String, 'links', {'rel': 'enclosure'}, 'length'],
+ ['enclosure_type', String, 'links', {'rel': 'enclosure'}, 'type'],
['id', String, 'id'],
['link', String, 'links', {'rel': 'alternate'}, 'href'],
['new_channel', String, 'id'],
@@ -190,6 +193,13 @@ def template_info(source):
for entry in data.entries:
output['Items'].append(tmpl_mapper(entry, Items))
+ # synthesize isPermaLink attribute
+ for item in output['Items']:
+ if item.get('id') == item.get('link'):
+ item['guid_isPermaLink']='true'
+ else:
+ item['guid_isPermaLink']='false'
+
# feed level information
output['generator'] = config.generator_uri()
output['name'] = config.name()
diff --git a/tests/data/filter/tmpl/enclosure_href.xml b/tests/data/filter/tmpl/enclosure_href.xml
new file mode 100644
index 0000000..98b77f7
--- /dev/null
+++ b/tests/data/filter/tmpl/enclosure_href.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/tests/data/filter/tmpl/enclosure_length.xml b/tests/data/filter/tmpl/enclosure_length.xml
new file mode 100644
index 0000000..e4a4191
--- /dev/null
+++ b/tests/data/filter/tmpl/enclosure_length.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/tests/data/filter/tmpl/enclosure_type.xml b/tests/data/filter/tmpl/enclosure_type.xml
new file mode 100644
index 0000000..32f35ef
--- /dev/null
+++ b/tests/data/filter/tmpl/enclosure_type.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/tests/data/reconstitute/enclosure.xml b/tests/data/reconstitute/enclosure.xml
new file mode 100644
index 0000000..8820d09
--- /dev/null
+++ b/tests/data/reconstitute/enclosure.xml
@@ -0,0 +1,13 @@
+
+
+
+
+ -
+
+
+
+
+
diff --git a/tests/data/reconstitute/link_length.xml b/tests/data/reconstitute/link_length.xml
new file mode 100644
index 0000000..a6617ac
--- /dev/null
+++ b/tests/data/reconstitute/link_length.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/themes/common/rss20.xml.tmpl b/themes/common/rss20.xml.tmpl
index 81cbffb..724a104 100644
--- a/themes/common/rss20.xml.tmpl
+++ b/themes/common/rss20.xml.tmpl
@@ -10,7 +10,7 @@
-
:
-
+
@@ -23,6 +23,9 @@
+
+ " length="" type=""/>
+