Skip to content

Commit

Permalink
Showing 2 changed files with 75 additions and 4 deletions.
42 changes: 38 additions & 4 deletions lib/govspeak/header_extractor.rb
Original file line number Diff line number Diff line change
@@ -3,11 +3,45 @@ module Govspeak

class HeaderExtractor < Kramdown::Converter::Base
def convert(doc)
doc.root.children.map do |el|
headers = []

doc.root.children.each do |el|
if el.type == :header
Header.new(el.options[:raw_text], el.options[:level], generate_id(el.options[:raw_text]))
headers << build_header(el)
next
end

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

headers.flatten.compact
end

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

def build_header(el)
Header.new(el.options[:raw_text], el.options[:level], id(el))
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.size > 0
headers << find_headers(child)
end
end
end.compact
end

headers
end
end
end
end
37 changes: 37 additions & 0 deletions test/govspeak_test.rb
Original file line number Diff line number Diff line change
@@ -56,6 +56,43 @@ class GovspeakTest < Minitest::Test
], document.headers
end

test "extracts headers when nested inside blocks" do
document = Govspeak::Document.new %{
# First title
<div markdown="1">
## Nested subtitle
</div>
<div>
<div markdown="1">
### Double nested subtitle
</div>
<div markdown="1">
### Second double subtitle
</div>
</div>
}
assert_equal [
Govspeak::Header.new('First title', 1, 'first-title'),
Govspeak::Header.new('Nested subtitle', 2, 'nested-subtitle'),
Govspeak::Header.new('Double nested subtitle', 3, 'double-nested-subtitle'),
Govspeak::Header.new('Second double subtitle', 3, 'second-double-subtitle')
], document.headers
end

test "extracts headers with explicitly specified ids" do
document = Govspeak::Document.new %{
# First title
## Second title {#special}
}
assert_equal [
Govspeak::Header.new('First title', 1, 'first-title'),
Govspeak::Header.new('Second title', 2, 'special'),
], document.headers
end

test "extracts text with no HTML and normalised spacing" do
input = "# foo\n\nbar baz "
doc = Govspeak::Document.new(input)

0 comments on commit 7763937

Please sign in to comment.