1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/macros/FeedReader.py Tue Feb 26 02:13:09 2008 +0100
1.3 @@ -0,0 +1,106 @@
1.4 +# -*- coding: iso-8859-1 -*-
1.5 +"""
1.6 + MoinMoin - FeedReader Macro
1.7 +
1.8 + @copyright: 2008 by Paul Boddie <paul@boddie.org.uk>
1.9 + @license: GNU GPL (v2 or later), see COPYING.txt for details.
1.10 +"""
1.11 +
1.12 +from MoinMoin.Page import Page
1.13 +import urllib
1.14 +import xml.dom.pulldom
1.15 +
1.16 +Dependencies = ["time"]
1.17 +
1.18 +MAX_ENTRIES = 5
1.19 +
1.20 +def text(element):
1.21 + nodes = []
1.22 + for node in element.childNodes:
1.23 + if node.nodeType == node.TEXT_NODE:
1.24 + nodes.append(node.nodeValue)
1.25 + return "".join(nodes)
1.26 +
1.27 +def execute(macro, args):
1.28 + request = macro.request
1.29 + fmt = macro.formatter
1.30 +
1.31 + max_entries = MAX_ENTRIES
1.32 + args = args.split(",")
1.33 + if args:
1.34 + try:
1.35 + feed_url = args[0]
1.36 + max_entries = int(args[1])
1.37 + except ValueError:
1.38 + pass
1.39 +
1.40 + feed = urllib.urlopen(feed_url)
1.41 + output = []
1.42 + nentries = 0
1.43 + try:
1.44 + events = xml.dom.pulldom.parse(feed)
1.45 +
1.46 + title = None
1.47 + link = None
1.48 + channel_title_text = None
1.49 + channel_link_text = None
1.50 +
1.51 + output.append(fmt.bullet_list(on=1))
1.52 +
1.53 + in_item = 0
1.54 + for event, value in events:
1.55 + if event == xml.dom.pulldom.START_ELEMENT:
1.56 + if value.nodeName == "item":
1.57 + in_item = 1
1.58 +
1.59 + if value.nodeName == "title":
1.60 + events.expandNode(value)
1.61 + title = value
1.62 + elif value.nodeName == "link":
1.63 + events.expandNode(value)
1.64 + link = value
1.65 +
1.66 + if title is not None and link is not None:
1.67 + link_text = text(link)
1.68 + title_text = text(title)
1.69 +
1.70 + if nentries >= max_entries:
1.71 + title = None
1.72 + link = None
1.73 + continue
1.74 +
1.75 + if in_item:
1.76 + output.append(fmt.listitem(on=1))
1.77 + output.append(fmt.url(on=1, href=link_text))
1.78 + output.append(fmt.icon('www'))
1.79 + output.append(fmt.text(" " + title_text))
1.80 + output.append(fmt.url(on=0))
1.81 + output.append(fmt.listitem(on=0))
1.82 + nentries += 1
1.83 + else:
1.84 + channel_title_text = title_text
1.85 + channel_link_text = link_text
1.86 +
1.87 + title = None
1.88 + link = None
1.89 +
1.90 + elif event == xml.dom.pulldom.END_ELEMENT:
1.91 + if value.nodeName == "item":
1.92 + in_item = 0
1.93 +
1.94 + output.append(fmt.bullet_list(on=0))
1.95 +
1.96 + if channel_title_text is not None and channel_link_text is not None:
1.97 + output.append(fmt.paragraph(on=1))
1.98 + output.append(fmt.url(on=1, href=channel_link_text))
1.99 + output.append(fmt.text(channel_title_text + " "))
1.100 + output.append(fmt.icon('rss'))
1.101 + output.append(fmt.url(on=0))
1.102 + output.append(fmt.paragraph(on=0))
1.103 +
1.104 + finally:
1.105 + feed.close()
1.106 +
1.107 + return ''.join(output)
1.108 +
1.109 +# vim: tabstop=4 expandtab shiftwidth=4