Class: HTML::Pipeline::TableOfContentsFilter
- Defined in:
- lib/html/pipeline/toc_filter.rb
Overview
HTML filter that adds an 'id' attribute to all headers in a document, so they can be accessed from a table of contents.
Generates the Table of Contents, with links to each header.
Examples
TocPipeline = HTML::Pipeline.new [ HTML::Pipeline::TableOfContentsFilter ]
=> #HTML::Pipeline:0x007fc13c4528d8...
orig = %(
Ice cube
is not for the pop chart
)=> "Ice cube
is not for the pop chart
"result = {}
=> {}
TocPipeline.call(orig, {}, result)
=> ...
=> "<ul class="section-nav">\n
- "
result.to_s
=> "\n<a id="ice-cube" class="anchor" href="#ice-cube">..."
Constant Summary collapse
- PUNCTUATION_REGEXP =
RUBY_VERSION > "1.9" ? /[^\p{Word}\- ]/u : /[^\w\- ]/
Instance Attribute Summary
Attributes inherited from Filter
Instance Method Summary collapse
Methods inherited from Filter
#base_url, call, #current_user, #doc, #has_ancestor?, #html, #initialize, #needs, #parse_html, #repository, #search_text_nodes, to_document, to_html, #validate
Constructor Details
This class inherits a constructor from HTML::Pipeline::Filter
Instance Method Details
#call ⇒ Object
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/html/pipeline/toc_filter.rb', line 28 def call result[:toc] = "" headers = Hash.new(0) doc.css('h1, h2, h3, h4, h5, h6').each do |node| text = node.text id = text.downcase id.gsub!(PUNCTUATION_REGEXP, '') # remove punctuation id.gsub!(' ', '-') # replace spaces with dash uniq = (headers[id] > 0) ? "-#{headers[id]}" : '' headers[id] += 1 if header_content = node.children.first result[:toc] << %Q{<li><a href="##{id}#{uniq}">#{text}</a></li>\n} header_content.add_previous_sibling(%Q{<a id="#{id}#{uniq}" class="anchor" href="##{id}#{uniq}" aria-hidden="true"><span class="octicon octicon-link"></span></a>}) end end result[:toc] = %Q{<ul class="section-nav">\n#{result[:toc]}</ul>} unless result[:toc].empty? doc end |