]> source.dussan.org Git - redmine.git/commitdiff
Added automatic table of content support on wiki pages, based on h1., h2. and h3...
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 9 Sep 2007 10:16:59 +0000 (10:16 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 9 Sep 2007 10:16:59 +0000 (10:16 +0000)
To display the page TOC, insert a line with this tag:
{{toc}} or {{<toc}} => left aligned toc
{{>toc}} => right aligned toc

git-svn-id: http://redmine.rubyforge.org/svn/trunk@718 e93f8b46-1217-0410-a6f0-8f06a7374b81

lib/redmine/wiki_formatting.rb
public/stylesheets/application.css

index e9f5eb749605730b61b7fde62ea4ac493e37f29c..2d26cabd20e1f0b9019207fdff86b18cc16fba2b 100644 (file)
@@ -7,14 +7,15 @@ module Redmine
   private
   
     class TextileFormatter < RedCloth      
-      RULES = [:inline_auto_link, :inline_auto_mailto, :textile ]
-
+      RULES = [:inline_auto_link, :inline_auto_mailto, :textile, :inline_toc]
+      
       def initialize(*args)
         super
         self.hard_breaks=true
       end
       
       def to_html
+        @toc = []
         super(*RULES).to_s
       end
 
@@ -41,6 +42,32 @@ module Redmine
         end
       end
       
+      # 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]
+        end
+        content = "<a name=\"#{@toc.length}-#{content}\" class=\"wiki-page\"></a>" + content
+        textile_p(tag, atts, cite, content)
+      end
+
+      alias :textile_h1 :textile_p_withtoc
+      alias :textile_h2 :textile_p_withtoc
+      alias :textile_h3 :textile_p_withtoc
+      
+      def inline_toc(text)
+        text.gsub!(/<p>\{\{(<>?)toc\}\}<\/p>/i) do
+          div_class = 'toc'
+          div_class << ' right' if $1 == '>'
+          out = "<div class=\"#{div_class}\">"
+          @toc.each_with_index do |heading, index|
+            out << "<a href=\"##{index+1}-#{heading.last}\" class=\"heading#{heading.first}\">#{heading.last}</a>"
+          end
+          out << '</div>'
+          out
+        end
+      end
+      
       AUTO_LINK_RE = %r{
                         (                          # leading text
                           <\w+.*?>|                # leading HTML tag, or
index 8f4a3ecdb7fa159c80a5f323d32fab6bd32664c3..5b3e70246de737055642917f21ebdcfa47937711 100644 (file)
@@ -619,7 +619,7 @@ div.wiki a {
     background-image: url(../images/external.png);
 }
 
-div.wiki a.wiki-page, div.wiki a.issue, div.wiki a.changeset, div.wiki a.email {
+div.wiki a.wiki-page, div.wiki a.issue, div.wiki a.changeset, div.wiki a.email, div.wiki div.toc a {
     padding-left: 0;
     background-image: none;
 }
@@ -643,6 +643,34 @@ div.wiki pre  {
     border: 1px solid #dadada;
 }
 
+div.wiki div.toc {
+    background-color: #fdfed0;
+    border: 1px solid #dadada;
+    padding: 4px;
+    line-height: 1.1em;
+    margin-bottom: 12px;
+    float: left;
+    margin-right: 12px;
+}
+
+div.wiki div.toc.right {
+    float: right;
+    margin-left: 12px;
+    margin-right: 0;
+}
+
+div.wiki div.toc a {
+    display: block;
+    font-size: 0.9em;
+    font-weight: normal;
+    color: #606060;
+}
+
+div.wiki div.toc a.heading2 { margin-left: 6px; }
+div.wiki div.toc a.heading3 { margin-left: 12px; font-size: 0.8em; }
+
+div.wiki
+
 .diff_out{
   background: #fcc;
 }