Edgewall Software

Ticket #992: anchors.3.diff

File anchors.3.diff, 3.9 KB (added by trac-form@…, 7 years ago)

Version 3, with fixed wikilink pattern

  • trac/Href.py

    diff --new-file --exclude='*.pyc' -ru trac-0.8/trac/Href.py /usr/lib/python2.3/site-packages/trac/Href.py
    old new  
    136136            return href_join(self.base, 'about_trac') 
    137137 
    138138    def wiki(self, page=None, version=None, diff=0, history=0): 
     139        anchor = "" 
     140        if page and page.find("#") != -1: 
     141            anchor = page[page.find('#'):] 
     142            page = page[:page.find('#')] 
    139143        if page and version and diff: 
    140             return href_join(self.base, 'wiki', page) + '?version=' + str(version) + '&diff=yes' 
     144            return href_join(self.base, 'wiki', page) + anchor + '?version=' + str(version) + '&diff=yes' 
    141145        elif page and version: 
    142             return href_join(self.base, 'wiki', page) + '?version=' + str(version) 
     146            return href_join(self.base, 'wiki', page) + anchor + '?version=' + str(version) 
    143147        elif page and history: 
    144             return href_join(self.base, 'wiki', page) + '?history=yes' 
     148            return href_join(self.base, 'wiki', page) + anchor + '?history=yes' 
    145149        elif page: 
    146             return href_join(self.base, 'wiki', page) 
     150            return href_join(self.base, 'wiki', page) + anchor 
    147151        else: 
    148152            return href_join(self.base, 'wiki') 
    149153 
  • trac/WikiFormatter.py

    diff --new-file --exclude='*.pyc' -ru trac-0.8/trac/WikiFormatter.py /usr/lib/python2.3/site-packages/trac/WikiFormatter.py
    old new  
    4545              r"""(?P<changesethref>!?\[\d+\])""", 
    4646              r"""(?P<reporthref>!?\{\d+\})""", 
    4747              r"""(?P<modulehref>!?((?P<modulename>bug|ticket|browser|source|repos|report|changeset|wiki|milestone|search):(?P<moduleargs>(&#34;(.*?)&#34;|'(.*?)')|([^ ]*[^'~_\., \)]))))""", 
    48               r"""(?P<wikilink>!?(^|(?<=[^A-Za-z]))[A-Z][a-z]+(?:[A-Z][a-z]*[a-z/])+(?=\Z|\s|[.,;:!?\)}\]]))""", 
     48              r"""(?P<wikilink>!?(^|(?<=[^A-Za-z]))[A-Z][a-z]+(?:[A-Z][a-z]*[a-z/])+(?:#[A-Za-z0-9]+)?(?=\Z|\s|[.,;:!?\)}\]]))""", 
    4949              r"""(?P<fancylink>!?\[(?P<fancyurl>([a-z]+:[^ ]+)) (?P<linkname>.*?)\])"""] 
    5050 
    5151    _open_tags = [] 
     
    162162            else: 
    163163                return self._href.ticket(args), '%s:%s' % (module, args), 1, '' 
    164164        elif module == 'wiki': 
    165             if not self.env._wiki_pages.has_key(args): 
     165            page = args 
     166            if page.find('#') != -1: page = page[:page.find('#')] 
     167            if not self.env._wiki_pages.has_key(page): 
    166168                return self._href.wiki(args), '%s:%s' % (module, args), 1, None 
    167169            else: 
    168170                return self._href.wiki(args), '%s:%s' % (module, args), 0, None 
     
    204206            return match 
    205207 
    206208    def _wikilink_formatter(self, match, fullmatch): 
    207         if not self.env._wiki_pages.has_key(match): 
     209        page = match 
     210        if page.find('#') != -1: page = page[:page.find('#')] 
     211        if not self.env._wiki_pages.has_key(page): 
    208212            return '<a class="missing" href="%s">%s?</a>' % \ 
    209213                   (self._href.wiki(match), match) 
    210214        else: 
     
    269273 
    270274    _compiled_rules = re.compile('(?:' + string.join(_rules, '|') + ')') 
    271275    _processor_re = re.compile('#\!([a-zA-Z0-9/+-]+)') 
     276    _anchor_re = re.compile('[^\w\d]+') 
    272277    mime_type = "" 
    273278     
    274279 
     
    362367        self.close_paragraph() 
    363368        self.close_indentation() 
    364369        self.close_list() 
    365         self.out.write('<h%d>%s</h%d>' % (depth, match[depth + 1:len(match) - depth - 1], depth)) 
     370        heading = match[depth + 1:len(match) - depth - 1] 
     371        anchor = self._anchor_re.sub("", heading) 
     372        self.out.write('<a name="%s"><h%d>%s</h%d></a>' % (anchor, depth, heading, depth)) 
    366373        return '' 
    367374 
    368375    def _svnimg_formatter(self, match, fullmatch):