eeepub 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 jugyo
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,15 @@
1
+ = EeePub
2
+
3
+ EeePub is a Ruby ePub generator.
4
+
5
+ == Install
6
+
7
+ gem install eeepub
8
+
9
+ == Usage
10
+
11
+ Show examples: http://github.com/jugyo/EeePub/tree/master/examples/
12
+
13
+ == Copyright
14
+
15
+ Copyright (c) 2010 jugyo. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,48 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "eeepub"
8
+ gem.summary = %Q{ePub generator}
9
+ gem.description = %Q{EeePub is a Ruby ePub generator.}
10
+ gem.email = "jugyo.org@gmail.com"
11
+ gem.homepage = "http://github.com/jugyo/eeepub"
12
+ gem.authors = ["jugyo"]
13
+ gem.add_development_dependency "rspec"
14
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
+ end
16
+ rescue LoadError
17
+ puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
18
+ end
19
+
20
+ require 'spec/rake/spectask'
21
+ Spec::Rake::SpecTask.new(:spec) do |spec|
22
+ spec.libs << 'lib' << 'spec'
23
+ spec.spec_files = FileList['spec/**/*_spec.rb']
24
+ end
25
+
26
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
27
+ spec.libs << 'lib' << 'spec'
28
+ spec.pattern = 'spec/**/*_spec.rb'
29
+ spec.rcov = true
30
+ end
31
+
32
+ task :spec => :check_dependencies
33
+
34
+ task :default => :spec
35
+
36
+ require 'rake/rdoctask'
37
+ Rake::RDocTask.new do |rdoc|
38
+ if File.exist?('VERSION')
39
+ version = File.read('VERSION')
40
+ else
41
+ version = ""
42
+ end
43
+
44
+ rdoc.rdoc_dir = 'rdoc'
45
+ rdoc.title = "eeepub #{version}"
46
+ rdoc.rdoc_files.include('README*')
47
+ rdoc.rdoc_files.include('lib/**/*.rb')
48
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
@@ -0,0 +1,61 @@
1
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
2
+ require 'rubygems'
3
+ require 'eeepub'
4
+ require 'fileutils'
5
+
6
+ dir = 'simple'
7
+ FileUtils.rm_rf(dir)
8
+ FileUtils.mkdir(dir)
9
+
10
+ epub_name = 'simple.epub'
11
+ FileUtils.rm_f(epub_name)
12
+
13
+ # Create sample html
14
+ ['foo', 'bar'].each do |name|
15
+ File.open(File.join(dir, "#{name}.html"), 'w') do |f|
16
+ f << <<-HTML
17
+ <?xml version="1.0" encoding="UTF-8"?>
18
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
19
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
20
+ <body>
21
+ <h1>#{name}</h1>
22
+ </body>
23
+ </html>
24
+ HTML
25
+ end
26
+ end
27
+
28
+ # Create NCX
29
+ EeePub::NCX.new(
30
+ :uid => 'xxxx', :doc_title => 'simple',
31
+ :nav_points => [
32
+ {:id => 'nav-1', :play_order => '1', :label => '1. foo', :content => 'foo.html'},
33
+ {:id => 'nav-2', :play_order => '2', :label => '2. bar', :content => 'bar.html'}
34
+ ]
35
+ ).save(File.join(dir, 'toc.ncx'))
36
+
37
+ # Create OPF
38
+ EeePub::OPF.new(
39
+ :title => 'simple',
40
+ :language => 'ja',
41
+ :identifier => 'xxxxxxx',
42
+ :items => [
43
+ {:id => 'ncx', :href => 'toc.ncx', :media_type => 'text/xml'},
44
+ {:id => 'foo', :href => 'foo.html', :media_type => 'text/html'},
45
+ {:id => 'bar', :href => 'bar.html', :media_type => 'text/html'},
46
+ ],
47
+ :itemrefs => [
48
+ {:idref => 'foo'},
49
+ {:idref => 'bar'}
50
+ ]
51
+ ).save(File.join(dir, 'package.opf'))
52
+
53
+ # Create OCF
54
+ EeePub::OCF.new(
55
+ :dir => dir,
56
+ :container => EeePub::OCF::Container.new(
57
+ :rootfiles => [
58
+ {:full_path => 'package.opf', :media_type => 'application/oebps-package+xml'}
59
+ ]
60
+ )
61
+ ).make(epub_name)
@@ -0,0 +1,45 @@
1
+ require 'erb'
2
+
3
+ module EeePub
4
+ class ContainerItem
5
+ include ERB::Util
6
+
7
+ TEMPLATE_DIR = File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
8
+
9
+ class << self
10
+ attr_reader :template_name
11
+
12
+ def template(name)
13
+ @template_name = name
14
+ end
15
+ end
16
+
17
+ def initialize(values)
18
+ set_values(values)
19
+ end
20
+
21
+ def set_values(values)
22
+ values.each do |k, v|
23
+ self.send(:"#{k}=", v)
24
+ end
25
+ end
26
+
27
+ def to_xml
28
+ erb(self.class.template_name).result(binding)
29
+ end
30
+
31
+ def erb(filename)
32
+ ERB.new(
33
+ File.read(File.join(TEMPLATE_DIR, filename)),
34
+ nil,
35
+ '-'
36
+ )
37
+ end
38
+
39
+ def save(filepath)
40
+ File.open(filepath, 'w') do |file|
41
+ file << self.to_xml
42
+ end
43
+ end
44
+ end
45
+ end
data/lib/eeepub/ncx.rb ADDED
@@ -0,0 +1,18 @@
1
+ module EeePub
2
+ class NCX < ContainerItem
3
+ template 'ncx.erb'
4
+ attr_accessor :uid,
5
+ :depth,
6
+ :total_page_count,
7
+ :max_page_number,
8
+ :doc_title,
9
+ :nav_points
10
+
11
+ def set_values(values)
12
+ super
13
+ @depth ||= 1
14
+ @total_page_count ||= 0
15
+ @max_page_number ||= 0
16
+ end
17
+ end
18
+ end
data/lib/eeepub/ocf.rb ADDED
@@ -0,0 +1,34 @@
1
+ module EeePub
2
+ class OCF
3
+ class Container < ContainerItem
4
+ template 'container.xml.erb'
5
+ attr_accessor :rootfiles
6
+ end
7
+
8
+ attr_accessor :dir, :container
9
+
10
+ def initialize(values)
11
+ values.each do |k, v|
12
+ self.send(:"#{k}=", v)
13
+ end
14
+ end
15
+
16
+ def make(output_path)
17
+ output_path = File.expand_path(output_path)
18
+
19
+ FileUtils.chdir(dir) do
20
+ File.open('mimetype', 'w') do |f|
21
+ f << 'application/epub+zip'
22
+ end
23
+
24
+ meta_inf = 'META-INF'
25
+ FileUtils.mkdir_p(meta_inf)
26
+
27
+ container.save(File.join(meta_inf, 'container.xml'))
28
+
29
+ %x(zip -X9 \"#{output_path}\" mimetype)
30
+ %x(zip -Xr9D \"#{output_path}\" * -xi mimetype)
31
+ end
32
+ end
33
+ end
34
+ end
data/lib/eeepub/opf.rb ADDED
@@ -0,0 +1,17 @@
1
+ module EeePub
2
+ class OPF < ContainerItem
3
+ template 'opf.erb'
4
+ attr_accessor :title,
5
+ :language,
6
+ :identifier,
7
+ :date,
8
+ :subject,
9
+ :description,
10
+ :relation,
11
+ :creator,
12
+ :publisher,
13
+ :rights,
14
+ :items,
15
+ :itemrefs
16
+ end
17
+ end
@@ -0,0 +1,8 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <container xmlns="urn:oasis:names:tc:opendocument:xmlns:container" version="1.0">
3
+ <rootfiles>
4
+ <%- rootfiles.each do |rootfile| -%>
5
+ <rootfile full-path="<%=h rootfile[:full_path] %>" media-type="<%=h rootfile[:media_type] %>"/>
6
+ <%- end -%>
7
+ </rootfiles>
8
+ </container>
@@ -0,0 +1,22 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">
3
+ <head>
4
+ <meta name="dtb:uid" content="<%=h uid %>"/>
5
+ <meta name="dtb:depth" content="<%=h depth %>"/>
6
+ <meta name="dtb:totalPageCount" content="<%=h total_page_count %>"/>
7
+ <meta name="dtb:maxPageNumber" content="<%=h max_page_number %>"/>
8
+ </head>
9
+ <docTitle>
10
+ <text><%=h doc_title %></text>
11
+ </docTitle>
12
+ <navMap>
13
+ <%- nav_points.each do |nav| -%>
14
+ <navPoint id="<%=h nav[:id] %>" playOrder="<%=h nav[:play_order] %>">
15
+ <navLabel>
16
+ <text><%=h nav[:label] %></text>
17
+ </navLabel>
18
+ <content src="<%=h nav[:content] %>"/>
19
+ </navPoint>
20
+ <%- end -%>
21
+ </navMap>
22
+ </ncx>
@@ -0,0 +1,39 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <package version="2.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId">
3
+ <metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
4
+ <dc:title><%=h title %></dc:title>
5
+ <dc:language><%=h language %></dc:language>
6
+ <dc:identifier id="BookId"><%=h identifier %></dc:identifier>
7
+ <%- if date -%>
8
+ <dc:date><%=h date.to_s %></dc:data>
9
+ <%- end -%>
10
+ <%- if subject -%>
11
+ <dc:subject><%=h subject %></dc:subject>
12
+ <%- end -%>
13
+ <%- if description -%>
14
+ <dc:description><%=h description %></dc:description>
15
+ <%- end -%>
16
+ <%- if relation -%>
17
+ <dc:relation><%=h relation %></dc:relation>
18
+ <%- end -%>
19
+ <%- if creator -%>
20
+ <dc:creator opf:role="aut"><%=h creator %></dc:creator>
21
+ <%- end -%>
22
+ <%- if publisher -%>
23
+ <dc:publisher><%=h publisher %></dc:publisher>
24
+ <%- end -%>
25
+ <%- if rights -%>
26
+ <dc:rights><%=h rights %></dc:rights>
27
+ <%- end -%>
28
+ </metadata>
29
+ <manifest>
30
+ <%- items.each do |item| -%>
31
+ <item id="<%=h item[:id] %>" href="<%=h item[:href] %>" media-type="<%=h item[:media_type] %>" />
32
+ <%- end -%>
33
+ </manifest>
34
+ <spine toc="ncx">
35
+ <%- itemrefs.each do |itemref| -%>
36
+ <itemref idref="<%=h itemref[:idref] %>" />
37
+ <%- end -%>
38
+ </spine>
39
+ </package>
data/lib/eeepub.rb ADDED
@@ -0,0 +1,4 @@
1
+ require 'eeepub/container_item'
2
+ require 'eeepub/opf'
3
+ require 'eeepub/ocf'
4
+ require 'eeepub/ncx'
@@ -0,0 +1,44 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ require 'tmpdir'
4
+ require 'fileutils'
5
+
6
+ describe "EeePub::NCX" do
7
+ before do
8
+ @ncx = EeePub::NCX.new(
9
+ :uid => 'uid', :doc_title => 'title',
10
+ :nav_points => [
11
+ {:id => 'nav-1', :play_order => '1', :label => 'foo', :content => 'foo.html'},
12
+ {:id => 'nav-2', :play_order => '2', :label => 'bar', :content => 'bar.html'}
13
+ ]
14
+ )
15
+ end
16
+
17
+ it 'should set default values' do
18
+ @ncx.depth.should == 1
19
+ @ncx.total_page_count.should == 0
20
+ @ncx.max_page_number.should == 0
21
+ end
22
+
23
+ it 'should make xml' do
24
+ doc = Nokogiri::XML(@ncx.to_xml)
25
+ head = doc.at('head')
26
+ head.should_not be_nil
27
+
28
+ head.at("//xmlns:meta[@name='dtb:uid']")['content'].should == 'uid'
29
+ head.at("//xmlns:meta[@name='dtb:depth']")['content'].should == '1'
30
+ head.at("//xmlns:meta[@name='dtb:totalPageCount']")['content'].should == '0'
31
+ head.at("//xmlns:meta[@name='dtb:maxPageNumber']")['content'].should == '0'
32
+ head.at("//xmlns:docTitle/xmlns:text").inner_text.should == 'title'
33
+
34
+ nav_map = doc.at('navMap')
35
+ nav_map.should_not be_nil
36
+ nav_map.search('navPoint').each_with_index do |nav_point, index|
37
+ expect = @ncx.nav_points[index]
38
+ nav_point.attribute('id').value.should == expect[:id]
39
+ nav_point.attribute('playOrder').value.should == expect[:play_order]
40
+ nav_point.at('navLabel').at('text').inner_text.should == expect[:label]
41
+ nav_point.at('content').attribute('src').value.should == expect[:content]
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,36 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ require 'tmpdir'
4
+ require 'fileutils'
5
+
6
+ describe "EeePub::OCF" do
7
+ before do
8
+ @tmpdir = File.join(Dir.tmpdir, 'eeepub_test')
9
+ FileUtils.mkdir_p(@tmpdir)
10
+ @container = EeePub::OCF::Container.new(
11
+ :rootfiles => [{:full_path => 'foo.opf', :media_type => 'application/oebps-package+xml'}]
12
+ )
13
+ @ocf = EeePub::OCF.new(:dir => @tmpdir, :container => @container)
14
+ end
15
+
16
+ after do
17
+ FileUtils.rm_rf(@tmpdir)
18
+ end
19
+
20
+ it 'should make xml' do
21
+ doc = Nokogiri::XML(@container.to_xml)
22
+ rootfiles = doc.at('rootfiles')
23
+ rootfiles.should_not be_nil
24
+ rootfiles.search('rootfile').each_with_index do |rootfile, index|
25
+ expect = @container.rootfiles[index]
26
+ rootfile.attribute('full-path').value.should == expect[:full_path]
27
+ rootfile.attribute('media-type').value.should == expect[:media_type]
28
+ end
29
+ end
30
+
31
+ it 'should make epub' do
32
+ output_path = File.join(Dir.tmpdir, 'eeepub_test.epub')
33
+ @ocf.make(output_path)
34
+ File.exists?(output_path)
35
+ end
36
+ end
@@ -0,0 +1,96 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
+
3
+ describe "EeePub::OPF" do
4
+ before do
5
+ @opf = EeePub::OPF.new(
6
+ :title => 'title',
7
+ :language => 'ja',
8
+ :identifier => 'id',
9
+ :items => [
10
+ {:id => 'foo', :href => 'foo.html', :media_type => 'text/html'},
11
+ {:id => 'bar', :href => 'bar.html', :media_type => 'text/html'},
12
+ {:id => 'picture', :href => 'picture.png', :media_type => 'image/png'}
13
+ ],
14
+ :itemrefs => [
15
+ {:idref => 'foo'},
16
+ {:idref => 'bar'}
17
+ ]
18
+ )
19
+ end
20
+
21
+ it 'should export as xml' do
22
+ doc = Nokogiri::XML(@opf.to_xml)
23
+ metadata = doc.at('metadata')
24
+ metadata.should_not be_nil
25
+ [
26
+ ['dc:title', @opf.title],
27
+ ['dc:language', @opf.language],
28
+ ['dc:identifier', @opf.identifier],
29
+ ['dc:date', ''],
30
+ ['dc:subject', ''],
31
+ ['dc:description', ''],
32
+ ['dc:relation', ''],
33
+ ['dc:creator', ''],
34
+ ['dc:publisher', ''],
35
+ ['dc:rights', ''],
36
+ ].each do |xpath, expect|
37
+ metadata.xpath(xpath,
38
+ 'xmlns:dc' => "http://purl.org/dc/elements/1.1/").inner_text.should == expect
39
+ end
40
+
41
+ manifest = doc.at('manifest')
42
+ manifest.should_not be_nil
43
+ items = manifest.search('item')
44
+ items.size.should == 3
45
+ items.each_with_index do |item, index|
46
+ expect = @opf.items[index]
47
+ item.attribute('id').value.should == expect[:id]
48
+ item.attribute('href').value.should == expect[:href]
49
+ item.attribute('media-type').value.should == expect[:media_type]
50
+ end
51
+
52
+ spine = doc.at('spine')
53
+ spine.should_not be_nil
54
+ itemrefs = spine.search('itemref')
55
+ itemrefs.size.should == 2
56
+ itemrefs.each_with_index do |itemref, index|
57
+ expect = @opf.itemrefs[index]
58
+ itemref.attribute('idref').value.should == expect[:idref]
59
+ end
60
+ end
61
+
62
+ context 'set all metadata' do
63
+ before do
64
+ @opf.set_values(
65
+ :date => Date.today,
66
+ :subject => 'subject',
67
+ :description => 'description',
68
+ :relation => 'relation',
69
+ :creator => 'creator',
70
+ :publisher => 'publisher',
71
+ :rights => 'rights'
72
+ )
73
+ end
74
+
75
+ it 'should export as xml' do
76
+ doc = Nokogiri::XML(@opf.to_xml)
77
+ metadata = doc.at('metadata')
78
+ metadata.should_not be_nil
79
+ [
80
+ ['dc:title', @opf.title],
81
+ ['dc:language', @opf.language],
82
+ ['dc:identifier', @opf.identifier],
83
+ ['dc:date', @opf.date.to_s],
84
+ ['dc:subject', 'subject'],
85
+ ['dc:description', 'description'],
86
+ ['dc:relation', 'relation'],
87
+ ['dc:creator', 'creator'],
88
+ ['dc:publisher', 'publisher'],
89
+ ['dc:rights', 'rights'],
90
+ ].each do |xpath, expect|
91
+ metadata.xpath(xpath,
92
+ 'xmlns:dc' => "http://purl.org/dc/elements/1.1/").inner_text.should == expect
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,4 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "Epubr" do
4
+ end
@@ -0,0 +1,11 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
+ require 'rubygems'
4
+ require 'eeepub'
5
+ require 'spec'
6
+ require 'spec/autorun'
7
+ require 'nokogiri'
8
+
9
+ Spec::Runner.configure do |config|
10
+
11
+ end
metadata ADDED
@@ -0,0 +1,96 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: eeepub
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ - 0
9
+ version: 0.1.0
10
+ platform: ruby
11
+ authors:
12
+ - jugyo
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-05-02 00:00:00 +09:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: rspec
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ">="
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 0
29
+ version: "0"
30
+ type: :development
31
+ version_requirements: *id001
32
+ description: EeePub is a Ruby ePub generator.
33
+ email: jugyo.org@gmail.com
34
+ executables: []
35
+
36
+ extensions: []
37
+
38
+ extra_rdoc_files:
39
+ - LICENSE
40
+ - README.rdoc
41
+ files:
42
+ - LICENSE
43
+ - README.rdoc
44
+ - Rakefile
45
+ - VERSION
46
+ - examples/simple.rb
47
+ - lib/eeepub.rb
48
+ - lib/eeepub/container_item.rb
49
+ - lib/eeepub/ncx.rb
50
+ - lib/eeepub/ocf.rb
51
+ - lib/eeepub/opf.rb
52
+ - lib/eeepub/templates/container.xml.erb
53
+ - lib/eeepub/templates/ncx.erb
54
+ - lib/eeepub/templates/opf.erb
55
+ - spec/eeepub/ncx_spec.rb
56
+ - spec/eeepub/ocf_spec.rb
57
+ - spec/eeepub/opf_spec.rb
58
+ - spec/eeepub_spec.rb
59
+ - spec/spec_helper.rb
60
+ has_rdoc: true
61
+ homepage: http://github.com/jugyo/eeepub
62
+ licenses: []
63
+
64
+ post_install_message:
65
+ rdoc_options:
66
+ - --charset=UTF-8
67
+ require_paths:
68
+ - lib
69
+ required_ruby_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - ">="
72
+ - !ruby/object:Gem::Version
73
+ segments:
74
+ - 0
75
+ version: "0"
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ segments:
81
+ - 0
82
+ version: "0"
83
+ requirements: []
84
+
85
+ rubyforge_project:
86
+ rubygems_version: 1.3.6
87
+ signing_key:
88
+ specification_version: 3
89
+ summary: ePub generator
90
+ test_files:
91
+ - spec/eeepub/ncx_spec.rb
92
+ - spec/eeepub/ocf_spec.rb
93
+ - spec/eeepub/opf_spec.rb
94
+ - spec/eeepub_spec.rb
95
+ - spec/spec_helper.rb
96
+ - examples/simple.rb