=== htdocs/css/trac.css
==================================================================
|
|
|
|
| 240 | 240 | a.missing:link,a.missing:visited { background: #fafaf0; color: #998 } |
| 241 | 241 | a.missing:hover { color: #000; } |
| 242 | 242 | |
| | 243 | a.external:link,a.external:visited { color: #00b } |
| | 244 | |
| 243 | 245 | #content.wiki { line-height: 140% } |
| 244 | 246 | .wikitoolbar { |
| 245 | 247 | border: solid #d7d7d7; |
=== trac/WikiFormatter.py
==================================================================
|
|
|
|
| 41 | 41 | r"""(?P<strike>~~)""", |
| 42 | 42 | r"""(?P<inlinecode>!?\{\{\{(?P<inline>.*?)\}\}\})""", |
| 43 | 43 | r"""(?P<htmlescapeentity>!?&#\d+;)""", |
| 44 | | r"""(?P<tickethref>!?#\d+)""", |
| 45 | | r"""(?P<changesethref>!?\[\d+\])""", |
| | 44 | r"""(?P<tickethref>!?#(?P<t_intertrac>[a-zA-z]?)\d+)""", |
| | 45 | r"""(?P<changesethref>!?\[(?P<c_intertrac>[a-zA-z]?)\d+\])""", |
| 46 | 46 | r"""(?P<reporthref>!?\{\d+\})""", |
| 47 | | r"""(?P<modulehref>!?((?P<modulename>bug|ticket|browser|source|repos|report|changeset|wiki|milestone|search):(?P<moduleargs>("(.*?)"|'(.*?)')|([^ ]*[^\., \)]))))""", |
| | 47 | r"""(?P<modulehref>!?((?P<modulename>bug|ticket|browser|source|repos|report|changeset|wiki|milestone|search):(?P<m_intertrac>[a-zA-z]:?)(?P<moduleargs>("(.*?)"|'(.*?)')|([^ ]*[^\., \)]))))""", |
| 48 | 48 | r"""(?P<wikilink>!?(^|(?<=[^A-Za-z]))[A-Z][a-z]+(?:[A-Z][a-z]*[a-z/])+(?=\Z|\s|,|\.|:|\)))""", |
| 49 | 49 | r"""(?P<fancylink>!?\[(?P<fancyurl>([a-z]+:[^ ]+)) (?P<linkname>.*?)\])"""] |
| 50 | 50 | |
| … |
… |
|
| 112 | 112 | return match |
| 113 | 113 | |
| 114 | 114 | def _tickethref_formatter(self, match, fullmatch): |
| 115 | | number = int(match[1:]) |
| 116 | | cursor = self.db.cursor () |
| 117 | | cursor.execute('SELECT summary,status FROM ticket WHERE id=%s', number) |
| 118 | | row = cursor.fetchone () |
| 119 | | if not row: |
| 120 | | return '<a class="missing" href="%s">#%d</a>' % (self._href.ticket(number), number) |
| | 115 | intertrac = fullmatch.group('t_intertrac') |
| | 116 | if intertrac: |
| | 117 | number = int(match[1+len(intertrac):]) |
| | 118 | href, title, _class = self._intertrac_link(intertrac) |
| | 119 | return '<a class="%s" title="%s" href="%s/ticket/%d">#%d</a>' % (_class, title, href, number, number) |
| 121 | 120 | else: |
| 122 | | summary = util.shorten_line(row[0]) |
| 123 | | if row[1] == 'new': |
| 124 | | return '<a href="%s" title="NEW : %s">#%d*</a>' % (self._href.ticket(number), summary, number) |
| 125 | | elif row[1] == 'closed': |
| 126 | | return '<a href="%s" title="CLOSED : %s"><del>#%d</del></a>' % (self._href.ticket(number), summary, number) |
| | 121 | number = int(match[1:]) |
| | 122 | cursor = self.db.cursor () |
| | 123 | cursor.execute('SELECT summary,status FROM ticket WHERE id=%s', number) |
| | 124 | row = cursor.fetchone () |
| | 125 | if not row: |
| | 126 | return '<a class="missing" href="%s">#%d</a>' % (self._href.ticket(number), number) |
| 127 | 127 | else: |
| 128 | | return '<a href="%s" title="%s">#%d</a>' % (self._href.ticket(number), summary, number) |
| | 128 | summary = util.shorten_line(row[0]) |
| | 129 | if row[1] == 'new': |
| | 130 | return '<a href="%s" title="NEW : %s">#%d*</a>' % (self._href.ticket(number), summary, number) |
| | 131 | elif row[1] == 'closed': |
| | 132 | return '<a href="%s" title="CLOSED : %s"><del>#%d</del></a>' % (self._href.ticket(number), summary, number) |
| | 133 | else: |
| | 134 | return '<a href="%s" title="%s">#%d</a>' % (self._href.ticket(number), summary, number) |
| 129 | 135 | |
| 130 | 136 | def _changesethref_formatter(self, match, fullmatch): |
| 131 | | number = int(match[1:-1]) |
| 132 | | cursor = self.db.cursor () |
| 133 | | cursor.execute('SELECT message FROM revision WHERE rev=%d', number) |
| 134 | | row = cursor.fetchone () |
| 135 | | if not row: |
| 136 | | return '[<a class="missing" href="%s">%d</a>]' % (self._href.changeset(number), number) |
| | 137 | intertrac = fullmatch.group('c_intertrac') |
| | 138 | if intertrac: |
| | 139 | number = int(match[1+len(intertrac):-1]) |
| | 140 | href, title, _class = self._intertrac_link(intertrac) |
| | 141 | return '[<a class="%s" title="%s" href="%s/changeset/%d">%d</a>]' % (_class, title, href, number, number) |
| 137 | 142 | else: |
| 138 | | return '[<a title="%s" href="%s">%d</a>]' % (util.shorten_line(row[0]),self._href.changeset(number), number) |
| | 143 | number = int(match[1:-1]) |
| | 144 | cursor = self.db.cursor () |
| | 145 | cursor.execute('SELECT message FROM revision WHERE rev=%d', number) |
| | 146 | row = cursor.fetchone () |
| | 147 | if not row: |
| | 148 | return '[<a class="missing" href="%s">%d</a>]' % (self._href.changeset(number), number) |
| | 149 | else: |
| | 150 | return '[<a title="%s" href="%s">%d</a>]' % (util.shorten_line(row[0]),self._href.changeset(number), number) |
| 139 | 151 | |
| 140 | 152 | def _reporthref_formatter(self, match, fullmatch): |
| 141 | 153 | number = int(match[1:-1]) |
| … |
… |
|
| 147 | 159 | return None, None |
| 148 | 160 | module = text[:sep] |
| 149 | 161 | args = text[sep+1:] |
| | 162 | sep2 = args.find(':') |
| | 163 | if sep2 != -1: |
| | 164 | intertrac = args[:sep2] |
| | 165 | href, title, _class = self._intertrac_link(intertrac) |
| | 166 | args = args[sep2+1:] |
| | 167 | return "%s/%s/%s"% (href,module,args), text, _class, title |
| 150 | 168 | if module in ['bug', 'ticket']: |
| 151 | 169 | cursor = self.db.cursor () |
| 152 | 170 | cursor.execute('SELECT summary,status FROM ticket WHERE id=%s', args) |
| … |
… |
|
| 195 | 213 | return None, None, 0, None |
| 196 | 214 | |
| 197 | 215 | def _modulehref_formatter(self, match, fullmatch): |
| 198 | | link, text, missing, title = self._expand_module_link(match) |
| 199 | | if link and missing: |
| 200 | | return '<a title="%s" class="missing" href="%s">%s?</a>' % (title,link, text) |
| | 216 | link, text, _class, title = self._expand_module_link(match) |
| | 217 | if link and _class: |
| | 218 | qmark = '' |
| | 219 | if _class == 1: |
| | 220 | _class, qmark = 'missing', '?' |
| | 221 | return '<a title="%s" class="%s" href="%s">%s%s</a>' % (title, _class, link, text, qmark) |
| 201 | 222 | elif link: |
| 202 | 223 | return '<a title="%s" href="%s">%s</a>' % (title or '',link, text) |
| 203 | 224 | else: |
| … |
… |
|
| 217 | 238 | link = fullmatch.group('fancyurl') |
| 218 | 239 | name = fullmatch.group('linkname') |
| 219 | 240 | |
| 220 | | module_link, t, missing, title = self._expand_module_link(link) |
| 221 | | if module_link and missing: |
| 222 | | return '<a class="missing" href="%s">%s?</a>' % (module_link, name) |
| | 241 | module_link, t, _class, title = self._expand_module_link(link) |
| | 242 | if module_link and _class: |
| | 243 | qmark = '' |
| | 244 | if _class == 1: |
| | 245 | _class, qmark = 'missing', '?' |
| | 246 | return '<a class="%s" href="%s">%s%s</a>' % (_class, module_link, name, qmark) |
| 223 | 247 | elif module_link: |
| 224 | 248 | return '<a href="%s">%s</a>' % (module_link, name) |
| 225 | 249 | else: |
| 226 | 250 | return '<a href="%s">%s</a>' % (link, name) |
| 227 | 251 | |
| | 252 | def _intertrac_link(self, intertrac): |
| | 253 | href = self.env.get_config('intertrac', intertrac.upper() + '.href') |
| | 254 | if href: |
| | 255 | title = self.env.get_config('intertrac', intertrac.upper() + '.title') |
| | 256 | _class = 'external' |
| | 257 | else: |
| | 258 | title = "Unknown intertrac link '%s'" % intertrac |
| | 259 | _class = 'missing' |
| | 260 | return href, title, _class |
| 228 | 261 | |
| | 262 | |
| 229 | 263 | class OneLinerFormatter(CommonFormatter): |
| 230 | 264 | """ |
| 231 | 265 | A special version of the wiki formatter that only implement a |
| … |
… |
|
| 275 | 309 | # RE patterns used by other patterna |
| 276 | 310 | _helper_patterns = ('idepth', 'ldepth', 'hdepth', 'fancyurl', |
| 277 | 311 | 'linkname', 'macroname', 'macroargs', 'inline', |
| 278 | | 'modulename', 'moduleargs') |
| | 312 | 'modulename', 'moduleargs', |
| | 313 | 't_intertrac', 'c_intertrac', 'm_intertrac') |
| 279 | 314 | |
| 280 | 315 | _htmlproc_disallow_rule = re.compile('(?i)<(script|noscript|embed|object|iframe|frame|frameset|link|style|meta|param|doctype)') |
| 281 | 316 | |