Edgewall Software

Ticket #3526: rst_trac_links-r3592.patch

File rst_trac_links-r3592.patch, 2.9 KB (added by cboos, 2 years ago)

Simplify and generalize the :trac: directive for reST

  • trac/mimeview/rst.py

     
    2929 
    3030from trac.core import * 
    3131from trac.mimeview.api import IHTMLPreviewRenderer, content_to_unicode 
     32from trac.util.markup import Element 
    3233from trac.web.href import Href 
    3334from trac.wiki.formatter import WikiProcessor 
    34 from trac.wiki import WikiSystem 
     35from trac.wiki import WikiSystem, wiki_to_link 
    3536 
    36 WIKI_LINK = re.compile(r'(?:wiki:)?(.+)') 
    37 TICKET_LINK = re.compile(r'(?:#(\d+))|(?:ticket:(\d+))') 
    38 REPORT_LINK = re.compile(r'(?:{(\d+)})|(?:report:(\d+))') 
    39 CHANGESET_LINK = re.compile(r'(?:\[(\d+)\])|(?:changeset:(\d+))') 
    40 FILE_LINK = re.compile(r'(?:browser|repos|source):([^#]+)#?(.*)') 
    41  
    42 def _wikipage(href, args): 
    43     return href.wiki(args[0]) 
    44  
    45 def _ticket(href, args): 
    46     return href.ticket(args[0]) 
    47  
    48 def _report(href, args): 
    49     return href.report(args[0]) 
    50  
    51 def _changeset(href, args): 
    52     return href.changeset(int(args[0])) 
    53  
    54 def _browser(href, args): 
    55     path = args[0] 
    56     rev = len(args) == 2 and args[1] or '' 
    57     return href.browser(path, rev=rev) 
    58  
    59 # TracLink REs and callback functions 
    60 LINKS = [(TICKET_LINK, _ticket), 
    61          (REPORT_LINK, _report), 
    62          (CHANGESET_LINK, _changeset), 
    63          (FILE_LINK, _browser), 
    64          (WIKI_LINK, _wikipage)] 
    65  
    6637class ReStructuredTextRenderer(Component): 
    6738    """ 
    6839    Renders plain text in reStructuredText format as HTML. 
     
    8657            raise TracError, 'Docutils version >= %s required, %s found' \ 
    8758                             % ('0.3.9', __version__) 
    8859 
    89         def trac_get_reference(rawtext, link, text): 
    90             for (pattern, function) in LINKS: 
    91                 m = pattern.match(link) 
    92                 if m: 
    93                     g = filter(None, m.groups()) 
    94                     missing = 0 
    95                     if not text: 
    96                         text = g[0] 
    97                     if pattern == WIKI_LINK: 
    98                         pagename = re.search(r'^[^\#]+',g[0]) 
    99                         if not WikiSystem(self.env).has_page(pagename.group()): 
    100                             missing = 1 
    101                             text = text + "?" 
    102                     uri = function(req.href, g) 
    103                     reference = nodes.reference(rawtext, text) 
     60        def trac_get_reference(rawtext, target, text): 
     61            link = wiki_to_link(target, self.env, req) 
     62            if isinstance(link, Element): 
     63                uri = link.attr['href'] 
     64                if uri: 
     65                    reference = nodes.reference(rawtext, text or target) 
    10466                    reference['refuri']= uri 
    105                     if missing: 
     67                    if 'missing' in link.attr.get('class', ''): 
    10668                        reference.set_class('missing') 
    10769                    return reference 
    10870            return None