OSDN Git Service

Adds Trac-Like anchors on wiki headings (#1647).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Mon, 28 Jul 2008 17:08:16 +0000 (17:08 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Mon, 28 Jul 2008 17:08:16 +0000 (17:08 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1705 e93f8b46-1217-0410-a6f0-8f06a7374b81

lib/redmine/wiki_formatting.rb
public/stylesheets/application.css
test/unit/helpers/application_helper_test.rb

index 11ec680..8c18d54 100644 (file)
@@ -65,10 +65,22 @@ module Redmine
       
       # Patch to add 'table of content' support to RedCloth
       def textile_p_withtoc(tag, atts, cite, content)
-        if tag =~ /^h(\d)$/
-          @toc << [$1.to_i, content]
+        # removes wiki links from the item
+        toc_item = content.gsub(/(\[\[|\]\])/, '')
+        # removes styles
+        # eg. %{color:red}Triggers% => Triggers
+        toc_item.gsub! %r[%\{[^\}]*\}([^%]+)%], '\\1'
+        
+        # replaces non word caracters by dashes
+        anchor = toc_item.gsub(%r{[^\w\s\-]}, '').gsub(%r{\s+(\-+\s*)?}, '-')
+
+        unless anchor.blank?
+          if tag =~ /^h(\d)$/
+            @toc << [$1.to_i, anchor, toc_item]
+          end
+          atts << " id=\"#{anchor}\""
+          content = content + "<a href=\"##{anchor}\" class=\"wiki-anchor\">&para;</a>"
         end
-        content = "<a name=\"#{@toc.length}\" class=\"wiki-page\"></a>" + content
         textile_p(tag, atts, cite, content)
       end
 
@@ -82,13 +94,9 @@ module Redmine
           div_class << ' right' if $1 == '>'
           div_class << ' left' if $1 == '<'
           out = "<ul class=\"#{div_class}\">"
-          @toc.each_with_index do |heading, index|
-            # remove wiki links from the item
-            toc_item = heading.last.gsub(/(\[\[|\]\])/, '')
-            # remove styles
-            # eg. %{color:red}Triggers% => Triggers
-            toc_item.gsub! %r[%\{[^\}]*\}([^%]+)%], '\\1'
-            out << "<li class=\"heading#{heading.first}\"><a href=\"##{index+1}\">#{toc_item}</a></li>\n"
+          @toc.each do |heading|
+            level, anchor, toc_item = heading
+            out << "<li class=\"heading#{level}\"><a href=\"##{anchor}\">#{toc_item}</a></li>\n"
           end
           out << '</ul>'
           out
index 9ae4d15..c7e9284 100644 (file)
@@ -487,6 +487,10 @@ div.wiki ul.toc a {
 }
 div.wiki ul.toc a:hover { color: #c61a1a; text-decoration: underline;}
 
+a.wiki-anchor { display: none; margin-left: 6px; text-decoration: none; }
+a.wiki-anchor:hover { color: #aaa !important; text-decoration: none; }
+h1:hover a.wiki-anchor, h2:hover a.wiki-anchor, h3:hover a.wiki-anchor { display: inline; color: #ddd; }
+
 /***** My page layout *****/
 .block-receiver {
 border:1px dashed #c0c0c0;
index eea4a83..71ef572 100644 (file)
@@ -215,10 +215,10 @@ h1. Another title
 RAW
 
     expected = '<ul class="toc">' +
-               '<li class="heading1"><a href="#1">Title</a></li>' +
-               '<li class="heading2"><a href="#2">Subtitle</a></li>' + 
-               '<li class="heading2"><a href="#3">Subtitle with red text</a></li>' +
-               '<li class="heading1"><a href="#4">Another title</a></li>' +
+               '<li class="heading1"><a href="#Title">Title</a></li>' +
+               '<li class="heading2"><a href="#Subtitle">Subtitle</a></li>' + 
+               '<li class="heading2"><a href="#Subtitle-with-red-text">Subtitle with red text</a></li>' +
+               '<li class="heading1"><a href="#Another-title">Another title</a></li>' +
                '</ul>'
                
     assert textilizable(raw).gsub("\n", "").include?(expected)