review 4.2.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/ruby-win.yml +11 -5
- data/.rubocop.yml +113 -24
- data/NEWS.ja.md +94 -0
- data/NEWS.md +94 -0
- data/bin/review-catalog-converter +1 -1
- data/bin/review-check +2 -4
- data/bin/review-checkdep +1 -1
- data/bin/review-compile +8 -14
- data/bin/review-validate +1 -1
- data/doc/config.yml.sample +4 -1
- data/doc/config.yml.sample-simple +1 -1
- data/doc/format.ja.md +83 -4
- data/doc/format.md +84 -7
- data/doc/makeindex.ja.md +2 -2
- data/doc/quickstart.ja.md +3 -3
- data/doc/quickstart.md +2 -2
- data/lib/epubmaker/content.rb +3 -2
- data/lib/epubmaker/epubcommon.rb +33 -25
- data/lib/epubmaker/epubv2.rb +5 -6
- data/lib/epubmaker/epubv3.rb +20 -18
- data/lib/review/book.rb +2 -2
- data/lib/review/book/base.rb +61 -25
- data/lib/review/book/bib.rb +21 -0
- data/lib/review/book/book_unit.rb +155 -0
- data/lib/review/book/chapter.rb +30 -26
- data/lib/review/book/index.rb +23 -185
- data/lib/review/book/index/item.rb +7 -1
- data/lib/review/book/part.rb +21 -9
- data/lib/review/book/volume.rb +1 -1
- data/lib/review/builder.rb +68 -13
- data/lib/review/catalog.rb +2 -2
- data/lib/review/compiler.rb +159 -73
- data/lib/review/configure.rb +22 -1
- data/lib/review/converter.rb +1 -1
- data/lib/review/epub2html.rb +6 -1
- data/lib/review/epubmaker.rb +12 -23
- data/lib/review/htmlbuilder.rb +36 -7
- data/lib/review/htmlutils.rb +7 -10
- data/lib/review/i18n.rb +1 -1
- data/lib/review/idgxmlbuilder.rb +51 -6
- data/lib/review/idgxmlmaker.rb +9 -14
- data/lib/review/index_builder.rb +653 -0
- data/lib/review/init.rb +5 -13
- data/lib/review/latexbuilder.rb +65 -4
- data/lib/review/logger.rb +2 -2
- data/lib/review/makerhelper.rb +11 -0
- data/lib/review/markdownbuilder.rb +19 -1
- data/lib/review/pdfmaker.rb +17 -36
- data/lib/review/plaintextbuilder.rb +48 -2
- data/lib/review/preprocessor.rb +5 -5
- data/lib/review/rstbuilder.rb +25 -6
- data/lib/review/sec_counter.rb +13 -0
- data/lib/review/textmaker.rb +4 -12
- data/lib/review/tocprinter.rb +2 -3
- data/lib/review/topbuilder.rb +26 -0
- data/lib/review/update.rb +7 -7
- data/lib/review/version.rb +1 -1
- data/lib/review/volumeprinter.rb +2 -3
- data/lib/review/webmaker.rb +9 -20
- data/review.gemspec +2 -2
- data/samples/sample-book/src/config.yml +1 -1
- data/samples/syntax-book/Gemfile +1 -1
- data/samples/syntax-book/config.yml +1 -1
- data/templates/latex/config.erb +27 -23
- data/templates/latex/review-jlreq/README.md +3 -1
- data/templates/latex/review-jlreq/review-base.sty +31 -15
- data/templates/latex/review-jlreq/review-jlreq.cls +8 -24
- data/templates/latex/review-jsbook/README.md +7 -5
- data/templates/latex/review-jsbook/review-base.sty +34 -16
- data/templates/latex/review-jsbook/review-jsbook.cls +4 -2
- data/templates/web/html/layout-html5.html.erb +1 -1
- data/test/assets/test_template.tex +3 -3
- data/test/assets/test_template_backmatter.tex +3 -3
- data/test/book_test_helper.rb +11 -5
- data/test/test_book.rb +54 -63
- data/test/test_book_chapter.rb +93 -52
- data/test/test_builder.rb +24 -15
- data/test/test_converter.rb +1 -0
- data/test/test_epub3maker.rb +2 -2
- data/test/test_epubmaker.rb +8 -0
- data/test/test_helper.rb +4 -1
- data/test/test_htmlbuilder.rb +627 -56
- data/test/test_htmlutils.rb +0 -12
- data/test/test_i18n.rb +33 -33
- data/test/test_idgxmlbuilder.rb +358 -11
- data/test/test_idgxmlmaker_cmd.rb +1 -1
- data/test/test_index.rb +62 -52
- data/test/test_indexbuilder.rb +52 -0
- data/test/test_latexbuilder.rb +547 -10
- data/test/test_latexbuilder_v2.rb +43 -5
- data/test/test_logger.rb +7 -7
- data/test/test_makerhelper.rb +0 -12
- data/test/test_markdownbuilder.rb +3 -0
- data/test/test_pdfmaker.rb +13 -12
- data/test/test_pdfmaker_cmd.rb +1 -1
- data/test/test_plaintextbuilder.rb +422 -7
- data/test/test_review_ext.rb +2 -1
- data/test/test_rstbuilder.rb +25 -1
- data/test/test_sec_counter.rb +156 -0
- data/test/test_textmaker_cmd.rb +1 -1
- data/test/test_topbuilder.rb +187 -10
- data/test/test_update.rb +10 -10
- data/test/test_webtocprinter.rb +12 -12
- data/vendor/gentombow/LICENSE +1 -1
- data/vendor/gentombow/Makefile +0 -1
- data/vendor/gentombow/bounddvi-en.pdf +0 -0
- data/vendor/gentombow/bounddvi-en.tex +1 -0
- data/vendor/gentombow/bounddvi.pdf +0 -0
- data/vendor/gentombow/bounddvi.sty +30 -7
- data/vendor/gentombow/bounddvi.tex +1 -0
- data/vendor/gentombow/create_archive.sh +1 -0
- data/vendor/gentombow/gentombow-ja.pdf +0 -0
- data/vendor/gentombow/gentombow-ja.tex +9 -0
- data/vendor/gentombow/gentombow.pdf +0 -0
- data/vendor/gentombow/gentombow.sty +32 -10
- data/vendor/gentombow/gentombow.tex +8 -0
- data/vendor/gentombow/tests/gentombow-01-pdfx.tex +8 -0
- data/vendor/gentombow/tests/gentombow-02-pdfx.tex +8 -0
- data/vendor/jsclasses/Makefile +3 -2
- data/vendor/jsclasses/create_archive.sh +5 -5
- data/vendor/jsclasses/jis/Makefile +3 -2
- data/vendor/jsclasses/jis/jsarticle.cls +22 -18
- data/vendor/jsclasses/jis/jsbook.cls +22 -18
- data/vendor/jsclasses/jis/jsclasses.dtx +94 -13
- data/vendor/jsclasses/jis/jsclasses.ins +15 -5
- data/vendor/jsclasses/jis/jslogo.ins +9 -0
- data/vendor/jsclasses/jis/jslogo.sty +1 -13
- data/vendor/jsclasses/jis/jspf.cls +22 -18
- data/vendor/jsclasses/jis/jsreport.cls +22 -18
- data/vendor/jsclasses/jis/jsverb.ins +9 -0
- data/vendor/jsclasses/jis/jsverb.sty +1 -13
- data/vendor/jsclasses/jis/kiyou.cls +22 -18
- data/vendor/jsclasses/jis/minijs.sty +65 -22
- data/vendor/jsclasses/jis/okumacro.ins +9 -0
- data/vendor/jsclasses/jis/okumacro.sty +1 -13
- data/vendor/jsclasses/jis/okuverb.ins +9 -0
- data/vendor/jsclasses/jis/okuverb.sty +1 -13
- data/vendor/jsclasses/jis/winjis.sty +23 -19
- data/vendor/jsclasses/jsarticle.cls +22 -18
- data/vendor/jsclasses/jsbook.cls +22 -18
- data/vendor/jsclasses/jsclasses.dtx +94 -13
- data/vendor/jsclasses/jsclasses.ins +15 -5
- data/vendor/jsclasses/jsclasses.pdf +0 -0
- data/vendor/jsclasses/jslogo.ins +9 -0
- data/vendor/jsclasses/jslogo.pdf +0 -0
- data/vendor/jsclasses/jslogo.sty +1 -13
- data/vendor/jsclasses/jspf.cls +22 -18
- data/vendor/jsclasses/jsreport.cls +22 -18
- data/vendor/jsclasses/jsverb.ins +9 -0
- data/vendor/jsclasses/jsverb.pdf +0 -0
- data/vendor/jsclasses/jsverb.sty +1 -13
- data/vendor/jsclasses/kiyou.cls +22 -18
- data/vendor/jsclasses/minijs.sty +68 -22
- data/vendor/jsclasses/okumacro.ins +9 -0
- data/vendor/jsclasses/okumacro.pdf +0 -0
- data/vendor/jsclasses/okumacro.sty +1 -13
- data/vendor/jsclasses/okuverb.ins +9 -0
- data/vendor/jsclasses/okuverb.pdf +0 -0
- data/vendor/jsclasses/okuverb.sty +1 -13
- data/vendor/jsclasses/tests/relfont.tex +10 -0
- data/vendor/jsclasses/winjis.sty +23 -19
- metadata +14 -6
- data/.rubocop_todo.yml +0 -7
- data/lib/review/book/compilable.rb +0 -174
data/lib/epubmaker/epubcommon.rb
CHANGED
|
@@ -10,7 +10,11 @@
|
|
|
10
10
|
|
|
11
11
|
require 'review/i18n'
|
|
12
12
|
require 'review/template'
|
|
13
|
-
|
|
13
|
+
begin
|
|
14
|
+
require 'cgi/escape'
|
|
15
|
+
rescue LoadError
|
|
16
|
+
require 'cgi/util'
|
|
17
|
+
end
|
|
14
18
|
|
|
15
19
|
module EPUBMaker
|
|
16
20
|
# EPUBCommon is the common class for EPUB producer.
|
|
@@ -22,6 +26,10 @@ module EPUBMaker
|
|
|
22
26
|
@body_ext = nil
|
|
23
27
|
end
|
|
24
28
|
|
|
29
|
+
def h(str)
|
|
30
|
+
CGI.escapeHTML(str)
|
|
31
|
+
end
|
|
32
|
+
|
|
25
33
|
# Return mimetype content.
|
|
26
34
|
def mimetype
|
|
27
35
|
'application/epub+zip'
|
|
@@ -59,10 +67,10 @@ module EPUBMaker
|
|
|
59
67
|
def ncx_doctitle
|
|
60
68
|
<<EOT
|
|
61
69
|
<docTitle>
|
|
62
|
-
<text>#{
|
|
70
|
+
<text>#{h(@producer.config['title'])}</text>
|
|
63
71
|
</docTitle>
|
|
64
72
|
<docAuthor>
|
|
65
|
-
<text>#{@producer.config['aut'].nil? ? '' :
|
|
73
|
+
<text>#{@producer.config['aut'].nil? ? '' : h(join_with_separator(@producer.config['aut'], ReVIEW::I18n.t('names_splitter')))}</text>
|
|
66
74
|
</docAuthor>
|
|
67
75
|
EOT
|
|
68
76
|
end
|
|
@@ -72,7 +80,7 @@ EOT
|
|
|
72
80
|
<navMap>
|
|
73
81
|
<navPoint id="top" playOrder="1">
|
|
74
82
|
<navLabel>
|
|
75
|
-
<text>#{
|
|
83
|
+
<text>#{h(@producer.config['title'])}</text>
|
|
76
84
|
</navLabel>
|
|
77
85
|
<content src="#{@producer.config['cover']}"/>
|
|
78
86
|
</navPoint>
|
|
@@ -84,7 +92,7 @@ EOT
|
|
|
84
92
|
s << <<EOT
|
|
85
93
|
<navPoint id="toc" playOrder="#{nav_count}">
|
|
86
94
|
<navLabel>
|
|
87
|
-
<text>#{
|
|
95
|
+
<text>#{h(@producer.res.v('toctitle'))}</text>
|
|
88
96
|
</navLabel>
|
|
89
97
|
<content src="#{@producer.config['bookname']}-toc.#{@producer.config['htmlext']}"/>
|
|
90
98
|
</navPoint>
|
|
@@ -100,7 +108,7 @@ EOT
|
|
|
100
108
|
s << <<EOT
|
|
101
109
|
<navPoint id="nav-#{nav_count}" playOrder="#{nav_count}">
|
|
102
110
|
<navLabel>
|
|
103
|
-
<text>#{indent[level]}#{
|
|
111
|
+
<text>#{indent[level]}#{h(item.title)}</text>
|
|
104
112
|
</navLabel>
|
|
105
113
|
<content src="#{item.file}"/>
|
|
106
114
|
</navPoint>
|
|
@@ -131,21 +139,21 @@ EOT
|
|
|
131
139
|
raise "coverimage #{@producer.config['coverimage']} not found. Abort." unless file
|
|
132
140
|
@body = <<-EOT
|
|
133
141
|
<div id="cover-image" class="cover-image">
|
|
134
|
-
<img src="#{file}" alt="#{
|
|
142
|
+
<img src="#{file}" alt="#{h(@producer.config.name_of('title'))}" class="max"/>
|
|
135
143
|
</div>
|
|
136
144
|
EOT
|
|
137
145
|
else
|
|
138
146
|
@body = <<-EOT
|
|
139
|
-
<h1 class="cover-title">#{
|
|
147
|
+
<h1 class="cover-title">#{h(@producer.config.name_of('title'))}</h1>
|
|
140
148
|
EOT
|
|
141
149
|
if @producer.config['subtitle']
|
|
142
150
|
@body << <<-EOT
|
|
143
|
-
<h2 class="cover-subtitle">#{
|
|
151
|
+
<h2 class="cover-subtitle">#{h(@producer.config.name_of('subtitle'))}</h2>
|
|
144
152
|
EOT
|
|
145
153
|
end
|
|
146
154
|
end
|
|
147
155
|
|
|
148
|
-
@title =
|
|
156
|
+
@title = h(@producer.config.name_of('title'))
|
|
149
157
|
@language = @producer.config['language']
|
|
150
158
|
@stylesheets = @producer.config['stylesheet']
|
|
151
159
|
tmplfile = if @producer.config['htmlversion'].to_i == 5
|
|
@@ -161,7 +169,7 @@ EOT
|
|
|
161
169
|
# NOTE: this method is not used yet.
|
|
162
170
|
# see lib/review/epubmaker.rb#build_titlepage
|
|
163
171
|
def titlepage
|
|
164
|
-
@title =
|
|
172
|
+
@title = h(@producer.config.name_of('title'))
|
|
165
173
|
|
|
166
174
|
@body = <<EOT
|
|
167
175
|
<h1 class="tp-title">#{@title}</h1>
|
|
@@ -169,7 +177,7 @@ EOT
|
|
|
169
177
|
|
|
170
178
|
if @producer.config['subtitle']
|
|
171
179
|
@body << <<EOT
|
|
172
|
-
<h2 class="tp-subtitle">#{
|
|
180
|
+
<h2 class="tp-subtitle">#{h(@producer.config.name_of('subtitle'))}</h2>
|
|
173
181
|
EOT
|
|
174
182
|
end
|
|
175
183
|
|
|
@@ -179,7 +187,7 @@ EOT
|
|
|
179
187
|
<br />
|
|
180
188
|
<br />
|
|
181
189
|
</p>
|
|
182
|
-
<h2 class="tp-author">#{
|
|
190
|
+
<h2 class="tp-author">#{h(join_with_separator(@producer.config.names_of('aut'), ReVIEW::I18n.t('names_splitter')))}</h2>
|
|
183
191
|
EOT
|
|
184
192
|
end
|
|
185
193
|
|
|
@@ -192,7 +200,7 @@ EOT
|
|
|
192
200
|
<br />
|
|
193
201
|
<br />
|
|
194
202
|
</p>
|
|
195
|
-
<h3 class="tp-publisher">#{
|
|
203
|
+
<h3 class="tp-publisher">#{h(join_with_separator(publisher, ReVIEW::I18n.t('names_splitter')))}</h3>
|
|
196
204
|
EOT
|
|
197
205
|
end
|
|
198
206
|
|
|
@@ -209,18 +217,18 @@ EOT
|
|
|
209
217
|
|
|
210
218
|
# Return colophon content.
|
|
211
219
|
def colophon
|
|
212
|
-
@title =
|
|
220
|
+
@title = h(@producer.res.v('colophontitle'))
|
|
213
221
|
@body = <<EOT
|
|
214
222
|
<div class="colophon">
|
|
215
223
|
EOT
|
|
216
224
|
|
|
217
225
|
if @producer.config['subtitle'].nil?
|
|
218
226
|
@body << <<EOT
|
|
219
|
-
<p class="title">#{
|
|
227
|
+
<p class="title">#{h(@producer.config.name_of('title'))}</p>
|
|
220
228
|
EOT
|
|
221
229
|
else
|
|
222
230
|
@body << <<EOT
|
|
223
|
-
<p class="title">#{
|
|
231
|
+
<p class="title">#{h(@producer.config.name_of('title'))}<br /><span class="subtitle">#{h(@producer.config.name_of('subtitle'))}</span></p>
|
|
224
232
|
EOT
|
|
225
233
|
end
|
|
226
234
|
|
|
@@ -229,7 +237,7 @@ EOT
|
|
|
229
237
|
@body << %Q( <table class="colophon">\n)
|
|
230
238
|
@body << @producer.config['colophon_order'].map do |role|
|
|
231
239
|
if @producer.config[role]
|
|
232
|
-
%Q( <tr><th>#{
|
|
240
|
+
%Q( <tr><th>#{h(@producer.res.v(role))}</th><td>#{h(join_with_separator(@producer.config.names_of(role), ReVIEW::I18n.t('names_splitter')))}</td></tr>\n)
|
|
233
241
|
else
|
|
234
242
|
''
|
|
235
243
|
end
|
|
@@ -238,7 +246,7 @@ EOT
|
|
|
238
246
|
@body << %Q( <tr><th>ISBN</th><td>#{@producer.isbn_hyphen}</td></tr>\n) if @producer.isbn_hyphen
|
|
239
247
|
@body << %Q( </table>\n)
|
|
240
248
|
if @producer.config['rights'] && !@producer.config['rights'].empty?
|
|
241
|
-
@body << %Q( <p class="copyright">#{join_with_separator(@producer.config.names_of('rights').map { |m|
|
|
249
|
+
@body << %Q( <p class="copyright">#{join_with_separator(@producer.config.names_of('rights').map { |m| h(m) }, '<br />')}</p>\n)
|
|
242
250
|
end
|
|
243
251
|
@body << %Q( </div>\n)
|
|
244
252
|
|
|
@@ -261,11 +269,11 @@ EOT
|
|
|
261
269
|
items.each_with_index do |item, rev|
|
|
262
270
|
editstr = edit == 0 ? ReVIEW::I18n.t('first_edition') : ReVIEW::I18n.t('nth_edition', (edit + 1).to_s)
|
|
263
271
|
revstr = ReVIEW::I18n.t('nth_impression', (rev + 1).to_s)
|
|
264
|
-
if item =~ /\A\d
|
|
272
|
+
if item =~ /\A\d+-\d+-\d+\Z/
|
|
265
273
|
buf << %Q( <p>#{ReVIEW::I18n.t('published_by1', [date_to_s(item), editstr + revstr])}</p>\n)
|
|
266
|
-
elsif item =~ /\A(\d
|
|
274
|
+
elsif item =~ /\A(\d+-\d+-\d+)[\s ](.+)/
|
|
267
275
|
# custom date with string
|
|
268
|
-
item.match(/\A(\d
|
|
276
|
+
item.match(/\A(\d+-\d+-\d+)[\s ](.+)/) do |m|
|
|
269
277
|
buf << %Q( <p>#{ReVIEW::I18n.t('published_by3', [date_to_s(m[1]), m[2]])}</p>\n)
|
|
270
278
|
end
|
|
271
279
|
else
|
|
@@ -289,9 +297,9 @@ EOT
|
|
|
289
297
|
|
|
290
298
|
# Return own toc content.
|
|
291
299
|
def mytoc
|
|
292
|
-
@title =
|
|
300
|
+
@title = h(@producer.res.v('toctitle'))
|
|
293
301
|
|
|
294
|
-
@body = %Q( <h1 class="toc-title">#{
|
|
302
|
+
@body = %Q( <h1 class="toc-title">#{h(@producer.res.v('toctitle'))}</h1>\n)
|
|
295
303
|
if @producer.config['epubmaker']['flattoc'].nil?
|
|
296
304
|
@body << hierarchy_ncx('ul')
|
|
297
305
|
else
|
|
@@ -385,7 +393,7 @@ EOT
|
|
|
385
393
|
@producer.contents.each do |item|
|
|
386
394
|
next if !item.notoc.nil? || item.level.nil? || item.file.nil? || item.title.nil? || item.level > @producer.config['toclevel'].to_i
|
|
387
395
|
is = indent == true ? ' ' * item.level : ''
|
|
388
|
-
s << %Q(<li><a href="#{item.file}">#{is}#{
|
|
396
|
+
s << %Q(<li><a href="#{item.file}">#{is}#{h(item.title)}</a></li>\n)
|
|
389
397
|
end
|
|
390
398
|
s << %Q(</#{type}>\n)
|
|
391
399
|
|
data/lib/epubmaker/epubv2.rb
CHANGED
|
@@ -9,14 +9,13 @@
|
|
|
9
9
|
#
|
|
10
10
|
|
|
11
11
|
require 'epubmaker/epubcommon'
|
|
12
|
-
require 'cgi'
|
|
13
12
|
require 'epubmaker/zip_exporter'
|
|
14
13
|
|
|
15
14
|
module EPUBMaker
|
|
16
15
|
# EPUBv2 is EPUB version 2 producer.
|
|
17
16
|
class EPUBv2 < EPUBCommon
|
|
18
17
|
# Construct object with parameter hash +config+ and message resource hash +res+.
|
|
19
|
-
def initialize(producer)
|
|
18
|
+
def initialize(producer) # rubocop:disable Lint/UselessMethodDefinition
|
|
20
19
|
super
|
|
21
20
|
end
|
|
22
21
|
|
|
@@ -37,9 +36,9 @@ module EPUBMaker
|
|
|
37
36
|
%w[title language date type format source description relation coverage subject rights].each do |item|
|
|
38
37
|
next unless @producer.config[item]
|
|
39
38
|
if @producer.config[item].is_a?(Array)
|
|
40
|
-
s << @producer.config.names_of(item).map { |i| %Q( <dc:#{item}>#{
|
|
39
|
+
s << @producer.config.names_of(item).map { |i| %Q( <dc:#{item}>#{h(i)}</dc:#{item}>\n) }.join
|
|
41
40
|
else
|
|
42
|
-
s << %Q( <dc:#{item}>#{
|
|
41
|
+
s << %Q( <dc:#{item}>#{h(@producer.config.name_of(item).to_s)}</dc:#{item}>\n)
|
|
43
42
|
end
|
|
44
43
|
end
|
|
45
44
|
|
|
@@ -54,7 +53,7 @@ module EPUBMaker
|
|
|
54
53
|
%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|
|
|
55
54
|
next unless @producer.config[role]
|
|
56
55
|
@producer.config.names_of(role).each do |v|
|
|
57
|
-
s << %Q( <dc:creator opf:role="#{role.sub('a-', '')}">#{
|
|
56
|
+
s << %Q( <dc:creator opf:role="#{role.sub('a-', '')}">#{h(v)}</dc:creator>\n)
|
|
58
57
|
end
|
|
59
58
|
end
|
|
60
59
|
|
|
@@ -62,7 +61,7 @@ module EPUBMaker
|
|
|
62
61
|
%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|
|
|
63
62
|
next unless @producer.config[role]
|
|
64
63
|
@producer.config.names_of(role).each do |v|
|
|
65
|
-
s << %Q( <dc:contributor opf:role="#{role}">#{
|
|
64
|
+
s << %Q( <dc:contributor opf:role="#{role}">#{h(v)}</dc:contributor>\n)
|
|
66
65
|
if role == 'prt'
|
|
67
66
|
s << %Q( <dc:publisher>#{v}</dc:publisher>\n)
|
|
68
67
|
end
|
data/lib/epubmaker/epubv3.rb
CHANGED
|
@@ -40,6 +40,7 @@ module EPUBMaker
|
|
|
40
40
|
ReVIEW::Template.load(tmplfile).result(binding)
|
|
41
41
|
end
|
|
42
42
|
|
|
43
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
|
43
44
|
def opf_metainfo
|
|
44
45
|
s = ''
|
|
45
46
|
%w[title language date type format source description relation coverage subject rights].each do |item|
|
|
@@ -47,23 +48,23 @@ module EPUBMaker
|
|
|
47
48
|
if @producer.config[item].is_a?(Array)
|
|
48
49
|
@producer.config[item].each_with_index do |v, i|
|
|
49
50
|
if v.is_a?(Hash)
|
|
50
|
-
s << %Q( <dc:#{item} id="#{item}-#{i}">#{
|
|
51
|
+
s << %Q( <dc:#{item} id="#{item}-#{i}">#{h(v['name'])}</dc:#{item}>\n)
|
|
51
52
|
v.each_pair do |name, val|
|
|
52
53
|
next if name == 'name'
|
|
53
|
-
s << %Q( <meta refines="##{item}-#{i}" property="#{name}">#{
|
|
54
|
+
s << %Q( <meta refines="##{item}-#{i}" property="#{name}">#{h(val)}</meta>\n)
|
|
54
55
|
end
|
|
55
56
|
else
|
|
56
|
-
s << %Q( <dc:#{item} id="#{item}-#{i}">#{
|
|
57
|
+
s << %Q( <dc:#{item} id="#{item}-#{i}">#{h(v.to_s)}</dc:#{item}>\n)
|
|
57
58
|
end
|
|
58
59
|
end
|
|
59
60
|
elsif @producer.config[item].is_a?(Hash)
|
|
60
|
-
s << %Q( <dc:#{item} id="#{item}">#{
|
|
61
|
+
s << %Q( <dc:#{item} id="#{item}">#{h(@producer.config[item]['name'])}</dc:#{item}>\n)
|
|
61
62
|
@producer.config[item].each_pair do |name, val|
|
|
62
63
|
next if name == 'name'
|
|
63
|
-
s << %Q( <meta refines="##{item}" property="#{name}">#{
|
|
64
|
+
s << %Q( <meta refines="##{item}" property="#{name}">#{h(val)}</meta>\n)
|
|
64
65
|
end
|
|
65
66
|
else
|
|
66
|
-
s << %Q( <dc:#{item} id="#{item}">#{
|
|
67
|
+
s << %Q( <dc:#{item} id="#{item}">#{h(@producer.config[item].to_s)}</dc:#{item}>\n)
|
|
67
68
|
end
|
|
68
69
|
end
|
|
69
70
|
|
|
@@ -81,14 +82,14 @@ module EPUBMaker
|
|
|
81
82
|
next unless @producer.config[role]
|
|
82
83
|
@producer.config[role].each_with_index do |v, i|
|
|
83
84
|
if v.is_a?(Hash)
|
|
84
|
-
s << %Q( <dc:creator id="#{role}-#{i}">#{
|
|
85
|
+
s << %Q( <dc:creator id="#{role}-#{i}">#{h(v['name'])}</dc:creator>\n)
|
|
85
86
|
s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role.sub('a-', '')}</meta>\n)
|
|
86
87
|
v.each_pair do |name, val|
|
|
87
88
|
next if name == 'name'
|
|
88
|
-
s << %Q( <meta refines="##{role.sub('a-', '')}-#{i}" property="#{name}">#{
|
|
89
|
+
s << %Q( <meta refines="##{role.sub('a-', '')}-#{i}" property="#{name}">#{h(val)}</meta>\n)
|
|
89
90
|
end
|
|
90
91
|
else
|
|
91
|
-
s << %Q( <dc:creator id="#{role}-#{i}">#{
|
|
92
|
+
s << %Q( <dc:creator id="#{role}-#{i}">#{h(v)}</dc:creator>\n)
|
|
92
93
|
s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role.sub('a-', '')}</meta>\n)
|
|
93
94
|
end
|
|
94
95
|
end
|
|
@@ -99,27 +100,27 @@ module EPUBMaker
|
|
|
99
100
|
next unless @producer.config[role]
|
|
100
101
|
@producer.config[role].each_with_index do |v, i|
|
|
101
102
|
if v.is_a?(Hash)
|
|
102
|
-
s << %Q( <dc:contributor id="#{role}-#{i}">#{
|
|
103
|
+
s << %Q( <dc:contributor id="#{role}-#{i}">#{h(v['name'])}</dc:contributor>\n)
|
|
103
104
|
s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
|
|
104
105
|
v.each_pair do |name, val|
|
|
105
106
|
next if name == 'name'
|
|
106
|
-
s << %Q( <meta refines="##{role}-#{i}" property="#{name}">#{
|
|
107
|
+
s << %Q( <meta refines="##{role}-#{i}" property="#{name}">#{h(val)}</meta>\n)
|
|
107
108
|
end
|
|
108
109
|
else
|
|
109
|
-
s << %Q( <dc:contributor id="#{role}-#{i}">#{
|
|
110
|
+
s << %Q( <dc:contributor id="#{role}-#{i}">#{h(v)}</dc:contributor>\n)
|
|
110
111
|
s << %Q( <meta refines="##{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
|
|
111
112
|
end
|
|
112
113
|
|
|
113
114
|
if %w[prt pbl].include?(role)
|
|
114
115
|
if v.is_a?(Hash)
|
|
115
|
-
s << %Q( <dc:publisher id="pub-#{role}-#{i}">#{
|
|
116
|
+
s << %Q( <dc:publisher id="pub-#{role}-#{i}">#{h(v['name'])}</dc:publisher>\n)
|
|
116
117
|
s << %Q( <meta refines="#pub-#{role}-#{i}" property="role" scheme="marc:relators">#{role}</meta>\n)
|
|
117
118
|
v.each_pair do |name, val|
|
|
118
119
|
next if name == 'name'
|
|
119
|
-
s << %Q( <meta refines="#pub-#{role}-#{i}" property="#{name}">#{
|
|
120
|
+
s << %Q( <meta refines="#pub-#{role}-#{i}" property="#{name}">#{h(val)}</meta>\n)
|
|
120
121
|
end
|
|
121
122
|
else
|
|
122
|
-
s << %Q( <dc:publisher id="pub-#{role}-#{i}">#{
|
|
123
|
+
s << %Q( <dc:publisher id="pub-#{role}-#{i}">#{h(v)}</dc:publisher>\n)
|
|
123
124
|
s << %Q( <meta refines="#pub-#{role}-#{i}" property="role" scheme="marc:relators">prt</meta>\n)
|
|
124
125
|
end
|
|
125
126
|
end
|
|
@@ -129,12 +130,13 @@ module EPUBMaker
|
|
|
129
130
|
## add custom <meta> element
|
|
130
131
|
if @producer.config['opf_meta'].present?
|
|
131
132
|
@producer.config['opf_meta'].each do |k, v|
|
|
132
|
-
s << %Q( <meta property="#{k}">#{
|
|
133
|
+
s << %Q( <meta property="#{k}">#{h(v)}</meta>\n)
|
|
133
134
|
end
|
|
134
135
|
end
|
|
135
136
|
|
|
136
137
|
s
|
|
137
138
|
end
|
|
139
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
|
138
140
|
|
|
139
141
|
def opf_manifest
|
|
140
142
|
s = ''
|
|
@@ -206,11 +208,11 @@ EOT
|
|
|
206
208
|
|
|
207
209
|
@body = <<EOT
|
|
208
210
|
<nav xmlns:epub="http://www.idpf.org/2007/ops" epub:type="toc" id="toc">
|
|
209
|
-
<h1 class="toc-title">#{
|
|
211
|
+
<h1 class="toc-title">#{h(@producer.res.v('toctitle'))}</h1>
|
|
210
212
|
#{ncx_main} </nav>
|
|
211
213
|
EOT
|
|
212
214
|
|
|
213
|
-
@title =
|
|
215
|
+
@title = h(@producer.res.v('toctitle'))
|
|
214
216
|
@language = @producer.config['language']
|
|
215
217
|
@stylesheets = @producer.config['stylesheet']
|
|
216
218
|
tmplfile = File.expand_path('./html/layout-html5.html.erb', ReVIEW::Template::TEMPLATE_DIR)
|
data/lib/review/book.rb
CHANGED
data/lib/review/book/base.rb
CHANGED
|
@@ -9,26 +9,34 @@
|
|
|
9
9
|
#
|
|
10
10
|
require 'review/configure'
|
|
11
11
|
require 'review/catalog'
|
|
12
|
+
require 'review/book/bib'
|
|
12
13
|
|
|
13
14
|
module ReVIEW
|
|
14
15
|
module Book
|
|
15
16
|
class Base
|
|
16
17
|
attr_accessor :config
|
|
17
18
|
attr_writer :parts
|
|
18
|
-
|
|
19
|
+
attr_accessor :catalog
|
|
19
20
|
attr_reader :basedir
|
|
21
|
+
attr_accessor :bibpaper_index
|
|
20
22
|
|
|
21
|
-
def self.load(
|
|
22
|
-
new(
|
|
23
|
+
def self.load(basedir = '.', config: nil)
|
|
24
|
+
new(basedir, config: config)
|
|
23
25
|
end
|
|
24
26
|
|
|
25
|
-
def initialize(basedir = '.')
|
|
27
|
+
def initialize(basedir = '.', config: nil)
|
|
26
28
|
@basedir = basedir
|
|
27
29
|
@logger = ReVIEW.logger
|
|
28
30
|
@parts = nil
|
|
29
31
|
@chapter_index = nil
|
|
30
|
-
@config = ReVIEW::Configure.values
|
|
32
|
+
@config = config || ReVIEW::Configure.values
|
|
31
33
|
@catalog = nil
|
|
34
|
+
@bibpaper_index = nil
|
|
35
|
+
catalog_path = filename_join(@basedir, @config['catalogfile'])
|
|
36
|
+
if catalog_path && File.file?(catalog_path)
|
|
37
|
+
parse_catalog_file(catalog_path)
|
|
38
|
+
end
|
|
39
|
+
|
|
32
40
|
@warn_old_files = {} # XXX for checking CHAPS, PREDEF, POSTDEF
|
|
33
41
|
@basedir_seen = {}
|
|
34
42
|
update_rubyenv
|
|
@@ -44,6 +52,14 @@ module ReVIEW
|
|
|
44
52
|
end
|
|
45
53
|
end
|
|
46
54
|
|
|
55
|
+
def execute_indexer
|
|
56
|
+
return unless @catalog
|
|
57
|
+
|
|
58
|
+
parts.each do |part|
|
|
59
|
+
part.chapters.each(&:execute_indexer)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
47
63
|
def bib_file
|
|
48
64
|
config['bib_file']
|
|
49
65
|
end
|
|
@@ -94,6 +110,30 @@ module ReVIEW
|
|
|
94
110
|
end
|
|
95
111
|
end
|
|
96
112
|
|
|
113
|
+
def create_chapter_index
|
|
114
|
+
chapter_index = ChapterIndex.new
|
|
115
|
+
each_chapter do |chap|
|
|
116
|
+
chapter_index.add_item(Index::Item.new(chap.id, chap.number, chap))
|
|
117
|
+
end
|
|
118
|
+
parts.each do |prt|
|
|
119
|
+
if prt.id.present?
|
|
120
|
+
chapter_index.add_item(Index::Item.new(prt.id, prt.number, prt))
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
chapter_index
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def generate_indexes
|
|
127
|
+
if bib_exist?
|
|
128
|
+
bib = ReVIEW::Book::Bib.new(file_content: bib_content, book: self)
|
|
129
|
+
bib.generate_indexes(use_bib: true)
|
|
130
|
+
@bibpaper_index = bib.bibpaper_index
|
|
131
|
+
end
|
|
132
|
+
self.each_chapter(&:generate_indexes)
|
|
133
|
+
self.parts.map(&:generate_indexes)
|
|
134
|
+
@chapter_index = create_chapter_index
|
|
135
|
+
end
|
|
136
|
+
|
|
97
137
|
def parts
|
|
98
138
|
@parts ||= read_parts
|
|
99
139
|
end
|
|
@@ -101,7 +141,7 @@ module ReVIEW
|
|
|
101
141
|
def parts_in_file
|
|
102
142
|
# TODO: should be `parts.find_all{|part| part.present? and part.file?}` ?
|
|
103
143
|
parts.find_all do |part|
|
|
104
|
-
part if part.present?
|
|
144
|
+
part if part.present? && part.file?
|
|
105
145
|
end
|
|
106
146
|
end
|
|
107
147
|
|
|
@@ -136,15 +176,7 @@ module ReVIEW
|
|
|
136
176
|
|
|
137
177
|
def chapter_index
|
|
138
178
|
return @chapter_index if @chapter_index
|
|
139
|
-
@chapter_index =
|
|
140
|
-
each_chapter do |chap|
|
|
141
|
-
@chapter_index.add_item(Index::Item.new(chap.id, chap.number, chap))
|
|
142
|
-
end
|
|
143
|
-
parts.each do |prt|
|
|
144
|
-
if prt.id.present?
|
|
145
|
-
@chapter_index.add_item(Index::Item.new(prt.id, prt.number, prt))
|
|
146
|
-
end
|
|
147
|
-
end
|
|
179
|
+
@chapter_index = create_chapter_index
|
|
148
180
|
@chapter_index
|
|
149
181
|
end
|
|
150
182
|
|
|
@@ -183,17 +215,15 @@ module ReVIEW
|
|
|
183
215
|
@config.merge!(new_conf)
|
|
184
216
|
end
|
|
185
217
|
|
|
186
|
-
def
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
catalogfile_path = filename_join(@basedir, config['catalogfile'])
|
|
190
|
-
if File.file?(catalogfile_path)
|
|
191
|
-
@catalog = File.open(catalogfile_path, 'rt:BOM|utf-8') { |f| Catalog.new(f) }
|
|
218
|
+
def parse_catalog_file(path)
|
|
219
|
+
unless File.file?(path)
|
|
220
|
+
raise FileNotFound, "catalog.yml is not found #{path}"
|
|
192
221
|
end
|
|
193
|
-
|
|
222
|
+
|
|
223
|
+
File.open(path, 'rt:BOM|utf-8') do |f|
|
|
224
|
+
@catalog = Catalog.new(f)
|
|
194
225
|
@catalog.validate!(@config, basedir)
|
|
195
226
|
end
|
|
196
|
-
@catalog
|
|
197
227
|
end
|
|
198
228
|
|
|
199
229
|
def read_chaps
|
|
@@ -252,6 +282,10 @@ module ReVIEW
|
|
|
252
282
|
File.exist?(File.join(contentdir, bib_file))
|
|
253
283
|
end
|
|
254
284
|
|
|
285
|
+
def bib_content
|
|
286
|
+
File.read(File.join(contentdir, bib_file))
|
|
287
|
+
end
|
|
288
|
+
|
|
255
289
|
def prefaces
|
|
256
290
|
if catalog
|
|
257
291
|
return Part.mkpart_from_namelist(self, catalog.predef)
|
|
@@ -333,8 +367,8 @@ module ReVIEW
|
|
|
333
367
|
end
|
|
334
368
|
end
|
|
335
369
|
|
|
336
|
-
|
|
337
|
-
|
|
370
|
+
# rubocop:disable Style/RedundantAssignment
|
|
371
|
+
chap = read_chaps.map(&:strip).join("\n").split(/\n{2,}/).map do |part_chunk|
|
|
338
372
|
chaps = part_chunk.split.map { |chapid| Chapter.new(self, num += 1, chapid, File.join(contentdir, chapid)) }
|
|
339
373
|
if part_exist? && read_part.size > part
|
|
340
374
|
Part.new(self, part += 1, chaps, read_part[part - 1])
|
|
@@ -342,6 +376,8 @@ module ReVIEW
|
|
|
342
376
|
Part.new(self, nil, chaps)
|
|
343
377
|
end
|
|
344
378
|
end
|
|
379
|
+
# rubocop:enable Style/RedundantAssignment
|
|
380
|
+
|
|
345
381
|
chap
|
|
346
382
|
end
|
|
347
383
|
|