1 # -*- coding: iso-8859-1 -*- 2 """ 3 Import a RSS Feed into MoinMoin 4 5 @copyright: 2006 by Ian Wienand <ianw@ieee.org> (apparently assigned to the public domain) 6 @copyright: 2008 by Paul Boddie <paul@boddie.org.uk> 7 @license: GNU GPL (v2 or later), see COPYING.txt for details. 8 """ 9 10 # Using this macro 11 # [[RSSReader(url[,allow_html])]] 12 # where 13 # * url is the url of the RSS/ATOM feed to read 14 # * allow_html is an optional argument if you trust the feed to put 15 # the HTML directly into the page 16 17 # CAUTION: this could be an attack vector, although feedparser should 18 # strip most "bad" HTML. 19 20 # this tells MoinMoin not to cache the page, as we don't know when it 21 # changes. 22 Dependencies = ["time"] 23 24 from MoinMoin import util, wikiutil, config 25 from MoinMoin.Page import Page 26 27 class RSStoWiki: 28 def __init__(self, macro, url, allow_html, compact_list): 29 self.macro = macro 30 self.fmt = macro.formatter 31 self.url = url 32 self.allow_html = allow_html 33 self.compact_list = compact_list 34 # in debian package python-feedparser 35 import feedparser 36 self.f = feedparser.parse(url) 37 self.result = [] 38 if self.f.feed == {}: 39 self.result.append (self.fmt.icon('info') + \ 40 self.fmt.strong(1) + \ 41 self.fmt.text(' Unable to retrieve feed %s' % url) + \ 42 self.fmt.strong(0)) 43 self.valid = False 44 else: 45 self.valid = True 46 47 48 def get_title(self): 49 if not self.f.feed.has_key('title'): 50 return 51 self.result.append(self.fmt.heading(on=1, depth=1) + \ 52 self.fmt.text(self.f.feed.title) + \ 53 self.fmt.heading(on=0, depth=1)) 54 55 def get_subtitle(self): 56 if not self.f.feed.has_key('subtitle'): 57 return 58 self.result.append(self.fmt.heading(on=1, depth=2) + \ 59 self.fmt.text(self.f.feed.subtitle) + \ 60 self.fmt.heading(on=0, depth=2)) 61 62 def get_paragraph(self, text): 63 self.result.append(self.fmt.paragraph(on=1) + \ 64 self.fmt.text(text) + \ 65 self.fmt.paragraph(on=0)) 66 67 def get_link(self, link): 68 self.result.append(self.fmt.url(on=1, href=link) + \ 69 self.fmt.icon('www') + \ 70 self.fmt.text(" "+link) + \ 71 self.fmt.url(on=0)) 72 73 def get_feedlink(self): 74 if not self.f.feed.has_key('link'): 75 return 76 self.get_link(self.f.feed.link) 77 78 def get_description(self): 79 if not self.f.feed.has_key('description'): 80 return 81 self.get_paragraph(self.f.feed.description) 82 83 def get_rule(self): 84 self.result.append(self.fmt.rule(size=1)) 85 86 def get_entry_header(self, title): 87 self.result.append(self.fmt.heading(on=1, depth=3) + \ 88 self.fmt.text(title) + \ 89 self.fmt.heading(on=0, depth=3)) 90 91 def get_entry_body(self, body): 92 self.result.append(self.fmt.paragraph(on=1)) 93 if (self.allow_html): 94 self.result.append(self.fmt.rawHTML(body)) 95 else: 96 self.result.append(self.fmt.text(body)) 97 self.result.append(self.fmt.paragraph(on=0)) 98 99 def get_entries(self): 100 for entry in self.f.entries: 101 if entry.has_key('title'): 102 self.get_entry_header(entry.title) 103 if entry.has_key('updated'): 104 self.get_paragraph(entry.updated) 105 if entry.has_key('description'): 106 self.get_entry_body(entry.description) 107 if entry.has_key('link'): 108 self.get_link(entry.link) 109 110 def get_compact_title(self): 111 if not self.f.feed.has_key('title') or not self.f.feed.has_key('link'): 112 return 113 self.result.append(self.fmt.url(on=1, href=self.f.feed.link) + \ 114 self.fmt.text(self.f.feed.title) + \ 115 self.fmt.url(on=0) + \ 116 self.fmt.text(" ") + \ 117 self.fmt.url(on=1, href=self.url) + \ 118 self.fmt.icon('rss') + \ 119 self.fmt.url(on=0)) 120 121 def get_compact_entry(self, entry): 122 if entry.has_key('link') and entry.has_key('title'): 123 self.result.append(self.fmt.listitem(on=1)) 124 #self.result.append(self.fmt.paragraph(on=1)) 125 self.result.append(self.fmt.url(on=1, href=entry.link) + \ 126 self.fmt.icon('www') + \ 127 self.fmt.text(" "+entry.title) + \ 128 self.fmt.url(on=0)) 129 #self.result.append(self.fmt.paragraph(on=0)) 130 self.result.append(self.fmt.listitem(on=0)) 131 132 def get_compact_entries(self): 133 self.result.append(self.fmt.bullet_list(on=1)) 134 for entry in self.f.entries: 135 self.get_compact_entry(entry) 136 self.result.append(self.fmt.bullet_list(on=0)) 137 138 def get_output(self): 139 if self.valid: 140 if self.compact_list: 141 self.get_compact_title() 142 self.get_compact_entries() 143 else: 144 self.get_title() 145 self.get_subtitle() 146 self.get_description() 147 self.get_feedlink() 148 self.get_rule() 149 self.get_entries() 150 self.get_rule() 151 return ''.join(self.result) 152 153 def execute(macro, args): 154 macro_args = args.split(",") 155 allow_html = False 156 compact_list = False 157 try: 158 if macro_args[1].strip() == "allow_html": 159 allow_html = True 160 if macro_args[1].strip() == "compact_list": 161 compact_list = True 162 except: 163 pass 164 165 rss = RSStoWiki(macro, macro_args[0], allow_html, compact_list) 166 return rss.get_output()