Sha256: 6d19e367dc63ee7b82f4993b2fe85b70091175707d022439ef11a1def73cecd7

Contents?: true

Size: 1.04 KB

Versions: 13

Compression:

Stored size: 1.04 KB

Contents

module Govspeak
  Header = Struct.new(:text, :level, :id)

  class HeaderExtractor < Kramdown::Converter::Base
    def convert(doc)
      headers = []

      doc.root.children.each do |el|
        if el.type == :header
          headers << build_header(el)
          next
        end

        headers << find_headers(el) if el.type == :html_element
      end

      headers.flatten.compact
    end

  private

    def id(element)
      element.attr.fetch('id', generate_id(element.options[:raw_text]))
    end

    def build_header(element)
      Header.new(element.options[:raw_text], element.options[:level], id(element))
    end

    def find_headers(parent)
      headers = []

      if parent.type == :header
        headers << build_header(parent)
      elsif parent.type == :html_element
        parent.children.each do |child|
          if child.type == :header
            headers << build_header(child)
          elsif !child.children.empty?
            headers << find_headers(child)
          end
        end
      end

      headers
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
govspeak-6.5.0 lib/govspeak/header_extractor.rb
govspeak-6.4.0 lib/govspeak/header_extractor.rb
govspeak-6.3.0 lib/govspeak/header_extractor.rb
govspeak-6.2.1 lib/govspeak/header_extractor.rb
govspeak-6.2.0 lib/govspeak/header_extractor.rb
govspeak-6.1.1 lib/govspeak/header_extractor.rb
govspeak-6.1.0 lib/govspeak/header_extractor.rb
govspeak-6.0.0 lib/govspeak/header_extractor.rb
govspeak-5.9.1 lib/govspeak/header_extractor.rb
govspeak-5.9.0 lib/govspeak/header_extractor.rb
govspeak-5.8.0 lib/govspeak/header_extractor.rb
govspeak-5.7.1 lib/govspeak/header_extractor.rb
govspeak-5.7.0 lib/govspeak/header_extractor.rb