gepub 0.4.5 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +27 -0
- data/Gemfile +3 -7
- data/README.rdoc +1 -7
- data/Rakefile +1 -42
- data/bin/gepuber +0 -0
- data/gepub.gemspec +18 -70
- data/lib/gepub/book.rb +44 -46
- data/lib/gepub/gepuber.rb +1 -1
- data/lib/gepub/item.rb +2 -0
- data/lib/gepub/version.rb +3 -0
- data/lib/gepub.rb +2 -1
- data/spec/gepub_spec.rb +64 -81
- data/spec/gepuber_spec.rb +12 -15
- metadata +63 -89
- data/VERSION +0 -1
- data/lib/gepub/generator.rb +0 -275
data/.gitignore
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
## MAC OS
|
2
|
+
.DS_Store
|
3
|
+
|
4
|
+
## TEXTMATE
|
5
|
+
*.tmproj
|
6
|
+
tmtags
|
7
|
+
|
8
|
+
## EMACS
|
9
|
+
*~
|
10
|
+
\#*
|
11
|
+
.\#*
|
12
|
+
|
13
|
+
## VIM
|
14
|
+
*.swp
|
15
|
+
|
16
|
+
## PROJECT::GENERAL
|
17
|
+
coverage
|
18
|
+
rdoc
|
19
|
+
pkg
|
20
|
+
|
21
|
+
## PROJECT::SPECIFIC
|
22
|
+
testepub.epub
|
23
|
+
|
24
|
+
## BUNDLER
|
25
|
+
Gemfile.lock
|
26
|
+
vendor/**
|
27
|
+
.bundle/**
|
data/Gemfile
CHANGED
@@ -1,8 +1,4 @@
|
|
1
|
-
source
|
1
|
+
source "http://rubygems.org"
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
gem 'epubcheck', '>= 0.1.0', :group => [:test, :development]
|
6
|
-
gem 'jeweler', '>= 1.5.1', :group => :development
|
7
|
-
gem 'libxml-ruby', '>= 1.1.4'
|
8
|
-
gem 'rubyzip', '>= 0.9.4'
|
3
|
+
# Specify your gem's dependencies in gepub.gemspec
|
4
|
+
gemspec
|
data/README.rdoc
CHANGED
@@ -16,8 +16,7 @@ a good-enough EPUB generator library.
|
|
16
16
|
* ncx: can't nest navPoint elements
|
17
17
|
* ...and many other restrictions
|
18
18
|
|
19
|
-
*
|
20
|
-
* GEPUB::Book does not create directory. GEPUB::Book accepts IO object, not File.
|
19
|
+
* GEPUB::Generator has been removed. Use GEPUB::Book instead.
|
21
20
|
|
22
21
|
== SYNOPSIS:
|
23
22
|
|
@@ -66,11 +65,6 @@ a good-enough EPUB generator library.
|
|
66
65
|
|
67
66
|
epub.generate_epub(epubname)
|
68
67
|
|
69
|
-
== REQUIREMENTS:
|
70
|
-
|
71
|
-
* libxml-ruby
|
72
|
-
* zipruby
|
73
|
-
|
74
68
|
== INSTALL:
|
75
69
|
|
76
70
|
* gem install gepub
|
data/Rakefile
CHANGED
@@ -1,42 +1 @@
|
|
1
|
-
require
|
2
|
-
require 'rake'
|
3
|
-
|
4
|
-
begin
|
5
|
-
require 'jeweler'
|
6
|
-
Jeweler::Tasks.new do |gem|
|
7
|
-
gem.name = "gepub"
|
8
|
-
gem.summary = %Q{a good-enough EPUB generator.}
|
9
|
-
gem.description = %Q{an easy-to-use (and easy-to-implement) EPUB generator.}
|
10
|
-
gem.email = "skoji@skoji.jp"
|
11
|
-
gem.homepage = "http://github.com/skoji/gepub"
|
12
|
-
gem.authors = ["KOJIMA Satoshi"]
|
13
|
-
# gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
|
14
|
-
end
|
15
|
-
Jeweler::GemcutterTasks.new
|
16
|
-
rescue LoadError
|
17
|
-
puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
|
18
|
-
end
|
19
|
-
|
20
|
-
require 'rspec/core/rake_task'
|
21
|
-
RSpec::Core::RakeTask.new(:spec) do |spec|
|
22
|
-
spec.rspec_opts = ["-c", "-f progress", "-r ./spec/spec_helper.rb"]
|
23
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
24
|
-
end
|
25
|
-
|
26
|
-
RSpec::Core::RakeTask.new(:rcov) do |spec|
|
27
|
-
spec.rspec_opts = ["-c", "-f progress", "-r ./spec/spec_helper.rb"]
|
28
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
29
|
-
spec.rcov = true
|
30
|
-
end
|
31
|
-
|
32
|
-
task :default => :spec
|
33
|
-
|
34
|
-
require 'rake/rdoctask'
|
35
|
-
Rake::RDocTask.new do |rdoc|
|
36
|
-
version = File.exist?('VERSION') ? File.read('VERSION') : ""
|
37
|
-
|
38
|
-
rdoc.rdoc_dir = 'rdoc'
|
39
|
-
rdoc.title = "gepub #{version}"
|
40
|
-
rdoc.rdoc_files.include('README*')
|
41
|
-
rdoc.rdoc_files.include('lib/**/*.rb')
|
42
|
-
end
|
1
|
+
require "bundler/gem_tasks"
|
data/bin/gepuber
CHANGED
File without changes
|
data/gepub.gemspec
CHANGED
@@ -1,77 +1,25 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
1
|
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "gepub/version"
|
5
4
|
|
6
5
|
Gem::Specification.new do |s|
|
7
|
-
s.name
|
8
|
-
s.version
|
6
|
+
s.name = "gepub"
|
7
|
+
s.version = GEPUB::VERSION
|
8
|
+
s.authors = ["KOJIMA Satoshi"]
|
9
|
+
s.email = ["skoji@mac.com"]
|
10
|
+
s.homepage = %q{http://github.com/skoji/gepub}
|
11
|
+
s.summary = %q{a good-enough EPUB generator.}
|
12
|
+
s.description = %q{an easy-to-use EPUB generator.}
|
9
13
|
|
10
|
-
s.
|
11
|
-
s.authors = ["KOJIMA Satoshi"]
|
12
|
-
s.date = %q{2011-06-13}
|
13
|
-
s.description = %q{an easy-to-use (and easy-to-implement) EPUB generator.}
|
14
|
-
s.email = %q{skoji@skoji.jp}
|
15
|
-
s.executables = ["gepuber"]
|
16
|
-
s.extra_rdoc_files = [
|
17
|
-
"README.rdoc"
|
18
|
-
]
|
19
|
-
s.files = [
|
20
|
-
".document",
|
21
|
-
"Gemfile",
|
22
|
-
"README.rdoc",
|
23
|
-
"Rakefile",
|
24
|
-
"VERSION",
|
25
|
-
"bin/gepuber",
|
26
|
-
"examples/example.rb",
|
27
|
-
"gepub.gemspec",
|
28
|
-
"lib/gepub.rb",
|
29
|
-
"lib/gepub/book.rb",
|
30
|
-
"lib/gepub/generator.rb",
|
31
|
-
"lib/gepub/gepuber.rb",
|
32
|
-
"lib/gepub/item.rb",
|
33
|
-
"spec/fixtures/testdata/0.html",
|
34
|
-
"spec/fixtures/testdata/1.html",
|
35
|
-
"spec/gepub_spec.rb",
|
36
|
-
"spec/gepuber_spec.rb",
|
37
|
-
"spec/spec_helper.rb"
|
38
|
-
]
|
39
|
-
s.homepage = %q{http://github.com/skoji/gepub}
|
40
|
-
s.require_paths = ["lib"]
|
41
|
-
s.rubygems_version = %q{1.7.2}
|
42
|
-
s.summary = %q{a good-enough EPUB generator.}
|
43
|
-
s.test_files = [
|
44
|
-
"examples/example.rb",
|
45
|
-
"spec/gepub_spec.rb",
|
46
|
-
"spec/gepuber_spec.rb",
|
47
|
-
"spec/spec_helper.rb"
|
48
|
-
]
|
14
|
+
s.rubyforge_project = "gepub"
|
49
15
|
|
50
|
-
|
51
|
-
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
52
20
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
s.add_development_dependency(%q<rspec>, [">= 2"])
|
58
|
-
s.add_development_dependency(%q<epubcheck>, [">= 0.1.0"])
|
59
|
-
s.add_development_dependency(%q<jeweler>, [">= 1.5.1"])
|
60
|
-
else
|
61
|
-
s.add_dependency(%q<libxml-ruby>, [">= 1.1.4"])
|
62
|
-
s.add_dependency(%q<rubyzip>, [">= 0.9.4"])
|
63
|
-
s.add_dependency(%q<bundler>, [">= 1.0.7"])
|
64
|
-
s.add_dependency(%q<rspec>, [">= 2"])
|
65
|
-
s.add_dependency(%q<epubcheck>, [">= 0.1.0"])
|
66
|
-
s.add_dependency(%q<jeweler>, [">= 1.5.1"])
|
67
|
-
end
|
68
|
-
else
|
69
|
-
s.add_dependency(%q<libxml-ruby>, [">= 1.1.4"])
|
70
|
-
s.add_dependency(%q<rubyzip>, [">= 0.9.4"])
|
71
|
-
s.add_dependency(%q<bundler>, [">= 1.0.7"])
|
72
|
-
s.add_dependency(%q<rspec>, [">= 2"])
|
73
|
-
s.add_dependency(%q<epubcheck>, [">= 0.1.0"])
|
74
|
-
s.add_dependency(%q<jeweler>, [">= 1.5.1"])
|
75
|
-
end
|
21
|
+
s.add_development_dependency "rspec", ">= 2"
|
22
|
+
s.add_development_dependency "epubcheck", ">= 0.1.0"
|
23
|
+
s.add_runtime_dependency "nokogiri", ">= 1.5.0"
|
24
|
+
s.add_runtime_dependency "rubyzip", ">= 0.9.4"
|
76
25
|
end
|
77
|
-
|
data/lib/gepub/book.rb
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
2
|
require 'rubygems'
|
3
|
-
require '
|
3
|
+
require 'nokogiri'
|
4
4
|
require 'zip/zip'
|
5
5
|
require 'fileutils'
|
6
6
|
|
7
7
|
|
8
8
|
module GEPUB
|
9
9
|
class Book
|
10
|
-
attr_accessor :spine, :locale
|
10
|
+
attr_accessor :spine, :locale, :epub_version, :epub_backword_compat
|
11
11
|
|
12
12
|
def self.def_meta(name, key = nil)
|
13
13
|
key ||= name
|
@@ -32,6 +32,8 @@ module GEPUB
|
|
32
32
|
@contents_prefix = @contents_prefix + "/" if contents_prefix != ""
|
33
33
|
@itemcount = 0
|
34
34
|
@locale = 'en'
|
35
|
+
@epub_version = 2.1
|
36
|
+
@epub_backword_compat = false
|
35
37
|
end
|
36
38
|
|
37
39
|
def_meta :title
|
@@ -125,104 +127,101 @@ EOF
|
|
125
127
|
end
|
126
128
|
|
127
129
|
def opf_xml
|
128
|
-
|
129
|
-
|
130
|
-
package
|
131
|
-
XML::Namespace.new(package, nil, 'http://www.idpf.org/2007/opf')
|
130
|
+
opf = Nokogiri::XML::Document.new
|
131
|
+
opf.root = package = Nokogiri::XML::Node.new('package', opf)
|
132
|
+
package.add_namespace(nil, 'http://www.idpf.org/2007/opf')
|
132
133
|
package['version'] = '2.0'
|
133
134
|
package['unique-identifier'] = 'BookID'
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
XML::
|
138
|
-
|
139
|
-
|
140
|
-
metadataelem << XML::Node.new('dc:language', @locale)
|
141
|
-
|
142
|
-
@metadata.each { | k, v |
|
135
|
+
package << metadataelem = Nokogiri::XML::Node.new('metadata', opf)
|
136
|
+
metadataelem.add_namespace('opf', 'http://www.idpf.org/2007/opf')
|
137
|
+
metadataelem.add_namespace('dc', "http://purl.org/dc/elements/1.1/")
|
138
|
+
metadataelem << lang = Nokogiri::XML::Node.new('dc:language', opf)
|
139
|
+
lang.content = @locale
|
140
|
+
@metadata.each { |k,v|
|
143
141
|
if (k == :cover)
|
144
|
-
metadataelem << node = XML::Node.new("meta")
|
142
|
+
metadataelem << node = Nokogiri::XML::Node.new("meta", opf)
|
145
143
|
node['name'] = 'cover'
|
146
144
|
node['content'] = v
|
147
145
|
elsif (k == :identifier)
|
148
146
|
v.each {
|
149
147
|
|id|
|
150
|
-
metadataelem << node = XML::Node.new("dc:#{k}",
|
148
|
+
metadataelem << node = Nokogiri::XML::Node.new("dc:#{k}", opf)
|
149
|
+
node.content = id[:identifier]
|
151
150
|
if (id[:main_id])
|
152
151
|
node['id'] = 'BookID'
|
153
152
|
end
|
154
153
|
node['opf:scheme'] = id[:scheme]
|
155
154
|
}
|
156
155
|
elsif (k == :gepub_version)
|
157
|
-
metadataelem << node = XML::Node.new("meta")
|
156
|
+
metadataelem << node = Nokogiri::XML::Node.new("meta", opf)
|
158
157
|
node['name'] = 'gepub version'
|
159
158
|
node['content'] = v
|
160
159
|
else
|
161
|
-
metadataelem << node = XML::Node.new("dc:#{k}",
|
160
|
+
metadataelem << node = Nokogiri::XML::Node.new("dc:#{k}",opf)
|
161
|
+
node.content = v
|
162
162
|
end
|
163
163
|
}
|
164
164
|
|
165
|
-
package << manifestelem = XML::Node.new('manifest')
|
165
|
+
package << manifestelem = Nokogiri::XML::Node.new('manifest', opf)
|
166
166
|
@manifest.each {
|
167
167
|
|item|
|
168
|
-
manifestelem << node = XML::Node.new("item")
|
168
|
+
manifestelem << node = Nokogiri::XML::Node.new("item", opf)
|
169
169
|
node['id'] = "#{item.itemid}"
|
170
170
|
node['href'] = "#{item.href}"
|
171
171
|
node['media-type'] = "#{item.mediatype}"
|
172
172
|
}
|
173
|
-
|
174
|
-
package << spineelem = XML::Node.new('spine')
|
173
|
+
|
174
|
+
package << spineelem = Nokogiri::XML::Node.new('spine', opf)
|
175
175
|
spineelem['toc'] = 'ncx'
|
176
176
|
|
177
177
|
@spine.each {
|
178
178
|
|v|
|
179
|
-
spineelem << node = XML::Node.new('itemref')
|
179
|
+
spineelem << node = Nokogiri::XML::Node.new('itemref', opf)
|
180
180
|
node['idref'] = "#{v.itemid}"
|
181
181
|
}
|
182
|
-
|
183
|
-
result.to_s
|
184
|
-
|
182
|
+
opf.to_s
|
185
183
|
end
|
184
|
+
|
186
185
|
|
187
186
|
def ncx_xml
|
188
|
-
|
189
|
-
|
190
|
-
root
|
191
|
-
XML::Namespace.new(root, nil, "http://www.daisy.org/z3986/2005/ncx/")
|
187
|
+
ncx = Nokogiri::XML::Document.new
|
188
|
+
ncx.root = root = Nokogiri::XML::Node.new('ncx', ncx)
|
189
|
+
root.add_namespace(nil, "http://www.daisy.org/z3986/2005/ncx/")
|
192
190
|
root['version'] = "2005-1"
|
193
|
-
root << head = XML::Node.new('head')
|
194
|
-
head << uid = XML::Node.new('meta')
|
191
|
+
root << head = Nokogiri::XML::Node.new('head', ncx)
|
192
|
+
head << uid = Nokogiri::XML::Node.new('meta', ncx)
|
195
193
|
uid['name'] = 'dtb:uid'
|
196
194
|
uid['content'] = "#{@main_identifier}"
|
197
195
|
|
198
|
-
head << depth = XML::Node.new('meta')
|
196
|
+
head << depth = Nokogiri::XML::Node.new('meta', ncx)
|
199
197
|
depth['name'] = 'dtb:depth'
|
200
198
|
depth['content'] = '1'
|
201
199
|
|
202
|
-
head << totalPageCount = XML::Node.new('meta')
|
200
|
+
head << totalPageCount = Nokogiri::XML::Node.new('meta', ncx)
|
203
201
|
totalPageCount['name'] = 'dtb:totalPageCount'
|
204
202
|
totalPageCount['content'] = '0'
|
205
203
|
|
206
|
-
head << maxPageNumber = XML::Node.new('meta')
|
204
|
+
head << maxPageNumber = Nokogiri::XML::Node.new('meta', ncx)
|
207
205
|
maxPageNumber['name'] = 'dtb:maxPageNumber'
|
208
206
|
maxPageNumber['content'] = '0'
|
209
207
|
|
208
|
+
root << docTitle = Nokogiri::XML::Node.new('docTitle', ncx)
|
209
|
+
docTitle << docTitleText = Nokogiri::XML::Node.new('text', ncx)
|
210
|
+
docTitleText.content = "#{@metadata[:title]}"
|
210
211
|
|
211
|
-
root <<
|
212
|
-
docTitle << XML::Node.new('text', "#{@metadata[:title]}")
|
213
|
-
|
214
|
-
root << nav_map = XML::Node.new('navMap')
|
212
|
+
root << nav_map = Nokogiri::XML::Node.new('navMap', ncx)
|
215
213
|
count = 1
|
216
214
|
@toc.each {
|
217
215
|
|x|
|
218
|
-
nav_point = XML::Node.new('navPoint')
|
216
|
+
nav_point = Nokogiri::XML::Node.new('navPoint', ncx)
|
219
217
|
nav_point['id'] = "#{x[:item].itemid}"
|
220
218
|
nav_point['playOrder'] = "#{count}"
|
221
219
|
|
222
|
-
nav_label = XML::Node.new('navLabel')
|
223
|
-
nav_label << XML::Node.new('text',
|
220
|
+
nav_label = Nokogiri::XML::Node.new('navLabel', ncx)
|
221
|
+
nav_label << navtxt = Nokogiri::XML::Node.new('text', ncx)
|
222
|
+
navtxt.content = "#{x[:text]}"
|
224
223
|
|
225
|
-
nav_content = XML::Node.new('content')
|
224
|
+
nav_content = Nokogiri::XML::Node.new('content', ncx)
|
226
225
|
if x[:id].nil?
|
227
226
|
nav_content['src'] = "#{x[:item].href}"
|
228
227
|
else
|
@@ -230,12 +229,11 @@ EOF
|
|
230
229
|
end
|
231
230
|
|
232
231
|
count = count + 1
|
233
|
-
|
234
232
|
nav_map << nav_point
|
235
233
|
nav_point << nav_label
|
236
234
|
nav_point << nav_content
|
237
235
|
}
|
238
|
-
|
236
|
+
ncx.to_s
|
239
237
|
end
|
240
238
|
end
|
241
239
|
end
|
data/lib/gepub/gepuber.rb
CHANGED
data/lib/gepub/item.rb
CHANGED
data/lib/gepub.rb
CHANGED
data/spec/gepub_spec.rb
CHANGED
@@ -1,9 +1,6 @@
|
|
1
|
-
# need to install 'epubcheck'.
|
2
|
-
|
3
1
|
require File.dirname(__FILE__) + '/spec_helper.rb'
|
4
2
|
require 'rubygems'
|
5
|
-
require '
|
6
|
-
|
3
|
+
require 'nokogiri'
|
7
4
|
|
8
5
|
describe GEPUB::Item do
|
9
6
|
it "should return atttributes" do
|
@@ -28,133 +25,119 @@ describe GEPUB::Item do
|
|
28
25
|
item.mediatype.should == 'image/jpeg'
|
29
26
|
end
|
30
27
|
|
28
|
+
it "should handle css" do
|
29
|
+
item = GEPUB::Item.new('id', 'img/foo.css')
|
30
|
+
item.mediatype.should == 'text/css'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should handle javascript" do
|
34
|
+
item = GEPUB::Item.new('id', 'js/jQuery.js')
|
35
|
+
item.mediatype.should == 'text/javascript'
|
36
|
+
end
|
37
|
+
|
31
38
|
end
|
32
39
|
|
33
40
|
describe GEPUB::Book do
|
34
41
|
before do
|
35
|
-
@
|
36
|
-
@
|
37
|
-
@
|
38
|
-
@
|
39
|
-
@
|
40
|
-
@
|
41
|
-
@
|
42
|
-
item1 = @
|
42
|
+
@book = GEPUB::Book.new('thetitle')
|
43
|
+
@book.author = "theauthor"
|
44
|
+
@book.contributor = "contributors contributors!"
|
45
|
+
@book.publisher = "thepublisher"
|
46
|
+
@book.date = "2010-05-05"
|
47
|
+
@book.identifier = "http://example.jp/foobar/"
|
48
|
+
@book.locale = 'ja'
|
49
|
+
item1 = @book.add_ref_to_item('text/foobar.html','c1')
|
43
50
|
item1.add_content(StringIO.new('<html xmlns="http://www.w3.org/1999/xhtml"><head><title>c1</title></head><body><p>the first page</p></body></html>'))
|
44
|
-
@
|
51
|
+
@book.spine.push(item1)
|
45
52
|
|
46
|
-
item2 = @
|
53
|
+
item2 = @book.add_ordered_item('text/barbar.html',
|
47
54
|
StringIO.new('<html xmlns="http://www.w3.org/1999/xhtml"><head><title>c2</title></head><body><p>second page, whith is test chapter.</p></body></html>'),
|
48
55
|
'c2')
|
49
|
-
@
|
56
|
+
@book.add_nav(item2, 'test chapter')
|
50
57
|
end
|
51
58
|
|
52
59
|
it "should have titile" do
|
53
|
-
@
|
60
|
+
@book.title.should == 'thetitle'
|
54
61
|
end
|
55
62
|
|
56
63
|
it "should generate correct ncx" do
|
57
|
-
ncx =
|
58
|
-
ncx.
|
59
|
-
ncx.
|
60
|
-
ncx.
|
64
|
+
ncx = Nokogiri::XML.parse(@book.ncx_xml).root
|
65
|
+
ncx.name.should == 'ncx'
|
66
|
+
ncx.attributes['version'].value.should == '2005-1'
|
67
|
+
ncx.namespaces['xmlns'] == 'http://www.daisy.org/z3986/2005/ncx/'
|
61
68
|
end
|
62
69
|
|
63
70
|
it "should have correct head in ncx" do
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
ncx.find_first("a:head/a:meta[@name='dtb:depth']").should_not be_nil
|
71
|
-
ncx.find_first("a:head/a:meta[@name='dtb:totalPageCount']").should_not be_nil
|
72
|
-
ncx.find_first("a:head/a:meta[@name='dtb:maxPageNumber']").should_not be_nil
|
71
|
+
head = Nokogiri::XML.parse(@book.ncx_xml).at_xpath('/xmlns:ncx/xmlns:head')
|
72
|
+
head.should_not be_nil
|
73
|
+
head.at_xpath("xmlns:meta[@name='dtb:uid']")['content'].should == "http://example.jp/foobar/"
|
74
|
+
head.xpath("xmlns:meta[@name='dtb:depth']").size.should > 0
|
75
|
+
head.xpath("xmlns:meta[@name='dtb:totalPageCount']").size.should > 0
|
76
|
+
head.xpath("xmlns:meta[@name='dtb:maxPageNumber']").size.should > 0
|
73
77
|
end
|
74
78
|
|
75
79
|
it "should have correct ncx doctitle" do
|
76
|
-
|
77
|
-
ncx.root.namespaces.default_prefix='a'
|
80
|
+
doctitle = Nokogiri::XML.parse(@book.ncx_xml).root
|
78
81
|
|
79
|
-
|
80
|
-
|
82
|
+
doctitle.xpath('xmlns:docTitle').size.should > 0
|
83
|
+
doctitle.at_xpath('xmlns:docTitle/xmlns:text').text.should == 'thetitle'
|
81
84
|
end
|
82
85
|
|
83
86
|
it "should correct ncx navmap" do
|
84
|
-
ncx =
|
85
|
-
ncx.root.namespaces.default_prefix='a'
|
87
|
+
ncx = Nokogiri::XML::parse(@book.ncx_xml).root
|
86
88
|
|
87
|
-
ncx.
|
88
|
-
nav_point = ncx.
|
89
|
+
ncx.xpath('xmlns:navMap').size.should > 0
|
90
|
+
nav_point = ncx.at_xpath('xmlns:navMap/xmlns:navPoint')
|
89
91
|
nav_point['id'].should == 'c2'
|
90
92
|
nav_point['playOrder'].should == '1'
|
91
93
|
|
92
|
-
nav_point.
|
93
|
-
nav_point.
|
94
|
+
nav_point.at_xpath('xmlns:navLabel/xmlns:text').content.should == 'test chapter'
|
95
|
+
nav_point.at_xpath('xmlns:content')['src'] == 'foobar2.html'
|
94
96
|
|
95
97
|
end
|
96
98
|
|
97
99
|
it "should create correct opf" do
|
98
|
-
opf =
|
99
|
-
opf.
|
100
|
-
|
101
|
-
opf
|
102
|
-
opf
|
103
|
-
opf.root['version'] == '2.0'
|
104
|
-
opf.root['unique-identifier'] == 'http://example.jp/foobar/'
|
100
|
+
opf = Nokogiri::XML.parse(@book.opf_xml).root
|
101
|
+
opf.name.should == 'package'
|
102
|
+
opf.namespaces['xmlns'] == 'http://www.idpf.org/2007/opf'
|
103
|
+
opf['version'] == '2.0'
|
104
|
+
opf['unique-identifier'] == 'http://example.jp/foobar/'
|
105
105
|
end
|
106
|
-
|
107
106
|
|
108
107
|
it "should have correct metadata in opf" do
|
109
|
-
opf =
|
110
|
-
opf.
|
111
|
-
|
112
|
-
|
113
|
-
metadata.find_first('dc:language').content.should == 'ja'
|
114
|
-
# TODO checking metadatas...
|
108
|
+
opf = Nokogiri::XML.parse(@book.opf_xml).root
|
109
|
+
metadata = opf.xpath('xmlns:metadata').first
|
110
|
+
metadata.at_xpath('dc:language', metadata.namespaces).content.should == 'ja'
|
111
|
+
#TODO: check metadata
|
115
112
|
end
|
116
113
|
|
117
114
|
it "should have correct manifest and spine in opf" do
|
118
|
-
opf =
|
119
|
-
opf.root.namespaces.default_prefix='a'
|
115
|
+
opf = Nokogiri::XML.parse(@book.opf_xml).root
|
120
116
|
|
121
|
-
manifest = opf.
|
122
|
-
manifest.
|
123
|
-
manifest.
|
124
|
-
manifest.
|
117
|
+
manifest = opf.at_xpath('xmlns:manifest')
|
118
|
+
manifest.at_xpath('xmlns:item')['id'].should == 'c1'
|
119
|
+
manifest.at_xpath('xmlns:item')['href'].should == 'text/foobar.html'
|
120
|
+
manifest.at_xpath('xmlns:item')['media-type'].should == 'application/xhtml+xml'
|
125
121
|
|
126
|
-
spine = opf.
|
122
|
+
spine = opf.at_xpath('xmlns:spine')
|
127
123
|
spine['toc'].should == 'ncx'
|
128
|
-
spine.
|
129
|
-
end
|
130
|
-
|
131
|
-
it "should have correct metadata in opf" do
|
132
|
-
opf = LibXML::XML::Parser.string(@generator.opf_xml).parse
|
133
|
-
opf.root.namespaces.default_prefix='a'
|
134
|
-
|
135
|
-
metadata = opf.find_first('a:metadata')
|
136
|
-
metadata.find_first('dc:language').content.should == 'ja'
|
137
|
-
# TODO checking metadatas...
|
124
|
+
spine.at_xpath('xmlns:itemref')['idref'].should == 'c1'
|
138
125
|
end
|
139
126
|
|
140
127
|
it "should have correct cover image id" do
|
141
|
-
item = @
|
142
|
-
@
|
128
|
+
item = @book.add_ref_to_item("img/img.jpg")
|
129
|
+
@book.specify_cover_image(item)
|
143
130
|
|
144
|
-
opf =
|
145
|
-
opf.root.namespaces.default_prefix='a'
|
131
|
+
opf = Nokogiri::XML.parse(@book.opf_xml).root
|
146
132
|
|
147
|
-
metadata = opf.
|
148
|
-
|
149
|
-
|
150
|
-
}
|
151
|
-
metas.length.should == 1
|
152
|
-
metas[0]['content'].should == item.itemid
|
133
|
+
metadata = opf.at_xpath('xmlns:metadata')
|
134
|
+
meta = metadata.at_xpath("xmlns:meta[@name='cover']")
|
135
|
+
meta['content'].should == item.itemid
|
153
136
|
end
|
154
137
|
|
155
138
|
it "should generate correct epub" do
|
156
139
|
epubname = File.join(File.dirname(__FILE__), 'testepub.epub')
|
157
|
-
@
|
140
|
+
@book.generate_epub(epubname)
|
158
141
|
%x( epubcheck #{epubname} )
|
159
142
|
end
|
160
143
|
|
data/spec/gepuber_spec.rb
CHANGED
@@ -1,15 +1,12 @@
|
|
1
1
|
# -*- coding: utf-8 -*-
|
2
|
-
# need to install 'epubcheck'.
|
3
2
|
|
4
3
|
require File.dirname(__FILE__) + '/spec_helper.rb'
|
5
4
|
require 'rubygems'
|
6
|
-
require 'xml/libxml'
|
7
|
-
|
8
5
|
|
9
6
|
describe GEPUB::Gepuber do
|
10
7
|
it "should be initialized with empty conf" do
|
11
8
|
gepuber = GEPUB::Gepuber.new({})
|
12
|
-
gepuber.texts.should == ['[0-9]*.html']
|
9
|
+
gepuber.texts.should == ['[0-9]*.{xhtml,html}']
|
13
10
|
gepuber.resources.should == ['*.css', 'img/*']
|
14
11
|
gepuber.title.should == ""
|
15
12
|
gepuber.table_of_contents.should == {}
|
@@ -18,22 +15,22 @@ describe GEPUB::Gepuber do
|
|
18
15
|
it "should read config hash" do
|
19
16
|
conf =
|
20
17
|
{
|
21
|
-
locale
|
22
|
-
title
|
23
|
-
author
|
24
|
-
publisher
|
25
|
-
date
|
26
|
-
identifier
|
27
|
-
epubname
|
28
|
-
table_of_contents
|
18
|
+
:locale => 'ja',
|
19
|
+
:title => 'theTitle',
|
20
|
+
:author => 'theAuthor',
|
21
|
+
:publisher => 'thePublisher',
|
22
|
+
:date => '2011-03-11',
|
23
|
+
:identifier => 'http://skoji.jp/gepuber/2011-03-11.0.0',
|
24
|
+
:epubname => 'gepub_00',
|
25
|
+
:table_of_contents => {
|
29
26
|
'1_.html' => '1st toc',
|
30
27
|
'3_.html' => '3rd toc',
|
31
28
|
'3_.html#a1' => '3rd toc 2',
|
32
29
|
'9_.html' => 'last toc'
|
33
30
|
},
|
34
|
-
coverimg
|
35
|
-
texts
|
36
|
-
resources
|
31
|
+
:coverimg => 'cover.gif',
|
32
|
+
:texts => [ '*.html' ],
|
33
|
+
:resources => ['*.css','*.gif']
|
37
34
|
}
|
38
35
|
|
39
36
|
gepuber = GEPUB::Gepuber.new(conf )
|
metadata
CHANGED
@@ -1,105 +1,81 @@
|
|
1
|
-
--- !ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
name: gepub
|
3
|
-
version: !ruby/object:Gem::Version
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.0
|
4
5
|
prerelease:
|
5
|
-
version: 0.4.5
|
6
6
|
platform: ruby
|
7
|
-
authors:
|
7
|
+
authors:
|
8
8
|
- KOJIMA Satoshi
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
- !ruby/object:Gem::Dependency
|
16
|
-
name: libxml-ruby
|
17
|
-
requirement: &id001 !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
|
-
requirements:
|
20
|
-
- - ">="
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: 1.1.4
|
23
|
-
type: :runtime
|
24
|
-
prerelease: false
|
25
|
-
version_requirements: *id001
|
26
|
-
- !ruby/object:Gem::Dependency
|
27
|
-
name: rubyzip
|
28
|
-
requirement: &id002 !ruby/object:Gem::Requirement
|
29
|
-
none: false
|
30
|
-
requirements:
|
31
|
-
- - ">="
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 0.9.4
|
34
|
-
type: :runtime
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: *id002
|
37
|
-
- !ruby/object:Gem::Dependency
|
38
|
-
name: bundler
|
39
|
-
requirement: &id003 !ruby/object:Gem::Requirement
|
40
|
-
none: false
|
41
|
-
requirements:
|
42
|
-
- - ">="
|
43
|
-
- !ruby/object:Gem::Version
|
44
|
-
version: 1.0.7
|
45
|
-
type: :development
|
46
|
-
prerelease: false
|
47
|
-
version_requirements: *id003
|
48
|
-
- !ruby/object:Gem::Dependency
|
12
|
+
date: 2012-01-25 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
49
15
|
name: rspec
|
50
|
-
requirement: &
|
16
|
+
requirement: &70335555213040 !ruby/object:Gem::Requirement
|
51
17
|
none: false
|
52
|
-
requirements:
|
53
|
-
- -
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version:
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '2'
|
56
22
|
type: :development
|
57
23
|
prerelease: false
|
58
|
-
version_requirements: *
|
59
|
-
- !ruby/object:Gem::Dependency
|
24
|
+
version_requirements: *70335555213040
|
25
|
+
- !ruby/object:Gem::Dependency
|
60
26
|
name: epubcheck
|
61
|
-
requirement: &
|
27
|
+
requirement: &70335555212540 !ruby/object:Gem::Requirement
|
62
28
|
none: false
|
63
|
-
requirements:
|
64
|
-
- -
|
65
|
-
- !ruby/object:Gem::Version
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
66
32
|
version: 0.1.0
|
67
33
|
type: :development
|
68
34
|
prerelease: false
|
69
|
-
version_requirements: *
|
70
|
-
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
72
|
-
requirement: &
|
35
|
+
version_requirements: *70335555212540
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: nokogiri
|
38
|
+
requirement: &70335555212080 !ruby/object:Gem::Requirement
|
73
39
|
none: false
|
74
|
-
requirements:
|
75
|
-
- -
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: 1.5.
|
78
|
-
type: :
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: 1.5.0
|
44
|
+
type: :runtime
|
79
45
|
prerelease: false
|
80
|
-
version_requirements: *
|
81
|
-
|
82
|
-
|
83
|
-
|
46
|
+
version_requirements: *70335555212080
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: rubyzip
|
49
|
+
requirement: &70335555211620 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 0.9.4
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70335555211620
|
58
|
+
description: an easy-to-use EPUB generator.
|
59
|
+
email:
|
60
|
+
- skoji@mac.com
|
61
|
+
executables:
|
84
62
|
- gepuber
|
85
63
|
extensions: []
|
86
|
-
|
87
|
-
|
88
|
-
- README.rdoc
|
89
|
-
files:
|
64
|
+
extra_rdoc_files: []
|
65
|
+
files:
|
90
66
|
- .document
|
67
|
+
- .gitignore
|
91
68
|
- Gemfile
|
92
69
|
- README.rdoc
|
93
70
|
- Rakefile
|
94
|
-
- VERSION
|
95
71
|
- bin/gepuber
|
96
72
|
- examples/example.rb
|
97
73
|
- gepub.gemspec
|
98
74
|
- lib/gepub.rb
|
99
75
|
- lib/gepub/book.rb
|
100
|
-
- lib/gepub/generator.rb
|
101
76
|
- lib/gepub/gepuber.rb
|
102
77
|
- lib/gepub/item.rb
|
78
|
+
- lib/gepub/version.rb
|
103
79
|
- spec/fixtures/testdata/0.html
|
104
80
|
- spec/fixtures/testdata/1.html
|
105
81
|
- spec/gepub_spec.rb
|
@@ -107,33 +83,31 @@ files:
|
|
107
83
|
- spec/spec_helper.rb
|
108
84
|
homepage: http://github.com/skoji/gepub
|
109
85
|
licenses: []
|
110
|
-
|
111
86
|
post_install_message:
|
112
87
|
rdoc_options: []
|
113
|
-
|
114
|
-
require_paths:
|
88
|
+
require_paths:
|
115
89
|
- lib
|
116
|
-
required_ruby_version: !ruby/object:Gem::Requirement
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
117
91
|
none: false
|
118
|
-
requirements:
|
119
|
-
- -
|
120
|
-
- !ruby/object:Gem::Version
|
121
|
-
version:
|
122
|
-
required_rubygems_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ! '>='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: '0'
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
97
|
none: false
|
124
|
-
requirements:
|
125
|
-
- -
|
126
|
-
- !ruby/object:Gem::Version
|
127
|
-
version:
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
128
102
|
requirements: []
|
129
|
-
|
130
|
-
|
131
|
-
rubygems_version: 1.7.2
|
103
|
+
rubyforge_project: gepub
|
104
|
+
rubygems_version: 1.8.11
|
132
105
|
signing_key:
|
133
106
|
specification_version: 3
|
134
107
|
summary: a good-enough EPUB generator.
|
135
|
-
test_files:
|
136
|
-
-
|
108
|
+
test_files:
|
109
|
+
- spec/fixtures/testdata/0.html
|
110
|
+
- spec/fixtures/testdata/1.html
|
137
111
|
- spec/gepub_spec.rb
|
138
112
|
- spec/gepuber_spec.rb
|
139
113
|
- spec/spec_helper.rb
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.4.5
|
data/lib/gepub/generator.rb
DELETED
@@ -1,275 +0,0 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
require 'rubygems'
|
3
|
-
require 'xml/libxml'
|
4
|
-
require 'zip/zip'
|
5
|
-
require 'fileutils'
|
6
|
-
|
7
|
-
|
8
|
-
module GEPUB
|
9
|
-
class Generator
|
10
|
-
|
11
|
-
attr_accessor :spine
|
12
|
-
|
13
|
-
def initialize(title)
|
14
|
-
warn('GEPUB::Generator is obsolete. use GEPUB::Book instead.')
|
15
|
-
@metadata = Hash.new
|
16
|
-
@manifest = Hash.new
|
17
|
-
@spine = Array.new
|
18
|
-
@toc = Array.new
|
19
|
-
@metadata[:title] = title
|
20
|
-
@manifest['ncx'] = { :href => 'toc.ncx', :mediatype => 'application/x-dtbncx+xml' }
|
21
|
-
@contents_prefix = "" # may insert "OEBPS/"
|
22
|
-
@locale = 'en'
|
23
|
-
end
|
24
|
-
|
25
|
-
def contents_prefix=(prefix)
|
26
|
-
@contents_prefix = prefix + "/"
|
27
|
-
end
|
28
|
-
|
29
|
-
def title
|
30
|
-
@metadata[:title]
|
31
|
-
end
|
32
|
-
|
33
|
-
def title=(title)
|
34
|
-
@metadata[:title] = title
|
35
|
-
end
|
36
|
-
|
37
|
-
def author
|
38
|
-
@metadata[:creator]
|
39
|
-
end
|
40
|
-
|
41
|
-
def author=(author)
|
42
|
-
@metadata[:creator] = author
|
43
|
-
end
|
44
|
-
|
45
|
-
def contributor
|
46
|
-
@metadata[:contributor]
|
47
|
-
end
|
48
|
-
|
49
|
-
def contributor=(contributor)
|
50
|
-
@metadata[:contributor] = contributor
|
51
|
-
end
|
52
|
-
|
53
|
-
def publisher
|
54
|
-
@metadata[:publisher]
|
55
|
-
end
|
56
|
-
|
57
|
-
def publisher=(publisher)
|
58
|
-
@metadata[:publisher] = publisher
|
59
|
-
end
|
60
|
-
|
61
|
-
def date
|
62
|
-
@metadata[:date]
|
63
|
-
end
|
64
|
-
|
65
|
-
def date=(date)
|
66
|
-
@metadata[:date] = date
|
67
|
-
end
|
68
|
-
|
69
|
-
def identifier
|
70
|
-
@metadata[:itentifier]
|
71
|
-
end
|
72
|
-
|
73
|
-
def identifier=(id)
|
74
|
-
@metadata[:identifier] = id
|
75
|
-
end
|
76
|
-
|
77
|
-
def locale
|
78
|
-
@locale
|
79
|
-
end
|
80
|
-
|
81
|
-
def locale=(locale)
|
82
|
-
@locale = locale
|
83
|
-
end
|
84
|
-
|
85
|
-
def addManifest(id, href, mediatype)
|
86
|
-
@manifest[id] = { :href => href, :mediatype => mediatype }
|
87
|
-
end
|
88
|
-
|
89
|
-
def addNav(id, text, ref)
|
90
|
-
@toc.push({ :id => id, :text => text, :ref => ref})
|
91
|
-
end
|
92
|
-
|
93
|
-
def specifyCoverImage(id)
|
94
|
-
@metadata[:cover] = id
|
95
|
-
end
|
96
|
-
|
97
|
-
def create(destdir)
|
98
|
-
create_mimetype(destdir)
|
99
|
-
create_container(destdir)
|
100
|
-
create_toc(destdir)
|
101
|
-
create_opf(destdir)
|
102
|
-
end
|
103
|
-
|
104
|
-
def create_epub(destdir, targetdir, epubname = @metadata[:title])
|
105
|
-
realtarget = File::expand_path(targetdir)
|
106
|
-
|
107
|
-
FileUtils.cd("#{destdir}") do
|
108
|
-
|dir|
|
109
|
-
epubname = "#{realtarget}/#{epubname}.epub"
|
110
|
-
File.delete(epubname) if File.exist?(epubname)
|
111
|
-
|
112
|
-
Zip::ZipOutputStream::open(epubname) {
|
113
|
-
|epub|
|
114
|
-
epub.put_next_entry('mimetype', '', '', Zip::ZipEntry::STORED)
|
115
|
-
epub << 'application/epub+zip'
|
116
|
-
|
117
|
-
Dir["**/*"].each do
|
118
|
-
|f|
|
119
|
-
if File.basename(f) != 'mimetype' && !File.directory?(f)
|
120
|
-
File.open(f,'rb') do
|
121
|
-
|file|
|
122
|
-
epub.put_next_entry(f)
|
123
|
-
epub << file.read
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
}
|
128
|
-
end
|
129
|
-
end
|
130
|
-
|
131
|
-
def mimetype_contents
|
132
|
-
<<EOF
|
133
|
-
application/epub+zip
|
134
|
-
EOF
|
135
|
-
end
|
136
|
-
def create_mimetype(destdir)
|
137
|
-
File.open(destdir + '/mimetype', 'w') {
|
138
|
-
| file |
|
139
|
-
file << mimetype_contents
|
140
|
-
}
|
141
|
-
end
|
142
|
-
|
143
|
-
def container_xml
|
144
|
-
<<EOF
|
145
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
146
|
-
<container version="1.0" xmlns="urn:oasis:names:tc:opendocument:xmlns:container">
|
147
|
-
<rootfiles>
|
148
|
-
<rootfile full-path="#{@contents_prefix}content.opf" media-type="application/oebps-package+xml"/>
|
149
|
-
</rootfiles>
|
150
|
-
</container>
|
151
|
-
EOF
|
152
|
-
end
|
153
|
-
|
154
|
-
def create_container(destdir)
|
155
|
-
infdir = destdir + "/META-INF"
|
156
|
-
Dir.mkdir(infdir) if !File.exist?(infdir)
|
157
|
-
|
158
|
-
File.open(infdir + "/container.xml", 'w') {
|
159
|
-
|file|
|
160
|
-
file << container_xml
|
161
|
-
}
|
162
|
-
end
|
163
|
-
|
164
|
-
def opf_xml
|
165
|
-
result = XML::Document.new
|
166
|
-
result.root = XML::Node.new('package')
|
167
|
-
package = result.root
|
168
|
-
XML::Namespace.new(package, nil, 'http://www.idpf.org/2007/opf')
|
169
|
-
package['version'] = '2.0'
|
170
|
-
package['unique-identifier'] = 'BookID'
|
171
|
-
|
172
|
-
|
173
|
-
package << metadataelem = XML::Node.new('metadata')
|
174
|
-
XML::Namespace.new(metadataelem, 'opf', 'http://www.idpf.org/2007/opf')
|
175
|
-
XML::Namespace.new(metadataelem, 'dc', "http://purl.org/dc/elements/1.1/")
|
176
|
-
|
177
|
-
metadataelem << XML::Node.new('dc:language', @locale)
|
178
|
-
|
179
|
-
@metadata.each { | k, v |
|
180
|
-
if (k == :cover)
|
181
|
-
metadataelem << node = XML::Node.new("meta")
|
182
|
-
node['name'] = 'cover'
|
183
|
-
node['content'] = v
|
184
|
-
else
|
185
|
-
metadataelem << node = XML::Node.new("dc:#{k}",v)
|
186
|
-
if (k == :identifier)
|
187
|
-
node['id'] = 'BookID'
|
188
|
-
node['opf:scheme'] = 'URL'
|
189
|
-
end
|
190
|
-
end
|
191
|
-
}
|
192
|
-
|
193
|
-
package << manifestelem = XML::Node.new('manifest')
|
194
|
-
@manifest.each {|k,v|
|
195
|
-
manifestelem << node = XML::Node.new("item")
|
196
|
-
node['id'] = "#{k}"
|
197
|
-
node['href'] = "#{v[:href]}"
|
198
|
-
node['media-type'] = "#{v[:mediatype]}"
|
199
|
-
}
|
200
|
-
|
201
|
-
package << spineelem = XML::Node.new('spine')
|
202
|
-
spineelem['toc'] = 'ncx'
|
203
|
-
|
204
|
-
@spine.each {
|
205
|
-
|v|
|
206
|
-
spineelem << node = XML::Node.new('itemref')
|
207
|
-
node['idref'] = "#{v}"
|
208
|
-
}
|
209
|
-
|
210
|
-
result.to_s
|
211
|
-
|
212
|
-
end
|
213
|
-
|
214
|
-
def create_opf(destdir)
|
215
|
-
File.open(destdir + "/" + @contents_prefix + "content.opf", 'w') { | file | file << opf_xml }
|
216
|
-
end
|
217
|
-
|
218
|
-
def ncx_xml
|
219
|
-
result = XML::Document.new
|
220
|
-
result.root = XML::Node.new('ncx')
|
221
|
-
root = result.root
|
222
|
-
XML::Namespace.new(root, nil, "http://www.daisy.org/z3986/2005/ncx/")
|
223
|
-
root['version'] = "2005-1"
|
224
|
-
root << head = XML::Node.new('head')
|
225
|
-
head << uid = XML::Node.new('meta')
|
226
|
-
uid['name'] = 'dtb:uid'
|
227
|
-
uid['content'] = "#{@metadata[:identifier]}"
|
228
|
-
|
229
|
-
head << depth = XML::Node.new('meta')
|
230
|
-
depth['name'] = 'dtb:depth'
|
231
|
-
depth['content'] = '1'
|
232
|
-
|
233
|
-
head << totalPageCount = XML::Node.new('meta')
|
234
|
-
totalPageCount['name'] = 'dtb:totalPageCount'
|
235
|
-
totalPageCount['content'] = '0'
|
236
|
-
|
237
|
-
head << maxPageNumber = XML::Node.new('meta')
|
238
|
-
maxPageNumber['name'] = 'dtb:maxPageNumber'
|
239
|
-
maxPageNumber['content'] = '0'
|
240
|
-
|
241
|
-
|
242
|
-
root << docTitle = XML::Node.new('docTitle')
|
243
|
-
docTitle << XML::Node.new('text', "#{@metadata[:title]}")
|
244
|
-
|
245
|
-
root << nav_map = XML::Node.new('navMap')
|
246
|
-
count = 1
|
247
|
-
@toc.each {
|
248
|
-
|x|
|
249
|
-
nav_point = XML::Node.new('navPoint')
|
250
|
-
nav_point['id'] = "#{x[:id]}"
|
251
|
-
nav_point['playOrder'] = "#{count}"
|
252
|
-
|
253
|
-
nav_label = XML::Node.new('navLabel')
|
254
|
-
nav_label << XML::Node.new('text', "#{x[:text]}")
|
255
|
-
|
256
|
-
nav_content = XML::Node.new('content')
|
257
|
-
nav_content['src'] = "#{x[:ref]}"
|
258
|
-
count = count + 1
|
259
|
-
|
260
|
-
nav_map << nav_point
|
261
|
-
nav_point << nav_label
|
262
|
-
nav_point << nav_content
|
263
|
-
}
|
264
|
-
result.to_s
|
265
|
-
end
|
266
|
-
|
267
|
-
def create_toc(destdir)
|
268
|
-
File.open(destdir + "/" + @contents_prefix + "toc.ncx", 'w') {
|
269
|
-
|file|
|
270
|
-
file << ncx_xml
|
271
|
-
}
|
272
|
-
end
|
273
|
-
|
274
|
-
end
|
275
|
-
end
|