class DaimonMarkdown::Plugin::TableOfContents

Public Instance Methods

call(limit = nil) click to toggle source
# File lib/daimon_markdown/plugin/toc.rb, line 6
def call(limit = nil)
  toc_html = ""
  toc_class = context[:toc_class] || "section-nav"

  ul_list = Hash.new {|h, k| h[k] = UnorderedList.new }
  ul_list[1] = UnorderedList.new(html_class: toc_class)
  previous_level = 1
  doc.css("h1, h2, h3, h4, h5, h6").each do |header_node|
    header = Header.new(header_node)
    next if limit && limit < header.level
    next unless header.content?
    header.unique_id = generate_unique_id(header.text)
    if header.level - previous_level > 0
      (previous_level + 1).upto(header.level) do |level|
        ul_list[level - 1] << ul_list[level]
      end
    end
    ul_list[header.level] << ListItem.new(header: header)
    previous_level = header.level
  end

  unless ul_list[1].items.empty?
    toc_header = context[:toc_header] || ""
    toc_html = "#{toc_header}#{ul_list[1].to_html}"
  end
  node.parent.replace(toc_html)
end

Private Instance Methods

generate_unique_id(text) click to toggle source
# File lib/daimon_markdown/plugin/toc.rb, line 36
def generate_unique_id(text)
  @headers ||= Hash.new(0)
  id = text.downcase
  id.tr!(" ", "-")
  id.gsub!(/\s/, "")

  unique_id =
    if @headers[id] > 0
      "#{id}-#{@headers[id]}"
    else
      id
    end
  @headers[id] += 1
  unique_id
end