--- OldHref.py	2004-12-21 13:46:38.071281581 +0000
+++ Href.py	2004-12-21 13:45:14.003700116 +0000
@@ -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')
 
--- OldWikiFormatter.py	2004-12-21 13:09:45.520440206 +0000
+++ WikiFormatter.py	2004-12-21 13:41:19.469135597 +0000
@@ -45,7 +45,7 @@
               r"""(?P<changesethref>!?\[\d+\])""",
               r"""(?P<reporthref>!?\{\d+\})""",
               r"""(?P<modulehref>!?((?P<modulename>bug|ticket|browser|source|repos|report|changeset|wiki|milestone|search):(?P<moduleargs>(&#34;(.*?)&#34;|'(.*?)')|([^ ]*[^'~_\., \)]))))""",
-              r"""(?P<wikilink>!?(^|(?<=[^A-Za-z]))[A-Z][a-z]+(?:[A-Z][a-z]*[a-z/])+(?=\Z|\s|[.,;:!?\)}\]]))""",
+              r"""(?P<wikilink>!?(^|(?<=[^A-Za-z]))[A-Z][a-z]+(?:[A-Z][a-z]*[a-z/])+(?:#[A-Za-z0-9]+)?(?=\Z|\s|[.,;:!?\)}\]]))""",
               r"""(?P<fancylink>!?\[(?P<fancyurl>([a-z]+:[^ ]+)) (?P<linkname>.*?)\])"""]
 
     _open_tags = []
@@ -162,6 +162,8 @@
             else:
                 return self._href.ticket(args), '%s:%s' % (module, args), 1, ''
         elif module == 'wiki':
+            page = args
+            if page.find('#') != -1: page = page[:page.find('#')]
             if not self.env._wiki_pages.has_key(args):
                 return self._href.wiki(args), '%s:%s' % (module, args), 1, None
             else:
@@ -205,6 +207,8 @@
 
     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('#')]
             return '<a class="missing" href="%s">%s?</a>' % \
                    (self._href.wiki(match), match)
         else:
@@ -269,8 +273,9 @@
 
     _compiled_rules = re.compile('(?:' + string.join(_rules, '|') + ')')
     _processor_re = re.compile('#\!([a-zA-Z0-9/+-]+)')
+    _anchor_re = re.compile('[^\w\d]+')
     mime_type = ""
-    
+    fragments = []    
 
     # RE patterns used by other patterna
     _helper_patterns = ('idepth', 'ldepth', 'hdepth', 'fancyurl',
@@ -362,7 +367,16 @@
         self.close_paragraph()
         self.close_indentation()
         self.close_list()
-        self.out.write('<h%d>%s</h%d>' % (depth, match[depth + 1:len(match) - depth - 1], depth))
+        
+        txt = match[depth + 1:len(match) - depth - 1]
+        simplefrag = frag = txt.lower().replace(' ', '-')
+        i = 0
+        while frag in self.fragments:
+            frag = simplefrag + '-' + str(i)
+            i += 1
+        self.fragments.append(frag)
+        
+        self.out.write('<h%d id="%s">%s</h%d>' % (depth, frag, txt, depth))
         return ''
 
     def _svnimg_formatter(self, match, fullmatch):

