Ticket #336: tracblog-rss.patch
| File tracblog-rss.patch, 6.2 kB (added by mjk@aellaweil.de, 2 years ago) |
|---|
-
blog/web_ui.py
old new 26 26 from trac.web import IRequestHandler 27 27 from trac.web.chrome import ITemplateProvider, add_stylesheet 28 28 from trac.web.chrome import INavigationContributor 29 from trac.util import Markup, format_date, format_datetime 30 from trac.wiki.formatter import Formatter, wiki_to_oneliner 29 from trac.web.chrome import add_link 30 from trac.util import Markup, format_date, format_datetime, http_date 31 from trac.util.text import to_unicode 32 from trac.wiki.formatter import Formatter, wiki_to_oneliner, wiki_to_html 31 33 from trac.wiki.model import WikiPage 32 34 from trac.wiki.api import IWikiMacroProvider 33 35 from trac.perm import IPermissionRequestor … … 35 37 from tractags.api import TagEngine 36 38 from tractags.parseargs import parseargs 37 39 40 import re 41 42 title_split_match = re.compile(r'^=+\s+([^\n\r=]+?)\s+=+\s+(.+)$', re.DOTALL).match 43 38 44 BOOLS_TRUE = ['true', 'yes', 'ok', 'on', 'enabled', '1'] 39 45 40 46 __all__ = ['TracBlogPlugin'] … … 196 202 add_stylesheet(req, 'blog/css/blog.css') 197 203 add_stylesheet(req, 'common/css/wiki.css') 198 204 tags = req.args.getlist('tag') 205 format = req.args.get('format') 199 206 kwargs = {} 200 207 for key in req.args.keys(): 201 208 if key != 'tag': … … 205 212 tstr = self.env.config.get('blog', 'default_tag', 'blog') 206 213 tags = [t.strip() for t in _tag_split.split(tstr) if t.strip()] 207 214 self._generate_blog(req, *tags, **kwargs) 208 return 'blog.cs', None 215 if format == 'rss': 216 return 'blog_rss.cs', 'application/rss+xml' 217 else: 218 add_link(req, 'alternate', self.env.href.blog(format='rss'), 219 'RSS Feed', 'application/rss+xml', 'rss') 220 return 'blog.cs', None 209 221 210 222 def _generate_blog(self, req, *args, **kwargs): 211 223 """Extract the blog pages and fill the HDF. … … 274 286 } 275 287 tagtags.append(d) 276 288 continue 289 match = title_split_match(page.text) 290 if match: 291 title = match.group(1) 292 fulltext = match.group(2) 293 else: 294 title = blog_entry 295 fulltext = page.text 296 del_comments = re.compile('==== Comment.*\Z', re.DOTALL) 297 del_addcomm = re.compile('\[\[AddComment.*\Z', re.DOTALL) 298 text = del_comments.sub('', text) 299 fulltext = del_comments.sub('', fulltext) 300 text = del_addcomm.sub('', text) 301 fulltext = del_addcomm.sub('', fulltext) 277 302 data = { 278 303 'name' : blog_entry, 304 'title' : title, 305 'href' : self.env.href.wiki(blog_entry), 279 306 'wiki_link' : wiki_to_oneliner(read_post % 280 307 blog_entry, 281 308 self.env), 282 309 'time' : timeStr, 310 'date' : http_date(page.time), 283 311 'author' : author, 284 312 'wiki_text' : wiki_to_nofloat_html(text, self.env, req, 285 313 macro_blacklist=macro_bl), 314 'rss_text' : Markup.escape(to_unicode(wiki_to_html(fulltext, self.env, req))), 286 315 'comment' : wiki_to_oneliner(comment, self.env), 287 316 'tags' : { 288 317 'present' : len(pagetags), … … 290 319 'more' : len(pagetags) > 3 or 0, 291 320 }, 292 321 } 322 if author: 323 # For RSS, author must be an email address 324 if author.find('@') != -1: 325 data['author.email'] = author 326 elif self._user2email(author) is not None: 327 data['author.email'] = self._user2email(author) 328 329 293 330 if (modified != post_time) and mark_updated: 294 331 data['modified'] = 1 295 332 mod_str = format_datetime(modified, format=time_format) … … 312 349 req.hdf['blog.hidecal'] = hidecal 313 350 pass 314 351 352 def _user2email(self, user): 353 for username, name, email in self.env.get_known_users(): 354 if email: 355 return email 356 return None 357 315 358 def _generate_calendar(self, req, tallies): 316 359 """Generate data necessary for the calendar 317 360 -
blog/templates/blog_rss.cs
old new 1 <?xml version="1.0"?> 2 <rss version="2.0"> 3 <channel><?cs 4 if:project.name_encoded ?> 5 <title><?cs var:project.name_encoded ?>: <?cs var:title ?></title><?cs 6 else ?> 7 <title><?cs var:title ?></title><?cs 8 /if ?> 9 <link><?cs var:base_host ?><?cs var:trac.href.blog ?></link> 10 <description>Trac Blog</description> 11 <language>en-us</language> 12 <generator>Trac v<?cs var:trac.version ?></generator><?cs 13 if:chrome.logo.src ?> 14 <image> 15 <title><?cs var:project.name_encoded ?></title> 16 <url><?cs if:!chrome.logo.src_abs ?><?cs var:base_host ?><?cs /if ?><?cs 17 var:chrome.logo.src ?></url> 18 <link><?cs var:base_host ?><?cs var:trac.href.blog ?></link> 19 </image><?cs 20 /if ?><?cs 21 each:bentry = blog.entries ?> 22 <item> 23 <title><?cs var:bentry.title ?></title><?cs 24 if:bentry.author.email ?> 25 <author><?cs var:bentry.author.email ?></author><?cs 26 else ?> 27 <author><?cs var:bentry.author ?></author><?cs 28 /if ?> 29 <pubDate><?cs var:bentry.date ?></pubDate> 30 <link><?cs var:base_host ?><?cs var:bentry.href ?></link> 31 <guid><?cs var:base_host ?><?cs var:bentry.href ?></guid> 32 <description><?cs var:bentry.rss_text ?></description> 33 </item><?cs 34 /each ?> 35 </channel> 36 </rss>
