Class: HTML::Pipeline::TableOfContentsFilter

Inherits:
Filter
  • Object
show all
Defined in:
lib/html/pipeline/toc_filter.rb

Overview

HTML filter that adds a ‘name’ attribute to all headers in a document, so they can be accessed from a table of contents

TODO: besides adding the name attribute, we should get around to eventually generating the Table of Contents itself, with links to each header

Instance Attribute Summary

Attributes inherited from Filter

#context, #result

Instance Method Summary collapse

Methods inherited from Filter

#base_url, call, #can_access_repo?, #current_user, #doc, #has_ancestor?, #html, #initialize, #needs, #parse_html, #repository, to_document, to_html, #validate

Constructor Details

This class inherits a constructor from HTML::Pipeline::Filter

Instance Method Details

#callObject



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/html/pipeline/toc_filter.rb', line 10

def call
  headers = Hash.new(0)
  doc.css('h1, h2, h3, h4, h5, h6').each do |node|
    name = node.text.downcase
    name.gsub!(/[^\w\- ]/, '') # remove punctuation
    name.gsub!(' ', '-') # replace spaces with dash
    name = EscapeUtils.escape_uri(name) # escape extended UTF-8 chars

    uniq = (headers[name] > 0) ? "-#{headers[name]}" : ''
    headers[name] += 1
    if header_content = node.children.first
      header_content.add_previous_sibling(%Q{<a name="#{name}#{uniq}" class="anchor" href="##{name}#{uniq}"><span class="mini-icon mini-icon-link"></span></a>})
    end
  end
  doc
end