def _format_link(self, formatter, ns, target, label, fullmatch=None): intertrac = formatter.shorthand_intertrac_helper( ns, target, label, fullmatch) if intertrac: return intertrac try: link, params, fragment = formatter.split_link(target) r = Ranges(link) if len(r) == 1: num = r.a ticket = formatter.resource('ticket', num) from trac.ticket.model import Ticket if Ticket.id_is_valid(num) and \ 'TICKET_VIEW' in formatter.perm(ticket): # TODO: attempt to retrieve ticket view directly, # something like: t = Ticket.view(num) for type, summary, status, resolution in \ self.env.db_query(""" SELECT type, summary, status, resolution FROM ticket WHERE id=%s """, (str(num),)): title = self.format_summary(summary, status, resolution, type) href = formatter.href.ticket(num) + params + fragment return tag.a(label, title=title, href=href, class_='%s ticket' % status) else: ranges = str(r) if params: params = '&' + params[1:] if isinstance(label, Markup): _label = unescape(label) else: _label = label label_wrap = _label.replace(',', u',\u200b') ranges_wrap = ranges.replace(',', u', ') return tag.a(label_wrap, title=_("Tickets %(ranges)s", ranges=ranges_wrap), href=formatter.href.query(id=ranges) + params) except ValueError: pass return tag.a(label, class_='missing ticket')
def _make_sublink(self, env, sublink, formatter, ns, target, label, fullmatch, extra=''): parent_match = {'ns' : ns, 'target' : target, 'label': Markup(escape(unescape(label) if isinstance(label, Markup) else label)), 'fullmatch' : fullmatch, } # Tweak nested context to work in target product/global scope subctx = formatter.context.child() subctx.href = resolve_product_href(to_env=env, at_env=self.env) try: req = formatter.context.req except AttributeError: pass else: # Authenticate in local context but use foreign permissions subctx.perm = self.FakePermClass() \ if isinstance(req.session, FakeSession) \ else PermissionCache(env, req.authname) subctx.req = req subformatter = EmbeddedLinkFormatter(env, subctx, parent_match) subformatter.auto_quote = True ctxtag = '[%s] ' % (env.product.prefix,) \ if isinstance(env, ProductEnvironment) \ else '<global> ' subformatter.enhance_link = lambda link : ( link(title=ctxtag + link.attrib.get('title')) if isinstance(link, Element) and 'title' in link.attrib else link) link = subformatter.match(sublink + extra) if link: return link else: # Return outermost match unchanged like if it was !-escaped for itype, match in fullmatch.groupdict().items(): if match and not itype in formatter.wikiparser.helper_patterns: return escape(match)
def _format_link(self, formatter, ns, target, label, fullmatch=None): intertrac = formatter.shorthand_intertrac_helper(ns, target, label, fullmatch) if intertrac: return intertrac try: link, params, fragment = formatter.split_link(target) r = Ranges(link) if len(r) == 1: num = r.a ticket = formatter.resource('ticket', num) from trac.ticket.model import Ticket if Ticket.id_is_valid(num) and \ 'TICKET_VIEW' in formatter.perm(ticket): # TODO: attempt to retrieve ticket view directly, # something like: t = Ticket.view(num) for type, summary, status, resolution in \ self.env.db_query(""" SELECT type, summary, status, resolution FROM ticket WHERE id=%s """, (str(num),)): title = self.format_summary(summary, status, resolution, type) href = formatter.href.ticket(num) + params + fragment return tag.a(label, title=title, href=href, class_='%s ticket' % status) else: ranges = str(r) if params: params = '&' + params[1:] if isinstance(label, Markup): _label = unescape(label) else: _label = label label_wrap = _label.replace(',', u',\u200b') ranges_wrap = ranges.replace(',', u', ') return tag.a(label_wrap, title=_("Tickets %(ranges)s", ranges=ranges_wrap), href=formatter.href.query(id=ranges) + params) except ValueError: pass return tag.a(label, class_='missing ticket')
def test_unescape_markup(self): string = '<b>"&"</b>' markup = Markup.escape(string) assert type(markup) is Markup self.assertEquals(string, unescape(markup))