review 5.3.0 → 5.4.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-tex.yml +1 -1
- data/.github/workflows/ruby.yml +1 -1
- data/.rubocop.yml +1 -322
- data/NEWS.ja.md +48 -0
- data/NEWS.md +48 -0
- data/README.md +9 -8
- data/bin/review +1 -1
- data/bin/review-catalog-converter +15 -15
- data/bin/review-check +7 -7
- data/bin/review-compile +6 -8
- data/bin/review-index +1 -1
- data/bin/review-preproc +1 -1
- data/bin/review-validate +2 -2
- data/doc/config.yml.sample +7 -1
- data/doc/config.yml.sample-simple +1 -1
- data/lib/review/book/base.rb +3 -3
- data/lib/review/book/book_unit.rb +1 -1
- data/lib/review/book/chapter.rb +1 -1
- data/lib/review/book/index.rb +3 -3
- data/lib/review/book/part.rb +12 -13
- data/lib/review/book/volume.rb +1 -1
- data/lib/review/builder.rb +10 -12
- data/lib/review/catalog.rb +5 -5
- data/lib/review/compiler.rb +13 -13
- data/lib/review/configure.rb +5 -2
- data/lib/review/epub2html.rb +12 -12
- data/lib/review/epubmaker/content.rb +1 -1
- data/lib/review/epubmaker/epubcommon.rb +44 -42
- data/lib/review/epubmaker/epubv2.rb +2 -1
- data/lib/review/epubmaker/epubv3.rb +5 -4
- data/lib/review/epubmaker/producer.rb +3 -3
- data/lib/review/epubmaker/reviewheaderlistener.rb +1 -1
- data/lib/review/epubmaker.rb +32 -31
- data/lib/review/extentions/string.rb +1 -1
- data/lib/review/htmlbuilder.rb +16 -15
- data/lib/review/htmlutils.rb +17 -17
- data/lib/review/i18n.rb +3 -3
- data/lib/review/idgxmlbuilder.rb +22 -21
- data/lib/review/idgxmlmaker.rb +15 -13
- data/lib/review/index_builder.rb +4 -20
- data/lib/review/init.rb +4 -4
- data/lib/review/latexbuilder.rb +30 -32
- data/lib/review/lineinput.rb +3 -3
- data/lib/review/location.rb +1 -1
- data/lib/review/logger.rb +21 -21
- data/lib/review/makerhelper.rb +3 -3
- data/lib/review/markdownbuilder.rb +6 -6
- data/lib/review/pdfmaker.rb +23 -19
- data/lib/review/plaintextbuilder.rb +5 -5
- data/lib/review/preprocessor/repository.rb +1 -1
- data/lib/review/preprocessor.rb +5 -5
- data/lib/review/textmaker.rb +20 -18
- data/lib/review/textutils.rb +3 -5
- data/lib/review/topbuilder.rb +71 -12
- data/lib/review/update.rb +16 -8
- data/lib/review/version.rb +1 -1
- data/lib/review/webmaker.rb +32 -32
- data/lib/review/webtocprinter.rb +10 -10
- data/lib/review/yamlloader.rb +35 -2
- data/review.gemspec +1 -0
- data/samples/sample-book/src/config.yml +0 -1
- data/templates/html/_titlepage.html.erb +9 -17
- data/templates/opf/opf_manifest_epubv2.opf.erb +1 -1
- data/templates/opf/opf_manifest_epubv3.opf.erb +1 -1
- data/test/book_test_helper.rb +10 -10
- data/test/test_epub3maker.rb +3 -3
- data/test/test_epubmaker.rb +14 -29
- data/test/test_epubmaker_cmd.rb +2 -2
- data/test/test_htmlbuilder.rb +4 -5
- data/test/test_idgxmlbuilder.rb +10 -10
- data/test/test_idgxmlmaker_cmd.rb +1 -1
- data/test/test_img_math.rb +11 -2
- data/test/test_latexbuilder.rb +2 -3
- data/test/test_pdfmaker_cmd.rb +10 -10
- data/test/test_textmaker_cmd.rb +1 -1
- data/test/test_topbuilder.rb +151 -11
- data/test/test_yamlloader.rb +28 -42
- metadata +8 -7
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# = epubcommon.rb -- super class for EPUBv2 and EPUBv3
|
|
2
2
|
#
|
|
3
|
-
# Copyright (c) 2010-
|
|
3
|
+
# Copyright (c) 2010-2022 Kenshi Muto and Masayoshi Takahashi
|
|
4
4
|
#
|
|
5
5
|
# This program is free software.
|
|
6
6
|
# You can distribute or modify this program under the terms of
|
|
@@ -27,6 +27,7 @@ module ReVIEW
|
|
|
27
27
|
@contents = producer.contents
|
|
28
28
|
@body_ext = nil
|
|
29
29
|
@logger = ReVIEW.logger
|
|
30
|
+
@workdir = nil
|
|
30
31
|
end
|
|
31
32
|
|
|
32
33
|
attr_reader :config
|
|
@@ -36,7 +37,8 @@ module ReVIEW
|
|
|
36
37
|
CGI.escapeHTML(str)
|
|
37
38
|
end
|
|
38
39
|
|
|
39
|
-
def produce(
|
|
40
|
+
def produce(_epubfile, _basedir, _tmpdir, base_dir:)
|
|
41
|
+
@workdir = base_dir
|
|
40
42
|
raise NotImplementedError # should be overridden
|
|
41
43
|
end
|
|
42
44
|
|
|
@@ -99,27 +101,43 @@ module ReVIEW
|
|
|
99
101
|
end
|
|
100
102
|
end
|
|
101
103
|
|
|
104
|
+
def template_name(localfile: 'layout.html.erb', systemfile: nil)
|
|
105
|
+
if @workdir
|
|
106
|
+
layoutfile = File.join(@workdir, 'layouts', localfile)
|
|
107
|
+
if File.exist?(layoutfile)
|
|
108
|
+
return layoutfile
|
|
109
|
+
end
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
if systemfile
|
|
113
|
+
return systemfile
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
if config['htmlversion'].to_i == 5
|
|
117
|
+
'./html/layout-html5.html.erb'
|
|
118
|
+
else
|
|
119
|
+
'./html/layout-xhtml1.html.erb'
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
102
123
|
# Return cover content.
|
|
103
124
|
# If Producer#config["coverimage"] is defined, it will be used for
|
|
104
125
|
# the cover image.
|
|
105
126
|
def cover
|
|
106
|
-
@body_ext = config['epubversion'] >= 3 ? %Q( epub:type="cover") :
|
|
127
|
+
@body_ext = config['epubversion'] >= 3 ? %Q( epub:type="cover") : nil
|
|
107
128
|
|
|
108
129
|
if config['coverimage']
|
|
109
130
|
@coverimage_src = coverimage
|
|
110
131
|
raise ApplicationError, "coverimage #{config['coverimage']} not found. Abort." unless @coverimage_src
|
|
111
132
|
end
|
|
112
|
-
@body = ReVIEW::Template.generate(path: '
|
|
133
|
+
@body = ReVIEW::Template.generate(path: template_name(localfile: '_cover.html.erb', systemfile: 'html/_cover.html.erb'), binding: binding)
|
|
113
134
|
|
|
114
135
|
@title = h(config.name_of('title'))
|
|
115
136
|
@language = config['language']
|
|
116
137
|
@stylesheets = config['stylesheet']
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
'./html/layout-xhtml1.html.erb'
|
|
121
|
-
end
|
|
122
|
-
ReVIEW::Template.generate(path: template_path, binding: binding)
|
|
138
|
+
ret = ReVIEW::Template.generate(path: template_name, binding: binding)
|
|
139
|
+
@body_ext = nil
|
|
140
|
+
ret
|
|
123
141
|
end
|
|
124
142
|
|
|
125
143
|
# Return title (copying) content.
|
|
@@ -138,16 +156,11 @@ module ReVIEW
|
|
|
138
156
|
if config.names_of('pbl')
|
|
139
157
|
@publisher_str = join_with_separator(config.names_of('pbl'), ReVIEW::I18n.t('names_splitter'))
|
|
140
158
|
end
|
|
141
|
-
@body = ReVIEW::Template.generate(path: './html/_titlepage.html.erb', binding: binding)
|
|
159
|
+
@body = ReVIEW::Template.generate(path: template_name(localfile: '_titlepage.html.erb', systemfile: './html/_titlepage.html.erb'), binding: binding)
|
|
142
160
|
|
|
143
161
|
@language = config['language']
|
|
144
162
|
@stylesheets = config['stylesheet']
|
|
145
|
-
|
|
146
|
-
'./html/layout-html5.html.erb'
|
|
147
|
-
else
|
|
148
|
-
'./html/layout-xhtml1.html.erb'
|
|
149
|
-
end
|
|
150
|
-
ReVIEW::Template.generate(path: template_path, binding: binding)
|
|
163
|
+
ReVIEW::Template.generate(path: template_name, binding: binding)
|
|
151
164
|
end
|
|
152
165
|
|
|
153
166
|
# Return colophon content.
|
|
@@ -155,24 +168,19 @@ module ReVIEW
|
|
|
155
168
|
@title = h(ReVIEW::I18n.t('colophontitle'))
|
|
156
169
|
@isbn_hyphen = isbn_hyphen
|
|
157
170
|
|
|
158
|
-
@body = ReVIEW::Template.generate(path: './html/_colophon.html.erb', binding: binding)
|
|
171
|
+
@body = ReVIEW::Template.generate(path: template_name(localfile: '_colophon.html.erb', systemfile: './html/_colophon.html.erb'), binding: binding)
|
|
159
172
|
|
|
160
173
|
@language = config['language']
|
|
161
174
|
@stylesheets = config['stylesheet']
|
|
162
|
-
|
|
163
|
-
'./html/layout-html5.html.erb'
|
|
164
|
-
else
|
|
165
|
-
'./html/layout-xhtml1.html.erb'
|
|
166
|
-
end
|
|
167
|
-
ReVIEW::Template.generate(path: template_path, binding: binding)
|
|
175
|
+
ReVIEW::Template.generate(path: template_name, binding: binding)
|
|
168
176
|
end
|
|
169
177
|
|
|
170
178
|
def isbn_hyphen
|
|
171
179
|
str = config['isbn'].to_s
|
|
172
180
|
|
|
173
|
-
if
|
|
181
|
+
if /\A\d{10}\Z/.match?(str)
|
|
174
182
|
"#{str[0..0]}-#{str[1..5]}-#{str[6..8]}-#{str[9..9]}"
|
|
175
|
-
elsif
|
|
183
|
+
elsif /\A\d{13}\Z/.match?(str)
|
|
176
184
|
"#{str[0..2]}-#{str[3..3]}-#{str[4..8]}-#{str[9..11]}-#{str[12..12]}"
|
|
177
185
|
end
|
|
178
186
|
end
|
|
@@ -184,9 +192,9 @@ module ReVIEW
|
|
|
184
192
|
items.each_with_index do |item, rev|
|
|
185
193
|
editstr = edit == 0 ? ReVIEW::I18n.t('first_edition') : ReVIEW::I18n.t('nth_edition', (edit + 1).to_s)
|
|
186
194
|
revstr = ReVIEW::I18n.t('nth_impression', (rev + 1).to_s)
|
|
187
|
-
if
|
|
195
|
+
if /\A\d+-\d+-\d+\Z/.match?(item)
|
|
188
196
|
@col_history << ReVIEW::I18n.t('published_by1', [date_to_s(item), editstr + revstr])
|
|
189
|
-
elsif
|
|
197
|
+
elsif /\A(\d+-\d+-\d+)[\s ](.+)/.match?(item)
|
|
190
198
|
# custom date with string
|
|
191
199
|
item.match(/\A(\d+-\d+-\d+)[\s ](.+)/) do |m|
|
|
192
200
|
@col_history << ReVIEW::I18n.t('published_by3', [date_to_s(m[1]), m[2]])
|
|
@@ -199,7 +207,7 @@ module ReVIEW
|
|
|
199
207
|
end
|
|
200
208
|
end
|
|
201
209
|
|
|
202
|
-
ReVIEW::Template.generate(path: './html/_colophon_history.html.erb', binding: binding)
|
|
210
|
+
ReVIEW::Template.generate(path: template_name(localfile: '_colophon_history.html.erb', systemfile: './html/_colophon_history.html.erb'), binding: binding)
|
|
203
211
|
end
|
|
204
212
|
|
|
205
213
|
def date_to_s(date)
|
|
@@ -211,22 +219,16 @@ module ReVIEW
|
|
|
211
219
|
# Return own toc content.
|
|
212
220
|
def mytoc
|
|
213
221
|
@title = h(ReVIEW::I18n.t('toctitle'))
|
|
214
|
-
|
|
215
222
|
@body = %Q( <h1 class="toc-title">#{h(ReVIEW::I18n.t('toctitle'))}</h1>\n)
|
|
216
|
-
if config['epubmaker']['flattoc'].nil?
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
223
|
+
@body << if config['epubmaker']['flattoc'].nil?
|
|
224
|
+
hierarchy_ncx('ul')
|
|
225
|
+
else
|
|
226
|
+
flat_ncx('ul', config['epubmaker']['flattocindent'])
|
|
227
|
+
end
|
|
221
228
|
|
|
222
229
|
@language = config['language']
|
|
223
230
|
@stylesheets = config['stylesheet']
|
|
224
|
-
|
|
225
|
-
'./html/layout-html5.html.erb'
|
|
226
|
-
else
|
|
227
|
-
'./html/layout-xhtml1.html.erb'
|
|
228
|
-
end
|
|
229
|
-
ReVIEW::Template.generate(path: template_path, binding: binding)
|
|
231
|
+
ReVIEW::Template.generate(path: template_name, binding: binding)
|
|
230
232
|
end
|
|
231
233
|
|
|
232
234
|
def hierarchy_ncx(type)
|
|
@@ -334,7 +336,7 @@ module ReVIEW
|
|
|
334
336
|
end
|
|
335
337
|
|
|
336
338
|
contents.each do |item|
|
|
337
|
-
next if item.file
|
|
339
|
+
next if /#/.match?(item.file) # skip subgroup
|
|
338
340
|
|
|
339
341
|
fname = "#{basedir}/#{item.file}"
|
|
340
342
|
unless File.exist?(fname)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# = epubv2.rb -- EPUB version 2 producer.
|
|
2
2
|
#
|
|
3
|
-
# Copyright (c) 2010-
|
|
3
|
+
# Copyright (c) 2010-2022 Kenshi Muto and Masayoshi Takahashi
|
|
4
4
|
#
|
|
5
5
|
# This program is free software.
|
|
6
6
|
# You can distribute or modify this program under the terms of
|
|
@@ -159,6 +159,7 @@ EOT
|
|
|
159
159
|
# +basedir+ points the directory has contents.
|
|
160
160
|
# +tmpdir+ defines temporary directory.
|
|
161
161
|
def produce(epubfile, work_dir, tmpdir, base_dir:)
|
|
162
|
+
@workdir = base_dir
|
|
162
163
|
produce_write_common(work_dir, tmpdir)
|
|
163
164
|
|
|
164
165
|
ncx_file = "#{tmpdir}/OEBPS/#{config['bookname']}.ncx"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# = epubv3.rb -- EPUB version 3 producer.
|
|
2
2
|
#
|
|
3
|
-
# Copyright (c) 2010-
|
|
3
|
+
# Copyright (c) 2010-2022 Kenshi Muto
|
|
4
4
|
#
|
|
5
5
|
# This program is free software.
|
|
6
6
|
# You can distribute or modify this program under the terms of
|
|
@@ -186,7 +186,7 @@ module ReVIEW
|
|
|
186
186
|
@tocx_contents = []
|
|
187
187
|
toc = nil
|
|
188
188
|
contents.each do |item|
|
|
189
|
-
next
|
|
189
|
+
next unless /xhtml\+xml/.match?(item.media) # skip non XHTML
|
|
190
190
|
|
|
191
191
|
@tocx_contents << item
|
|
192
192
|
end
|
|
@@ -210,19 +210,20 @@ module ReVIEW
|
|
|
210
210
|
@title = h(ReVIEW::I18n.t('toctitle'))
|
|
211
211
|
@language = config['language']
|
|
212
212
|
@stylesheets = config['stylesheet']
|
|
213
|
-
ReVIEW::Template.generate(path:
|
|
213
|
+
ReVIEW::Template.generate(path: template_name, binding: binding)
|
|
214
214
|
end
|
|
215
215
|
|
|
216
216
|
# Produce EPUB file +epubfile+.
|
|
217
217
|
# +work_dir+ points the directory has contents.
|
|
218
218
|
# +tmpdir+ defines temporary directory.
|
|
219
219
|
def produce(epubfile, work_dir, tmpdir, base_dir:)
|
|
220
|
+
@workdir = base_dir
|
|
220
221
|
produce_write_common(work_dir, tmpdir)
|
|
221
222
|
|
|
222
223
|
toc_file = "#{tmpdir}/OEBPS/#{config['bookname']}-toc.#{config['htmlext']}"
|
|
223
224
|
File.write(toc_file, ncx(config['epubmaker']['ncxindent']))
|
|
224
225
|
|
|
225
|
-
call_hook('hook_prepack', tmpdir, base_dir:
|
|
226
|
+
call_hook('hook_prepack', tmpdir, base_dir: @workdir)
|
|
226
227
|
expoter = ReVIEW::EPUBMaker::ZipExporter.new(tmpdir, config)
|
|
227
228
|
expoter.export_zip(epubfile)
|
|
228
229
|
end
|
|
@@ -89,8 +89,8 @@ module ReVIEW
|
|
|
89
89
|
Dir.foreach(path) do |f|
|
|
90
90
|
next if f.start_with?('.')
|
|
91
91
|
|
|
92
|
-
if
|
|
93
|
-
path.chop! if
|
|
92
|
+
if /\.(#{allow_exts.join('|')})\Z/i.match?(f)
|
|
93
|
+
path.chop! if %r{/\Z}.match?(path)
|
|
94
94
|
if base.nil?
|
|
95
95
|
@contents.push(ReVIEW::EPUBMaker::Content.new(file: "#{path}/#{f}"))
|
|
96
96
|
else
|
|
@@ -115,7 +115,7 @@ module ReVIEW
|
|
|
115
115
|
|
|
116
116
|
# use Dir to solve a path for Windows (see #1011)
|
|
117
117
|
new_tmpdir = Dir[File.join(tmpdir.nil? ? Dir.mktmpdir : tmpdir)][0]
|
|
118
|
-
|
|
118
|
+
unless epubfile.start_with?('/')
|
|
119
119
|
epubfile = "#{current}/#{epubfile}"
|
|
120
120
|
end
|
|
121
121
|
|
data/lib/review/epubmaker.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (c) 2010-
|
|
1
|
+
# Copyright (c) 2010-2022 Kenshi Muto and Masayoshi Takahashi
|
|
2
2
|
#
|
|
3
3
|
# This program is free software.
|
|
4
4
|
# You can distribute or modify this program under the terms of
|
|
@@ -75,9 +75,13 @@ module ReVIEW
|
|
|
75
75
|
cmd_config, yamlfile, exportfile = parse_opts(args)
|
|
76
76
|
error! "#{yamlfile} not found." unless File.exist?(yamlfile)
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
begin
|
|
79
|
+
@config = ReVIEW::Configure.create(maker: 'epubmaker',
|
|
80
|
+
yamlfile: yamlfile,
|
|
81
|
+
config: cmd_config)
|
|
82
|
+
rescue ReVIEW::ConfigError => e
|
|
83
|
+
error! e.message
|
|
84
|
+
end
|
|
81
85
|
@producer = ReVIEW::EPUBMaker::Producer.new(@config)
|
|
82
86
|
update_log_level
|
|
83
87
|
debug("Loaded yaml file (#{yamlfile}).")
|
|
@@ -227,7 +231,7 @@ module ReVIEW
|
|
|
227
231
|
if @config['epubmaker']['verify_target_images'].present?
|
|
228
232
|
@config['epubmaker']['force_include_images'].each do |file|
|
|
229
233
|
unless File.exist?(file)
|
|
230
|
-
|
|
234
|
+
unless /\Ahttps?:/.match?(file)
|
|
231
235
|
warn "#{file} is not found, skip."
|
|
232
236
|
end
|
|
233
237
|
next
|
|
@@ -257,7 +261,7 @@ module ReVIEW
|
|
|
257
261
|
|
|
258
262
|
if FileTest.directory?(File.join(resdir, fname))
|
|
259
263
|
recursive_copy_files(File.join(resdir, fname), File.join(destdir, fname), allow_exts)
|
|
260
|
-
elsif
|
|
264
|
+
elsif /\.(#{allow_exts.join('|')})\Z/i.match?(fname)
|
|
261
265
|
FileUtils.mkdir_p(destdir)
|
|
262
266
|
debug("Copy #{resdir}/#{fname} to the temporary directory.")
|
|
263
267
|
FileUtils.cp(File.join(resdir, fname), destdir, preserve: true)
|
|
@@ -315,15 +319,25 @@ module ReVIEW
|
|
|
315
319
|
File.open(File.join(basetmpdir, htmlfile), 'w') do |f|
|
|
316
320
|
@part_number = part.number
|
|
317
321
|
@part_title = part.name.strip
|
|
318
|
-
@body = ReVIEW::Template.generate(path: 'html/_part_body.html.erb', binding: binding)
|
|
319
|
-
|
|
322
|
+
@body = ReVIEW::Template.generate(path: template_name(localfile: '_part_body.html.erb', systemfile: 'html/_part_body.html.erb'), binding: binding)
|
|
320
323
|
@language = @producer.config['language']
|
|
321
324
|
@stylesheets = @producer.config['stylesheet']
|
|
322
325
|
f.write ReVIEW::Template.generate(path: template_name, binding: binding)
|
|
323
326
|
end
|
|
324
327
|
end
|
|
325
328
|
|
|
326
|
-
def template_name
|
|
329
|
+
def template_name(localfile: 'layout.html.erb', systemfile: nil)
|
|
330
|
+
if @basedir
|
|
331
|
+
layoutfile = File.join(@basedir, 'layouts', localfile)
|
|
332
|
+
if File.exist?(layoutfile)
|
|
333
|
+
return layoutfile
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
if systemfile
|
|
338
|
+
return systemfile
|
|
339
|
+
end
|
|
340
|
+
|
|
327
341
|
if @producer.config['htmlversion'].to_i == 5
|
|
328
342
|
'./html/layout-html5.html.erb'
|
|
329
343
|
else
|
|
@@ -376,7 +390,7 @@ module ReVIEW
|
|
|
376
390
|
|
|
377
391
|
if @config['params'].present?
|
|
378
392
|
warn %Q('params:' in config.yml is obsoleted.)
|
|
379
|
-
if @config['params']
|
|
393
|
+
if /stylesheet=/.match?(@config['params'])
|
|
380
394
|
warn %Q(stylesheets should be defined in 'stylesheet:', not in 'params:')
|
|
381
395
|
end
|
|
382
396
|
end
|
|
@@ -384,7 +398,7 @@ module ReVIEW
|
|
|
384
398
|
@converter.convert(filename, File.join(basetmpdir, htmlfile))
|
|
385
399
|
write_info_body(basetmpdir, id, htmlfile, ispart, chaptype)
|
|
386
400
|
remove_hidden_title(basetmpdir, htmlfile)
|
|
387
|
-
rescue => e
|
|
401
|
+
rescue StandardError => e
|
|
388
402
|
@compile_errors = true
|
|
389
403
|
error "compile error in #{filename} (#{e.class})"
|
|
390
404
|
error e.message
|
|
@@ -436,11 +450,11 @@ module ReVIEW
|
|
|
436
450
|
end
|
|
437
451
|
|
|
438
452
|
properties = detect_properties(path)
|
|
439
|
-
if properties.present?
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
453
|
+
prop_str = if properties.present?
|
|
454
|
+
',properties=' + properties.join(' ')
|
|
455
|
+
else
|
|
456
|
+
''
|
|
457
|
+
end
|
|
444
458
|
first = true
|
|
445
459
|
headlines.each do |headline|
|
|
446
460
|
if ispart.present? && headline['level'] == 1
|
|
@@ -545,25 +559,12 @@ module ReVIEW
|
|
|
545
559
|
end
|
|
546
560
|
|
|
547
561
|
def build_titlepage(basetmpdir, htmlfile)
|
|
548
|
-
# TODO: should be created via epubcommon
|
|
549
562
|
@title = h(@config.name_of('booktitle'))
|
|
550
563
|
File.open(File.join(basetmpdir, htmlfile), 'w') do |f|
|
|
551
|
-
@body = ''
|
|
552
|
-
@body << %Q(<div class="titlepage">\n)
|
|
553
|
-
@body << %Q(<h1 class="tp-title">#{h(@config.name_of('booktitle'))}</h1>\n)
|
|
554
|
-
if @config['subtitle']
|
|
555
|
-
@body << %Q(<h2 class="tp-subtitle">#{h(@config.name_of('subtitle'))}</h2>\n)
|
|
556
|
-
end
|
|
557
|
-
if @config['aut']
|
|
558
|
-
@body << %Q(<h2 class="tp-author">#{h(@config.names_of('aut').join(ReVIEW::I18n.t('names_splitter')))}</h2>\n)
|
|
559
|
-
end
|
|
560
|
-
if @config['pbl']
|
|
561
|
-
@body << %Q(<h3 class="tp-publisher">#{h(@config.names_of('pbl').join(ReVIEW::I18n.t('names_splitter')))}</h3>\n)
|
|
562
|
-
end
|
|
563
|
-
@body << '</div>'
|
|
564
|
-
|
|
564
|
+
@body = ReVIEW::Template.generate(path: template_name(localfile: '_titlepage.html.erb', systemfile: 'html/_titlepage.html.erb'), binding: binding)
|
|
565
565
|
@language = @producer.config['language']
|
|
566
566
|
@stylesheets = @producer.config['stylesheet']
|
|
567
|
+
|
|
567
568
|
f.write ReVIEW::Template.generate(path: template_name, binding: binding)
|
|
568
569
|
end
|
|
569
570
|
end
|
data/lib/review/htmlbuilder.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (c) 2008-
|
|
1
|
+
# Copyright (c) 2008-2022 Minero Aoki, Kenshi Muto, Masayoshi Takahashi,
|
|
2
2
|
# KADO Masanori
|
|
3
3
|
# 2002-2007 Minero Aoki
|
|
4
4
|
#
|
|
@@ -67,11 +67,11 @@ module ReVIEW
|
|
|
67
67
|
htmldir = 'html'
|
|
68
68
|
localfilename = 'layout.html.erb'
|
|
69
69
|
end
|
|
70
|
-
if @book.htmlversion == 5
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
70
|
+
htmlfilename = if @book.htmlversion == 5
|
|
71
|
+
File.join(htmldir, 'layout-html5.html.erb')
|
|
72
|
+
else
|
|
73
|
+
File.join(htmldir, 'layout-xhtml1.html.erb')
|
|
74
|
+
end
|
|
75
75
|
|
|
76
76
|
layout_file = File.join(@book.basedir, 'layouts', localfilename)
|
|
77
77
|
if !File.exist?(layout_file) && File.exist?(File.join(@book.basedir, 'layouts', 'layout.erb'))
|
|
@@ -861,7 +861,7 @@ EOS
|
|
|
861
861
|
end
|
|
862
862
|
begin
|
|
863
863
|
puts %Q(<img src="#{@chapter.image(id).path.sub(%r{\A\./}, '')}" alt="#{escape(compile_inline(caption))}"#{metrics} />)
|
|
864
|
-
rescue
|
|
864
|
+
rescue StandardError
|
|
865
865
|
warn "image not bound: #{id}", location: location
|
|
866
866
|
if lines
|
|
867
867
|
puts %Q(<pre class="dummyimage">)
|
|
@@ -977,8 +977,9 @@ EOS
|
|
|
977
977
|
def compile_kw(word, alt)
|
|
978
978
|
%Q(<b class="kw">) +
|
|
979
979
|
if alt
|
|
980
|
-
|
|
981
|
-
else
|
|
980
|
+
escape(word + " (#{alt.strip})")
|
|
981
|
+
else
|
|
982
|
+
escape(word)
|
|
982
983
|
end +
|
|
983
984
|
"</b><!-- IDX:#{escape_comment(escape(word))} -->"
|
|
984
985
|
end
|
|
@@ -1096,11 +1097,11 @@ EOS
|
|
|
1096
1097
|
|
|
1097
1098
|
def inline_hd_chap(chap, id)
|
|
1098
1099
|
n = chap.headline_index.number(id)
|
|
1099
|
-
if n.present? && chap.number && over_secnolevel?(n)
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1100
|
+
str = if n.present? && chap.number && over_secnolevel?(n)
|
|
1101
|
+
I18n.t('hd_quote', [n, compile_inline(chap.headline(id).caption)])
|
|
1102
|
+
else
|
|
1103
|
+
I18n.t('hd_quote_without_number', compile_inline(chap.headline(id).caption))
|
|
1104
|
+
end
|
|
1104
1105
|
if @book.config['chapterlink']
|
|
1105
1106
|
anchor = 'h' + n.tr('.', '-')
|
|
1106
1107
|
%Q(<a href="#{chap.id}#{extname}##{anchor}">#{str}</a>)
|
|
@@ -1250,7 +1251,7 @@ EOS
|
|
|
1250
1251
|
def inline_icon(id)
|
|
1251
1252
|
begin
|
|
1252
1253
|
%Q(<img src="#{@chapter.image(id).path.sub(%r{\A\./}, '')}" alt="[#{id}]" />)
|
|
1253
|
-
rescue
|
|
1254
|
+
rescue StandardError
|
|
1254
1255
|
warn "image not bound: #{id}", location: location
|
|
1255
1256
|
%Q(<pre>missing image: #{id}</pre>)
|
|
1256
1257
|
end
|
data/lib/review/htmlutils.rb
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
|
|
10
10
|
begin
|
|
11
11
|
require 'cgi/escape'
|
|
12
|
-
rescue
|
|
12
|
+
rescue StandardError
|
|
13
13
|
require 'cgi/util'
|
|
14
14
|
end
|
|
15
15
|
|
|
@@ -60,13 +60,13 @@ module ReVIEW
|
|
|
60
60
|
def highlight_pygments(ops)
|
|
61
61
|
body = ops[:body] || ''
|
|
62
62
|
format = ops[:format] || ''
|
|
63
|
-
if ops[:lexer].present?
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
63
|
+
lexer = if ops[:lexer].present?
|
|
64
|
+
ops[:lexer]
|
|
65
|
+
elsif @book.config['highlight'] && @book.config['highlight']['lang']
|
|
66
|
+
@book.config['highlight']['lang'] # default setting
|
|
67
|
+
else
|
|
68
|
+
'text'
|
|
69
|
+
end
|
|
70
70
|
options = { nowrap: true, noclasses: true }
|
|
71
71
|
if ops[:linenum]
|
|
72
72
|
options[:nowrap] = false
|
|
@@ -93,13 +93,13 @@ module ReVIEW
|
|
|
93
93
|
|
|
94
94
|
def highlight_rouge(ops)
|
|
95
95
|
body = ops[:body] || ''
|
|
96
|
-
if ops[:lexer].present?
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
96
|
+
lexer = if ops[:lexer].present?
|
|
97
|
+
ops[:lexer]
|
|
98
|
+
elsif @book.config['highlight'] && @book.config['highlight']['lang']
|
|
99
|
+
@book.config['highlight']['lang'] # default setting
|
|
100
|
+
else
|
|
101
|
+
'text'
|
|
102
|
+
end
|
|
103
103
|
# format = ops[:format] || ''
|
|
104
104
|
|
|
105
105
|
first_line_num = 1 ## default
|
|
@@ -129,9 +129,9 @@ module ReVIEW
|
|
|
129
129
|
end
|
|
130
130
|
|
|
131
131
|
def normalize_id(id)
|
|
132
|
-
if
|
|
132
|
+
if /\A[a-z][a-z0-9_.-]*\Z/i.match?(id)
|
|
133
133
|
id
|
|
134
|
-
elsif
|
|
134
|
+
elsif /\A[0-9_.-][a-z0-9_.-]*\Z/i.match?(id)
|
|
135
135
|
"id_#{id}" # dummy prefix
|
|
136
136
|
else
|
|
137
137
|
"id_#{CGI.escape(id.gsub('_', '__')).tr('%', '_').tr('+', '-')}" # escape all
|
data/lib/review/i18n.rb
CHANGED
|
@@ -75,11 +75,11 @@ module ReVIEW
|
|
|
75
75
|
end
|
|
76
76
|
|
|
77
77
|
def load_file(path)
|
|
78
|
-
@store =
|
|
78
|
+
@store = YAMLLoader.safe_load_file(path)
|
|
79
79
|
end
|
|
80
80
|
|
|
81
81
|
def update_localefile(path)
|
|
82
|
-
user_i18n =
|
|
82
|
+
user_i18n = YAMLLoader.safe_load_file(path)
|
|
83
83
|
locale = user_i18n['locale']
|
|
84
84
|
if locale
|
|
85
85
|
user_i18n.delete('locale')
|
|
@@ -171,7 +171,7 @@ module ReVIEW
|
|
|
171
171
|
args_matched = (frmt.count('%') <= args.size)
|
|
172
172
|
frmt.gsub!('##', '%%')
|
|
173
173
|
args_matched ? (frmt % args) : frmt
|
|
174
|
-
rescue
|
|
174
|
+
rescue StandardError
|
|
175
175
|
str
|
|
176
176
|
end
|
|
177
177
|
end
|