build_toc

in jekyll/plugins/toc_builder_hook.rb [13:48]


  def build_toc(site, toc_input)

    toc = []
    content = File.read(File.join(site.source, toc_input))
    kramdown_config = site.config['kramdown'].merge({:html_to_native => true})
    kramdown_doc = Kramdown::Document.new(content, kramdown_config)

    parent_id = nil
    kramdown_doc.root.children.each do |c|
      item = extract_from_node(c, parent_id)
      if not item.nil? then
        toc.concat(item)
        parent_id = item[0][:id] if item[0][:type] == :header
      end
    end

    
    delete_list = []
    (0).upto(toc.length-1) do |i|
      item = toc[i]
      prev = toc[i-1] != nil ? toc[i-1] : nil
      item_is_header = (item[:type] != nil and item[:type] == :header)
      prev_is_header = (prev != nil and prev[:type] != nil and prev[:type] == :header)

      if item_is_header and prev_is_header
        delete_list.push(i-1)
      end
    end

    delete_list.each do |del_index|
      toc.delete_at(del_index)
    end

    toc
  end