Added automatic table of content support on wiki pages, based on h1., h2. and h3. headings.
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
This commit is contained in:
parent
7d899166c6
commit
f3364b9dce
|
@ -7,14 +7,15 @@ module Redmine
|
||||||
private
|
private
|
||||||
|
|
||||||
class TextileFormatter < RedCloth
|
class TextileFormatter < RedCloth
|
||||||
RULES = [:inline_auto_link, :inline_auto_mailto, :textile ]
|
RULES = [:inline_auto_link, :inline_auto_mailto, :textile, :inline_toc]
|
||||||
|
|
||||||
def initialize(*args)
|
def initialize(*args)
|
||||||
super
|
super
|
||||||
self.hard_breaks=true
|
self.hard_breaks=true
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_html
|
def to_html
|
||||||
|
@toc = []
|
||||||
super(*RULES).to_s
|
super(*RULES).to_s
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -41,6 +42,32 @@ module Redmine
|
||||||
end
|
end
|
||||||
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{
|
AUTO_LINK_RE = %r{
|
||||||
( # leading text
|
( # leading text
|
||||||
<\w+.*?>| # leading HTML tag, or
|
<\w+.*?>| # leading HTML tag, or
|
||||||
|
|
|
@ -619,7 +619,7 @@ div.wiki a {
|
||||||
background-image: url(../images/external.png);
|
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;
|
padding-left: 0;
|
||||||
background-image: none;
|
background-image: none;
|
||||||
}
|
}
|
||||||
|
@ -643,6 +643,34 @@ div.wiki pre {
|
||||||
border: 1px solid #dadada;
|
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{
|
.diff_out{
|
||||||
background: #fcc;
|
background: #fcc;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue