Class: HTML::Pipeline::TableOfContentsFilter

Inherits:
Filter
  • Object
show all
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)

=> ...

result

=> "<ul class="section-nav">\n
  • <a href="#ice-cube">...
    • "

    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

    #context, #result

    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

    #callObject

    
    
    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