# HG changeset patch # User Paul Boddie # Date 1203988389 -3600 # Node ID 772b9558dd8dd7dbae09b541c35fa4efcb9276de # Parent 97776f72566a79756014c9ac97f59dd70f89915d Improved the RSSReader, eventually realising that a new implementation - FeedReader - would be more reliable, especially with regard to feedparser limitations (overloading all "title" elements such that "media:title" appears instead of an entry's title). Added a special rule which works best with FeedReader. diff -r 97776f72566a -r 772b9558dd8d macros/FeedReader.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/macros/FeedReader.py Tue Feb 26 02:13:09 2008 +0100 @@ -0,0 +1,106 @@ +# -*- coding: iso-8859-1 -*- +""" + MoinMoin - FeedReader Macro + + @copyright: 2008 by Paul Boddie + @license: GNU GPL (v2 or later), see COPYING.txt for details. +""" + +from MoinMoin.Page import Page +import urllib +import xml.dom.pulldom + +Dependencies = ["time"] + +MAX_ENTRIES = 5 + +def text(element): + nodes = [] + for node in element.childNodes: + if node.nodeType == node.TEXT_NODE: + nodes.append(node.nodeValue) + return "".join(nodes) + +def execute(macro, args): + request = macro.request + fmt = macro.formatter + + max_entries = MAX_ENTRIES + args = args.split(",") + if args: + try: + feed_url = args[0] + max_entries = int(args[1]) + except ValueError: + pass + + feed = urllib.urlopen(feed_url) + output = [] + nentries = 0 + try: + events = xml.dom.pulldom.parse(feed) + + title = None + link = None + channel_title_text = None + channel_link_text = None + + output.append(fmt.bullet_list(on=1)) + + in_item = 0 + for event, value in events: + if event == xml.dom.pulldom.START_ELEMENT: + if value.nodeName == "item": + in_item = 1 + + if value.nodeName == "title": + events.expandNode(value) + title = value + elif value.nodeName == "link": + events.expandNode(value) + link = value + + if title is not None and link is not None: + link_text = text(link) + title_text = text(title) + + if nentries >= max_entries: + title = None + link = None + continue + + if in_item: + output.append(fmt.listitem(on=1)) + output.append(fmt.url(on=1, href=link_text)) + output.append(fmt.icon('www')) + output.append(fmt.text(" " + title_text)) + output.append(fmt.url(on=0)) + output.append(fmt.listitem(on=0)) + nentries += 1 + else: + channel_title_text = title_text + channel_link_text = link_text + + title = None + link = None + + elif event == xml.dom.pulldom.END_ELEMENT: + if value.nodeName == "item": + in_item = 0 + + output.append(fmt.bullet_list(on=0)) + + if channel_title_text is not None and channel_link_text is not None: + output.append(fmt.paragraph(on=1)) + output.append(fmt.url(on=1, href=channel_link_text)) + output.append(fmt.text(channel_title_text + " ")) + output.append(fmt.icon('rss')) + output.append(fmt.url(on=0)) + output.append(fmt.paragraph(on=0)) + + finally: + feed.close() + + return ''.join(output) + +# vim: tabstop=4 expandtab shiftwidth=4 diff -r 97776f72566a -r 772b9558dd8d macros/RSSReader.py --- a/macros/RSSReader.py Sun Feb 24 21:06:46 2008 +0100 +++ b/macros/RSSReader.py Tue Feb 26 02:13:09 2008 +0100 @@ -1,6 +1,11 @@ -# Import a RSS Feed into MoinMoin -# Ian Wienand -# (C) 2006 - Public Domain +# -*- coding: iso-8859-1 -*- +""" + Import a RSS Feed into MoinMoin + + @copyright: 2006 by Ian Wienand (apparently assigned to the public domain) + @copyright: 2008 by Paul Boddie + @license: GNU GPL (v2 or later), see COPYING.txt for details. +""" # Using this macro # [[RSSReader(url[,allow_html])]] @@ -20,10 +25,12 @@ from MoinMoin.Page import Page class RSStoWiki: - def __init__(self, macro, url, allow_html): + def __init__(self, macro, url, allow_html, compact_list): self.macro = macro self.fmt = macro.formatter + self.url = url self.allow_html = allow_html + self.compact_list = compact_list # in debian package python-feedparser import feedparser self.f = feedparser.parse(url) @@ -31,7 +38,7 @@ if self.f.feed == {}: self.result.append (self.fmt.icon('info') + \ self.fmt.strong(1) + \ - self.fmt.text(' Unable to retreive feed %s' % url) + \ + self.fmt.text(' Unable to retrieve feed %s' % url) + \ self.fmt.strong(0)) self.valid = False else: @@ -100,26 +107,60 @@ if entry.has_key('link'): self.get_link(entry.link) + def get_compact_title(self): + if not self.f.feed.has_key('title') or not self.f.feed.has_key('link'): + return + self.result.append(self.fmt.url(on=1, href=self.f.feed.link) + \ + self.fmt.text(self.f.feed.title) + \ + self.fmt.url(on=0) + \ + self.fmt.text(" ") + \ + self.fmt.url(on=1, href=self.url) + \ + self.fmt.icon('rss') + \ + self.fmt.url(on=0)) + + def get_compact_entry(self, entry): + if entry.has_key('link') and entry.has_key('title'): + self.result.append(self.fmt.listitem(on=1)) + #self.result.append(self.fmt.paragraph(on=1)) + self.result.append(self.fmt.url(on=1, href=entry.link) + \ + self.fmt.icon('www') + \ + self.fmt.text(" "+entry.title) + \ + self.fmt.url(on=0)) + #self.result.append(self.fmt.paragraph(on=0)) + self.result.append(self.fmt.listitem(on=0)) + + def get_compact_entries(self): + self.result.append(self.fmt.bullet_list(on=1)) + for entry in self.f.entries: + self.get_compact_entry(entry) + self.result.append(self.fmt.bullet_list(on=0)) + def get_output(self): if self.valid: - self.get_title() - self.get_subtitle() - self.get_description() - self.get_feedlink() - self.get_rule() - self.get_entries() - self.get_rule() + if self.compact_list: + self.get_compact_title() + self.get_compact_entries() + else: + self.get_title() + self.get_subtitle() + self.get_description() + self.get_feedlink() + self.get_rule() + self.get_entries() + self.get_rule() return ''.join(self.result) def execute(macro, args): macro_args = args.split(",") + allow_html = False + compact_list = False try: if macro_args[1].strip() == "allow_html": allow_html = True - else: - allow_html = False + if macro_args[1].strip() == "compact_list": + compact_list = True except: - allow_html = False + pass - rss = RSStoWiki(macro, macro_args[0], allow_html) + rss = RSStoWiki(macro, macro_args[0], allow_html, compact_list) return rss.get_output() diff -r 97776f72566a -r 772b9558dd8d themes/ep2008/css/screen.css --- a/themes/ep2008/css/screen.css Sun Feb 24 21:06:46 2008 +0100 +++ b/themes/ep2008/css/screen.css Tue Feb 26 02:13:09 2008 +0100 @@ -668,6 +668,20 @@ padding: 0; } +.rss-feed { + vertical-align: top; +} + +.rss-feed ul { + list-style-type: none; + margin: 0; + padding: 0; +} + +.rss-feed li { + padding: 0.25em 0.5em 0.25em 0.5em; +} + /* Currently unused... */ .portlet-picture {