Ticket #2580: rss_fixes.2.diff
| File rss_fixes.2.diff, 14.3 KB (added by cboos, 3 years ago) |
|---|
-
trac/ticket/web_ui.py
240 240 yield ('ticket_details', 'Ticket details', False) 241 241 242 242 def get_timeline_events(self, req, start, stop, filters): 243 rss = req.args.get('format') == 'rss' # Kludge243 format = req.args.get('format') 244 244 245 245 status_map = {'new': ('newticket', 'created'), 246 246 'reopened': ('newticket', 'reopened'), … … 268 268 kind, verb = status_map[status] 269 269 title = util.Markup('Ticket <em title="%s">#%s</em> (%s) %s by %s', 270 270 summary, id, type, verb, author) 271 href = rss and self.env.abs_href.ticket(id)\272 orself.env.href.ticket(id)271 href = format == 'rss' and self.env.abs_href.ticket(id) or \ 272 self.env.href.ticket(id) 273 273 274 274 if status == 'new': 275 message = util.escape(summary)275 message = summary 276 276 else: 277 277 message = util.Markup(info) 278 278 if comment: 279 if rss:279 if format == 'rss': 280 280 message += wiki_to_html(comment, self.env, req, db, 281 281 absurls=True) 282 282 else: -
trac/ticket/report.py
1 1 # -*- coding: iso-8859-1 -*- 2 2 # 3 # Copyright (C) 2003-200 5Edgewall Software3 # Copyright (C) 2003-2006 Edgewall Software 4 4 # Copyright (C) 2003-2004 Jonas Borgstr�jonas@edgewall.com> 5 # Copyright (C) 2006 Christian Boos <cboos@neuf.fr> 5 6 # All rights reserved. 6 7 # 7 8 # This software is licensed as described in the file COPYING, which … … 254 255 255 256 title, description, sql = self.get_info(db, id, args) 256 257 257 if req.args.get('format') == 'sql': 258 format = req.args.get('format') 259 if format == 'sql': 258 260 self._render_sql(req, id, title, description, sql) 259 261 return 260 262 … … 344 346 id_val = row[id_cols[0]] 345 347 value['ticket_href'] = self.env.href.ticket(id_val) 346 348 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 348 352 elif column == 'reporter' and cell.find('@') != -1: 349 353 value['rss'] = cell 350 354 elif column == 'report': … … 363 367 row_idx += 1 364 368 req.hdf['report.numrows'] = row_idx 365 369 366 format = req.args.get('format')367 370 if format == 'rss': 368 self._render_rss(req)369 371 return 'report_rss.cs', 'application/rss+xml' 370 372 elif format == 'csv': 371 373 self._render_csv(req, cols, rows) … … 480 482 .replace('\r',' ') 481 483 req.write(sep.join(map(sanitize, row)) + '\r\n') 482 484 483 def _render_rss(self, req):484 # Escape HTML in the ticket summaries485 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] = value493 item = item.next()494 495 485 def _render_sql(self, req, id, title, description, sql): 496 486 req.perm.assert_permission('REPORT_SQL_VIEW') 497 487 req.send_response(200) -
trac/ticket/roadmap.py
316 316 title = Markup('Milestone <em>%s</em> completed', name) 317 317 if format == 'rss': 318 318 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) 321 321 else: 322 322 href = self.env.href.milestone(name) 323 323 message = wiki_to_oneliner(description, self.env, db, 324 324 shorten=True) 325 yield 'milestone', href, title, completed, None, message 325 yield 'milestone', href, title, completed, None, message or '--' 326 326 327 327 # IRequestHandler methods 328 328 -
trac/ticket/query.py
1 1 # -*- coding: iso-8859-1 -*- 2 2 # 3 # Copyright (C) 2004-200 5Edgewall Software3 # Copyright (C) 2004-2006 Edgewall Software 4 4 # Copyright (C) 2004-2005 Christopher Lenz <cmlenz@gmx.de> 5 # Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 5 6 # All rights reserved. 6 7 # 7 8 # This software is licensed as described in the file COPYING, which … … 592 593 result['reporter'] = '' 593 594 if result['description']: 594 595 # 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) 598 599 if result['time']: 599 600 result['time'] = http_date(result['time']) 600 601 req.hdf['query.results'] = results -
trac/versioncontrol/web_ui/util.py
1 1 # -*- coding: iso-8859-1 -*- 2 2 # 3 # Copyright (C) 2003-200 5Edgewall Software3 # Copyright (C) 2003-2006 Edgewall Software 4 4 # Copyright (C) 2003-2005 Jonas Borgstr�jonas@edgewall.com> 5 # Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 5 6 # All rights reserved. 6 7 # 7 8 # This software is licensed as described in the file COPYING, which … … 13 14 # history and logs, available at http://projects.edgewall.com/trac/. 14 15 # 15 16 # Author: Jonas Borgstr�jonas@edgewall.com> 17 # Christian Boos <cboos@neuf.fr> 16 18 17 19 import re 18 20 import urllib 19 21 20 22 from trac.util import escape, format_datetime, pretty_timedelta, shorten_line, \ 21 TracError, Markup 23 TracError, Markup, rss_title 22 24 from trac.wiki import wiki_to_html, wiki_to_oneliner 23 25 24 26 __all__ = ['get_changes', 'get_path_links', 'get_path_rev_line', … … 30 32 for rev in revs: 31 33 changeset = repos.get_changeset(rev) 32 34 message = changeset.message or '--' 33 files = None35 shortlog = wiki_to_oneliner(message, env, db, shorten=True) 34 36 if format == 'changelog': 35 37 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: 41 41 message = wiki_to_html(message, env, req, db, 42 42 absurls=(format == 'rss'), 43 43 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) 46 49 changes[rev] = { 47 50 'date_seconds': changeset.date, 48 51 'date': format_datetime(changeset.date), 49 52 'age': pretty_timedelta(changeset.date), 50 53 'author': changeset.author or 'anonymous', 51 54 'message': message, 52 'shortlog': short en_line(message),55 'shortlog': shortlog, 53 56 'files': files 54 57 } 55 58 return changes -
trac/versioncontrol/web_ui/changeset.py
1 1 # -*- coding: iso-8859-1 -*- 2 2 # 3 # Copyright (C) 2003-200 5Edgewall Software3 # Copyright (C) 2003-2006 Edgewall Software 4 4 # Copyright (C) 2003-2005 Jonas Borgstr�jonas@edgewall.com> 5 5 # Copyright (C) 2004-2005 Christopher Lenz <cmlenz@gmx.de> 6 # Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 6 7 # All rights reserved. 7 8 # 8 9 # This software is licensed as described in the file COPYING, which … … 113 114 repos = self.env.get_repository() 114 115 for chgset in repos.get_changesets(start, stop): 115 116 message = chgset.message or '--' 117 shortlog = wiki_to_oneliner(message, self.env, db, shorten=True) 116 118 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) 119 121 href = self.env.abs_href.changeset(chgset.rev) 120 122 message = wiki_to_html(message, self.env, req, db, 121 123 absurls=True) … … 129 131 files = [] 130 132 for chg in chgset.get_changes(): 131 133 if show_files > 0 and len(files) >= show_files: 132 files.append(' ...')134 files.append('…') 133 135 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 138 143 yield 'changeset', href, title, chgset.date, chgset.author,\ 139 util.Markup(message)144 message 140 145 141 146 # Internal methods 142 147 -
trac/versioncontrol/web_ui/log.py
1 1 # -*- coding: iso-8859-1 -*- 2 2 # 3 # Copyright (C) 2003-200 5Edgewall Software3 # Copyright (C) 2003-2006 Edgewall Software 4 4 # Copyright (C) 2003-2005 Jonas Borgstr�jonas@edgewall.com> 5 # Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 5 6 # All rights reserved. 6 7 # 7 8 # This software is licensed as described in the file COPYING, which … … 157 158 if email: 158 159 email_map[username] = email 159 160 for cs in changes.values(): 160 cs['shortlog'] = cs['shortlog'].replace('\n', ' ')161 161 # For RSS, author must be an email address 162 162 author = cs['author'] 163 163 author_email = '' -
trac/Timeline.py
1 1 # -*- coding: iso-8859-1 -*- 2 2 # 3 # Copyright (C) 2003-200 5Edgewall Software3 # Copyright (C) 2003-2006 Edgewall Software 4 4 # Copyright (C) 2003-2005 Jonas Borgstr�jonas@edgewall.com> 5 5 # Copyright (C) 2004-2005 Christopher Lenz <cmlenz@gmx.de> 6 # Copyright (C) 2005-2006 Christian Boos <cboos@neuf.fr> 6 7 # All rights reserved. 7 8 # 8 9 # This software is licensed as described in the file COPYING, which … … 21 22 22 23 from trac.core import * 23 24 from trac.perm import IPermissionRequestor 24 from trac.util import format_date, format_time, http_date, Markup 25 from trac.util import format_date, format_time, http_date, Markup, rss_title 25 26 from trac.web import IRequestHandler 26 27 from trac.web.chrome import add_link, add_stylesheet, INavigationContributor 27 28 … … 158 159 159 160 if format == 'rss': 160 161 # 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) 165 164 166 165 if author: 167 166 # For RSS, author must be an email address -
trac/util.py
246 246 return text 247 247 return text.unescape() 248 248 249 ENTITIES = re.compile(r"&(?:(\w+)|#(\d+));") 250 def rss_title(text): 251 if isinstance(text, Markup): 252 def replace_entity(match): 253 named = match.group(1) 254 num = match.group(2) 255 return num and int(num) < 128 and match.group(0) or \ 256 named in ('gt', 'lt', 'amp') and named or '' 257 return re.sub(ENTITIES, replace_entity, text.striptags()) 258 return text 259 260 261 249 262 def to_utf8(text, charset='iso-8859-15'): 250 263 """Convert a string to UTF-8, assuming the encoding is either UTF-8, ISO 251 264 Latin-1, or as specified by the optional `charset` parameter."""
