Edgewall Software

Ticket #992: headingids.diff

File headingids.diff, 3.7 KB (added by Manuzhai, 7 years ago)

cmlenz' concerns fixed.

  • .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) + '?version=' + str(version) + '&diff=yes' + anchor 
    141145        elif page and version: 
    142             return href_join(self.base, 'wiki', page) + '?version=' + str(version) 
     146            return href_join(self.base, 'wiki', page) + '?version=' + str(version) + anchor 
    143147        elif page and history: 
    144             return href_join(self.base, 'wiki', page) + '?history=yes' 
     148            return href_join(self.base, 'wiki', page) + '?history=yes' + anchor 
    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 
  • .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            page = args 
     166            if page.find('#') != -1: page = page[:page.find('#')] 
    165167            if not self.env._wiki_pages.has_key(args): 
    166168                return self._href.wiki(args), '%s:%s' % (module, args), 1, None 
    167169            else: 
     
    205207 
    206208    def _wikilink_formatter(self, match, fullmatch): 
    207209        if not self.env._wiki_pages.has_key(match): 
     210            page = match 
     211            if page.find('#') != -1: page = page[:page.find('#')] 
    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 = "" 
    273      
     278    fragments = []     
    274279 
    275280    # RE patterns used by other patterna 
    276281    _helper_patterns = ('idepth', 'ldepth', 'hdepth', 'fancyurl', 
     
    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         
     371        txt = match[depth + 1:len(match) - depth - 1] 
     372        simplefrag = frag = txt.lower().replace(' ', '-') 
     373        i = 0 
     374        while frag in self.fragments: 
     375            frag = simplefrag + '-' + str(i) 
     376            i += 1 
     377        self.fragments.append(frag) 
     378         
     379        self.out.write('<h%d id="%s">%s</h%d>' % (depth, frag, txt, depth)) 
    366380        return '' 
    367381 
    368382    def _svnimg_formatter(self, match, fullmatch):