1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1.2 +++ b/macros/SharedContent.py Tue Jul 17 00:03:35 2012 +0200
1.3 @@ -0,0 +1,141 @@
1.4 +# -*- coding: iso-8859-1 -*-
1.5 +"""
1.6 + MoinMoin - SharedContent macro, based on the FeedReader macro
1.7 +
1.8 + @copyright: 2008, 2012 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 +ATOM_NS = "http://www.w3.org/2005/Atom"
1.20 +
1.21 +def text(element):
1.22 + nodes = []
1.23 + for node in element.childNodes:
1.24 + if node.nodeType == node.TEXT_NODE:
1.25 + nodes.append(node.nodeValue)
1.26 + return "".join(nodes)
1.27 +
1.28 +def linktext(element, feed_type):
1.29 + if feed_type == "rss":
1.30 + return text(element)
1.31 + else:
1.32 + return element.getAttribute("href")
1.33 +
1.34 +def execute(macro, args):
1.35 + request = macro.request
1.36 + fmt = macro.formatter
1.37 +
1.38 + max_entries = MAX_ENTRIES
1.39 + args = args.split(",")
1.40 + if args:
1.41 + try:
1.42 + feed_url = args[0]
1.43 + max_entries = int(args[1])
1.44 + except IndexError:
1.45 + pass
1.46 +
1.47 + # Obtain the feed.
1.48 +
1.49 + feed = urllib.urlopen(feed_url)
1.50 +
1.51 + try:
1.52 + # Parse each node from the feed.
1.53 +
1.54 + title = link = None
1.55 + channel_title = channel_link = None
1.56 +
1.57 + output = []
1.58 + append = output.append
1.59 + append(fmt.bullet_list(on=1))
1.60 +
1.61 + feed_type = None
1.62 + in_item = False
1.63 + nentries = 0
1.64 +
1.65 + events = xml.dom.pulldom.parse(feed)
1.66 +
1.67 + for event, value in events:
1.68 +
1.69 + if event == xml.dom.pulldom.START_ELEMENT:
1.70 + tagname = value.localName
1.71 +
1.72 + # Detect the feed type and items.
1.73 +
1.74 + if tagname == "feed" and value.namespaceURI == ATOM_NS:
1.75 + feed_type = "atom"
1.76 +
1.77 + elif tagname == "rss":
1.78 + feed_type = "rss"
1.79 +
1.80 + # Detect items.
1.81 +
1.82 + elif feed_type == "rss" and tagname == "item" or \
1.83 + feed_type == "atom" and tagname == "entry":
1.84 +
1.85 + in_item = True
1.86 +
1.87 + elif tagname == "title":
1.88 + events.expandNode(value)
1.89 + if in_item:
1.90 + title = value
1.91 + else:
1.92 + channel_title = value
1.93 +
1.94 + elif tagname == "link":
1.95 + events.expandNode(value)
1.96 + if in_item:
1.97 + link = value
1.98 + else:
1.99 + channel_link = value
1.100 +
1.101 + elif event == xml.dom.pulldom.END_ELEMENT:
1.102 + tagname = value.localName
1.103 +
1.104 + if feed_type == "rss" and tagname == "item" or \
1.105 + feed_type == "atom" and tagname == "entry":
1.106 +
1.107 + in_item = False
1.108 +
1.109 + # Emit title and link information for items.
1.110 +
1.111 + if title and link and nentries < max_entries:
1.112 + link_text = linktext(link, feed_type)
1.113 +
1.114 + append(fmt.listitem(on=1))
1.115 + append(fmt.url(on=1, href=link_text))
1.116 + append(fmt.icon('www'))
1.117 + append(fmt.text(" " + text(title)))
1.118 + append(fmt.url(on=0))
1.119 + append(fmt.listitem(on=0))
1.120 +
1.121 + title = link = None
1.122 + nentries += 1
1.123 +
1.124 + append(fmt.bullet_list(on=0))
1.125 +
1.126 + if channel_title and channel_link:
1.127 + channel_link_text = linktext(channel_link, feed_type)
1.128 +
1.129 + append(fmt.paragraph(on=1))
1.130 + append(fmt.url(on=1, href=channel_link_text))
1.131 + append(fmt.text(text(channel_title)))
1.132 + append(fmt.url(on=0))
1.133 + append(fmt.text(" "))
1.134 + append(fmt.url(on=1, href=feed_url))
1.135 + append(fmt.icon('rss'))
1.136 + append(fmt.url(on=0))
1.137 + append(fmt.paragraph(on=0))
1.138 +
1.139 + finally:
1.140 + feed.close()
1.141 +
1.142 + return ''.join(output)
1.143 +
1.144 +# vim: tabstop=4 expandtab shiftwidth=4