Skip to content

Commit

Permalink
Merge pull request #7 from elia/toc-from-headings
Browse files Browse the repository at this point in the history
Toc from headings
  • Loading branch information
avdgaag committed May 26, 2012
2 parents 79b7e78 + cd84cd1 commit 16db19e
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 16 deletions.
5 changes: 5 additions & 0 deletions lib/rpub/chapter.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -17,6 +17,11 @@ def initialize(content, number, layout)
@content, @number, @layout = content, number, layout @content, @number, @layout = content, number, layout
@document = Kramdown::Document.new(content, KRAMDOWN_OPTIONS.merge(:template => layout)) @document = Kramdown::Document.new(content, KRAMDOWN_OPTIONS.merge(:template => layout))
end end

# @return [Kramdown::Element] Toc elements hierarchy
def toc
Kramdown::Converter::Toc.convert(@document.root).first
end


# @return [String] Unique identifier for this chapter. # @return [String] Unique identifier for this chapter.
def uid def uid
Expand Down
19 changes: 9 additions & 10 deletions lib/rpub/epub/toc.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@ def render
xml.ncx :xmlns => 'http://www.daisy.org/z3986/2005/ncx/', :version => '2005-1' do xml.ncx :xmlns => 'http://www.daisy.org/z3986/2005/ncx/', :version => '2005-1' do
xml.head do xml.head do
xml.meta :name => 'dtb:uid', :content => book.uid xml.meta :name => 'dtb:uid', :content => book.uid
xml.meta :name => 'dtb:depth', :content => '1' xml.meta :name => 'dtb:depth', :content => @max_level
xml.meta :name => 'dtb:totalPageCount', :content => '0' xml.meta :name => 'dtb:totalPageCount', :content => '0'
xml.meta :name => 'dtb:maxPageNumber', :content => '0' xml.meta :name => 'dtb:maxPageNumber', :content => '0'
end end
xml.docTitle { xml.text book.title } xml.docTitle { xml.text book.title }
xml.navMap do xml.navMap do
book.chapters.each do |chapter| book.chapters.each do |chapter|
nav_points_nested_by_level chapter nav_points_nested_by_level chapter.toc, chapter.filename
end end
end end
end end
Expand All @@ -35,13 +35,13 @@ def next_play_order
@play_order += 1 @play_order += 1
end end


def nav_points_nested_by_level(chapter, level = 1, start = nil) def nav_points_nested_by_level(heading, filename, level = 1)
chapter.outline.each_with_index do |heading, i| heading.children.each do |heading|
next if start && i < start html_id = heading.attr[:id]
break unless heading.level == level source = filename+'#'+html_id
nav_point chapter.xml_id + '-' + heading.html_id, next_play_order, heading.text, chapter.filename + '#' + heading.html_id do nav_point html_id, next_play_order, heading.value.options[:raw_text], source do
if level < @max_level if level <= @max_level
nav_points_nested_by_level chapter, level + 1, i + 1 nav_points_nested_by_level heading, filename, level + 1
end end
end end
end end
Expand All @@ -57,4 +57,3 @@ def nav_point(id, play_order, text, filename)
end end
end end
end end

13 changes: 7 additions & 6 deletions spec/rpub/epub/toc_spec.rb
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@


it { should have_xpath('/xmlns:ncx') } it { should have_xpath('/xmlns:ncx') }
it { should have_xpath('/xmlns:ncx/xmlns:head/xmlns:meta[@name="dtb:uid"][@content="foo"]') } it { should have_xpath('/xmlns:ncx/xmlns:head/xmlns:meta[@name="dtb:uid"][@content="foo"]') }
it { should have_xpath('/xmlns:ncx/xmlns:head/xmlns:meta[@name="dtb:depth"][@content="1"]') } it { should have_xpath('/xmlns:ncx/xmlns:head/xmlns:meta[@name="dtb:depth"][@content="2"]') }
it { should have_xpath('/xmlns:ncx/xmlns:head/xmlns:meta[@name="dtb:totalPageCount"][@content="0"]') } it { should have_xpath('/xmlns:ncx/xmlns:head/xmlns:meta[@name="dtb:totalPageCount"][@content="0"]') }
it { should have_xpath('/xmlns:ncx/xmlns:head/xmlns:meta[@name="dtb:maxPageNumber"][@content="0"]') } it { should have_xpath('/xmlns:ncx/xmlns:head/xmlns:meta[@name="dtb:maxPageNumber"][@content="0"]') }
it { should have_xpath('/xmlns:ncx/xmlns:docTitle/xmlns:text[text()="title"]') } it { should have_xpath('/xmlns:ncx/xmlns:docTitle/xmlns:text[text()="title"]') }
Expand All @@ -17,13 +17,14 @@
end end


context 'with chapters' do context 'with chapters' do
let(:heading1) { double('heading', :level => 1, :text => 'chapter title', :html_id => 'foo') } let(:heading1) { double('heading', :children => [heading2], :value => double('value', :options => {:raw_text => 'chapter title' }), :attr => {:id => 'foo'}) }
let(:heading2) { double('heading', :level => 2, :text => 'chapter title 2', :html_id => 'bar') } let(:heading2) { double('heading', :children => [], :value => double('value', :options => {:raw_text => 'chapter title 2'}), :attr => {:id => 'bar'}) }
let(:chapters) { [double('chapter', :title => 'chapter title', :filename => 'filename', :xml_id => 'id', :outline => [heading1, heading2])] } let(:toc) { double('toc', :children => [heading1])}
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint[@id="id-foo"]') } let(:chapters) { [double('chapter', :title => 'chapter title', :filename => 'filename', :xml_id => 'id', :toc => toc)] }
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint[@id="foo"]') }
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:navLabel/xmlns:text[text()="chapter title"]') } it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:navLabel/xmlns:text[text()="chapter title"]') }
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:content[@src="filename#foo"]') } it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:content[@src="filename#foo"]') }
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:navPoint[@id="id-bar"]') } it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:navPoint[@id="bar"]') }
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:navPoint/xmlns:navLabel/xmlns:text[text()="chapter title 2"]') } it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:navPoint/xmlns:navLabel/xmlns:text[text()="chapter title 2"]') }
it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:navPoint/xmlns:content[@src="filename#bar"]') } it { should have_xpath('/xmlns:ncx/xmlns:navMap/xmlns:navPoint/xmlns:navPoint/xmlns:content[@src="filename#bar"]') }
end end
Expand Down

0 comments on commit 16db19e

Please sign in to comment.