tmtms-review 1.0.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 +9 -0
- data/COPYING +515 -0
- data/ChangeLog +2083 -0
- data/README.rdoc +50 -0
- data/Rakefile +56 -0
- data/VERSION +1 -0
- data/bin/review-check +178 -0
- data/bin/review-checkdep +63 -0
- data/bin/review-compile +205 -0
- data/bin/review-epubmaker +661 -0
- data/bin/review-epubmaker-ng +176 -0
- data/bin/review-index +118 -0
- data/bin/review-pdfmaker +208 -0
- data/bin/review-preproc +142 -0
- data/bin/review-validate +51 -0
- data/bin/review-vol +102 -0
- data/debian/README.Debian +12 -0
- data/debian/README.source +5 -0
- data/debian/changelog +5 -0
- data/debian/compat +1 -0
- data/debian/control +22 -0
- data/debian/copyright +62 -0
- data/debian/docs +6 -0
- data/debian/manpage.1.ex +59 -0
- data/debian/patches/path.diff +91 -0
- data/debian/patches/series +1 -0
- data/debian/review.install +13 -0
- data/debian/review.links +4 -0
- data/debian/rules +13 -0
- data/debian/source/format +1 -0
- data/doc/format.rdoc +582 -0
- data/doc/format_idg.rdoc +180 -0
- data/doc/libepubmaker/sample.yaml +90 -0
- data/doc/quickstart.rdoc +188 -0
- data/doc/ruby-uuid/README +11 -0
- data/doc/ruby-uuid/README.ja +34 -0
- data/doc/sample.css +108 -0
- data/doc/sample.yaml +62 -0
- data/lib/epubmaker.rb +28 -0
- data/lib/epubmaker/content.rb +82 -0
- data/lib/epubmaker/epubv2.rb +418 -0
- data/lib/epubmaker/epubv3.rb +249 -0
- data/lib/epubmaker/producer.rb +204 -0
- data/lib/epubmaker/resource.rb +66 -0
- data/lib/lineinput.rb +155 -0
- data/lib/review.rb +3 -0
- data/lib/review/book.rb +46 -0
- data/lib/review/book/base.rb +235 -0
- data/lib/review/book/chapter.rb +81 -0
- data/lib/review/book/compilable.rb +159 -0
- data/lib/review/book/index.rb +339 -0
- data/lib/review/book/page_metric.rb +38 -0
- data/lib/review/book/parameters.rb +97 -0
- data/lib/review/book/part.rb +44 -0
- data/lib/review/book/volume.rb +65 -0
- data/lib/review/builder.rb +444 -0
- data/lib/review/compiler.rb +550 -0
- data/lib/review/configure.rb +38 -0
- data/lib/review/epubbuilder.rb +18 -0
- data/lib/review/exception.rb +21 -0
- data/lib/review/extentions.rb +3 -0
- data/lib/review/extentions/object.rb +9 -0
- data/lib/review/extentions/string.rb +33 -0
- data/lib/review/htmlbuilder.rb +1097 -0
- data/lib/review/htmllayout.rb +19 -0
- data/lib/review/htmlutils.rb +36 -0
- data/lib/review/i18n.rb +30 -0
- data/lib/review/i18n.yaml +34 -0
- data/lib/review/idgxmlbuilder.rb +1145 -0
- data/lib/review/latexbuilder.rb +815 -0
- data/lib/review/latexindex.rb +35 -0
- data/lib/review/latexutils.rb +79 -0
- data/lib/review/preprocessor.rb +563 -0
- data/lib/review/review.tex.erb +232 -0
- data/lib/review/textbuilder.rb +17 -0
- data/lib/review/textutils.rb +66 -0
- data/lib/review/tocparser.rb +342 -0
- data/lib/review/tocprinter.rb +221 -0
- data/lib/review/topbuilder.rb +785 -0
- data/lib/review/unfold.rb +138 -0
- data/lib/uuid.rb +312 -0
- data/review.gemspec +141 -0
- data/test/CHAPS +2 -0
- data/test/bib.re +13 -0
- data/test/book_test_helper.rb +35 -0
- data/test/test.re +43 -0
- data/test/test_book.rb +598 -0
- data/test/test_book_chapter.rb +418 -0
- data/test/test_book_parameter.rb +42 -0
- data/test/test_book_part.rb +50 -0
- data/test/test_builder.rb +144 -0
- data/test/test_compiler.rb +44 -0
- data/test/test_epubmaker.rb +507 -0
- data/test/test_helper.rb +27 -0
- data/test/test_htmlbuilder.rb +554 -0
- data/test/test_htmlutils.rb +28 -0
- data/test/test_i18n.rb +64 -0
- data/test/test_idgxmlbuilder.rb +589 -0
- data/test/test_index.rb +31 -0
- data/test/test_latexbuilder.rb +656 -0
- data/test/test_lineinput.rb +198 -0
- data/test/test_preprocessor.rb +23 -0
- data/test/test_textutils.rb +68 -0
- data/test/test_topbuilder.rb +244 -0
- data/test/test_uuid.rb +156 -0
- metadata +161 -0
@@ -0,0 +1,249 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# = epubv3.rb -- EPUB version 3 producer.
|
3
|
+
#
|
4
|
+
# Copyright (c) 2010 Kenshi Muto
|
5
|
+
#
|
6
|
+
# This program is free software.
|
7
|
+
# You can distribute or modify this program under the terms of
|
8
|
+
# the GNU LGPL, Lesser General Public License version 2.1.
|
9
|
+
# For details of the GNU LGPL, see the file "COPYING".
|
10
|
+
#
|
11
|
+
|
12
|
+
require 'epubmaker/epubv2'
|
13
|
+
|
14
|
+
module EPUBMaker
|
15
|
+
|
16
|
+
# EPUBv3 is EPUB version 3 producer.
|
17
|
+
class EPUBv3 < EPUBv2
|
18
|
+
def ncx(indentarray)
|
19
|
+
# FIXME: handle indentarray
|
20
|
+
s = common_header
|
21
|
+
s << <<EOT
|
22
|
+
<title>#{@producer.res.v("toctitle")}</title>
|
23
|
+
</head>
|
24
|
+
<body>
|
25
|
+
<nav epub:type="toc" id="toc">
|
26
|
+
<h1 class="toc-title">#{@producer.res.v("toctitle")}</h1>
|
27
|
+
<ul class="toc-h1">
|
28
|
+
EOT
|
29
|
+
|
30
|
+
current = 1
|
31
|
+
init_item = true
|
32
|
+
@producer.contents.each do |item|
|
33
|
+
next if !item.notoc.nil? || item.level.nil? || item.file.nil? || item.title.nil? || item.level > @producer.params["toclevel"].to_i
|
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]
|
57
|
+
end
|
58
|
+
s << <<EOT
|
59
|
+
</ul>
|
60
|
+
</nav>
|
61
|
+
</body>
|
62
|
+
</html>
|
63
|
+
EOT
|
64
|
+
return s
|
65
|
+
end
|
66
|
+
|
67
|
+
# Produce EPUB file +epubfile+.
|
68
|
+
# +basedir+ points the directory has contents.
|
69
|
+
# +tmpdir+ defines temporary directory.
|
70
|
+
def produce(epubfile, basedir, tmpdir)
|
71
|
+
File.open("#{tmpdir}/mimetype", "w") {|f| @producer.mimetype(f) }
|
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) }
|
78
|
+
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
|
+
|
97
|
+
fork {
|
98
|
+
Dir.chdir(tmpdir) {|d|
|
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
|
109
|
+
end
|
110
|
+
|
111
|
+
# Return opf file content.
|
112
|
+
def opf
|
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
|
119
|
+
%w[title language date type format source description relation coverage subject rights].each do |item|
|
120
|
+
next if @producer.params[item].nil?
|
121
|
+
if @producer.params[item].instance_of?(Array)
|
122
|
+
s << @producer.params[item].map {|i| %Q[ <dc:#{item} prefer="#{item}">#{CGI.escapeHTML(i.to_s)}</dc:#{item}>\n]}.join
|
123
|
+
s << @producer.params[item].map {|i| %Q[ <meta id="#{item}" property="dcterms:#{item}">#{CGI.escapeHTML(i.to_s)}</meta>\n]}.join
|
124
|
+
else
|
125
|
+
s << %Q[ <dc:#{item} prefer="#{item}">#{CGI.escapeHTML(@producer.params[item].to_s)}</dc:#{item}>\n]
|
126
|
+
s << %Q[ <meta id="#{item}" property="dcterms:#{item}">#{CGI.escapeHTML(@producer.params[item].to_s)}</meta>\n]
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
# ID
|
131
|
+
if @producer.params["isbn"].nil?
|
132
|
+
s << %Q[ <dc:identifier id="BookId" prefer="bookid">#{@producer.params["urnid"]}</dc:identifier>\n]
|
133
|
+
s << %Q[ <meta property="dcterms:identifier" id="bookid">#{@producer.params["urnid"]}</meta>\n]
|
134
|
+
else
|
135
|
+
s << %Q[ <dc:identifier id="BookId" opf:scheme="ISBN" prefer="bookid">#{@producer.params["isbn"]}</dc:identifier>\n]
|
136
|
+
s << %Q[ <meta property="dcterms:identifier" id="bookid" opf:scheme="ISBN">#{@producer.params["isbn"]}</meta>\n]
|
137
|
+
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|
|
141
|
+
next if @producer.params[role].nil?
|
142
|
+
@producer.params[role].each_with_index do |v, i|
|
143
|
+
s << %Q[ <dc:creator opf:role="#{role.sub('a-', '')}" prefer="creator-#{i}">#{CGI.escapeHTML(v)}</dc:creator>\n]
|
144
|
+
s << %Q[ <meta property="dcterms:creator" id="creator-#{i}" opf:role="#{role.sub('a-', '')}">#{CGI.escapeHTML(v)}</meta>\n]
|
145
|
+
end
|
146
|
+
end
|
147
|
+
# contributor
|
148
|
+
%w[adp ann arr art asn aqt aft aui ant bkp clb cmm dsr edt ill lyr mdc mus nrt oth pht prt red rev spn ths trc trl].each do |role|
|
149
|
+
next if @producer.params[role].nil?
|
150
|
+
@producer.params[role].each_with_index do |v, i|
|
151
|
+
s << %Q[ <dc:contributor opf:role="#{role}" prefer="contributor-#{i}">#{CGI.escapeHTML(v)}</dc:contributor>\n]
|
152
|
+
s << %Q[ <meta property="dcterms:contributor" id="contributor-#{i}" opf:role="#{role}">#{CGI.escapeHTML(v)}</meta>\n]
|
153
|
+
|
154
|
+
if role == "prt"
|
155
|
+
s << %Q[ <dc:publisher prefer="publisher">#{CGI.escapeHTML(v)}</dc:publisher>\n]
|
156
|
+
s << %Q[ <meta property="dcterms:publisher" id="publisher">#{CGI.escapeHTML(v)}</meta>\n]
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
s << %Q[ </metadata>\n]
|
162
|
+
|
163
|
+
# manifest
|
164
|
+
s << <<EOT
|
165
|
+
<manifest>
|
166
|
+
<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"/>
|
167
|
+
<item id="#{@producer.params["bookname"]}" href="#{@producer.params["cover"]}" media-type="application/xhtml+xml"/>
|
168
|
+
EOT
|
169
|
+
|
170
|
+
if @producer.params["coverimage"]
|
171
|
+
@producer.contents.each do |item|
|
172
|
+
if item.media =~ /\Aimage/ && item.file =~ /#{@producer.params["coverimage"]}\Z/
|
173
|
+
s << %Q[ <item properties="cover-image" id="#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n]
|
174
|
+
break
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
# s << %Q[ <item id="toc" href="#{@producer.params["tocfile"]}" media-type="application/xhtml+xml"/>\n] unless @producer.params["mytoc"].nil?
|
180
|
+
|
181
|
+
@producer.contents.each do |item|
|
182
|
+
next if item.file =~ /#/ # skip subgroup
|
183
|
+
s << %Q[ <item#{mathstr} id="#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n]
|
184
|
+
end
|
185
|
+
s << %Q[ </manifest>\n]
|
186
|
+
|
187
|
+
# tocx
|
188
|
+
s << %Q[ <spine>\n]
|
189
|
+
s << %Q[ <itemref idref="#{@producer.params["bookname"]}" linear="no"/>\n]
|
190
|
+
s << %Q[ <itemref idref="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" />\n] unless @producer.params["mytoc"].nil?
|
191
|
+
|
192
|
+
@producer.contents.each do |item|
|
193
|
+
next if item.media !~ /xhtml\+xml/ # skip non XHTML
|
194
|
+
s << %Q[ <itemref idref="#{item.id}"/>\n] if item.notoc.nil?
|
195
|
+
end
|
196
|
+
s << %Q[ </spine>\n]
|
197
|
+
|
198
|
+
# guide
|
199
|
+
s << %Q[ <guide>\n]
|
200
|
+
s << %Q[ <reference type="cover" title="#{@producer.res.v("covertitle")}" href="#{@producer.params["cover"]}"/>\n]
|
201
|
+
s << %Q[ <reference type="title-page" title="#{@producer.res.v("titlepagetitle")}" href="#{@producer.params["titlepage"]}"/>\n] unless @producer.params["titlepage"].nil?
|
202
|
+
s << %Q[ <reference type="toc" title="#{@producer.res.v("toctitle")}" href="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["mytoc"].nil?
|
203
|
+
s << %Q[ <reference type="colophon" title="#{@producer.res.v("colophontitle")}" href="colophon.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["colophon"].nil? # FIXME: path
|
204
|
+
s << %Q[ </guide>\n]
|
205
|
+
s << %Q[</package>\n]
|
206
|
+
return s
|
207
|
+
end
|
208
|
+
|
209
|
+
private
|
210
|
+
|
211
|
+
# Return cover pointer for opf file
|
212
|
+
def cover_in_opf
|
213
|
+
s = ""
|
214
|
+
|
215
|
+
if @producer.params["coverimage"]
|
216
|
+
@producer.contents.each do |item|
|
217
|
+
if item.media =~ /\Aimage/ && item.file =~ /#{@producer.params["coverimage"]}\Z/
|
218
|
+
s << <<EOT
|
219
|
+
<item id="#{item.id}" href="#{item.file}" media-type="#{item.media}"/>
|
220
|
+
EOT
|
221
|
+
break
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
|
226
|
+
s << <<EOT
|
227
|
+
<item id="#{@producer.params["bookname"]}" href="#{@producer.params["cover"]}" media-type="application/xhtml+xml"/>
|
228
|
+
EOT
|
229
|
+
return s
|
230
|
+
end
|
231
|
+
|
232
|
+
def common_header
|
233
|
+
s =<<EOT
|
234
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
235
|
+
<!DOCTYPE html>
|
236
|
+
<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
|
+
<head>
|
238
|
+
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
|
239
|
+
<meta http-equiv="Content-Style-Type" content="text/css"/>
|
240
|
+
<meta name="generator" content="EPUBMaker::Producer"/>
|
241
|
+
EOT
|
242
|
+
|
243
|
+
@producer.params["stylesheet"].each do |file|
|
244
|
+
s << %Q[ <link rel="stylesheet" type="text/css" href="#{file}"/>\n]
|
245
|
+
end
|
246
|
+
return s
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
@@ -0,0 +1,204 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
# = producer.rb -- EPUB producer.
|
3
|
+
#
|
4
|
+
# Copyright (c) 2010 Kenshi Muto
|
5
|
+
#
|
6
|
+
# This program is free software.
|
7
|
+
# You can distribute or modify this program under the terms of
|
8
|
+
# the GNU LGPL, Lesser General Public License version 2.1.
|
9
|
+
# For details of the GNU LGPL, see the file "COPYING".
|
10
|
+
|
11
|
+
require 'tmpdir'
|
12
|
+
require 'fileutils'
|
13
|
+
require 'yaml'
|
14
|
+
require 'uuid'
|
15
|
+
require 'epubmaker/resource'
|
16
|
+
require 'epubmaker/content'
|
17
|
+
require 'epubmaker/epubv2'
|
18
|
+
require 'epubmaker/epubv3'
|
19
|
+
|
20
|
+
module EPUBMaker
|
21
|
+
# EPUBMaker produces EPUB file.
|
22
|
+
class Producer
|
23
|
+
# Array of content objects.
|
24
|
+
attr_accessor :contents
|
25
|
+
# Parameter hash.
|
26
|
+
attr_accessor :params
|
27
|
+
# Message resource object.
|
28
|
+
attr_accessor :res
|
29
|
+
|
30
|
+
# Take YAML +file+ and return parameter hash.
|
31
|
+
def Producer.load(file)
|
32
|
+
raise "Can't open #{yamlfile}." if file.nil? || !File.exist?(file)
|
33
|
+
return YAML.load_file(file)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Take YAML +file+ and update parameter hash.
|
37
|
+
def load(file)
|
38
|
+
raise "Can't open #{yamlfile}." if file.nil? || !File.exist?(file)
|
39
|
+
mergeparams(@params.merge(YAML.load_file(file)))
|
40
|
+
end
|
41
|
+
|
42
|
+
# Construct producer object.
|
43
|
+
# +params+ takes initial parameter hash. This parameters can be overriden by EPUBMaker#load or EPUBMaker#mergeparams.
|
44
|
+
# +version+ takes EPUB version (default is 2).
|
45
|
+
def initialize(params=nil, version=nil)
|
46
|
+
@contents = []
|
47
|
+
@params = {}
|
48
|
+
@epub = nil
|
49
|
+
@params["epubversion"] = version unless version.nil?
|
50
|
+
|
51
|
+
unless params.nil?
|
52
|
+
mergeparams(params)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
# Update parameters by merging from new parameter hash +params+.
|
57
|
+
def mergeparams(params)
|
58
|
+
@params = @params.merge(params)
|
59
|
+
complement
|
60
|
+
@res = EPUBMaker::Resource.new(@params)
|
61
|
+
|
62
|
+
unless @params["epubversion"].nil?
|
63
|
+
case @params["epubversion"].to_i
|
64
|
+
when 2
|
65
|
+
@epub = EPUBMaker::EPUBv2.new(self)
|
66
|
+
when 3
|
67
|
+
@epub = EPUBMaker::EPUBv3.new(self)
|
68
|
+
else
|
69
|
+
raise "Invalid EPUB version (#{@params["epubversion"]}.)"
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
# Write mimetype file to IO object +wobj+.
|
75
|
+
def mimetype(wobj)
|
76
|
+
s = @epub.mimetype
|
77
|
+
wobj.print s if !s.nil? && !wobj.nil?
|
78
|
+
end
|
79
|
+
|
80
|
+
# Write opf file to IO object +wobj+.
|
81
|
+
def opf(wobj)
|
82
|
+
s = @epub.opf
|
83
|
+
wobj.puts s if !s.nil? && !wobj.nil?
|
84
|
+
end
|
85
|
+
|
86
|
+
# Write ncx file to IO object +wobj+. +indentarray+ defines prefix
|
87
|
+
# string for each level.
|
88
|
+
def ncx(wobj, indentarray=[])
|
89
|
+
s = @epub.ncx(indentarray)
|
90
|
+
wobj.puts s if !s.nil? && !wobj.nil?
|
91
|
+
end
|
92
|
+
|
93
|
+
# Write container file to IO object +wobj+.
|
94
|
+
def container(wobj)
|
95
|
+
s = @epub.container
|
96
|
+
wobj.puts s if !s.nil? && !wobj.nil?
|
97
|
+
end
|
98
|
+
|
99
|
+
# Write cover file to IO object +wobj+.
|
100
|
+
# If Producer#params["coverimage"] is defined, it will be used for
|
101
|
+
# the cover image.
|
102
|
+
def cover(wobj)
|
103
|
+
s = @epub.cover
|
104
|
+
wobj.puts s if !s.nil? && !wobj.nil?
|
105
|
+
end
|
106
|
+
|
107
|
+
# Write title file (copying) to IO object +wobj+.
|
108
|
+
def titlepage(wobj)
|
109
|
+
s = @epub.titlepage
|
110
|
+
wobj.puts s if !s.nil? && !wobj.nil?
|
111
|
+
end
|
112
|
+
|
113
|
+
# Write colophon file to IO object +wobj+.
|
114
|
+
def colophon(wobj)
|
115
|
+
s = @epub.colophon
|
116
|
+
wobj.puts s if !s.nil? && !wobj.nil?
|
117
|
+
end
|
118
|
+
|
119
|
+
# Write own toc file to IO object +wobj+.
|
120
|
+
def mytoc(wobj)
|
121
|
+
s = @epub.mytoc
|
122
|
+
wobj.puts s if !s.nil? && !wobj.nil?
|
123
|
+
end
|
124
|
+
|
125
|
+
# Add informations of figure files in +path+ to contents array.
|
126
|
+
# +base+ defines a string to remove from path name.
|
127
|
+
def importImageInfo(path, base=nil)
|
128
|
+
Dir.foreach(path) do |f|
|
129
|
+
next if f =~ /\A\./
|
130
|
+
if f =~ /\.(png|jpg|jpeg|svg|gif)\Z/i # FIXME:EPUB3 accepts more types...
|
131
|
+
path.chop! if path =~ /\/\Z/
|
132
|
+
if base.nil?
|
133
|
+
@contents.push(EPUBMaker::Content.new({"file" => "#{path}/#{f}"}))
|
134
|
+
else
|
135
|
+
@contents.push(EPUBMaker::Content.new({"file" => "#{path.sub(base + "/", '')}/#{f}"}))
|
136
|
+
end
|
137
|
+
end
|
138
|
+
if FileTest.directory?("#{path}/#{f}")
|
139
|
+
importImageInfo("#{path}/#{f}", base)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
# Produce EPUB file +epubfile+.
|
145
|
+
# +basedir+ points the directory has contents (default: current directory.)
|
146
|
+
# +tmpdir+ defines temporary directory.
|
147
|
+
def produce(epubfile, basedir=nil, tmpdir=nil)
|
148
|
+
current = Dir.pwd
|
149
|
+
basedir = current if basedir.nil?
|
150
|
+
# FIXME: produce cover, mytoc, titlepage, colophon?
|
151
|
+
|
152
|
+
_tmpdir = tmpdir.nil? ? Dir.mktmpdir : tmpdir
|
153
|
+
epubfile = "#{current}/#{epubfile}" if epubfile !~ /\A\// # /
|
154
|
+
|
155
|
+
# FIXME: error check
|
156
|
+
File.unlink(epubfile) if File.exist?(epubfile)
|
157
|
+
|
158
|
+
begin
|
159
|
+
@epub.produce(epubfile, basedir, _tmpdir)
|
160
|
+
ensure
|
161
|
+
FileUtils.rm_r(_tmpdir) if tmpdir.nil?
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
private
|
166
|
+
|
167
|
+
# Complement parameters.
|
168
|
+
def complement
|
169
|
+
# FIXME: should separate for EPUB2/3?
|
170
|
+
# FIXME: escapeHTML?
|
171
|
+
# use default value if not defined
|
172
|
+
@params["htmlext"] = "html" if @params["htmlext"].nil?
|
173
|
+
defaults = {
|
174
|
+
"cover" => "#{@params["bookname"]}.#{@params["htmlext"]}",
|
175
|
+
"title" => @params["booktitle"], # backward compatibility
|
176
|
+
"language" => "ja",
|
177
|
+
"date" => Time.now.strftime("%Y-%m-%d"),
|
178
|
+
"urnid" => "urn:uid:#{UUID.create}",
|
179
|
+
"tocfile" => "toc.#{@params["htmlext"]}",
|
180
|
+
"toclevel" => 2,
|
181
|
+
"stylesheet" => [],
|
182
|
+
"epubversion" => 2,
|
183
|
+
"htmlversion" => 4,
|
184
|
+
}
|
185
|
+
|
186
|
+
defaults.each_pair do |k, v|
|
187
|
+
@params[k] = v if @params[k].nil?
|
188
|
+
end
|
189
|
+
|
190
|
+
@params["htmlversion"] == 5 if @params["epubversion"] >= 3 && @params["htmlversion"] == 4
|
191
|
+
|
192
|
+
# must be defined
|
193
|
+
%w[bookname title].each do |k|
|
194
|
+
raise "Key #{k} must have a value. Abort." if @params[k].nil? # FIXME: should not be error?
|
195
|
+
end
|
196
|
+
# array
|
197
|
+
%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) # FIXME: avoid double insert
|
199
|
+
end
|
200
|
+
# optional
|
201
|
+
# type, format, identifier, source, relation, coverpage, rights, aut
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|