review 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +1 -0
- data/ChangeLog +100 -0
- data/README.rdoc +11 -12
- data/Rakefile +6 -2
- data/bin/review-check +1 -1
- data/bin/review-compile +13 -4
- data/bin/review-epubmaker +172 -24
- data/bin/review-epubmaker-ng +8 -161
- data/bin/review-index +1 -1
- data/bin/review-init +17 -5
- data/bin/review-pdfmaker +40 -19
- data/bin/review-preproc +1 -1
- data/bin/review-validate +2 -2
- data/bin/review-vol +1 -1
- data/debian/control +2 -2
- data/doc/format.rdoc +23 -6
- data/doc/format_idg.rdoc +3 -3
- data/doc/libepubmaker/config.yaml +163 -0
- data/doc/quickstart.rdoc +27 -27
- data/doc/sample.yaml +10 -5
- data/lib/epubmaker.rb +2 -5
- data/lib/epubmaker/content.rb +9 -6
- data/lib/epubmaker/epubv2.rb +233 -109
- data/lib/epubmaker/epubv3.rb +83 -119
- data/lib/epubmaker/producer.rb +50 -20
- data/lib/epubmaker/resource.rb +22 -8
- data/lib/review/book/base.rb +1 -0
- data/lib/review/book/chapter.rb +2 -2
- data/lib/review/book/compilable.rb +1 -1
- data/lib/review/book/index.rb +33 -27
- data/lib/review/book/parameters.rb +3 -2
- data/lib/review/book/part.rb +1 -1
- data/lib/review/builder.rb +10 -42
- data/lib/review/compiler.rb +1 -1
- data/lib/review/configure.rb +3 -3
- data/lib/review/epubmaker.rb +428 -0
- data/lib/review/htmlbuilder.rb +45 -95
- data/lib/review/htmlutils.rb +2 -0
- data/lib/review/i18n.yaml +25 -0
- data/lib/review/idgxmlbuilder.rb +11 -9
- data/lib/review/inaobuilder.rb +1 -1
- data/lib/review/latexbuilder.rb +7 -6
- data/lib/review/latexutils.rb +6 -0
- data/lib/review/makerhelper.rb +4 -2
- data/lib/review/markdownbuilder.rb +8 -0
- data/lib/review/sec_counter.rb +71 -0
- data/lib/review/topbuilder.rb +0 -1
- data/lib/review/version.rb +2 -2
- data/review.gemspec +4 -4
- data/test/sample-book/README.md +2 -2
- data/test/sample-book/src/Rakefile +2 -2
- data/test/sample-book/src/config.yml +4 -4
- data/test/sample-book/src/images/cover.jpg +0 -0
- data/test/sample-book/src/sty/{samplemacro.sty → reviewmacro.sty} +1 -1
- data/test/test_book_parameter.rb +1 -1
- data/test/test_epubmaker.rb +77 -15
- data/test/test_epubmaker_cmd.rb +11 -7
- data/test/test_helper.rb +7 -0
- data/test/test_htmlbuilder.rb +39 -6
- data/test/test_idgxmlbuilder.rb +14 -2
- data/test/test_inaobuilder.rb +2 -1
- data/test/test_latexbuilder.rb +23 -2
- data/test/test_makerhelper.rb +19 -3
- data/test/test_markdownbuilder.rb +35 -0
- data/test/test_pdfmaker_cmd.rb +11 -7
- data/test/test_topbuilder.rb +36 -2
- metadata +18 -18
- data/VERSION +0 -1
- data/doc/libepubmaker/sample.yaml +0 -90
data/lib/epubmaker/epubv3.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# = epubv3.rb -- EPUB version 3 producer.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2010 Kenshi Muto
|
4
|
+
# Copyright (c) 2010-2013 Kenshi Muto
|
5
5
|
#
|
6
6
|
# This program is free software.
|
7
7
|
# You can distribute or modify this program under the terms of
|
@@ -15,152 +15,100 @@ module EPUBMaker
|
|
15
15
|
|
16
16
|
# EPUBv3 is EPUB version 3 producer.
|
17
17
|
class EPUBv3 < EPUBv2
|
18
|
+
def opf_guide
|
19
|
+
s = ""
|
20
|
+
s << %Q[ <guide>\n]
|
21
|
+
s << %Q[ <reference type="cover" title="#{@producer.res.v("covertitle")}" href="#{@producer.params["cover"]}"/>\n]
|
22
|
+
s << %Q[ <reference type="title-page" title="#{@producer.res.v("titlepagetitle")}" href="titlepage.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["titlepage"].nil?
|
23
|
+
s << %Q[ <reference type="toc" title="#{@producer.res.v("toctitle")}" href="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}"/>\n]
|
24
|
+
s << %Q[ <reference type="colophon" title="#{@producer.res.v("colophontitle")}" href="colophon.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["colophon"].nil?
|
25
|
+
s << %Q[ </guide>\n]
|
26
|
+
s
|
27
|
+
end
|
28
|
+
|
18
29
|
def ncx(indentarray)
|
19
|
-
# FIXME: handle indentarray
|
20
30
|
s = common_header
|
21
31
|
s << <<EOT
|
22
32
|
<title>#{@producer.res.v("toctitle")}</title>
|
23
33
|
</head>
|
24
34
|
<body>
|
25
|
-
<nav epub:type="toc" id="toc">
|
35
|
+
<nav xmlns:epub="http://www.idpf.org/2007/ops" epub:type="toc" id="toc">
|
26
36
|
<h1 class="toc-title">#{@producer.res.v("toctitle")}</h1>
|
27
|
-
<ul class="toc-h1">
|
28
37
|
EOT
|
29
38
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
if item.level > current
|
35
|
-
s << %Q[\n<ul class="toc-h#{item.level}">\n]
|
36
|
-
current = item.level
|
37
|
-
elsif item.level < current
|
38
|
-
(current - 1).downto(item.level) do |n|
|
39
|
-
s << %Q[</li>\n</ul>\n]
|
40
|
-
end
|
41
|
-
s << %Q[</li>\n]
|
42
|
-
current = item.level
|
43
|
-
elsif init_item
|
44
|
-
# noop
|
45
|
-
else
|
46
|
-
s << %Q[</li>\n]
|
47
|
-
end
|
48
|
-
s << %Q[<li><a href="#{item.file}">#{item.title}</a>]
|
49
|
-
init_item = false
|
50
|
-
end
|
51
|
-
|
52
|
-
(current - 1).downto(1) do |n|
|
53
|
-
s << %Q[</li>\n</ul>\n]
|
54
|
-
end
|
55
|
-
if !init_item
|
56
|
-
s << %Q[</li>\n]
|
39
|
+
if @producer.params["flattoc"].nil?
|
40
|
+
s << hierarchy_ncx("ol")
|
41
|
+
else
|
42
|
+
s << flat_ncx("ol", @producer.params["flattocindent"])
|
57
43
|
end
|
58
44
|
s << <<EOT
|
59
|
-
</ul>
|
60
45
|
</nav>
|
61
46
|
</body>
|
62
47
|
</html>
|
63
48
|
EOT
|
64
|
-
|
49
|
+
s
|
65
50
|
end
|
66
51
|
|
67
52
|
# Produce EPUB file +epubfile+.
|
68
53
|
# +basedir+ points the directory has contents.
|
69
54
|
# +tmpdir+ defines temporary directory.
|
70
55
|
def produce(epubfile, basedir, tmpdir)
|
71
|
-
|
72
|
-
|
73
|
-
Dir.mkdir("#{tmpdir}/META-INF") unless File.exist?("#{tmpdir}/META-INF")
|
74
|
-
File.open("#{tmpdir}/META-INF/container.xml", "w") {|f| @producer.container(f) }
|
75
|
-
|
76
|
-
Dir.mkdir("#{tmpdir}/OEBPS") unless File.exist?("#{tmpdir}/OEBPS")
|
77
|
-
File.open("#{tmpdir}/OEBPS/#{@producer.params["bookname"]}.opf", "w") {|f| @producer.opf(f) }
|
56
|
+
produce_write_common(basedir, tmpdir)
|
57
|
+
|
78
58
|
File.open("#{tmpdir}/OEBPS/#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}", "w") {|f| @producer.ncx(f, @producer.params["ncxindent"]) }
|
79
|
-
# File.open("#{tmpdir}/OEBPS/#{@producer.params["tocfile"]}", "w") {|f| @producer.mytoc(f) } unless @producer.params["mytoc"].nil?
|
80
|
-
|
81
|
-
if File.exist?("#{basedir}/#{@producer.params["cover"]}")
|
82
|
-
FileUtils.cp("#{basedir}/#{@producer.params["cover"]}", "#{tmpdir}/OEBPS")
|
83
|
-
else
|
84
|
-
File.open("#{tmpdir}/OEBPS/#{@producer.params["cover"]}", "w") {|f| @producer.cover(f) }
|
85
|
-
end
|
86
|
-
|
87
|
-
# FIXME:colophon and titlepage should be included in @producer.contents.
|
88
|
-
|
89
|
-
@producer.contents.each do |item|
|
90
|
-
next if item.file =~ /#/ # skip subgroup
|
91
|
-
fname = "#{basedir}/#{item.file}"
|
92
|
-
raise "#{fname} doesn't exist. Abort." unless File.exist?(fname)
|
93
|
-
FileUtils.mkdir_p(File.dirname("#{tmpdir}/OEBPS/#{item.file}")) unless File.exist?(File.dirname("#{tmpdir}/OEBPS/#{item.file}"))
|
94
|
-
FileUtils.cp(fname, "#{tmpdir}/OEBPS/#{item.file}")
|
95
|
-
end
|
96
59
|
|
97
|
-
|
98
|
-
|
99
|
-
exec("zip", "-0X", "#{epubfile}", "mimetype")
|
100
|
-
}
|
101
|
-
}
|
102
|
-
Process.waitall
|
103
|
-
fork {
|
104
|
-
Dir.chdir(tmpdir) {|d|
|
105
|
-
exec("zip", "-Xr9D", "#{epubfile}", "META-INF", "OEBPS")
|
106
|
-
}
|
107
|
-
}
|
108
|
-
Process.waitall
|
60
|
+
@producer.call_hook(@producer.params["hook_prepack"], tmpdir)
|
61
|
+
export_zip(tmpdir, epubfile)
|
109
62
|
end
|
110
63
|
|
111
|
-
|
112
|
-
|
113
|
-
mathstr = @producer.params["mathml"].nil? ? "" : %Q[ properties="mathml"]
|
114
|
-
s = <<EOT
|
115
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
116
|
-
<package version="3.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId" xml:lang="#{@producer.params["language"]}" profile="http://www.idpf.org/epub/30/profile/package/">
|
117
|
-
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
|
118
|
-
EOT
|
64
|
+
def opf_metainfo
|
65
|
+
s = ""
|
119
66
|
%w[title language date type format source description relation coverage subject rights].each do |item|
|
120
67
|
next if @producer.params[item].nil?
|
121
68
|
if @producer.params[item].instance_of?(Array)
|
122
|
-
s << @producer.params[item].map {|i| %Q[ <dc:#{item}
|
123
|
-
s << @producer.params[item].map {|i| %Q[ <meta id="#{item}" property="dcterms:#{item}">#{CGI.escapeHTML(i.to_s)}</meta>\n]}.join
|
69
|
+
s << @producer.params[item].map.with_index {|v, i| %Q[ <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v.to_s)}</dc:#{item}>\n]}.join
|
124
70
|
else
|
125
|
-
s << %Q[ <dc:#{item}
|
126
|
-
s << %Q[ <meta id="#{item}" property="dcterms:#{item}">#{CGI.escapeHTML(@producer.params[item].to_s)}</meta>\n]
|
71
|
+
s << %Q[ <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.params[item].to_s)}</dc:#{item}>\n]
|
127
72
|
end
|
128
73
|
end
|
129
74
|
|
75
|
+
s << %Q[ <meta property="dcterms:modified">#{@producer.params["modified"]}</meta>\n]
|
76
|
+
|
130
77
|
# ID
|
131
78
|
if @producer.params["isbn"].nil?
|
132
|
-
s << %Q[ <dc:identifier id="BookId"
|
133
|
-
s << %Q[ <meta property="dcterms:identifier" id="bookid">#{@producer.params["urnid"]}</meta>\n]
|
79
|
+
s << %Q[ <dc:identifier id="BookId">#{@producer.params["urnid"]}</dc:identifier>\n]
|
134
80
|
else
|
135
|
-
s << %Q[ <dc:identifier id="BookId"
|
136
|
-
s << %Q[ <meta property="dcterms:identifier" id="bookid" opf:scheme="ISBN">#{@producer.params["isbn"]}</meta>\n]
|
81
|
+
s << %Q[ <dc:identifier id="BookId">#{@producer.params["isbn"]}</dc:identifier>\n]
|
137
82
|
end
|
138
|
-
|
139
|
-
# creator
|
140
|
-
%w[aut a-adp a-ann a-arr a-art a-asn a-aqt a-aft a-aui a-ant a-bkp a-clb a-cmm a-dsr a-edt a-ill a-lyr a-mdc a-mus a-nrt a-oth a-pht a-prt a-red a-rev a-spn a-ths a-trc a-trl].each do |role|
|
83
|
+
|
84
|
+
# creator (should be array)
|
85
|
+
%w[aut a-adp a-ann a-arr a-art a-asn a-aqt a-aft a-aui a-ant a-bkp a-clb a-cmm a-csl a-dsr a-edt a-ill a-lyr a-mdc a-mus a-nrt a-oth a-pht a-prt a-red a-rev a-spn a-ths a-trc a-trl].each do |role|
|
141
86
|
next if @producer.params[role].nil?
|
142
87
|
@producer.params[role].each_with_index do |v, i|
|
143
|
-
s << %Q[ <dc:creator
|
144
|
-
s << %Q[ <meta
|
88
|
+
s << %Q[ <dc:creator id="#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:creator>\n]
|
89
|
+
s << %Q[ <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role.sub('a-', '')}</meta>\n]
|
145
90
|
end
|
146
91
|
end
|
147
|
-
|
148
|
-
|
92
|
+
|
93
|
+
# contributor (should be array)
|
94
|
+
%w[adp ann arr art asn aqt aft aui ant bkp clb cmm csl dsr edt ill lyr mdc mus nrt oth pht prt red rev spn ths trc trl].each do |role|
|
149
95
|
next if @producer.params[role].nil?
|
150
96
|
@producer.params[role].each_with_index do |v, i|
|
151
|
-
s << %Q[ <dc:contributor
|
152
|
-
s << %Q[ <meta
|
97
|
+
s << %Q[ <dc:contributor id="#{role}-#{i}">#{CGI.escapeHTML(v)}</dc:contributor>\n]
|
98
|
+
s << %Q[ <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n]
|
153
99
|
|
154
100
|
if role == "prt"
|
155
|
-
s << %Q[ <dc:publisher
|
156
|
-
s << %Q[ <meta property="
|
101
|
+
s << %Q[ <dc:publisher id="prt">#{CGI.escapeHTML(v)}</dc:publisher>\n]
|
102
|
+
s << %Q[ <meta refines="#prt" property="role" scheme="marc:relators">prt</meta>\n]
|
157
103
|
end
|
158
104
|
end
|
159
105
|
end
|
160
106
|
|
161
|
-
s
|
162
|
-
|
163
|
-
|
107
|
+
s
|
108
|
+
end
|
109
|
+
|
110
|
+
def opf_manifest(mathstr)
|
111
|
+
s = ""
|
164
112
|
s << <<EOT
|
165
113
|
<manifest>
|
166
114
|
<item properties="nav#{mathstr.empty? ? '' : ' mathml'}" id="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" href="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" media-type="application/xhtml+xml"/>
|
@@ -170,40 +118,57 @@ EOT
|
|
170
118
|
if @producer.params["coverimage"]
|
171
119
|
@producer.contents.each do |item|
|
172
120
|
if item.media =~ /\Aimage/ && item.file =~ /#{@producer.params["coverimage"]}\Z/
|
173
|
-
|
121
|
+
s << %Q[ <item properties="cover-image" id="cover-#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n]
|
122
|
+
item.id = nil
|
174
123
|
break
|
175
124
|
end
|
176
125
|
end
|
177
126
|
end
|
178
127
|
|
179
|
-
# s << %Q[ <item id="toc" href="#{@producer.params["tocfile"]}" media-type="application/xhtml+xml"/>\n] unless @producer.params["mytoc"].nil?
|
180
|
-
|
181
128
|
@producer.contents.each do |item|
|
182
|
-
next if item.file =~ /#/ # skip subgroup
|
129
|
+
next if item.file =~ /#/ || item.id.nil? # skip subgroup, or id=nil (for cover)
|
183
130
|
s << %Q[ <item#{mathstr} id="#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n]
|
184
131
|
end
|
185
132
|
s << %Q[ </manifest>\n]
|
186
|
-
|
187
|
-
|
133
|
+
|
134
|
+
s
|
135
|
+
end
|
136
|
+
|
137
|
+
def opf_tocx
|
138
|
+
s = ""
|
188
139
|
s << %Q[ <spine>\n]
|
189
140
|
s << %Q[ <itemref idref="#{@producer.params["bookname"]}" linear="no"/>\n]
|
190
|
-
s << %Q[ <itemref idref="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" />\n]
|
141
|
+
# s << %Q[ <itemref idref="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" />\n]
|
191
142
|
|
192
143
|
@producer.contents.each do |item|
|
193
144
|
next if item.media !~ /xhtml\+xml/ # skip non XHTML
|
194
145
|
s << %Q[ <itemref idref="#{item.id}"/>\n] if item.notoc.nil?
|
195
146
|
end
|
196
147
|
s << %Q[ </spine>\n]
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
s <<
|
148
|
+
|
149
|
+
s
|
150
|
+
end
|
151
|
+
|
152
|
+
# Return opf file content.
|
153
|
+
def opf
|
154
|
+
mathstr = @producer.params["mathml"].nil? ? "" : %Q[ properties="mathml"]
|
155
|
+
s = <<EOT
|
156
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
157
|
+
<package version="3.0" xmlns="http://www.idpf.org/2007/opf" unique-identifier="BookId" xml:lang="#{@producer.params["language"]}">
|
158
|
+
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:opf="http://www.idpf.org/2007/opf">
|
159
|
+
EOT
|
160
|
+
|
161
|
+
s << opf_metainfo
|
162
|
+
|
163
|
+
s << %Q[ </metadata>\n]
|
164
|
+
|
165
|
+
s << opf_manifest(mathstr)
|
166
|
+
s << opf_tocx
|
167
|
+
s << opf_guide # same as ePUB2
|
168
|
+
|
205
169
|
s << %Q[</package>\n]
|
206
|
-
|
170
|
+
|
171
|
+
s
|
207
172
|
end
|
208
173
|
|
209
174
|
private
|
@@ -226,7 +191,7 @@ EOT
|
|
226
191
|
s << <<EOT
|
227
192
|
<item id="#{@producer.params["bookname"]}" href="#{@producer.params["cover"]}" media-type="application/xhtml+xml"/>
|
228
193
|
EOT
|
229
|
-
|
194
|
+
s
|
230
195
|
end
|
231
196
|
|
232
197
|
def common_header
|
@@ -235,15 +200,14 @@ EOT
|
|
235
200
|
<!DOCTYPE html>
|
236
201
|
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2011/epub" xmlns:ops="http://www.idpf.org/2007/ops" xml:lang="#{@producer.params["language"]}">
|
237
202
|
<head>
|
238
|
-
<meta
|
239
|
-
<meta http-equiv="Content-Style-Type" content="text/css"/>
|
203
|
+
<meta charset="UTF-8" />
|
240
204
|
<meta name="generator" content="EPUBMaker::Producer"/>
|
241
205
|
EOT
|
242
206
|
|
243
207
|
@producer.params["stylesheet"].each do |file|
|
244
208
|
s << %Q[ <link rel="stylesheet" type="text/css" href="#{file}"/>\n]
|
245
209
|
end
|
246
|
-
|
210
|
+
s
|
247
211
|
end
|
248
212
|
end
|
249
213
|
end
|
data/lib/epubmaker/producer.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# = producer.rb -- EPUB producer.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2010 Kenshi Muto
|
4
|
+
# Copyright (c) 2010-2014 Kenshi Muto
|
5
5
|
#
|
6
6
|
# This program is free software.
|
7
7
|
# You can distribute or modify this program under the terms of
|
@@ -36,11 +36,11 @@ module EPUBMaker
|
|
36
36
|
# Take YAML +file+ and update parameter hash.
|
37
37
|
def load(file)
|
38
38
|
raise "Can't open #{yamlfile}." if file.nil? || !File.exist?(file)
|
39
|
-
|
39
|
+
merge_params(@params.merge(YAML.load_file(file)))
|
40
40
|
end
|
41
41
|
|
42
42
|
# Construct producer object.
|
43
|
-
# +params+ takes initial parameter hash. This parameters can be overriden by EPUBMaker#load or EPUBMaker#
|
43
|
+
# +params+ takes initial parameter hash. This parameters can be overriden by EPUBMaker#load or EPUBMaker#merge_params.
|
44
44
|
# +version+ takes EPUB version (default is 2).
|
45
45
|
def initialize(params=nil, version=nil)
|
46
46
|
@contents = []
|
@@ -49,12 +49,12 @@ module EPUBMaker
|
|
49
49
|
@params["epubversion"] = version unless version.nil?
|
50
50
|
|
51
51
|
unless params.nil?
|
52
|
-
|
52
|
+
merge_params(params)
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
56
|
# Update parameters by merging from new parameter hash +params+.
|
57
|
-
def
|
57
|
+
def merge_params(params)
|
58
58
|
@params = @params.merge(params)
|
59
59
|
complement
|
60
60
|
@res = EPUBMaker::Resource.new(@params)
|
@@ -121,13 +121,15 @@ module EPUBMaker
|
|
121
121
|
s = @epub.mytoc
|
122
122
|
wobj.puts s if !s.nil? && !wobj.nil?
|
123
123
|
end
|
124
|
-
|
124
|
+
|
125
125
|
# Add informations of figure files in +path+ to contents array.
|
126
126
|
# +base+ defines a string to remove from path name.
|
127
|
-
def
|
127
|
+
def import_imageinfo(path, base=nil, allow_exts=nil)
|
128
|
+
return nil unless File.exist?(path)
|
129
|
+
allow_exts = @params["image_ext"] if allow_exts.nil?
|
128
130
|
Dir.foreach(path) do |f|
|
129
131
|
next if f =~ /\A\./
|
130
|
-
if f =~ /\.(
|
132
|
+
if f =~ /\.(#{allow_exts.join("|")})\Z/i
|
131
133
|
path.chop! if path =~ /\/\Z/
|
132
134
|
if base.nil?
|
133
135
|
@contents.push(EPUBMaker::Content.new({"file" => "#{path}/#{f}"}))
|
@@ -136,10 +138,12 @@ module EPUBMaker
|
|
136
138
|
end
|
137
139
|
end
|
138
140
|
if FileTest.directory?("#{path}/#{f}")
|
139
|
-
|
141
|
+
import_imageinfo("#{path}/#{f}", base)
|
140
142
|
end
|
141
143
|
end
|
142
144
|
end
|
145
|
+
|
146
|
+
alias importImageInfo import_imageinfo
|
143
147
|
|
144
148
|
# Produce EPUB file +epubfile+.
|
145
149
|
# +basedir+ points the directory has contents (default: current directory.)
|
@@ -147,7 +151,6 @@ module EPUBMaker
|
|
147
151
|
def produce(epubfile, basedir=nil, tmpdir=nil)
|
148
152
|
current = Dir.pwd
|
149
153
|
basedir = current if basedir.nil?
|
150
|
-
# FIXME: produce cover, mytoc, titlepage, colophon?
|
151
154
|
|
152
155
|
_tmpdir = tmpdir.nil? ? Dir.mktmpdir : tmpdir
|
153
156
|
epubfile = "#{current}/#{epubfile}" if epubfile !~ /\A\// # /
|
@@ -162,40 +165,67 @@ module EPUBMaker
|
|
162
165
|
end
|
163
166
|
end
|
164
167
|
|
165
|
-
|
168
|
+
def call_hook(filename, *params)
|
169
|
+
if !filename.nil? && File.exist?(filename) && FileTest.executable?(filename)
|
170
|
+
system(filename, *params)
|
171
|
+
end
|
172
|
+
end
|
166
173
|
|
174
|
+
private
|
175
|
+
|
167
176
|
# Complement parameters.
|
168
177
|
def complement
|
169
|
-
# FIXME: should separate for EPUB2/3?
|
170
|
-
# FIXME: escapeHTML?
|
171
|
-
# use default value if not defined
|
172
178
|
@params["htmlext"] = "html" if @params["htmlext"].nil?
|
173
179
|
defaults = {
|
174
180
|
"cover" => "#{@params["bookname"]}.#{@params["htmlext"]}",
|
175
|
-
"title" => @params["booktitle"],
|
181
|
+
"title" => @params["booktitle"],
|
176
182
|
"language" => "ja",
|
177
183
|
"date" => Time.now.strftime("%Y-%m-%d"),
|
184
|
+
"modified" => Time.now.strftime("%Y-%02m-%02dT%02H:%02M:%02SZ"),
|
178
185
|
"urnid" => "urn:uid:#{UUID.create}",
|
179
|
-
"
|
186
|
+
"isbn" => nil,
|
180
187
|
"toclevel" => 2,
|
188
|
+
"flattoc" => nil,
|
189
|
+
"flattocindent" => true,
|
181
190
|
"stylesheet" => [],
|
182
191
|
"epubversion" => 2,
|
183
192
|
"htmlversion" => 4,
|
193
|
+
"secnolevel" => 2,
|
194
|
+
"pre_secnolevel" => 0,
|
195
|
+
"post_secnolevel" => 0,
|
196
|
+
"part_secnolevel" => 1,
|
197
|
+
"titlepage" => nil,
|
198
|
+
"titlepagefile" => nil,
|
199
|
+
"originaltitlefile" => nil,
|
200
|
+
"profile" => nil,
|
201
|
+
"colophon" => nil,
|
202
|
+
"zip_stage1" => "zip -0Xq",
|
203
|
+
"zip_stage2" => "zip -Xr9Dq",
|
204
|
+
"hook_beforeprocess" => nil,
|
205
|
+
"hook_afterfrontmatter" => nil,
|
206
|
+
"hook_afterbody" => nil,
|
207
|
+
"hook_afterbackmatter" => nil,
|
208
|
+
"hook_aftercopyimage" => nil,
|
209
|
+
"hook_prepack" => nil,
|
210
|
+
"rename_for_legacy" => nil,
|
211
|
+
"imagedir" => "images",
|
212
|
+
"fontdir" => "fonts",
|
213
|
+
"image_ext" => %w(png gif jpg jpeg svg ttf woff otf),
|
214
|
+
"font_ext" => %w(ttf woff otf),
|
184
215
|
}
|
185
216
|
|
186
217
|
defaults.each_pair do |k, v|
|
187
218
|
@params[k] = v if @params[k].nil?
|
188
219
|
end
|
189
220
|
|
190
|
-
@params["htmlversion"] == 5 if @params["epubversion"] >= 3
|
221
|
+
@params["htmlversion"] == 5 if @params["epubversion"] >= 3
|
191
222
|
|
192
|
-
# must be defined
|
193
223
|
%w[bookname title].each do |k|
|
194
|
-
raise "Key #{k} must have a value. Abort." if @params[k].nil?
|
224
|
+
raise "Key #{k} must have a value. Abort." if @params[k].nil?
|
195
225
|
end
|
196
226
|
# array
|
197
227
|
%w[subject aut a-adp a-ann a-arr a-art a-asn a-aqt a-aft a-aui a-ant a-bkp a-clb a-cmm a-dsr a-edt a-ill a-lyr a-mdc a-mus a-nrt a-oth a-pht a-prt a-red a-rev a-spn a-ths a-trc a-trl adp ann arr art asn aut aqt aft aui ant bkp clb cmm dsr edt ill lyr mdc mus nrt oth pht prt red rev spn ths trc trl stylesheet].each do |item|
|
198
|
-
@params[item] = [@params[item]] if !@params[item].nil? && @params[item].instance_of?(String)
|
228
|
+
@params[item] = [@params[item]] if !@params[item].nil? && @params[item].instance_of?(String)
|
199
229
|
end
|
200
230
|
# optional
|
201
231
|
# type, format, identifier, source, relation, coverpage, rights, aut
|