Ticket #336: tracblog-rss.patch

File tracblog-rss.patch, 6.2 kB (added by mjk@aellaweil.de, 2 years ago)

Patch for RSS feed

  • blog/web_ui.py

    old new  
    2626from trac.web import IRequestHandler 
    2727from trac.web.chrome import ITemplateProvider, add_stylesheet 
    2828from 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 
     29from trac.web.chrome import add_link 
     30from trac.util import Markup, format_date, format_datetime, http_date 
     31from trac.util.text import to_unicode 
     32from trac.wiki.formatter import Formatter, wiki_to_oneliner, wiki_to_html 
    3133from trac.wiki.model import WikiPage 
    3234from trac.wiki.api import IWikiMacroProvider 
    3335from trac.perm import IPermissionRequestor 
     
    3537from tractags.api import TagEngine 
    3638from tractags.parseargs import parseargs 
    3739 
     40import re 
     41 
     42title_split_match = re.compile(r'^=+\s+([^\n\r=]+?)\s+=+\s+(.+)$', re.DOTALL).match 
     43 
    3844BOOLS_TRUE = ['true', 'yes', 'ok', 'on', 'enabled', '1'] 
    3945 
    4046__all__ = ['TracBlogPlugin'] 
     
    196202        add_stylesheet(req, 'blog/css/blog.css') 
    197203        add_stylesheet(req, 'common/css/wiki.css') 
    198204        tags = req.args.getlist('tag') 
     205        format = req.args.get('format') 
    199206        kwargs = {} 
    200207        for key in req.args.keys(): 
    201208            if key != 'tag': 
     
    205212            tstr = self.env.config.get('blog', 'default_tag', 'blog') 
    206213            tags = [t.strip() for t in _tag_split.split(tstr) if t.strip()] 
    207214        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 
    209221 
    210222    def _generate_blog(self, req, *args, **kwargs): 
    211223        """Extract the blog pages and fill the HDF. 
     
    274286                        } 
    275287                    tagtags.append(d) 
    276288                    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) 
    277302                data = { 
    278303                        'name'      : blog_entry, 
     304                        'title'     : title, 
     305                        'href'      : self.env.href.wiki(blog_entry), 
    279306                        'wiki_link' : wiki_to_oneliner(read_post %  
    280307                                                       blog_entry, 
    281308                                                       self.env), 
    282309                        'time'      : timeStr, 
     310                        'date'      : http_date(page.time), 
    283311                        'author'    : author, 
    284312                        'wiki_text' : wiki_to_nofloat_html(text, self.env, req, 
    285313                                                   macro_blacklist=macro_bl), 
     314                        'rss_text'  : Markup.escape(to_unicode(wiki_to_html(fulltext, self.env, req))), 
    286315                        'comment'   : wiki_to_oneliner(comment, self.env), 
    287316                        'tags'      : { 
    288317                                        'present' : len(pagetags), 
     
    290319                                        'more'    : len(pagetags) > 3 or 0, 
    291320                                      }, 
    292321                       } 
     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                 
    293330                if (modified != post_time) and mark_updated: 
    294331                    data['modified'] = 1 
    295332                    mod_str = format_datetime(modified, format=time_format) 
     
    312349        req.hdf['blog.hidecal'] = hidecal 
    313350        pass 
    314351 
     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 
    315358    def _generate_calendar(self, req, tallies): 
    316359        """Generate data necessary for the calendar 
    317360 
  • 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>