Skip to content

Commit

Permalink
Reimplement toc using Kramdown toc generator
Browse files Browse the repository at this point in the history
  • Loading branch information
elia committed May 26, 2012
1 parent 79b7e78 commit cd84cd1
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
Expand Up @@ -17,6 +17,11 @@ def initialize(content, number, layout)
@content, @number, @layout = content, number, layout
@document = Kramdown::Document.new(content, KRAMDOWN_OPTIONS.merge(:template => layout))
end

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

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

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

13 changes: 7 additions & 6 deletions spec/rpub/epub/toc_spec.rb
Expand Up @@ -7,7 +7,7 @@

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: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:maxPageNumber"][@content="0"]') }
it { should have_xpath('/xmlns:ncx/xmlns:docTitle/xmlns:text[text()="title"]') }
Expand All @@ -17,13 +17,14 @@
end

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

0 comments on commit cd84cd1

Please sign in to comment.