review 2.0.0.beta1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +66 -1
- data/.rubocop_todo.yml +617 -0
- data/.travis.yml +16 -1
- data/ChangeLog +48 -0
- data/Dockerfile +22 -0
- data/Gemfile +0 -1
- data/README.md +97 -0
- data/Rakefile +10 -11
- data/appveyor.yml +9 -0
- data/bin/review +46 -0
- data/bin/review-check +8 -21
- data/bin/review-compile +26 -43
- data/bin/review-index +9 -22
- data/bin/review-init +21 -25
- data/bin/review-preproc +9 -13
- data/bin/review-validate +1 -1
- data/bin/review-vol +3 -17
- data/bin/review-webmaker +15 -0
- data/doc/NEWS.ja.md +534 -0
- data/doc/NEWS.md +538 -0
- data/doc/catalog.ja.md +10 -18
- data/doc/catalog.md +5 -9
- data/doc/config.yml.sample +319 -0
- data/doc/customize_epub.ja.md +42 -0
- data/doc/format.ja.md +320 -288
- data/doc/format.md +277 -170
- data/doc/format_idg.ja.md +82 -175
- data/doc/pdfmaker.ja.md +61 -0
- data/doc/pdfmaker.md +65 -0
- data/doc/quickstart.ja.md +88 -98
- data/doc/quickstart.md +72 -110
- data/doc/sample.css +41 -0
- data/doc/writing_vertical.ja.md +55 -0
- data/doc/writing_vertical.md +5 -0
- data/lib/epubmaker/content.rb +3 -3
- data/lib/epubmaker/epubcommon.rb +173 -145
- data/lib/epubmaker/epubv2.rb +24 -77
- data/lib/epubmaker/epubv3.rb +72 -73
- data/lib/epubmaker/producer.rb +54 -30
- data/lib/lineinput.rb +48 -0
- data/lib/review/book.rb +0 -1
- data/lib/review/book/base.rb +47 -27
- data/lib/review/book/chapter.rb +48 -19
- data/lib/review/book/compilable.rb +10 -14
- data/lib/review/book/index.rb +10 -19
- data/lib/review/book/page_metric.rb +0 -10
- data/lib/review/book/part.rb +17 -3
- data/lib/review/builder.rb +84 -68
- data/lib/review/catalog.rb +5 -1
- data/lib/review/compiler.rb +327 -4657
- data/lib/review/configure.rb +84 -10
- data/lib/review/converter.rb +28 -0
- data/lib/review/epubbuilder.rb +1 -1
- data/lib/review/epubmaker.rb +142 -158
- data/lib/review/ewbbuilder.rb +5 -5
- data/lib/review/exception.rb +1 -1
- data/lib/review/extentions.rb +1 -1
- data/lib/review/extentions/hash.rb +15 -0
- data/lib/review/extentions/string.rb +2 -1
- data/lib/review/htmlbuilder.rb +364 -348
- data/lib/review/htmltoc.rb +44 -0
- data/lib/review/htmlutils.rb +12 -6
- data/lib/review/i18n.rb +78 -6
- data/lib/review/i18n.yml +7 -4
- data/lib/review/idgxmlbuilder.rb +226 -267
- data/lib/review/latexbuilder.rb +281 -274
- data/lib/review/latexutils.rb +56 -49
- data/lib/review/makerhelper.rb +8 -4
- data/lib/review/markdownbuilder.rb +80 -124
- data/lib/review/pdfmaker.rb +197 -138
- data/lib/review/preprocessor.rb +16 -67
- data/lib/review/template.rb +24 -0
- data/lib/review/textbuilder.rb +1 -1
- data/lib/review/textutils.rb +18 -24
- data/lib/review/tocparser.rb +51 -106
- data/lib/review/tocprinter.rb +61 -117
- data/lib/review/topbuilder.rb +119 -126
- data/lib/review/unfold.rb +2 -2
- data/lib/review/version.rb +1 -1
- data/lib/review/webmaker.rb +302 -0
- data/lib/review/webtocprinter.rb +48 -0
- data/lib/review/yamlloader.rb +47 -0
- data/review.gemspec +3 -3
- data/templates/html/layout-html5.html.erb +17 -0
- data/templates/html/layout-xhtml1.html.erb +20 -0
- data/{lib/review → templates/latex}/layout.tex.erb +107 -115
- data/templates/ncx/epubv2.ncx.erb +11 -0
- data/templates/opf/epubv2.opf.erb +21 -0
- data/templates/opf/epubv3.opf.erb +18 -0
- data/templates/web/html/layout-html5.html.erb +56 -0
- data/templates/web/html/layout-xhtml1.html.erb +20 -0
- data/templates/xml/container.xml.erb +6 -0
- data/test/assets/test.xml.erb +3 -0
- data/test/assets/test_template.tex +28 -71
- data/test/assets/test_template_backmatter.tex +1 -9
- data/test/sample-book/src/Rakefile +12 -3
- data/{doc/sample.yml → test/sample-book/src/config-epub2.yml} +92 -147
- data/test/sample-book/src/config.yml +40 -154
- data/test/sample-book/src/style-web.css +45 -0
- data/test/sample-book/src/style.css +23 -1
- data/test/test.re +1 -1
- data/test/test_book.rb +15 -17
- data/test/test_book_chapter.rb +2 -80
- data/test/test_book_part.rb +1 -1
- data/test/test_builder.rb +28 -6
- data/test/test_catalog.rb +17 -0
- data/test/test_compiler.rb +14 -59
- data/test/test_configure.rb +94 -0
- data/test/test_converter.rb +21 -0
- data/test/test_epub3maker.rb +155 -3
- data/test/test_epubmaker.rb +245 -30
- data/test/test_epubmaker_cmd.rb +2 -2
- data/test/test_extentions_hash.rb +60 -0
- data/test/test_helper.rb +4 -47
- data/test/test_htmlbuilder.rb +282 -175
- data/test/test_htmltoc.rb +33 -0
- data/test/test_i18n.rb +134 -70
- data/test/test_idgxmlbuilder.rb +58 -39
- data/test/test_latexbuilder.rb +132 -14
- data/test/test_lineinput.rb +5 -26
- data/test/test_makerhelper.rb +6 -4
- data/test/test_markdownbuilder.rb +23 -5
- data/test/test_pdfmaker.rb +86 -20
- data/test/test_pdfmaker_cmd.rb +1 -3
- data/test/test_review_ext.rb +1 -1
- data/test/test_template.rb +27 -0
- data/test/test_textutils.rb +36 -0
- data/test/test_tocparser.rb +25 -0
- data/test/test_topbuilder.rb +34 -2
- data/test/test_yamlloader.rb +188 -0
- metadata +71 -29
- data/README.rdoc +0 -81
- data/bin/review-epubmaker-legacy +0 -1024
- data/doc/ruby-uuid/README +0 -11
- data/doc/ruby-uuid/README.ja +0 -34
- data/lib/review/compiler/literals_1_8.kpeg +0 -19
- data/lib/review/compiler/literals_1_8.rb +0 -432
- data/lib/review/compiler/literals_1_9.kpeg +0 -22
- data/lib/review/compiler/literals_1_9.rb +0 -435
- data/lib/review/extentions/array.rb +0 -25
- data/lib/review/htmllayout.rb +0 -41
- data/lib/review/inaobuilder.rb +0 -357
- data/lib/review/location.rb +0 -24
- data/lib/review/node.rb +0 -267
- data/lib/review/review.kpeg +0 -724
- data/lib/uuid.rb +0 -312
- data/rubocop-todo.yml +0 -456
- data/test/test_inaobuilder.rb +0 -247
- data/test/test_uuid.rb +0 -157
data/lib/epubmaker/epubv2.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# encoding: utf-8
|
2
2
|
# = epubv2.rb -- EPUB version 2 producer.
|
3
3
|
#
|
4
|
-
# Copyright (c) 2010-
|
4
|
+
# Copyright (c) 2010-2016 Kenshi Muto and Masayoshi Takahashi
|
5
5
|
#
|
6
6
|
# This program is free software.
|
7
7
|
# You can distribute or modify this program under the terms of
|
@@ -23,34 +23,24 @@ module EPUBMaker
|
|
23
23
|
|
24
24
|
# Return opf file content.
|
25
25
|
def opf
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
s << %Q[ </metadata>\n]
|
36
|
-
|
37
|
-
s << opf_manifest
|
38
|
-
s << opf_tocx
|
39
|
-
s << opf_guide
|
40
|
-
|
41
|
-
s << %Q[</package>\n]
|
42
|
-
|
43
|
-
s
|
26
|
+
@opf_metainfo = opf_metainfo
|
27
|
+
@opf_coverimage = opf_coverimage
|
28
|
+
@opf_manifest = opf_manifest
|
29
|
+
@opf_toc = opf_tocx
|
30
|
+
|
31
|
+
tmplfile = File.expand_path('./opf/epubv2.opf.erb', ReVIEW::Template::TEMPLATE_DIR)
|
32
|
+
tmpl = ReVIEW::Template.load(tmplfile)
|
33
|
+
return tmpl.result(binding)
|
44
34
|
end
|
45
35
|
|
46
36
|
def opf_metainfo
|
47
37
|
s = ""
|
48
38
|
%w[title language date type format source description relation coverage subject rights].each do |item|
|
49
|
-
next
|
50
|
-
if @producer.params[item].
|
51
|
-
s << @producer.params
|
39
|
+
next unless @producer.params[item]
|
40
|
+
if @producer.params[item].kind_of?(Array)
|
41
|
+
s << @producer.params.names_of(item).map {|i| %Q[ <dc:#{item}>#{CGI.escapeHTML(i)}</dc:#{item}>\n]}.join
|
52
42
|
else
|
53
|
-
s << %Q[ <dc:#{item}>#{CGI.escapeHTML(@producer.params
|
43
|
+
s << %Q[ <dc:#{item}>#{CGI.escapeHTML(@producer.params.name_of(item))}</dc:#{item}>\n]
|
54
44
|
end
|
55
45
|
end
|
56
46
|
|
@@ -63,16 +53,16 @@ EOT
|
|
63
53
|
|
64
54
|
# creator (should be array)
|
65
55
|
%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|
|
66
|
-
next
|
67
|
-
@producer.params
|
56
|
+
next unless @producer.params[role]
|
57
|
+
@producer.params.names_of(role).each do |v|
|
68
58
|
s << %Q[ <dc:creator opf:role="#{role.sub('a-', '')}">#{CGI.escapeHTML(v)}</dc:creator>\n]
|
69
59
|
end
|
70
60
|
end
|
71
61
|
|
72
62
|
# contributor (should be array)
|
73
63
|
%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|
|
74
|
-
next
|
75
|
-
@producer.params
|
64
|
+
next unless @producer.params[role]
|
65
|
+
@producer.params.names_of(role).each do |v|
|
76
66
|
s << %Q[ <dc:contributor opf:role="#{role}">#{CGI.escapeHTML(v)}</dc:contributor>\n]
|
77
67
|
if role == "prt"
|
78
68
|
s << %Q[ <dc:publisher>#{v}</dc:publisher>\n]
|
@@ -115,45 +105,21 @@ EOT
|
|
115
105
|
|
116
106
|
@producer.contents.each do |item|
|
117
107
|
next if item.media !~ /xhtml\+xml/ # skip non XHTML
|
118
|
-
s << %Q[ <itemref idref="#{item.id}"/>\n]
|
108
|
+
s << %Q[ <itemref idref="#{item.id}"/>\n]
|
119
109
|
end
|
120
110
|
s << %Q[ </spine>\n]
|
121
111
|
s
|
122
112
|
end
|
123
113
|
|
124
|
-
def opf_guide
|
125
|
-
s = ""
|
126
|
-
s << %Q[ <guide>\n]
|
127
|
-
s << %Q[ <reference type="cover" title="#{@producer.res.v("covertitle")}" href="#{@producer.params["cover"]}"/>\n]
|
128
|
-
s << %Q[ <reference type="title-page" title="#{@producer.res.v("titlepagetitle")}" href="titlepage.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["titlepage"].nil?
|
129
|
-
s << %Q[ <reference type="toc" title="#{@producer.res.v("toctitle")}" href="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["mytoc"].nil?
|
130
|
-
s << %Q[ <reference type="colophon" title="#{@producer.res.v("colophontitle")}" href="colophon.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["colophon"].nil?
|
131
|
-
s << %Q[ </guide>\n]
|
132
|
-
s
|
133
|
-
end
|
134
|
-
|
135
114
|
# Return ncx content. +indentarray+ has prefix marks for each level.
|
136
115
|
def ncx(indentarray)
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
<head>
|
141
|
-
<meta name="dtb:depth" content="1"/>
|
142
|
-
<meta name="dtb:totalPageCount" content="0"/>
|
143
|
-
<meta name="dtb:maxPageNumber" content="0"/>
|
144
|
-
EOT
|
145
|
-
s << ncx_isbn
|
116
|
+
@ncx_isbn = ncx_isbn
|
117
|
+
@ncx_doctitle = ncx_doctitle
|
118
|
+
@ncx_navmap = ncx_navmap(indentarray)
|
146
119
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
s << ncx_doctitle
|
151
|
-
s << ncx_navmap(indentarray)
|
152
|
-
|
153
|
-
s << <<EOT
|
154
|
-
</ncx>
|
155
|
-
EOT
|
156
|
-
s
|
120
|
+
tmplfile = File.expand_path('./ncx/epubv2.ncx.erb', ReVIEW::Template::TEMPLATE_DIR)
|
121
|
+
tmpl = ReVIEW::Template.load(tmplfile)
|
122
|
+
return tmpl.result(binding)
|
157
123
|
end
|
158
124
|
|
159
125
|
# Produce EPUB file +epubfile+.
|
@@ -169,24 +135,5 @@ EOT
|
|
169
135
|
export_zip(tmpdir, epubfile)
|
170
136
|
end
|
171
137
|
|
172
|
-
private
|
173
|
-
|
174
|
-
# Return common XHTML headder
|
175
|
-
def common_header
|
176
|
-
s =<<EOT
|
177
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
178
|
-
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
179
|
-
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ops="http://www.idpf.org/2007/ops" xml:lang="#{@producer.params["language"]}">
|
180
|
-
<head>
|
181
|
-
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8"/>
|
182
|
-
<meta http-equiv="Content-Style-Type" content="text/css"/>
|
183
|
-
<meta name="generator" content="Re:VIEW"/>
|
184
|
-
EOT
|
185
|
-
|
186
|
-
@producer.params["stylesheet"].each do |file|
|
187
|
-
s << %Q[ <link rel="stylesheet" type="text/css" href="#{file}"/>\n]
|
188
|
-
end
|
189
|
-
s
|
190
|
-
end
|
191
138
|
end
|
192
139
|
end
|
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-
|
4
|
+
# Copyright (c) 2010-2016 Kenshi Muto
|
5
5
|
#
|
6
6
|
# This program is free software.
|
7
7
|
# You can distribute or modify this program under the terms of
|
@@ -18,37 +18,53 @@ module EPUBMaker
|
|
18
18
|
# Construct object with parameter hash +params+ and message resource hash +res+.
|
19
19
|
def initialize(producer)
|
20
20
|
super
|
21
|
+
@opf_prefix = Hash.new
|
22
|
+
if @producer.params["opf_prefix"].present?
|
23
|
+
@producer.params["opf_prefix"].each do |k, v|
|
24
|
+
@opf_prefix[k] = v
|
25
|
+
end
|
26
|
+
end
|
21
27
|
end
|
22
28
|
|
23
29
|
# Return opf file content.
|
24
30
|
def opf
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
s << opf_manifest
|
36
|
-
s << opf_tocx
|
37
|
-
s << opf_guide # same as ePUB2
|
38
|
-
|
39
|
-
s << %Q[</package>\n]
|
31
|
+
@opf_metainfo = opf_metainfo
|
32
|
+
@opf_manifest = opf_manifest
|
33
|
+
@opf_toc = opf_tocx
|
34
|
+
@package_attrs = ""
|
35
|
+
|
36
|
+
if !@opf_prefix.empty?
|
37
|
+
prefixes_str = @opf_prefix.map{|k,v| %Q|#{k}: #{v}| }.join(" ")
|
38
|
+
@package_attrs << " prefix=\"#{prefixes_str}\""
|
39
|
+
end
|
40
40
|
|
41
|
-
|
41
|
+
tmplfile = File.expand_path('./opf/epubv3.opf.erb', ReVIEW::Template::TEMPLATE_DIR)
|
42
|
+
tmpl = ReVIEW::Template.load(tmplfile)
|
43
|
+
return tmpl.result(binding)
|
42
44
|
end
|
43
45
|
|
44
46
|
def opf_metainfo
|
45
47
|
s = ""
|
46
48
|
%w[title language date type format source description relation coverage subject rights].each do |item|
|
47
|
-
next
|
48
|
-
if @producer.params[item].
|
49
|
-
@producer.params[item].each_with_index
|
50
|
-
|
51
|
-
|
49
|
+
next unless @producer.params[item]
|
50
|
+
if @producer.params[item].kind_of?(Array)
|
51
|
+
@producer.params[item].each_with_index do |v, i|
|
52
|
+
if v.kind_of?(Hash)
|
53
|
+
s << %Q[ <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v["name"])}</dc:#{item}>\n]
|
54
|
+
v.each_pair do |name, val|
|
55
|
+
next if name == "name"
|
56
|
+
s << %Q[ <meta refines="##{item}-#{i}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n]
|
57
|
+
end
|
58
|
+
else
|
59
|
+
s << %Q[ <dc:#{item} id="#{item}-#{i}">#{CGI.escapeHTML(v.to_s)}</dc:#{item}>\n]
|
60
|
+
end
|
61
|
+
end
|
62
|
+
elsif @producer.params[item].kind_of?(Hash)
|
63
|
+
s << %Q[ <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.params[item]["name"])}</dc:#{item}>\n]
|
64
|
+
@producer.params[item].each_pair do |name, val|
|
65
|
+
next if name == "name"
|
66
|
+
s << %Q[ <meta refines="##{item}" property="#{name}">#{CGI.escapeHTML(val)}</meta>\n]
|
67
|
+
end
|
52
68
|
else
|
53
69
|
s << %Q[ <dc:#{item} id="#{item}">#{CGI.escapeHTML(@producer.params[item].to_s)}</dc:#{item}>\n]
|
54
70
|
end
|
@@ -65,9 +81,9 @@ EOT
|
|
65
81
|
|
66
82
|
# creator (should be array)
|
67
83
|
%w[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 aut].each do |role|
|
68
|
-
next
|
84
|
+
next unless @producer.params[role]
|
69
85
|
@producer.params[role].each_with_index do |v, i|
|
70
|
-
if v.
|
86
|
+
if v.kind_of?(Hash)
|
71
87
|
s << %Q[ <dc:creator id="#{role}-#{i}">#{CGI.escapeHTML(v["name"])}</dc:creator>\n]
|
72
88
|
s << %Q[ <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role.sub('a-', '')}</meta>\n]
|
73
89
|
v.each_pair do |name, val|
|
@@ -83,9 +99,9 @@ EOT
|
|
83
99
|
|
84
100
|
# contributor (should be array)
|
85
101
|
%w[adp ann arr art asn aqt aft aui ant bkp clb cmm csl dsr edt ill lyr mdc mus nrt oth pbd pbl pht prt red rev spn ths trc trl].each do |role|
|
86
|
-
next
|
102
|
+
next unless @producer.params[role]
|
87
103
|
@producer.params[role].each_with_index do |v, i|
|
88
|
-
if v.
|
104
|
+
if v.kind_of?(Hash)
|
89
105
|
s << %Q[ <dc:contributor id="#{role}-#{i}">#{CGI.escapeHTML(v["name"])}</dc:contributor>\n]
|
90
106
|
s << %Q[ <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n]
|
91
107
|
v.each_pair do |name, val|
|
@@ -98,7 +114,7 @@ EOT
|
|
98
114
|
end
|
99
115
|
|
100
116
|
if role == "prt" || role == "pbl"
|
101
|
-
if v.
|
117
|
+
if v.kind_of?(Hash)
|
102
118
|
s << %Q[ <dc:publisher id="pub-#{role}-#{i}">#{CGI.escapeHTML(v["name"])}</dc:publisher>\n]
|
103
119
|
s << %Q[ <meta refines="#pub-#{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n]
|
104
120
|
v.each_pair do |name, val|
|
@@ -113,6 +129,13 @@ EOT
|
|
113
129
|
end
|
114
130
|
end
|
115
131
|
|
132
|
+
## add custom <meta> element
|
133
|
+
if @producer.params["opf_meta"].present?
|
134
|
+
@producer.params["opf_meta"].each do |k, v|
|
135
|
+
s << %Q[ <meta property="#{k}">#{CGI.escapeHTML(v)}</meta>\n]
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
116
139
|
s
|
117
140
|
end
|
118
141
|
|
@@ -126,7 +149,7 @@ EOT
|
|
126
149
|
|
127
150
|
if @producer.params["coverimage"]
|
128
151
|
@producer.contents.each do |item|
|
129
|
-
if item.media
|
152
|
+
if item.media.start_with?('image') && File.basename(item.file) == @producer.params["coverimage"]
|
130
153
|
s << %Q[ <item properties="cover-image" id="cover-#{item.id}" href="#{item.file}" media-type="#{item.media}"/>\n]
|
131
154
|
item.id = nil
|
132
155
|
break
|
@@ -155,51 +178,42 @@ EOT
|
|
155
178
|
end
|
156
179
|
|
157
180
|
s = ""
|
158
|
-
|
181
|
+
if @producer.params["direction"]
|
182
|
+
s << %Q[ <spine page-progression-direction="#{@producer.params["direction"]}">\n]
|
183
|
+
else
|
184
|
+
s << %Q[ <spine>\n]
|
185
|
+
end
|
159
186
|
s << %Q[ <itemref idref="#{@producer.params["bookname"]}" linear="#{cover_linear}"/>\n]
|
160
187
|
s << %Q[ <itemref idref="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}" />\n] if @producer.params["toc"]
|
161
188
|
|
162
189
|
@producer.contents.each do |item|
|
163
190
|
next if item.media !~ /xhtml\+xml/ # skip non XHTML
|
164
|
-
s << %Q[ <itemref idref="#{item.id}"/>\n]
|
191
|
+
s << %Q[ <itemref idref="#{item.id}"/>\n]
|
165
192
|
end
|
166
193
|
s << %Q[ </spine>\n]
|
167
194
|
|
168
195
|
s
|
169
196
|
end
|
170
197
|
|
171
|
-
def opf_guide
|
172
|
-
s = ""
|
173
|
-
s << %Q[ <guide>\n]
|
174
|
-
s << %Q[ <reference type="cover" title="#{@producer.res.v("covertitle")}" href="#{@producer.params["cover"]}"/>\n]
|
175
|
-
s << %Q[ <reference type="title-page" title="#{@producer.res.v("titlepagetitle")}" href="titlepage.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["titlepage"].nil?
|
176
|
-
s << %Q[ <reference type="toc" title="#{@producer.res.v("toctitle")}" href="#{@producer.params["bookname"]}-toc.#{@producer.params["htmlext"]}"/>\n]
|
177
|
-
s << %Q[ <reference type="colophon" title="#{@producer.res.v("colophontitle")}" href="colophon.#{@producer.params["htmlext"]}"/>\n] unless @producer.params["colophon"].nil?
|
178
|
-
s << %Q[ </guide>\n]
|
179
|
-
s
|
180
|
-
end
|
181
|
-
|
182
198
|
def ncx(indentarray)
|
183
|
-
s = common_header
|
184
|
-
s << <<EOT
|
185
|
-
<title>#{@producer.res.v("toctitle")}</title>
|
186
|
-
</head>
|
187
|
-
<body>
|
188
|
-
<nav xmlns:epub="http://www.idpf.org/2007/ops" epub:type="toc" id="toc">
|
189
|
-
<h1 class="toc-title">#{@producer.res.v("toctitle")}</h1>
|
190
|
-
EOT
|
191
|
-
|
192
199
|
if @producer.params["epubmaker"]["flattoc"].nil?
|
193
|
-
|
200
|
+
ncx_main = hierarchy_ncx("ol")
|
194
201
|
else
|
195
|
-
|
202
|
+
ncx_main = flat_ncx("ol", @producer.params["epubmaker"]["flattocindent"])
|
196
203
|
end
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
</
|
204
|
+
|
205
|
+
@body = <<EOT
|
206
|
+
<nav xmlns:epub="http://www.idpf.org/2007/ops" epub:type="toc" id="toc">
|
207
|
+
<h1 class="toc-title">#{CGI.escapeHTML(@producer.res.v("toctitle"))}</h1>
|
208
|
+
#{ncx_main} </nav>
|
201
209
|
EOT
|
202
|
-
|
210
|
+
|
211
|
+
@title = CGI.escapeHTML(@producer.res.v("toctitle"))
|
212
|
+
@language = @producer.params['language']
|
213
|
+
@stylesheets = @producer.params["stylesheet"]
|
214
|
+
tmplfile = File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR)
|
215
|
+
tmpl = ReVIEW::Template.load(tmplfile)
|
216
|
+
return tmpl.result(binding)
|
203
217
|
end
|
204
218
|
|
205
219
|
# Produce EPUB file +epubfile+.
|
@@ -222,7 +236,7 @@ EOT
|
|
222
236
|
|
223
237
|
if @producer.params["coverimage"]
|
224
238
|
@producer.contents.each do |item|
|
225
|
-
if item.media
|
239
|
+
if item.media.start_with?('image') && item.file =~ /#{@producer.params["coverimage"]}\Z/
|
226
240
|
s << <<EOT
|
227
241
|
<item id="#{item.id}" href="#{item.file}" media-type="#{item.media}"/>
|
228
242
|
EOT
|
@@ -237,20 +251,5 @@ EOT
|
|
237
251
|
s
|
238
252
|
end
|
239
253
|
|
240
|
-
def common_header
|
241
|
-
s =<<EOT
|
242
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
243
|
-
<!DOCTYPE html>
|
244
|
-
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xmlns:ops="http://www.idpf.org/2007/ops" xml:lang="#{@producer.params["language"]}">
|
245
|
-
<head>
|
246
|
-
<meta charset="UTF-8" />
|
247
|
-
<meta name="generator" content="Re:VIEW" />
|
248
|
-
EOT
|
249
|
-
|
250
|
-
@producer.params["stylesheet"].each do |file|
|
251
|
-
s << %Q[ <link rel="stylesheet" type="text/css" href="#{file}"/>\n]
|
252
|
-
end
|
253
|
-
s
|
254
|
-
end
|
255
254
|
end
|
256
255
|
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-
|
4
|
+
# Copyright (c) 2010-2016 Kenshi Muto
|
5
5
|
#
|
6
6
|
# This program is free software.
|
7
7
|
# You can distribute or modify this program under the terms of
|
@@ -10,12 +10,14 @@
|
|
10
10
|
|
11
11
|
require 'tmpdir'
|
12
12
|
require 'fileutils'
|
13
|
-
require '
|
14
|
-
require '
|
13
|
+
require 'review/yamlloader'
|
14
|
+
require 'securerandom'
|
15
15
|
require 'epubmaker/content'
|
16
16
|
require 'epubmaker/epubv2'
|
17
17
|
require 'epubmaker/epubv3'
|
18
18
|
require 'review/i18n'
|
19
|
+
require 'review/configure'
|
20
|
+
require 'review/extentions/hash'
|
19
21
|
|
20
22
|
module EPUBMaker
|
21
23
|
# EPUBMaker produces EPUB file.
|
@@ -29,14 +31,16 @@ module EPUBMaker
|
|
29
31
|
|
30
32
|
# Take YAML +file+ and return parameter hash.
|
31
33
|
def Producer.load(file)
|
32
|
-
raise "Can't open #{
|
33
|
-
|
34
|
+
raise "Can't open #{file}." if file.nil? || !File.exist?(file)
|
35
|
+
loader = ReVIEW::YAMLLoader.new
|
36
|
+
loader.load_file(file)
|
34
37
|
end
|
35
38
|
|
36
39
|
# Take YAML +file+ and update parameter hash.
|
37
40
|
def load(file)
|
38
|
-
raise "Can't open #{
|
39
|
-
|
41
|
+
raise "Can't open #{file}." if file.nil? || !File.exist?(file)
|
42
|
+
loader = ReVIEW::YAMLLoader.new
|
43
|
+
merge_params(@params.deep_merge(loader.load_file(file)))
|
40
44
|
end
|
41
45
|
|
42
46
|
# Construct producer object.
|
@@ -44,19 +48,29 @@ module EPUBMaker
|
|
44
48
|
# +version+ takes EPUB version (default is 2).
|
45
49
|
def initialize(params=nil, version=nil)
|
46
50
|
@contents = []
|
47
|
-
@params =
|
51
|
+
@params = ReVIEW::Configure.new
|
48
52
|
@epub = nil
|
49
53
|
@params["epubversion"] = version unless version.nil?
|
50
54
|
@res = ReVIEW::I18n
|
51
55
|
|
52
|
-
|
56
|
+
if params
|
53
57
|
merge_params(params)
|
54
58
|
end
|
55
59
|
end
|
56
60
|
|
61
|
+
def coverimage
|
62
|
+
return nil unless params["coverimage"]
|
63
|
+
@contents.each do |item|
|
64
|
+
if item.media.start_with?('image') && item.file =~ /#{params["coverimage"]}\Z/ # /
|
65
|
+
return item.file
|
66
|
+
end
|
67
|
+
end
|
68
|
+
return nil
|
69
|
+
end
|
70
|
+
|
57
71
|
# Update parameters by merging from new parameter hash +params+.
|
58
72
|
def merge_params(params)
|
59
|
-
@params
|
73
|
+
@params.deep_merge!(params)
|
60
74
|
complement
|
61
75
|
|
62
76
|
unless @params["epubversion"].nil?
|
@@ -133,7 +147,7 @@ module EPUBMaker
|
|
133
147
|
return nil unless File.exist?(path)
|
134
148
|
allow_exts = @params["image_ext"] if allow_exts.nil?
|
135
149
|
Dir.foreach(path) do |f|
|
136
|
-
next if f
|
150
|
+
next if f.start_with?('.')
|
137
151
|
if f =~ /\.(#{allow_exts.join("|")})\Z/i
|
138
152
|
path.chop! if path =~ /\/\Z/
|
139
153
|
if base.nil?
|
@@ -180,23 +194,33 @@ module EPUBMaker
|
|
180
194
|
end
|
181
195
|
end
|
182
196
|
|
197
|
+
def isbn_hyphen
|
198
|
+
str = @params["isbn"].to_s
|
199
|
+
|
200
|
+
if str =~ /\A\d{10}\Z/
|
201
|
+
"#{str[0..0]}-#{str[1..5]}-#{str[6..8]}-#{str[9..9]}"
|
202
|
+
elsif str =~ /\A\d{13}\Z/
|
203
|
+
"#{str[0..2]}-#{str[3..3]}-#{str[4..8]}-#{str[9..11]}-#{str[12..12]}"
|
204
|
+
else
|
205
|
+
nil
|
206
|
+
end
|
207
|
+
end
|
208
|
+
|
183
209
|
private
|
184
210
|
|
185
211
|
# Complement parameters.
|
186
212
|
def complement
|
187
213
|
@params["htmlext"] = "html" if @params["htmlext"].nil?
|
188
|
-
defaults = {
|
189
|
-
"cover" => "#{@params["bookname"]}.#{@params["htmlext"]}",
|
190
|
-
"title" => @params["booktitle"],
|
214
|
+
defaults = ReVIEW::Configure.new.merge({
|
191
215
|
"language" => "ja",
|
192
216
|
"date" => Time.now.strftime("%Y-%m-%d"),
|
193
217
|
"modified" => Time.now.strftime("%Y-%02m-%02dT%02H:%02M:%02SZ"),
|
194
|
-
"urnid" => "urn:uid:#{
|
218
|
+
"urnid" => "urn:uid:#{SecureRandom.uuid}",
|
195
219
|
"isbn" => nil,
|
196
220
|
"toclevel" => 2,
|
197
221
|
"stylesheet" => [],
|
198
|
-
"epubversion" =>
|
199
|
-
"htmlversion" =>
|
222
|
+
"epubversion" => 3,
|
223
|
+
"htmlversion" => 5,
|
200
224
|
"secnolevel" => 2,
|
201
225
|
"pre_secnolevel" => 0,
|
202
226
|
"post_secnolevel" => 1,
|
@@ -206,6 +230,8 @@ module EPUBMaker
|
|
206
230
|
"originaltitlefile" => nil,
|
207
231
|
"profile" => nil,
|
208
232
|
"colophon" => nil,
|
233
|
+
"colophon_order" => %w[aut csl trl dsr ill edt pbl prt pht],
|
234
|
+
"direction" => "ltr",
|
209
235
|
"epubmaker" => {
|
210
236
|
"flattoc" => nil,
|
211
237
|
"flattocindent" => true,
|
@@ -224,21 +250,15 @@ module EPUBMaker
|
|
224
250
|
"force_include_images" => [],
|
225
251
|
"cover_linear" => nil,
|
226
252
|
},
|
253
|
+
"externallink" => true,
|
227
254
|
"imagedir" => "images",
|
228
255
|
"fontdir" => "fonts",
|
229
256
|
"image_ext" => %w(png gif jpg jpeg svg ttf woff otf),
|
230
257
|
"font_ext" => %w(ttf woff otf),
|
231
|
-
}
|
258
|
+
})
|
232
259
|
|
233
|
-
defaults.
|
234
|
-
|
235
|
-
v.each_pair do |k2, v2|
|
236
|
-
@params[k][k2] = v2 if @params[k][k2].nil?
|
237
|
-
end
|
238
|
-
else
|
239
|
-
@params[k] = v if @params[k].nil?
|
240
|
-
end
|
241
|
-
end
|
260
|
+
@params = defaults.deep_merge(@params)
|
261
|
+
@params["title"] = @params["booktitle"] unless @params["title"]
|
242
262
|
|
243
263
|
deprecated_parameters = {
|
244
264
|
"ncxindent" => "epubmaker:ncxindent",
|
@@ -268,14 +288,18 @@ module EPUBMaker
|
|
268
288
|
end
|
269
289
|
end
|
270
290
|
|
271
|
-
@params["htmlversion"]
|
291
|
+
@params["htmlversion"] = 5 if @params["epubversion"] >= 3
|
292
|
+
|
293
|
+
@params.maker = "epubmaker"
|
294
|
+
@params["cover"] = "#{@params["bookname"]}.#{@params["htmlext"]}" unless @params["cover"]
|
272
295
|
|
273
296
|
%w[bookname title].each do |k|
|
274
|
-
raise "Key #{k} must have a value. Abort."
|
297
|
+
raise "Key #{k} must have a value. Abort." unless @params[k]
|
275
298
|
end
|
276
299
|
# array
|
277
300
|
%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 pbl prt red rev spn ths trc trl stylesheet rights].each do |item|
|
278
|
-
|
301
|
+
next unless @params[item]
|
302
|
+
@params[item] = [@params[item]] if @params[item].kind_of?(String)
|
279
303
|
end
|
280
304
|
# optional
|
281
305
|
# type, format, identifier, source, relation, coverpage, aut
|