gepub 0.6.3 → 0.6.3.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -2
- data/README.md +5 -4
- data/lib/gepub/book.rb +42 -19
- data/lib/gepub/builder.rb +2 -2
- data/lib/gepub/metadata.rb +1 -1
- data/lib/gepub/spine.rb +7 -1
- data/lib/gepub/version.rb +1 -1
- data/spec/builder_spec.rb +37 -9
- data/spec/example_spec.rb +32 -0
- data/spec/gepub_spec.rb +10 -0
- metadata +8 -9
- data/.document +0 -5
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -10,7 +10,7 @@ a generic EPUB parser/generator library.
|
|
10
10
|
|
11
11
|
* GEPUB::Book provides functionality to create EPUB file, and parsing EPUB file
|
12
12
|
* Handle every metadata in EPUB2/EPUB3.
|
13
|
-
*
|
13
|
+
* GEPUB::Builder privides easy and powerful way to create EPUB3 files
|
14
14
|
|
15
15
|
* See [issues](https://github.com/skoji/gepub/issues/) for known problems.
|
16
16
|
|
@@ -20,7 +20,6 @@ a generic EPUB parser/generator library.
|
|
20
20
|
|
21
21
|
require 'rubygem'
|
22
22
|
require 'gepub'
|
23
|
-
workdir = 'epub/example/'
|
24
23
|
builder = GEPUB::Builder.new {
|
25
24
|
unique_identifier 'http:/example.jp/bookid_in_url', 'BookID', 'URL'
|
26
25
|
language 'en'
|
@@ -36,7 +35,7 @@ a generic EPUB parser/generator library.
|
|
36
35
|
|
37
36
|
date '2012-02-29T00:00:00Z'
|
38
37
|
|
39
|
-
resources(:workdir =>
|
38
|
+
resources(:workdir => '~/epub/sample_book_source/') {
|
40
39
|
cover_image 'img/image1.jpg' => 'image1.jpg'
|
41
40
|
ordered {
|
42
41
|
file 'text/chap1.xhtml'
|
@@ -50,7 +49,9 @@ a generic EPUB parser/generator library.
|
|
50
49
|
epubname = File.join(File.dirname(__FILE__), 'example_test_with_builder.epub')
|
51
50
|
builder.generate_epub(epubname)
|
52
51
|
|
53
|
-
|
52
|
+
[more builder examples](https://gist.github.com/1878995)
|
53
|
+
|
54
|
+
[examples in this repository](https://github.com/skoji/gepub/tree/master/examples/)
|
54
55
|
|
55
56
|
## INSTALL:
|
56
57
|
|
data/lib/gepub/book.rb
CHANGED
@@ -83,16 +83,18 @@ module GEPUB
|
|
83
83
|
def add_item(href, io_or_filename = nil, id = nil, attributes = {})
|
84
84
|
item = @package.add_item(href,io_or_filename,id,attributes)
|
85
85
|
toc = @toc
|
86
|
-
(class << item;self;end)
|
86
|
+
metaclass = (class << item;self;end)
|
87
|
+
metaclass.send(:define_method, :toc_text,
|
87
88
|
Proc.new { |text|
|
88
89
|
toc.push(:item => item, :text => text, :id => nil)
|
89
90
|
item
|
90
|
-
|
91
|
-
|
91
|
+
})
|
92
|
+
metaclass.send(:define_method, :toc_text_with_id,
|
92
93
|
Proc.new { |text, id|
|
93
94
|
toc.push(:item => item, :text => text, :id => id)
|
94
95
|
item
|
95
|
-
|
96
|
+
})
|
97
|
+
|
96
98
|
yield item if block_given?
|
97
99
|
item
|
98
100
|
end
|
@@ -117,8 +119,7 @@ module GEPUB
|
|
117
119
|
@package.ordered(&block)
|
118
120
|
end
|
119
121
|
|
120
|
-
def
|
121
|
-
|
122
|
+
def cleanup
|
122
123
|
if version.to_f < 3.0 || @package.epub_backward_compat
|
123
124
|
if @package.manifest.item_list.select {
|
124
125
|
|x,item|
|
@@ -133,30 +134,52 @@ module GEPUB
|
|
133
134
|
|
134
135
|
if version.to_f >=3.0
|
135
136
|
@package.metadata.set_lastmodified
|
137
|
+
|
136
138
|
if @package.manifest.item_list.select {
|
137
139
|
|href, item|
|
138
140
|
(item.properties||[]).member? 'nav'
|
139
141
|
}.size == 0
|
140
142
|
generate_nav_doc
|
141
143
|
end
|
144
|
+
|
145
|
+
@package.spine.remove_with_idlist @package.manifest.item_list.map {
|
146
|
+
|href, item|
|
147
|
+
item.fallback
|
148
|
+
}.reject(&:nil?)
|
149
|
+
|
142
150
|
end
|
151
|
+
end
|
152
|
+
|
153
|
+
def write_to_epub_container(epub)
|
154
|
+
epub.put_next_entry('mimetype', '', '', Zip::ZipEntry::STORED)
|
155
|
+
epub << "application/epub+zip"
|
156
|
+
epub.put_next_entry('META-INF/container.xml')
|
157
|
+
epub << container_xml
|
143
158
|
|
159
|
+
epub.put_next_entry(@package.path)
|
160
|
+
epub << opf_xml
|
161
|
+
|
162
|
+
@package.manifest.item_list.each {
|
163
|
+
|k, item|
|
164
|
+
epub.put_next_entry(@package.contents_prefix + item.href)
|
165
|
+
epub << item.content
|
166
|
+
}
|
167
|
+
end
|
168
|
+
|
169
|
+
def generate_epub_stream
|
170
|
+
cleanup
|
171
|
+
Zip::ZipOutputStream::write_buffer {
|
172
|
+
|epub|
|
173
|
+
write_to_epub_container(epub)
|
174
|
+
}
|
175
|
+
end
|
176
|
+
|
177
|
+
def generate_epub(path_to_epub)
|
178
|
+
cleanup
|
144
179
|
File.delete(path_to_epub) if File.exist?(path_to_epub)
|
145
180
|
Zip::ZipOutputStream::open(path_to_epub) {
|
146
181
|
|epub|
|
147
|
-
epub
|
148
|
-
epub << "application/epub+zip"
|
149
|
-
epub.put_next_entry('META-INF/container.xml')
|
150
|
-
epub << container_xml
|
151
|
-
|
152
|
-
epub.put_next_entry(@package.path)
|
153
|
-
epub << opf_xml
|
154
|
-
|
155
|
-
@package.manifest.item_list.each {
|
156
|
-
|k, item|
|
157
|
-
epub.put_next_entry(@package.contents_prefix + item.href)
|
158
|
-
epub << item.content
|
159
|
-
}
|
182
|
+
write_to_epub_container(epub)
|
160
183
|
}
|
161
184
|
end
|
162
185
|
|
data/lib/gepub/builder.rb
CHANGED
@@ -73,7 +73,7 @@ module GEPUB
|
|
73
73
|
@last_defined_item = vals.map {
|
74
74
|
|v|
|
75
75
|
name = v
|
76
|
-
role = ''
|
76
|
+
role = 'aut'
|
77
77
|
name,role = v[0], v[1] if Array === name
|
78
78
|
MetaItem.new(@book.add_creator(name, nil, role))
|
79
79
|
}
|
@@ -121,7 +121,7 @@ module GEPUB
|
|
121
121
|
end
|
122
122
|
|
123
123
|
def generate_epub_stream
|
124
|
-
|
124
|
+
@book.generate_epub_stream
|
125
125
|
end
|
126
126
|
end
|
127
127
|
end
|
data/lib/gepub/metadata.rb
CHANGED
data/lib/gepub/spine.rb
CHANGED
data/lib/gepub/version.rb
CHANGED
data/spec/builder_spec.rb
CHANGED
@@ -291,12 +291,11 @@ describe GEPUB::Builder do
|
|
291
291
|
end
|
292
292
|
|
293
293
|
it 'should handle fallback chain' do
|
294
|
-
# in this test, do not supply
|
295
294
|
workdir = File.join(File.dirname(__FILE__),'fixtures', 'builder')
|
296
295
|
builder = GEPUB::Builder.new {
|
297
296
|
resources(:workdir => workdir) {
|
298
297
|
fallback_group {
|
299
|
-
file 'chap3_docbook.
|
298
|
+
file 'chap3_docbook.xml' => nil
|
300
299
|
media_type('application/docbook+xml')
|
301
300
|
file 'chap3.xml' => nil
|
302
301
|
media_type("application/z3986-auth+xml")
|
@@ -305,7 +304,7 @@ describe GEPUB::Builder do
|
|
305
304
|
}
|
306
305
|
}
|
307
306
|
builder.instance_eval {
|
308
|
-
fallbackid = @book.item_by_href('chap3_docbook.
|
307
|
+
fallbackid = @book.item_by_href('chap3_docbook.xml').fallback
|
309
308
|
@book.items[fallbackid].href.should == 'chap3.xml'
|
310
309
|
|
311
310
|
fallbackid = @book.items[fallbackid].fallback
|
@@ -318,11 +317,11 @@ describe GEPUB::Builder do
|
|
318
317
|
workdir = File.join(File.dirname(__FILE__),'fixtures', 'builder')
|
319
318
|
builder = GEPUB::Builder.new {
|
320
319
|
resources(:workdir => workdir) {
|
321
|
-
fallback_chain_files
|
320
|
+
fallback_chain_files({'chap3_docbook.xml' => nil}, {'chap3.xml' => nil}, {'chap3.xhtml' => nil})
|
322
321
|
}
|
323
322
|
}
|
324
323
|
builder.instance_eval {
|
325
|
-
fallbackid = @book.item_by_href('chap3_docbook.
|
324
|
+
fallbackid = @book.item_by_href('chap3_docbook.xml').fallback
|
326
325
|
@book.items[fallbackid].href.should == 'chap3.xml'
|
327
326
|
|
328
327
|
fallbackid = @book.items[fallbackid].fallback
|
@@ -331,18 +330,17 @@ describe GEPUB::Builder do
|
|
331
330
|
end
|
332
331
|
|
333
332
|
it 'should handle fallback chain with fallback_chain_files in with_media_type' do
|
334
|
-
# in this test, do not supply
|
335
333
|
workdir = File.join(File.dirname(__FILE__),'fixtures', 'builder')
|
336
334
|
builder = GEPUB::Builder.new {
|
337
335
|
resources(:workdir => workdir) {
|
338
336
|
with_media_type('application/docbook+xml', 'application/z3986-auth+xml', 'application/xhtml+xml') {
|
339
|
-
fallback_chain_files
|
337
|
+
fallback_chain_files({'chap3_docbook.xml' => nil}, {'chap3.xml' => nil}, {'chap3.xhtml' => nil})
|
340
338
|
}
|
341
339
|
}
|
342
340
|
}
|
343
341
|
builder.instance_eval {
|
344
|
-
@book.item_by_href('chap3_docbook.
|
345
|
-
fallbackid = @book.item_by_href('chap3_docbook.
|
342
|
+
@book.item_by_href('chap3_docbook.xml').media_type.should == 'application/docbook+xml'
|
343
|
+
fallbackid = @book.item_by_href('chap3_docbook.xml').fallback
|
346
344
|
@book.items[fallbackid].href.should == 'chap3.xml'
|
347
345
|
@book.items[fallbackid].media_type.should == 'application/z3986-auth+xml'
|
348
346
|
|
@@ -352,5 +350,35 @@ describe GEPUB::Builder do
|
|
352
350
|
}
|
353
351
|
end
|
354
352
|
|
353
|
+
it 'should handle fallback chain in spine' do
|
354
|
+
workdir = File.join(File.dirname(__FILE__),'fixtures', 'builder')
|
355
|
+
builder = GEPUB::Builder.new {
|
356
|
+
unique_identifier 'uid'
|
357
|
+
|
358
|
+
resources(:workdir => workdir) {
|
359
|
+
ordered {
|
360
|
+
fallback_group {
|
361
|
+
file 'chap3_docbook.xml' => nil
|
362
|
+
media_type('application/docbook+xml')
|
363
|
+
file 'chap3.xml' => nil
|
364
|
+
media_type("application/z3986-auth+xml")
|
365
|
+
file 'chap3.xhtml' => nil
|
366
|
+
}
|
367
|
+
}
|
368
|
+
}
|
369
|
+
}
|
370
|
+
builder.instance_eval {
|
371
|
+
@book.cleanup
|
372
|
+
fallbackid = @book.item_by_href('chap3_docbook.xml').fallback
|
373
|
+
@book.items[fallbackid].href.should == 'chap3.xml'
|
374
|
+
fallbackid = @book.items[fallbackid].fallback
|
375
|
+
@book.items[fallbackid].href.should == 'chap3.xhtml'
|
376
|
+
|
377
|
+
@book.spine_items.size.should == 1
|
378
|
+
@book.spine_items[0].href == 'chap3_docbook.xhtml'
|
379
|
+
|
380
|
+
}
|
381
|
+
end
|
382
|
+
|
355
383
|
end
|
356
384
|
end
|
data/spec/example_spec.rb
CHANGED
@@ -7,6 +7,38 @@ describe 'GEPUB usage' do
|
|
7
7
|
end
|
8
8
|
|
9
9
|
context 'On generating EPUB' do
|
10
|
+
it 'should generate simple EPUB3 with Builder and buffer' do
|
11
|
+
workdir = File.join(File.dirname(__FILE__), 'fixtures', 'testdata')
|
12
|
+
builder = GEPUB::Builder.new {
|
13
|
+
unique_identifier 'http:/example.jp/bookid_in_url', 'BookID', 'URL'
|
14
|
+
language 'ja'
|
15
|
+
title 'GEPUBサンプル文書'
|
16
|
+
file_as 'GEPUB Sample Book'
|
17
|
+
alt 'en' => 'GEPUB Sample Book (Japanese)',
|
18
|
+
'el' => 'GEPUB δείγμα (Ιαπωνικά)',
|
19
|
+
'th' => 'GEPUB ตัวอย่าง (ญี่ปุ่น)'
|
20
|
+
|
21
|
+
subtitle 'これはあくまでサンプルです'
|
22
|
+
alt 'en' => 'This book is just a sample'
|
23
|
+
creator '小嶋智'
|
24
|
+
contributors 'Denshobu', 'Asagaya Densho', 'Shonan Densho Teidan', 'eMagazine Torutaru'
|
25
|
+
resources(:workdir => workdir) {
|
26
|
+
cover_image 'img/image1.jpg' => 'image1.jpg'
|
27
|
+
ordered {
|
28
|
+
file 'text/chap1.xhtml' => StringIO.new('<html xmlns="http://www.w3.org/1999/xhtml"><head><title>c1</title></head><body><p>the first page</p></body></html>')
|
29
|
+
heading 'Chapter 1'
|
30
|
+
file 'text/chap1-1.xhtml' => StringIO.new('<html xmlns="http://www.w3.org/1999/xhtml"><head><title>c2</title></head><body><p>the second page</p></body></html>')
|
31
|
+
file 'text/chap2.html' => StringIO.new('<html xmlns="http://www.w3.org/1999/xhtml"><head><title>c3</title></head><body><p>the third page</p></body></html>')
|
32
|
+
heading 'Chapter 2'
|
33
|
+
}
|
34
|
+
}
|
35
|
+
}
|
36
|
+
epubname = File.join(File.dirname(__FILE__), 'example_test_with_builder_buffer.epub')
|
37
|
+
File.open(epubname, 'wb') { |io| io.write builder.generate_epub_stream.string }
|
38
|
+
jar = File.join(File.dirname(__FILE__), 'fixtures/epubcheck-3.0b4/epubcheck-3.0b4.jar')
|
39
|
+
system 'java' '-jar', jar, epubname
|
40
|
+
end
|
41
|
+
|
10
42
|
it 'should generate simple EPUB3 with Builder' do
|
11
43
|
workdir = File.join(File.dirname(__FILE__), 'fixtures', 'testdata')
|
12
44
|
builder = GEPUB::Builder.new {
|
data/spec/gepub_spec.rb
CHANGED
@@ -158,6 +158,16 @@ EOF
|
|
158
158
|
system 'java', '-jar', jar, epubname
|
159
159
|
end
|
160
160
|
|
161
|
+
it "should generate correct epub with buffer" do
|
162
|
+
epubname = File.join(File.dirname(__FILE__), 'testepub_buf.epub')
|
163
|
+
File.open(epubname, 'wb') {
|
164
|
+
|io|
|
165
|
+
io.write @book.generate_epub_stream.string
|
166
|
+
}
|
167
|
+
jar = File.join(File.dirname(__FILE__), 'fixtures/epubcheck-3.0b4/epubcheck-3.0b4.jar')
|
168
|
+
system 'java', '-jar', jar, epubname
|
169
|
+
end
|
170
|
+
|
161
171
|
it "should generate correct epub2.0" do
|
162
172
|
epubname = File.join(File.dirname(__FILE__), 'testepub2.epub')
|
163
173
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gepub
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.3
|
4
|
+
version: 0.6.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
12
|
+
date: 2012-02-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70317965172840 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '2'
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70317965172840
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: nokogiri
|
27
|
-
requirement: &
|
27
|
+
requirement: &70317964165820 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 1.5.0
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70317964165820
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rubyzip
|
38
|
-
requirement: &
|
38
|
+
requirement: &70317964163220 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: 0.9.6
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70317964163220
|
47
47
|
description: gepub is a generic EPUB parser/generator. Generates and parse EPUB2 and
|
48
48
|
EPUB3
|
49
49
|
email:
|
@@ -53,7 +53,6 @@ executables:
|
|
53
53
|
extensions: []
|
54
54
|
extra_rdoc_files: []
|
55
55
|
files:
|
56
|
-
- .document
|
57
56
|
- .gitignore
|
58
57
|
- .travis.yml
|
59
58
|
- Gemfile
|