eeepub 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +15 -0
- data/VERSION +1 -1
- data/examples/basic.rb +18 -0
- data/examples/files/bar.html +10 -0
- data/examples/files/foo.html +10 -0
- data/lib/eeepub/basic.rb +44 -0
- data/lib/eeepub/container_item.rb +0 -11
- data/lib/eeepub/opf.rb +39 -25
- data/lib/eeepub.rb +1 -0
- data/spec/eeepub/opf_spec.rb +54 -37
- metadata +8 -5
- data/examples/simple.rb +0 -53
data/README.md
CHANGED
@@ -6,6 +6,21 @@ EeePub is a Ruby ePub generator.
|
|
6
6
|
Usage
|
7
7
|
-------
|
8
8
|
|
9
|
+
### Basic
|
10
|
+
|
11
|
+
epub = EeePub::Basic.new(
|
12
|
+
:title => 'simple',
|
13
|
+
:id => {'URL' => 'http://example.com/book/foo'},
|
14
|
+
:uid => 'http://example.com/book/foo'
|
15
|
+
)
|
16
|
+
epub.files << '/path/to/foo.html'
|
17
|
+
epub.files << '/path/to/bar.html'
|
18
|
+
epub.nav << {:label => '1. foo', :content => 'foo.html'}
|
19
|
+
epub.nav << {:label => '2. bar', :content => 'bar.html'}
|
20
|
+
epub.save('sample.epub')
|
21
|
+
|
22
|
+
### Raw
|
23
|
+
|
9
24
|
Create NCX:
|
10
25
|
|
11
26
|
EeePub::NCX.new(
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
data/examples/basic.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
2
|
+
require 'rubygems'
|
3
|
+
require 'eeepub'
|
4
|
+
|
5
|
+
dir = File.join(File.dirname(__FILE__), 'files')
|
6
|
+
|
7
|
+
epub = EeePub::Basic.new(
|
8
|
+
:title => 'simple',
|
9
|
+
:id => {'URL' => 'http://example.com/book/foo'},
|
10
|
+
:uid => 'http://example.com/book/foo'
|
11
|
+
)
|
12
|
+
epub.files << File.join(dir, 'foo.html')
|
13
|
+
epub.files << File.join(dir, 'bar.html')
|
14
|
+
epub.nav << {:label => '1. foo', :content => 'foo.html'}
|
15
|
+
epub.nav << {:label => '2. bar', :content => 'bar.html'}
|
16
|
+
epub.save('sample.epub')
|
17
|
+
|
18
|
+
puts "complete! => 'sample.epub'"
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
|
4
|
+
<head>
|
5
|
+
<title></title>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<h1>bar</h1>
|
9
|
+
</body>
|
10
|
+
</html>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
3
|
+
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja">
|
4
|
+
<head>
|
5
|
+
<title></title>
|
6
|
+
</head>
|
7
|
+
<body>
|
8
|
+
<h1>foo</h1>
|
9
|
+
</body>
|
10
|
+
</html>
|
data/lib/eeepub/basic.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'tmpdir'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module EeePub
|
5
|
+
class Basic
|
6
|
+
attr_accessor :title, :id, :uid, :files, :nav
|
7
|
+
|
8
|
+
def initialize(values)
|
9
|
+
values.each do |k, v|
|
10
|
+
self.send(:"#{k}=", v)
|
11
|
+
end
|
12
|
+
@files ||= []
|
13
|
+
@nav ||= []
|
14
|
+
end
|
15
|
+
|
16
|
+
def save(filename)
|
17
|
+
dir = Dir.mktmpdir
|
18
|
+
|
19
|
+
files.each do |file|
|
20
|
+
FileUtils.cp(file, dir)
|
21
|
+
end
|
22
|
+
|
23
|
+
EeePub::NCX.new(
|
24
|
+
:uid => uid,
|
25
|
+
:title => title,
|
26
|
+
:nav => nav
|
27
|
+
).save(File.join(dir, 'toc.ncx'))
|
28
|
+
|
29
|
+
EeePub::OPF.new(
|
30
|
+
:title => title,
|
31
|
+
:identifier => id,
|
32
|
+
:manifest => files.map{|i| File.basename(i)},
|
33
|
+
:ncx => 'toc.ncx'
|
34
|
+
).save(File.join(dir, 'content.opf'))
|
35
|
+
|
36
|
+
EeePub::OCF.new(
|
37
|
+
:dir => dir,
|
38
|
+
:container => 'content.opf'
|
39
|
+
).save(filename)
|
40
|
+
|
41
|
+
FileUtils.rm_rf(dir)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,10 +1,7 @@
|
|
1
|
-
require 'erb' # TODO 消す
|
2
1
|
require 'builder'
|
3
2
|
|
4
3
|
module EeePub
|
5
4
|
class ContainerItem
|
6
|
-
include ERB::Util
|
7
|
-
|
8
5
|
class << self
|
9
6
|
def default_value(name, default)
|
10
7
|
instance_variable_name = "@#{name}"
|
@@ -38,14 +35,6 @@ module EeePub
|
|
38
35
|
out
|
39
36
|
end
|
40
37
|
|
41
|
-
def erb(filename)
|
42
|
-
ERB.new(
|
43
|
-
File.read(File.join(TEMPLATE_DIR, filename)),
|
44
|
-
nil,
|
45
|
-
'-'
|
46
|
-
)
|
47
|
-
end
|
48
|
-
|
49
38
|
def save(filepath)
|
50
39
|
File.open(filepath, 'w') do |file|
|
51
40
|
file << self.to_xml
|
data/lib/eeepub/opf.rb
CHANGED
@@ -43,21 +43,10 @@ module EeePub
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def spine
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
id = i
|
51
|
-
media_type = guess_media_type(i)
|
52
|
-
when Hash
|
53
|
-
id = i[:id]
|
54
|
-
media_type = i[:media_type] || guess_media_type(i[:href])
|
55
|
-
end
|
56
|
-
media_type == 'application/xhtml+xml' ? id : nil
|
57
|
-
end
|
58
|
-
@spine = items.compact
|
59
|
-
end
|
60
|
-
@spine
|
46
|
+
@spine ||
|
47
|
+
complete_manifest.
|
48
|
+
select { |i| i[:media_type] == 'application/xhtml+xml' }.
|
49
|
+
map { |i| i[:id]}
|
61
50
|
end
|
62
51
|
|
63
52
|
def build_xml(builder)
|
@@ -96,17 +85,9 @@ module EeePub
|
|
96
85
|
end
|
97
86
|
|
98
87
|
def build_manifest(builder)
|
99
|
-
items = manifest + [{:id => 'ncx', :href => ncx}]
|
100
88
|
builder.manifest do
|
101
|
-
|
102
|
-
|
103
|
-
when Hash
|
104
|
-
builder.item :id => i[:id], :href => i[:href], 'media-type' => i[:media_type] || guess_media_type(i[:href])
|
105
|
-
when String
|
106
|
-
builder.item :id => i, :href => i, 'media-type' => guess_media_type(i)
|
107
|
-
else
|
108
|
-
raise 'manifest item must be Hash or String'
|
109
|
-
end
|
89
|
+
complete_manifest.each do |i|
|
90
|
+
builder.item :id => i[:id], :href => i[:href], 'media-type' => i[:media_type]
|
110
91
|
end
|
111
92
|
end
|
112
93
|
end
|
@@ -118,5 +99,38 @@ module EeePub
|
|
118
99
|
end
|
119
100
|
end
|
120
101
|
end
|
102
|
+
|
103
|
+
def complete_manifest
|
104
|
+
item_id_cache = {}
|
105
|
+
|
106
|
+
result = manifest.map do |i|
|
107
|
+
case i
|
108
|
+
when String
|
109
|
+
id = create_unique_item_id(i, item_id_cache)
|
110
|
+
href = i
|
111
|
+
media_type = guess_media_type(i)
|
112
|
+
when Hash
|
113
|
+
id = i[:id] || create_unique_item_id(i[:href], item_id_cache)
|
114
|
+
href = i[:href]
|
115
|
+
media_type = i[:media_type] || guess_media_type(i[:href])
|
116
|
+
end
|
117
|
+
{:id => id, :href => href, :media_type => media_type}
|
118
|
+
end
|
119
|
+
|
120
|
+
result += [{:id => 'ncx', :href => ncx, :media_type => 'application/x-dtbncx+xml'}] if ncx
|
121
|
+
result
|
122
|
+
end
|
123
|
+
|
124
|
+
def create_unique_item_id(filename, id_cache)
|
125
|
+
basename = File.basename(filename)
|
126
|
+
unless id_cache[basename]
|
127
|
+
id_cache[basename] = 0
|
128
|
+
name = basename
|
129
|
+
else
|
130
|
+
name = "#{basename}-#{id_cache[basename]}"
|
131
|
+
end
|
132
|
+
id_cache[basename] += 1
|
133
|
+
name
|
134
|
+
end
|
121
135
|
end
|
122
136
|
end
|
data/lib/eeepub.rb
CHANGED
data/spec/eeepub/opf_spec.rb
CHANGED
@@ -17,36 +17,6 @@ describe "EeePub::OPF" do
|
|
17
17
|
@opf.language.should == 'en'
|
18
18
|
end
|
19
19
|
|
20
|
-
describe 'spec of identifier' do
|
21
|
-
context 'specify as Array' do
|
22
|
-
before { @opf.identifier = [{:scheme => 'ISBN', :value => '978-4-00-310101-8'}] }
|
23
|
-
it 'should return value' do
|
24
|
-
@opf.identifier.should == [{:scheme => 'ISBN', :value => '978-4-00-310101-8'}]
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
context 'specify as Hash' do
|
29
|
-
before { @opf.identifier = {:scheme => 'ISBN', :value => '978-4-00-310101-8'} }
|
30
|
-
it 'should return value' do
|
31
|
-
@opf.identifier.should == [{:scheme => 'ISBN', :value => '978-4-00-310101-8', :id => @opf.unique_identifier}]
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
context 'specify as Hash(scheme => value)' do
|
36
|
-
before { @opf.identifier = {'ISBN' => '978-4-00-310101-8'} }
|
37
|
-
it 'should return value' do
|
38
|
-
@opf.identifier.should == [{:scheme => 'ISBN', :value => '978-4-00-310101-8', :id => @opf.unique_identifier}]
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
context 'specify as String' do
|
43
|
-
before { @opf.identifier = '978-4-00-310101-8' }
|
44
|
-
it 'should return value' do
|
45
|
-
@opf.identifier.should == [{:value => '978-4-00-310101-8', :id => @opf.unique_identifier}]
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
20
|
it 'should export as xml' do
|
51
21
|
doc = Nokogiri::XML(@opf.to_xml)
|
52
22
|
doc.at('package').attribute('unique-identifier').value.should == @opf.unique_identifier
|
@@ -89,9 +59,58 @@ describe "EeePub::OPF" do
|
|
89
59
|
spine.should_not be_nil
|
90
60
|
spine = spine.search('itemref')
|
91
61
|
spine.size.should == 2
|
92
|
-
spine.
|
93
|
-
|
94
|
-
|
62
|
+
spine[0].attribute('idref').value.should == 'foo.html'
|
63
|
+
spine[1].attribute('idref').value.should == 'bar.html'
|
64
|
+
end
|
65
|
+
|
66
|
+
describe 'spec of identifier' do
|
67
|
+
context 'specify as Array' do
|
68
|
+
before { @opf.identifier = [{:scheme => 'ISBN', :value => '978-4-00-310101-8'}] }
|
69
|
+
it 'should return value' do
|
70
|
+
@opf.identifier.should == [{:scheme => 'ISBN', :value => '978-4-00-310101-8'}]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'specify as Hash' do
|
75
|
+
before { @opf.identifier = {:scheme => 'ISBN', :value => '978-4-00-310101-8'} }
|
76
|
+
it 'should return value' do
|
77
|
+
@opf.identifier.should == [{:scheme => 'ISBN', :value => '978-4-00-310101-8', :id => @opf.unique_identifier}]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
context 'specify as Hash(scheme => value)' do
|
82
|
+
before { @opf.identifier = {'ISBN' => '978-4-00-310101-8'} }
|
83
|
+
it 'should return value' do
|
84
|
+
@opf.identifier.should == [{:scheme => 'ISBN', :value => '978-4-00-310101-8', :id => @opf.unique_identifier}]
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
context 'specify as String' do
|
89
|
+
before { @opf.identifier = '978-4-00-310101-8' }
|
90
|
+
it 'should return value' do
|
91
|
+
@opf.identifier.should == [{:value => '978-4-00-310101-8', :id => @opf.unique_identifier}]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
describe 'spec of create_unique_item_id' do
|
97
|
+
it 'should return unique item id' do
|
98
|
+
id_cache = {}
|
99
|
+
@opf.create_unique_item_id('foo/bar/test.html', id_cache).should == 'test.html'
|
100
|
+
@opf.create_unique_item_id('foo/bar/test.html', id_cache).should == 'test.html-1'
|
101
|
+
@opf.create_unique_item_id('foo/bar/TEST.html', id_cache).should == 'TEST.html'
|
102
|
+
@opf.create_unique_item_id('foo/bar/test.html.1', id_cache).should == 'test.html.1'
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
context 'ncx is nil' do
|
107
|
+
before do
|
108
|
+
@opf.ncx = nil
|
109
|
+
end
|
110
|
+
|
111
|
+
it 'should not set ncx to manifest' do
|
112
|
+
doc = Nokogiri::XML(@opf.to_xml)
|
113
|
+
doc.search('manifest/item[id=ncx]').should be_empty
|
95
114
|
end
|
96
115
|
end
|
97
116
|
|
@@ -180,10 +199,8 @@ describe "EeePub::OPF" do
|
|
180
199
|
spine.should_not be_nil
|
181
200
|
spine = spine.search('itemref')
|
182
201
|
spine.size.should == 2
|
183
|
-
spine.
|
184
|
-
|
185
|
-
itemref.attribute('idref').value.should == expect
|
186
|
-
end
|
202
|
+
spine[0].attribute('idref').value.should == 'a'
|
203
|
+
spine[1].attribute('idref').value.should == 'b'
|
187
204
|
end
|
188
205
|
end
|
189
206
|
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
7
|
+
- 3
|
8
8
|
- 0
|
9
|
-
version: 0.
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- jugyo
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-05-
|
17
|
+
date: 2010-05-06 00:00:00 +09:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -55,8 +55,11 @@ files:
|
|
55
55
|
- README.md
|
56
56
|
- Rakefile
|
57
57
|
- VERSION
|
58
|
-
- examples/
|
58
|
+
- examples/basic.rb
|
59
|
+
- examples/files/bar.html
|
60
|
+
- examples/files/foo.html
|
59
61
|
- lib/eeepub.rb
|
62
|
+
- lib/eeepub/basic.rb
|
60
63
|
- lib/eeepub/container_item.rb
|
61
64
|
- lib/eeepub/ncx.rb
|
62
65
|
- lib/eeepub/ocf.rb
|
@@ -102,4 +105,4 @@ test_files:
|
|
102
105
|
- spec/eeepub/opf_spec.rb
|
103
106
|
- spec/eeepub_spec.rb
|
104
107
|
- spec/spec_helper.rb
|
105
|
-
- examples/
|
108
|
+
- examples/basic.rb
|
data/examples/simple.rb
DELETED
@@ -1,53 +0,0 @@
|
|
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">
|
20
|
-
<head>
|
21
|
-
<title></title>
|
22
|
-
</head>
|
23
|
-
<body>
|
24
|
-
<h1>#{name}</h1>
|
25
|
-
</body>
|
26
|
-
</html>
|
27
|
-
HTML
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
# Create NCX
|
32
|
-
EeePub::NCX.new(
|
33
|
-
:uid => 'xxxx',
|
34
|
-
:title => 'simple',
|
35
|
-
:nav => [
|
36
|
-
{:label => '1. foo', :content => 'foo.html'},
|
37
|
-
{:label => '2. bar', :content => 'bar.html'}
|
38
|
-
]
|
39
|
-
).save(File.join(dir, 'toc.ncx'))
|
40
|
-
|
41
|
-
# Create OPF
|
42
|
-
EeePub::OPF.new(
|
43
|
-
:title => 'simple',
|
44
|
-
:identifier => {'ISBN' => '0-0000000-0-0'},
|
45
|
-
:manifest => ['foo.html', 'bar.html'],
|
46
|
-
:ncx => 'toc.ncx'
|
47
|
-
).save(File.join(dir, 'content.opf'))
|
48
|
-
|
49
|
-
# Create OCF
|
50
|
-
EeePub::OCF.new(
|
51
|
-
:dir => dir,
|
52
|
-
:container => 'content.opf'
|
53
|
-
).save(epub_name)
|