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