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_isoRfc3399published_parsed updated_parsed +enclosure_hrefStringenclosures[0].href +enclosure_lengthStringenclosures[0].length +enclosure_typeStringenclosures[0].type +guid_isPermaLinkStringisPermaLink idStringid linkStringlinks[rel='alternate'].href new_channelStringid 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 @@ <TMPL_VAR channel_name ESCAPE="HTML"><TMPL_IF title>: <TMPL_VAR title_plain ESCAPE="HTML"></TMPL_IF> - + @@ -23,6 +23,9 @@ + + " length="" type=""/> +