1 # -*- coding: iso-8859-1 -*- 2 """ 3 MoinMoin - FeedReader Macro 4 5 @copyright: 2008 by Paul Boddie <paul@boddie.org.uk> 6 @license: GNU GPL (v2 or later), see COPYING.txt for details. 7 """ 8 9 from MoinMoin.Page import Page 10 import urllib 11 import xml.dom.pulldom 12 13 Dependencies = ["time"] 14 15 MAX_ENTRIES = 5 16 17 def text(element): 18 nodes = [] 19 for node in element.childNodes: 20 if node.nodeType == node.TEXT_NODE: 21 nodes.append(node.nodeValue) 22 return "".join(nodes) 23 24 def execute(macro, args): 25 request = macro.request 26 fmt = macro.formatter 27 28 max_entries = MAX_ENTRIES 29 args = args.split(",") 30 if args: 31 try: 32 feed_url = args[0] 33 max_entries = int(args[1]) 34 except ValueError: 35 pass 36 37 feed = urllib.urlopen(feed_url) 38 output = [] 39 nentries = 0 40 try: 41 events = xml.dom.pulldom.parse(feed) 42 43 title = None 44 link = None 45 channel_title_text = None 46 channel_link_text = None 47 48 output.append(fmt.bullet_list(on=1)) 49 50 in_item = 0 51 for event, value in events: 52 if event == xml.dom.pulldom.START_ELEMENT: 53 if value.nodeName == "item": 54 in_item = 1 55 56 if value.nodeName == "title": 57 events.expandNode(value) 58 title = value 59 elif value.nodeName == "link": 60 events.expandNode(value) 61 link = value 62 63 if title is not None and link is not None: 64 link_text = text(link) 65 title_text = text(title) 66 67 if nentries >= max_entries: 68 title = None 69 link = None 70 continue 71 72 if in_item: 73 output.append(fmt.listitem(on=1)) 74 output.append(fmt.url(on=1, href=link_text)) 75 output.append(fmt.icon('www')) 76 output.append(fmt.text(" " + title_text)) 77 output.append(fmt.url(on=0)) 78 output.append(fmt.listitem(on=0)) 79 nentries += 1 80 else: 81 channel_title_text = title_text 82 channel_link_text = link_text 83 84 title = None 85 link = None 86 87 elif event == xml.dom.pulldom.END_ELEMENT: 88 if value.nodeName == "item": 89 in_item = 0 90 91 output.append(fmt.bullet_list(on=0)) 92 93 if channel_title_text is not None and channel_link_text is not None: 94 output.append(fmt.paragraph(on=1)) 95 output.append(fmt.url(on=1, href=channel_link_text)) 96 output.append(fmt.text(channel_title_text)) 97 output.append(fmt.url(on=0)) 98 output.append(fmt.text(" ")) 99 output.append(fmt.url(on=1, href=feed_url)) 100 output.append(fmt.icon('rss')) 101 output.append(fmt.url(on=0)) 102 output.append(fmt.paragraph(on=0)) 103 104 finally: 105 feed.close() 106 107 return ''.join(output) 108 109 # vim: tabstop=4 expandtab shiftwidth=4