gepub 0.4.5 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|