github.com/shyftnetwork/go-empyrean@v1.8.3-0.20191127201940-fbfca9338f04/shyft_documentation/lib/toc_data.rb (about)

     1  require 'nokogiri'
     2  
     3  def toc_data(page_content)
     4    html_doc = Nokogiri::HTML::DocumentFragment.parse(page_content)
     5  
     6    # get a flat list of headers
     7    headers = []
     8    html_doc.css('h1, h2, h3').each do |header|
     9      headers.push({
    10        id: header.attribute('id').to_s,
    11        content: header.children,
    12        level: header.name[1].to_i,
    13        children: []
    14      })
    15    end
    16  
    17    [3,2].each do |header_level|
    18      header_to_nest = nil
    19      headers = headers.reject do |header|
    20        if header[:level] == header_level
    21          header_to_nest[:children].push header if header_to_nest
    22          true
    23        else
    24          header_to_nest = header if header[:level] < header_level
    25          false
    26        end
    27      end
    28    end
    29    headers
    30  end