--- trac-0.8.2/trac/Href.py 2005-04-02 22:58:20.000000000 +1000 +++ trac-0.8.2-custom/trac/Href.py 2005-06-04 13:51:03.000000000 +1000 @@ -136,14 +136,18 @@ return href_join(self.base, 'about_trac') def wiki(self, page=None, version=None, diff=0, history=0): + anchor = "" + if page and page.find("#") != -1: + anchor = page[page.find('#'):] + page = page[:page.find('#')] if page and version and diff: - return href_join(self.base, 'wiki', page) + '?version=' + str(version) + '&diff=yes' + return href_join(self.base, 'wiki', page) + '?version=' + str(version) + '&diff=yes' + anchor elif page and version: - return href_join(self.base, 'wiki', page) + '?version=' + str(version) + return href_join(self.base, 'wiki', page) + '?version=' + str(version) + anchor elif page and history: - return href_join(self.base, 'wiki', page) + '?history=yes' + return href_join(self.base, 'wiki', page) + '?history=yes' + anchor elif page: - return href_join(self.base, 'wiki', page) + return href_join(self.base, 'wiki', page) + anchor else: return href_join(self.base, 'wiki') --- trac-0.8.2/trac/WikiFormatter.py 2005-03-19 02:43:26.000000000 +1100 +++ trac-0.8.2-custom/trac/WikiFormatter.py 2005-06-04 14:00:02.000000000 +1000 @@ -45,7 +45,7 @@ r"""(?P!?\[\d+\])""", r"""(?P!?\{\d+\})""", r"""(?P!?((?Pbug|ticket|browser|source|repos|report|changeset|wiki|milestone|search):(?P("(.*?)"|'(.*?)')|([^ ]*[^'~_\., \)]))))""", - r"""(?P!?(^|(?<=[^A-Za-z]))[A-Z][a-z]+(?:[A-Z][a-z]*[a-z/])+(?=\Z|\s|[.,;:!?\)}\]]))""", + r"""(?P!?(^|(?<=[^A-Za-z]))[A-Z][a-z]+(?:[A-Z][a-z]*[a-z/])+(?:#[A-Za-z0-9]+)?(?=\Z|\s|[.,;:!?\)}\]]))""", r"""(?P!?\[(?P([a-z]+:[^ ]+)) (?P.*?)\])"""] _open_tags = [] @@ -162,7 +162,9 @@ else: return self._href.ticket(args), '%s:%s' % (module, args), 1, '' elif module == 'wiki': - if not self.env._wiki_pages.has_key(args): + page = args + if page.find('#') != -1: page = page[:page.find('#')] + if not self.env._wiki_pages.has_key(page): return self._href.wiki(args), '%s:%s' % (module, args), 1, None else: return self._href.wiki(args), '%s:%s' % (module, args), 0, None @@ -204,7 +206,9 @@ return match def _wikilink_formatter(self, match, fullmatch): - if not self.env._wiki_pages.has_key(match): + page = match + if page.find('#') != -1: page = page[:page.find('#')] + if not self.env._wiki_pages.has_key(page): return '%s?' % \ (self._href.wiki(match), match) else: @@ -269,8 +273,8 @@ _compiled_rules = re.compile('(?:' + string.join(_rules, '|') + ')') _processor_re = re.compile('#\!([a-zA-Z0-9/+-]+)') + _anchor_re = re.compile('\W+', re.LOCALE | re.UNICODE) mime_type = "" - # RE patterns used by other patterna _helper_patterns = ('idepth', 'ldepth', 'hdepth', 'fancyurl', @@ -283,6 +287,10 @@ 'meta|param|doctype)') _htmlproc_disallow_attribute = re.compile('(?i)<[^>]*\s+(on\w+)=') + def __init__(self, hdf, env, db, absurls=0): + CommonFormatter.__init__(self, hdf, env, db, absurls) + self.seen_anchors = [] + def default_processor(hdf, text, env): return '
' + util.escape(text) + '
' def asp_processor(hdf, text, env): @@ -374,7 +382,14 @@ self.close_paragraph() self.close_indentation() self.close_list() - self.out.write('%s' % (depth, match[depth + 1:len(match) - depth - 1], depth)) + heading = match[depth + 1:len(match) - depth - 1] + anchor = default_anchor = self._anchor_re.sub("", heading) + anchor_n = 1 + while anchor in self.seen_anchors: + anchor = default_anchor + str(anchor_n) + anchor_n += 1 + self.seen_anchors.append(anchor) + self.out.write('%s' % (depth, anchor, heading, depth)) return '' def _svnimg_formatter(self, match, fullmatch):