def _format_tagged(self, formatter, target, label): if label: href = formatter.context.href url = get_resource_url(self.env, Resource('tag', target), href) return tag.a(label, href=url) return render_resource_link(self.env, formatter.context, Resource('tag', target))
def test_resource_missing_summary_format(self): res = resource.Resource('fake', 'missing', version=1) link = resource.render_resource_link(self.env, self.context, res, 'summary') html = tag.a('fake:missing at version 1', class_='fake missing', rel='nofollow', href='/trac.cgi/fake/missing?version=1') self.assertEqual(unicode(html), unicode(link))
def _format_tagged(self, formatter, ns, target, label, fullmatch=None): """Tag and tag query expression link formatter.""" def unquote(text): """Strip all matching pairs of outer quotes from string.""" while re.match(WikiParser.QUOTED_STRING, text): # Remove outer whitespace after stripped quotation too. text = text[1:-1].strip() return text label = label and unquote(label.strip()) or '' target = unquote(target.strip()) tag_res = Resource('tag', target) if 'TAGS_VIEW' in formatter.perm(tag_res): context = formatter.context href = get_resource_url(self.env, tag_res, context.href) tag_sys = TagSystem(self.env) # Tag exists or tags query yields at least one match. if target in tag_sys.get_all_tags(formatter.req) or \ [(res, tags) for res, tags in tag_sys.query(formatter.req, target)]: if label: return tag.a(label, href=href) return render_resource_link(self.env, context, tag_res) else: return tag.a(label+'?', href=href, class_='missing tags', rel='nofollow') else: return tag.span(label, class_='forbidden tags', title=_("no permission to view tags"))
def test_resource_exists_default_format(self): res = resource.Resource('fake', 'exists', version=1) link = resource.render_resource_link(self.env, self.context, res) html = tag.a('fake:exists', class_='fake', href='/trac.cgi/fake/exists?version=1') self.assertEqual(unicode(html), unicode(link))
def test_resource_has_no_manager_default_format(self): res = resource.Resource('unmanaged', 'exists', version=1) link = resource.render_resource_link(self.env, self.context, res) html = tag.a('unmanaged:exists', class_='unmanaged', href='/trac.cgi/unmanaged/exists?version=1') self.assertEqual(unicode(html), unicode(link))
def test_resource_exists_summary_format(self): res = resource.Resource('fake', 'exists', version=1) link = resource.render_resource_link(self.env, self.context, res, 'summary') html = tag.a('fake:exists at version 1', class_='fake', href='/trac.cgi/fake/exists?version=1') self.assertEqual(unicode(html), unicode(link))
def test_resource_missing_default_format(self): res = resource.Resource('fake', 'missing', version=1) link = resource.render_resource_link(self.env, self.context, res) html = tag.a('fake:missing', class_='fake missing', rel='nofollow', href='/trac.cgi/fake/missing?version=1') self.assertEqual(unicode(html), unicode(link))
def test_resource_exists_summary_format(self): res = resource.Resource('fake', 'exists', version=1) link = resource.render_resource_link(self.env, self.context, res, 'summary') html = tag.a('fake:exists at version 1', class_='fake', href='/trac.cgi/fake/exists?version=1') self.assertEqual(str(html), str(link))
def test_resource_has_no_manager_summary_format(self): res = resource.Resource('unmanaged', 'exists', version=1) link = resource.render_resource_link(self.env, self.context, res, 'summary') html = tag.a('unmanaged:exists at version 1', class_='unmanaged', href='/trac.cgi/unmanaged/exists?version=1') self.assertEqual(str(html), str(link))
def test_resource_missing_summary_format(self): res = resource.Resource('fake', 'missing', version=1) link = resource.render_resource_link(self.env, self.context, res, 'summary') html = tag.a('fake:missing at version 1', class_='fake missing', rel='nofollow', href='/trac.cgi/fake/missing?version=1') self.assertEqual(str(html), str(link))
def test_resource_link_ticket_context_milestone_missing(self): """Resource link in ticket context for non-existent milestone. """ req = MockRequest(self.env, path_info='/ticket/1', authname='user1') resource = Resource('milestone', 'milestone1') context = web_context(req) link = render_resource_link(self.env, context, resource, format='compact') self.assertEqual('<a class="milestone missing">milestone1</a>', unicode(link))
def test_resource_link_ticket_context_milestone_no_view_perm(self): """Resource link in ticket context with no milestone view permission. """ milestone = Milestone(self.env) milestone.name = 'milestone1' milestone.insert() req = MockRequest(self.env, path_info='/ticket/1', authname='user1') resource = Resource('milestone', 'milestone1') context = web_context(req) link = render_resource_link(self.env, context, resource, format='compact') self.assertEqual('<a class="milestone">milestone1</a>', unicode(link))
def test_resource_link_ticket_context_milestone_exists(self): """Resource link in ticket context for viewable milestone. """ milestone = Milestone(self.env) milestone.name = 'milestone1' milestone.insert() req = MockRequest(self.env, path_info='/ticket/1') resource = Resource('milestone', 'milestone1') context = web_context(req) link = render_resource_link(self.env, context, resource, format='compact') self.assertEqual('<a class="milestone" href="/trac.cgi/milestone/' 'milestone1" title="No date set">milestone1</a>', unicode(link))
def _link(resource): if resource.realm == 'tag': # Keep realm selection in tag links. return builder.a(resource.id, href=self.get_href(req, tag=resource)) elif resource.realm == 'ticket': # Return resource link including ticket status dependend # class to allow for common Trac ticket link style. ticket = Ticket(env, resource.id) return builder.a('#%s' % ticket.id, class_=ticket['status'], href=formatter.href.ticket(ticket.id), title=shorten_line(ticket['summary'])) return render_resource_link(env, context, resource, 'compact')
def _wiki_view(self, req, stream): tags = self._page_tags(req) if not tags: return stream tag_system = TagSystem(self.env) add_stylesheet(req, 'tags/css/tractags.css') li = [] for tag_ in tags: resource = Resource('tag', tag_) anchor = render_resource_link(self.env, Context.from_request(req, resource), resource) li.append(tag.li(anchor, ' ')) insert = tag.ul(class_='tags')(tag.li('Tags', class_='header'), li) return stream | Transformer('//div[@class="buttons"]').before(insert)
def _wiki_view(self, req, stream): add_stylesheet(req, 'tags/css/tractags.css') tags = self._page_tags(req) if not tags: return stream li = [] for tag_ in tags: resource = Resource('tag', tag_) anchor = render_resource_link(self.env, web_context(req, resource), resource) anchor = anchor(rel='tag') li.append(tag.li(anchor, ' ')) # TRANSLATOR: Header label text for tag list at wiki page bottom. insert = tag.ul(class_='tags')(tag.li(_("Tags"), class_='header'), li) return stream | ( Transformer('//div[contains(@class,"wikipage")]').after(insert))
def _wiki_view(self, req, stream): add_stylesheet(req, 'tags/css/tractags.css') tags = self._page_tags(req) if not tags: return stream li = [] for tag_ in tags: resource = Resource('tag', tag_) anchor = render_resource_link(self.env, Context.from_request(req, resource), resource) anchor = anchor(rel='tag') li.append(tag.li(anchor, ' ')) # TRANSLATOR: Header label text for tag list at wiki page bottom. insert = tag.ul(class_='tags')(tag.li(_("Tags"), class_='header'), li) return stream | (Transformer('//div[contains(@class,"wikipage")]') .after(insert))
def _format_tagged(self, formatter, target, label): RE = re.compile(r'^(\\[\'"]*\'|\\[\'"]*\"|"|\')(.*)(\1)') iter_max = 5 iter_run = 0 for iter_run in range(0, iter_max): # Reduce outer quotations. ctarget = RE.sub(r'\2', target) iter_run += 1 if ctarget == target or iter_run > iter_max: self.env.log.debug(' ,'.join([target, ctarget, str(iter_run)])) break target = ctarget if label: href = formatter.context.href url = get_resource_url(self.env, Resource('tag', target), href) return tag.a(label, href=url) return render_resource_link(self.env, formatter.context, Resource('tag', target))
def _format_tagged(self, formatter, ns, target, label, fullmatch=None): """Tag and tag query expression link formatter.""" def unquote(text): """Strip all matching pairs of outer quotes from string.""" while re.match(WikiParser.QUOTED_STRING, text): # Remove outer whitespace after stripped quotation too. text = text[1:-1].strip() return text label = label and unquote(label.strip()) or '' target = unquote(target.strip()) query = target # Pop realms from query expression. all_realms = self.tag_system.get_taggable_realms(formatter.perm) realms = query_realms(target, all_realms) if realms: kwargs = dict((realm, 'on') for realm in realms) target = re.sub('(^|\W)realm:\S+(\W|$)', ' ', target).strip() else: kwargs = {} tag_res = Resource('tag', target) if 'TAGS_VIEW' not in formatter.perm(tag_res): return tag.span(label, class_='forbidden tags', title=_("no permission to view tags")) context = formatter.context href = self.tag_system.get_resource_url(tag_res, context.href, kwargs) if all_realms and (target in self.tag_system.get_all_tags( formatter.req) or not iter_is_empty( self.tag_system.query(formatter.req, query))): # At least one tag provider is available and tag exists or # tags query yields at least one match. if label: return tag.a(label, href=href) return render_resource_link(self.env, context, tag_res) return tag.a(label + '?', href=href, class_='missing tags', rel='nofollow')
def _format_tagged(self, formatter, ns, target, label, fullmatch=None): """Tag and tag query expression link formatter.""" def unquote(text): """Strip all matching pairs of outer quotes from string.""" while re.match(WikiParser.QUOTED_STRING, text): # Remove outer whitespace after stripped quotation too. text = text[1:-1].strip() return text label = label and unquote(label.strip()) or '' target = unquote(target.strip()) query = target # Pop realms from query expression. all_realms = self.tag_system.get_taggable_realms(formatter.perm) realms = query_realms(target, all_realms) if realms: kwargs = dict((realm, 'on') for realm in realms) target = re.sub('(^|\W)realm:\S+(\W|$)', ' ', target).strip() else: kwargs = {} tag_res = Resource('tag', target) if 'TAGS_VIEW' not in formatter.perm(tag_res): return tag.span(label, class_='forbidden tags', title=_("no permission to view tags")) context = formatter.context href = self.tag_system.get_resource_url(tag_res, context.href, kwargs) if all_realms and ( target in self.tag_system.get_all_tags(formatter.req) or not iter_is_empty(self.tag_system.query(formatter.req, query))): # At least one tag provider is available and tag exists or # tags query yields at least one match. if label: return tag.a(label, href=href) return render_resource_link(self.env, context, tag_res) return tag.a(label+'?', href=href, class_='missing tags', rel='nofollow')
def _post_process_request_wiki_view(self, req): add_stylesheet(req, 'tags/css/tractags.css') tags = self._page_tags(req) if not tags: return li = [] for t in tags: resource = Resource('tag', t) anchor = render_resource_link(self.env, web_context(req, resource), resource) anchor = anchor(rel='tag') li.append(tag.li(anchor, ' ')) # TRANSLATOR: Header label text for tag list at wiki page bottom. insert = tag.ul(class_='tags')(tag.li(_("Tags"), class_='header'), li) filter_lst = [] # xpath = //div[contains(@class,"wikipage")] xform = JTransformer('div[class*=wikipage]') filter_lst.append(xform.after(Markup(insert))) self._add_jtransform(req, filter_lst) return
def link(resource): return render_resource_link(self.env, formatter.context, resource, 'compact')