Edgewall Software

Ticket #2580: rss_fixes.diff

File rss_fixes.diff, 14.2 KB (added by cboos, 3 years ago)

patch on top of r2766

  • trac/ticket/web_ui.py

     
    240240                yield ('ticket_details', 'Ticket details', False) 
    241241 
    242242    def get_timeline_events(self, req, start, stop, filters): 
    243         rss = req.args.get('format') == 'rss' # Kludge 
     243        format = req.args.get('format') 
    244244 
    245245        status_map = {'new': ('newticket', 'created'), 
    246246                      'reopened': ('newticket', 'reopened'), 
     
    268268            kind, verb = status_map[status] 
    269269            title = util.Markup('Ticket <em title="%s">#%s</em> (%s) %s by %s', 
    270270                                summary, id, type, verb, author) 
    271             href = rss and self.env.abs_href.ticket(id) \ 
    272                    or self.env.href.ticket(id) 
     271            href = format == 'rss' and self.env.abs_href.ticket(id) or \ 
     272                   self.env.href.ticket(id) 
    273273 
    274274            if status == 'new': 
    275                 message = util.escape(summary) 
     275                message = summary 
    276276            else: 
    277277                message = util.Markup(info) 
    278278                if comment: 
    279                     if rss: 
     279                    if format == 'rss': 
    280280                        message += wiki_to_html(comment, self.env, req, db, 
    281281                                                absurls=True) 
    282282                    else: 
  • trac/ticket/report.py

     
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2003-2005 Edgewall Software 
     3# Copyright (C) 2003-2006 Edgewall Software 
    44# Copyright (C) 2003-2004 Jonas Borgstr�jonas@edgewall.com> 
     5# Copyright (C) 2006 Christian Boos <cboos@neuf.fr> 
    56# All rights reserved. 
    67# 
    78# This software is licensed as described in the file COPYING, which 
     
    254255 
    255256        title, description, sql = self.get_info(db, id, args) 
    256257 
    257         if req.args.get('format') == 'sql': 
     258        format = req.args.get('format') 
     259        if format == 'sql': 
    258260            self._render_sql(req, id, title, description, sql) 
    259261            return 
    260262 
     
    344346                        id_val = row[id_cols[0]] 
    345347                        value['ticket_href'] = self.env.href.ticket(id_val) 
    346348                elif column == 'description': 
    347                     value['parsed'] = wiki_to_html(cell, self.env, req, db) 
     349                    descr = wiki_to_html(cell, self.env, req, db, 
     350                                         absurls=(format == 'rss')) 
     351                    value['parsed'] = format == 'rss' and str(descr) or descr 
    348352                elif column == 'reporter' and cell.find('@') != -1: 
    349353                    value['rss'] = cell 
    350354                elif column == 'report': 
     
    363367            row_idx += 1 
    364368        req.hdf['report.numrows'] = row_idx 
    365369 
    366         format = req.args.get('format') 
    367370        if format == 'rss': 
    368             self._render_rss(req) 
    369371            return 'report_rss.cs', 'application/rss+xml' 
    370372        elif format == 'csv': 
    371373            self._render_csv(req, cols, rows) 
     
    480482                                       .replace('\r',' ') 
    481483            req.write(sep.join(map(sanitize, row)) + '\r\n') 
    482484 
    483     def _render_rss(self, req): 
    484         # Escape HTML in the ticket summaries 
    485         item = req.hdf.getObj('report.items') 
    486         if item: 
    487             item = item.child() 
    488             while item: 
    489                 for col in ('summary', 'description.parsed'): 
    490                     nodename = 'report.items.%s.%s' % (item.name(), col) 
    491                     value = req.hdf.get(nodename, '') 
    492                     req.hdf[nodename] = value 
    493                 item = item.next() 
    494  
    495485    def _render_sql(self, req, id, title, description, sql): 
    496486        req.perm.assert_permission('REPORT_SQL_VIEW') 
    497487        req.send_response(200) 
  • trac/ticket/roadmap.py

     
    316316                title = Markup('Milestone <em>%s</em> completed', name) 
    317317                if format == 'rss': 
    318318                    href = self.env.abs_href.milestone(name) 
    319                     message = wiki_to_html(description or '--', self.env, 
    320                                            req, db, absurls=True) 
     319                    message = wiki_to_html(description, self.env, db, 
     320                                           absurls=True) 
    321321                else: 
    322322                    href = self.env.href.milestone(name) 
    323323                    message = wiki_to_oneliner(description, self.env, db, 
    324324                                               shorten=True) 
    325                 yield 'milestone', href, title, completed, None, message 
     325                yield 'milestone', href, title, completed, None, message or '--' 
    326326 
    327327    # IRequestHandler methods 
    328328 
  • trac/ticket/query.py

     
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2004-2005 Edgewall Software 
     3# Copyright (C) 2004-2006 Edgewall Software 
    44# Copyright (C) 2004-2005 Christopher Lenz <cmlenz@gmx.de> 
     5# Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 
    56# All rights reserved. 
    67# 
    78# This software is licensed as described in the file COPYING, which 
     
    592593                result['reporter'] = '' 
    593594            if result['description']: 
    594595                # str() cancels out the Markup() returned by wiki_to_html 
    595                 result['description'] = str(wiki_to_html(result['description'] or '', 
    596                                                          self.env, req, db, 
    597                                                          absurls=1)) 
     596                descr = wiki_to_html(result['description'], self.env, req, db, 
     597                                     absurls=True) 
     598                result['description'] = str(descr) 
    598599            if result['time']: 
    599600                result['time'] = http_date(result['time']) 
    600601        req.hdf['query.results'] = results 
  • trac/versioncontrol/web_ui/util.py

     
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2003-2005 Edgewall Software 
     3# Copyright (C) 2003-2006 Edgewall Software 
    44# Copyright (C) 2003-2005 Jonas Borgstr�jonas@edgewall.com> 
     5# Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 
    56# All rights reserved. 
    67# 
    78# This software is licensed as described in the file COPYING, which 
     
    1314# history and logs, available at http://projects.edgewall.com/trac/. 
    1415# 
    1516# Author: Jonas Borgstr�jonas@edgewall.com> 
     17#         Christian Boos <cboos@neuf.fr> 
    1618 
    1719import re 
    1820import urllib 
    1921 
    2022from trac.util import escape, format_datetime, pretty_timedelta, shorten_line, \ 
    21                       TracError, Markup 
     23                      TracError, Markup, rss_title 
    2224from trac.wiki import wiki_to_html, wiki_to_oneliner 
    2325 
    2426__all__ = ['get_changes', 'get_path_links', 'get_path_rev_line', 
     
    3032    for rev in revs: 
    3133        changeset = repos.get_changeset(rev) 
    3234        message = changeset.message or '--' 
    33         files = None 
     35        shortlog = wiki_to_oneliner(message, env, db, shorten=True) 
    3436        if format == 'changelog': 
    3537            files = [change[0] for change in changeset.get_changes()] 
    36         elif message: 
    37             if not full: 
    38                 message = wiki_to_oneliner(message, env, db, 
    39                                            shorten=True) 
    40             else: 
     38        else: 
     39            files = None 
     40            if full: 
    4141                message = wiki_to_html(message, env, req, db, 
    4242                                       absurls=(format == 'rss'), 
    4343                                       escape_newlines=True) 
    44         if not message: 
    45             message = '--' 
     44            else: 
     45                message = shortlog 
     46            if format == 'rss': 
     47                shortlog = rss_title(shortlog) 
     48                message = str(message) 
    4649        changes[rev] = { 
    4750            'date_seconds': changeset.date, 
    4851            'date': format_datetime(changeset.date), 
    4952            'age': pretty_timedelta(changeset.date), 
    5053            'author': changeset.author or 'anonymous', 
    5154            'message': message, 
    52             'shortlog': shorten_line(message), 
     55            'shortlog': shortlog, 
    5356            'files': files 
    5457        } 
    5558    return changes 
  • trac/versioncontrol/web_ui/changeset.py

     
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2003-2005 Edgewall Software 
     3# Copyright (C) 2003-2006 Edgewall Software 
    44# Copyright (C) 2003-2005 Jonas Borgstr�jonas@edgewall.com> 
    55# Copyright (C) 2004-2005 Christopher Lenz <cmlenz@gmx.de> 
     6# Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 
    67# All rights reserved. 
    78# 
    89# This software is licensed as described in the file COPYING, which 
     
    113114            repos = self.env.get_repository() 
    114115            for chgset in repos.get_changesets(start, stop): 
    115116                message = chgset.message or '--' 
     117                shortlog = wiki_to_oneliner(message, self.env, db, shorten=True) 
    116118                if format == 'rss': 
    117                     title = util.Markup('Changeset <em>[%s]</em>: %s', 
    118                                         chgset.rev, util.shorten_line(message)) 
     119                    title = util.Markup('Changeset [%s]: %s', 
     120                                        chgset.rev, shortlog) 
    119121                    href = self.env.abs_href.changeset(chgset.rev) 
    120122                    message = wiki_to_html(message, self.env, req, db, 
    121123                                           absurls=True) 
     
    129131                    files = [] 
    130132                    for chg in chgset.get_changes(): 
    131133                        if show_files > 0 and len(files) >= show_files: 
    132                             files.append('...') 
     134                            files.append('&hellip;') 
    133135                            break 
    134                         files.append('<span class="%s">%s</span>' 
    135                                      % (chg[2], util.escape(chg[0]))) 
    136                     message = '<span class="changes">' + ', '.join(files) +\ 
    137                               '</span>: ' + message 
     136                        print chg 
     137                        files.append(util.Markup('<span class="%s">%s</span>', 
     138                                                 chg[2], chg[0] or '/')) 
     139                    message = util.Markup('<span class="changes">%s</span> %s', 
     140                                          util.Markup('<br /> '.join(files)), 
     141                                          message) 
     142                    print message 
    138143                yield 'changeset', href, title, chgset.date, chgset.author,\ 
    139                       util.Markup(message) 
     144                      message 
    140145 
    141146    # Internal methods 
    142147 
  • trac/versioncontrol/web_ui/log.py

     
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2003-2005 Edgewall Software 
     3# Copyright (C) 2003-2006 Edgewall Software 
    44# Copyright (C) 2003-2005 Jonas Borgstr�jonas@edgewall.com> 
     5# Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 
    56# All rights reserved. 
    67# 
    78# This software is licensed as described in the file COPYING, which 
     
    157158                if email: 
    158159                    email_map[username] = email 
    159160            for cs in changes.values(): 
    160                 cs['shortlog'] = cs['shortlog'].replace('\n', ' ') 
    161161                # For RSS, author must be an email address 
    162162                author = cs['author'] 
    163163                author_email = '' 
  • trac/Timeline.py

     
    11# -*- coding: iso-8859-1 -*- 
    22# 
    3 # Copyright (C) 2003-2005 Edgewall Software 
     3# Copyright (C) 2003-2006 Edgewall Software 
    44# Copyright (C) 2003-2005 Jonas Borgstr�jonas@edgewall.com> 
    55# Copyright (C) 2004-2005 Christopher Lenz <cmlenz@gmx.de> 
     6# Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 
    67# All rights reserved. 
    78# 
    89# This software is licensed as described in the file COPYING, which 
     
    2122 
    2223from trac.core import * 
    2324from trac.perm import IPermissionRequestor 
    24 from trac.util import format_date, format_time, http_date, Markup 
     25from trac.util import format_date, format_time, http_date, Markup, rss_title 
    2526from trac.web import IRequestHandler 
    2627from trac.web.chrome import add_link, add_stylesheet, INavigationContributor 
    2728 
     
    158159 
    159160            if format == 'rss': 
    160161                # Strip/escape HTML markup 
    161                 if isinstance(title, Markup): 
    162                     event['title'] = title.striptags() 
    163                 else: 
    164                     event['title'] = title 
     162                event['title'] = rss_title(title) 
     163                event['message'] = str(message) 
    165164 
    166165                if author: 
    167166                    # For RSS, author must be an email address 
  • trac/util.py

     
    246246        return text 
    247247    return text.unescape() 
    248248 
     249ENTITIES = re.compile(r"&(?:\w+|#(\d+));") 
     250def rss_title(text): 
     251    if isinstance(text, Markup): 
     252        def replace_entity(match): 
     253            num = match.group(1) 
     254            return num and int(num) < 128 and match.group(0) or '' 
     255        return re.sub(ENTITIES, replace_entity, text.striptags()) 
     256    return text 
     257 
     258 
     259 
    249260def to_utf8(text, charset='iso-8859-15'): 
    250261    """Convert a string to UTF-8, assuming the encoding is either UTF-8, ISO 
    251262    Latin-1, or as specified by the optional `charset` parameter."""