review 2.5.0 → 3.0.0.preview1
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/.rubocop.yml +28 -10
- data/.travis.yml +11 -2
- data/NEWS.ja.md +89 -17
- data/NEWS.md +92 -0
- data/README.md +1 -1
- data/Rakefile +0 -13
- data/bin/review-catalog-converter +83 -37
- data/bin/review-check +17 -5
- data/bin/review-compile +1 -1
- data/bin/review-index +6 -0
- data/bin/review-init +3 -155
- data/bin/review-preproc +0 -5
- data/bin/review-validate +21 -7
- data/bin/review-vol +13 -5
- data/doc/config.yml.sample +12 -7
- data/doc/config.yml.sample-simple +1 -1
- data/doc/format.ja.md +39 -3
- data/doc/format.md +39 -3
- data/doc/format_idg.ja.md +0 -4
- data/doc/pdfmaker.ja.md +1 -1
- data/doc/pdfmaker.md +1 -1
- data/doc/sample.css +7 -0
- data/lib/epubmaker/content.rb +31 -12
- data/lib/epubmaker/epubcommon.rb +10 -3
- data/lib/epubmaker/epubv2.rb +11 -3
- data/lib/epubmaker/epubv3.rb +11 -3
- data/lib/epubmaker/producer.rb +55 -20
- data/lib/review/book/base.rb +63 -48
- data/lib/review/book/chapter.rb +19 -7
- data/lib/review/book/compilable.rb +5 -20
- data/lib/review/book/image_finder.rb +10 -3
- data/lib/review/book/index.rb +30 -9
- data/lib/review/book/part.rb +9 -6
- data/lib/review/book.rb +0 -14
- data/lib/review/builder.rb +110 -18
- data/lib/review/catalog.rb +24 -4
- data/lib/review/compiler.rb +3 -1
- data/lib/review/configure.rb +43 -9
- data/lib/review/epubmaker/reviewheaderlistener.rb +57 -0
- data/lib/review/epubmaker.rb +129 -85
- data/lib/review/htmlbuilder.rb +76 -58
- data/lib/review/htmlutils.rb +20 -13
- data/lib/review/i18n.rb +6 -2
- data/lib/review/idgxmlbuilder.rb +52 -41
- data/lib/review/init.rb +194 -0
- data/lib/review/latexbuilder.rb +118 -34
- data/lib/review/latexutils.rb +5 -5
- data/lib/review/logger.rb +2 -1
- data/lib/review/makerhelper.rb +1 -1
- data/lib/review/markdownbuilder.rb +66 -6
- data/lib/review/md2inaobuilder.rb +2 -2
- data/lib/review/pdfmaker.rb +74 -22
- data/lib/review/plaintextbuilder.rb +8 -4
- data/lib/review/preprocessor.rb +14 -17
- data/lib/review/sec_counter.rb +8 -2
- data/lib/review/textmaker.rb +2 -2
- data/lib/review/textutils.rb +9 -2
- data/lib/review/tocparser.rb +7 -4
- data/lib/review/tocprinter.rb +3 -1
- data/lib/review/version.rb +1 -1
- data/lib/review/webmaker.rb +19 -7
- data/lib/review/webtocprinter.rb +8 -4
- data/review.gemspec +4 -3
- data/templates/latex/config.erb +84 -0
- data/templates/latex/layout.tex.erb +76 -361
- data/templates/latex/review-jlreq/README.md +22 -0
- data/templates/latex/review-jlreq/review-base.sty +178 -0
- data/templates/latex/review-jlreq/review-custom.sty +1 -0
- data/templates/latex/review-jlreq/review-jlreq.cls +141 -0
- data/templates/latex/review-jlreq/review-style.sty +149 -0
- data/templates/latex/review-jlreq/reviewmacro.sty +8 -0
- data/templates/latex/review-jsbook/jumoline.sty +310 -0
- data/templates/latex/review-jsbook/plistings.sty +326 -0
- data/templates/latex/review-jsbook/review-base.sty +405 -0
- data/templates/latex/review-jsbook/review-custom.sty +1 -0
- data/templates/latex/review-jsbook/review-style.sty +38 -0
- data/templates/latex/review-jsbook/reviewmacro.sty +8 -0
- data/templates/latex-compat2/layout.tex.erb +387 -0
- data/test/assets/test_template.tex +105 -235
- data/test/assets/test_template_backmatter.tex +133 -14
- data/test/book_test_helper.rb +1 -1
- data/test/run_test.rb +2 -0
- data/test/sample-book/src/Rakefile +11 -6
- data/test/sample-book/src/config.yml +2 -2
- data/test/sample-book/src/sty/reviewmacro.sty +1 -39
- data/test/sample-book/src/style.css +6 -0
- data/test/syntax-book/config.yml +1 -1
- data/test/test_book.rb +13 -16
- data/test/test_book_chapter.rb +4 -10
- data/test/test_book_part.rb +4 -3
- data/test/test_catalog.rb +15 -4
- data/test/test_helper.rb +2 -2
- data/test/test_htmlbuilder.rb +78 -10
- data/test/test_htmlutils.rb +12 -5
- data/test/test_idgxmlbuilder.rb +1 -1
- data/test/test_latexbuilder.rb +94 -49
- data/test/test_latexbuilder_v2.rb +1077 -0
- data/test/test_logger.rb +20 -0
- data/test/test_markdownbuilder.rb +10 -0
- data/test/test_pdfmaker.rb +6 -7
- data/test/test_plaintextbuilder.rb +1 -1
- data/test/test_review_ext.rb +0 -1
- data/test/test_rstbuilder.rb +1 -1
- data/test/test_topbuilder.rb +19 -7
- data/test/test_webtocprinter.rb +14 -14
- data/{test/sample-book/src/vendor → vendor}/jumoline/README +0 -0
- data/{test/sample-book/src/vendor → vendor}/jumoline/jumoline.dtx +0 -0
- data/{test/sample-book/src/vendor → vendor}/jumoline/jumoline.ins +0 -0
- data/{test/sample-book/src/vendor → vendor}/jumoline/lppl.txt +0 -0
- data/vendor/plistings/.gitignore +9 -0
- data/vendor/plistings/LICENSE +21 -0
- data/vendor/plistings/README.md +18 -0
- data/vendor/plistings/plistings.sty +326 -0
- data/vendor/plistings/test1.tex +174 -0
- data/vendor/plistings/test2.tex +54 -0
- metadata +48 -19
- data/lib/review/unfold.rb +0 -129
- data/test/CHAPS +0 -2
- data/test/bib.re +0 -13
- data/test/test.re +0 -43
data/lib/review/book/index.rb
CHANGED
@@ -23,7 +23,9 @@ module ReVIEW
|
|
23
23
|
if id = line.slice(/\[(.*?)\]/, 1)
|
24
24
|
items.push item_class.new(id, seq)
|
25
25
|
seq += 1
|
26
|
-
|
26
|
+
if id.empty?
|
27
|
+
ReVIEW.logger.warn "warning: no ID of #{item_type} in #{line}"
|
28
|
+
end
|
27
29
|
end
|
28
30
|
end
|
29
31
|
new(items, *args)
|
@@ -46,7 +48,9 @@ module ReVIEW
|
|
46
48
|
@index = {}
|
47
49
|
@logger = ReVIEW.logger
|
48
50
|
items.each do |i|
|
49
|
-
|
51
|
+
if @index[i.id]
|
52
|
+
@logger.warn "warning: duplicate ID: #{i.id} (#{i})"
|
53
|
+
end
|
50
54
|
@index[i.id] = i
|
51
55
|
end
|
52
56
|
@image_finder = nil
|
@@ -62,7 +66,9 @@ module ReVIEW
|
|
62
66
|
end
|
63
67
|
|
64
68
|
@items.each do |i|
|
65
|
-
|
69
|
+
if i.id.split('|').include?(id)
|
70
|
+
return i
|
71
|
+
end
|
66
72
|
end
|
67
73
|
raise KeyError, "not found key '#{id}' for #{self.class}"
|
68
74
|
end
|
@@ -150,7 +156,9 @@ module ReVIEW
|
|
150
156
|
items.push item_class.new(elements[1], seq, elements[3])
|
151
157
|
seq += 1
|
152
158
|
end
|
153
|
-
|
159
|
+
if elements[1] == ''
|
160
|
+
ReVIEW.logger.warn "warning: no ID of #{item_type} in #{line}"
|
161
|
+
end
|
154
162
|
end
|
155
163
|
end
|
156
164
|
new(items, *args)
|
@@ -295,7 +303,9 @@ module ReVIEW
|
|
295
303
|
end
|
296
304
|
|
297
305
|
m = HEADLINE_PATTERN.match(line)
|
298
|
-
|
306
|
+
if m.nil? || m[1].size > 10 # Ignore too deep index
|
307
|
+
next
|
308
|
+
end
|
299
309
|
index = m[1].size - 2
|
300
310
|
|
301
311
|
# column
|
@@ -307,7 +317,9 @@ module ReVIEW
|
|
307
317
|
inside_column = false
|
308
318
|
next
|
309
319
|
end
|
310
|
-
|
320
|
+
if indexs.blank? || index <= column_level
|
321
|
+
inside_column = false
|
322
|
+
end
|
311
323
|
next if inside_column
|
312
324
|
next if m[4].strip.empty? # no title
|
313
325
|
|
@@ -316,7 +328,11 @@ module ReVIEW
|
|
316
328
|
indexs = indexs.take(index + 1)
|
317
329
|
headlines = headlines.take(index + 1)
|
318
330
|
end
|
319
|
-
|
331
|
+
if indexs[index].nil?
|
332
|
+
(0..index).each do |i|
|
333
|
+
indexs[i] ||= 0
|
334
|
+
end
|
335
|
+
end
|
320
336
|
indexs[index] += 1
|
321
337
|
headlines[index] = m[3].present? ? m[3].strip : m[4].strip
|
322
338
|
items.push Item.new(headlines.join('|'), indexs.dup, m[4].strip)
|
@@ -330,14 +346,19 @@ module ReVIEW
|
|
330
346
|
@index = {}
|
331
347
|
@logger = ReVIEW.logger
|
332
348
|
items.each do |i|
|
333
|
-
|
349
|
+
if @index[i.id]
|
350
|
+
@logger.warn "warning: duplicate ID: #{i.id}"
|
351
|
+
end
|
334
352
|
@index[i.id] = i
|
335
353
|
end
|
336
354
|
end
|
337
355
|
|
338
356
|
def number(id)
|
339
357
|
n = @chap.number
|
340
|
-
|
358
|
+
# XXX: remove magic number (move to lib/review/book/chapter.rb)
|
359
|
+
if @chap.on_appendix? && @chap.number > 0 && @chap.number < 28
|
360
|
+
n = @chap.format_number(false)
|
361
|
+
end
|
341
362
|
([n] + self[id].number).join('.')
|
342
363
|
end
|
343
364
|
end
|
data/lib/review/book/part.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2009-
|
1
|
+
# Copyright (c) 2009-2018 Minero Aoki, Kenshi Muto
|
2
2
|
# 2002-2008 Minero Aoki
|
3
3
|
#
|
4
4
|
# This program is free software.
|
@@ -24,12 +24,15 @@ module ReVIEW
|
|
24
24
|
@content = nil
|
25
25
|
if io
|
26
26
|
@content = io.read
|
27
|
-
elsif @path && File.exist?(@path)
|
28
|
-
@content = File.read(@path, mode: 'r:BOM|utf-8')
|
27
|
+
elsif @path.present? && File.exist?(File.join(@book.config['contentdir'], @path))
|
28
|
+
@content = File.read(File.join(@book.config['contentdir'], @path), mode: 'r:BOM|utf-8')
|
29
29
|
@name = File.basename(@name, '.re')
|
30
30
|
end
|
31
|
-
|
32
|
-
|
31
|
+
if file?
|
32
|
+
@title = nil
|
33
|
+
else
|
34
|
+
@title = name
|
35
|
+
end
|
33
36
|
@volume = nil
|
34
37
|
end
|
35
38
|
|
@@ -48,7 +51,7 @@ module ReVIEW
|
|
48
51
|
end
|
49
52
|
|
50
53
|
def file?
|
51
|
-
name.present? and path.end_with?('.re')
|
54
|
+
name.present? and path.end_with?('.re')
|
52
55
|
end
|
53
56
|
|
54
57
|
def format_number(heading = true)
|
data/lib/review/book.rb
CHANGED
@@ -17,23 +17,9 @@ require 'review/book/volume'
|
|
17
17
|
require 'review/book/index'
|
18
18
|
|
19
19
|
module ReVIEW
|
20
|
-
@default_book = nil
|
21
|
-
|
22
|
-
def self.book
|
23
|
-
@default_book ||= Book::Base.load
|
24
|
-
end
|
25
|
-
|
26
20
|
module Book
|
27
|
-
def self.load_default
|
28
|
-
Base.load_default
|
29
|
-
end
|
30
|
-
|
31
21
|
def self.load(dir)
|
32
22
|
Base.load dir
|
33
23
|
end
|
34
|
-
|
35
|
-
def self.update_rubyenv(dir)
|
36
|
-
Base.update_rubyenv dir
|
37
|
-
end
|
38
24
|
end
|
39
25
|
end
|
data/lib/review/builder.rb
CHANGED
@@ -13,6 +13,8 @@ require 'review/sec_counter'
|
|
13
13
|
require 'stringio'
|
14
14
|
require 'cgi'
|
15
15
|
require 'fileutils'
|
16
|
+
require 'tempfile'
|
17
|
+
require 'csv'
|
16
18
|
|
17
19
|
module ReVIEW
|
18
20
|
class Builder
|
@@ -35,6 +37,7 @@ module ReVIEW
|
|
35
37
|
@output = nil
|
36
38
|
@logger = ReVIEW.logger
|
37
39
|
@doc_status = {}
|
40
|
+
@dictionary = {}
|
38
41
|
builder_init(*args)
|
39
42
|
end
|
40
43
|
|
@@ -47,10 +50,19 @@ module ReVIEW
|
|
47
50
|
@chapter = chapter
|
48
51
|
@location = location
|
49
52
|
@output = StringIO.new
|
50
|
-
|
53
|
+
if @chapter.present?
|
54
|
+
@book = @chapter.book
|
55
|
+
end
|
51
56
|
@tabwidth = nil
|
52
57
|
@tsize = nil
|
53
|
-
|
58
|
+
if @book && @book.config
|
59
|
+
if @book.config['words_file']
|
60
|
+
load_words(@book.config['words_file'])
|
61
|
+
end
|
62
|
+
if @book.config['tabwidth']
|
63
|
+
@tabwidth = @book.config['tabwidth']
|
64
|
+
end
|
65
|
+
end
|
54
66
|
builder_init_file
|
55
67
|
end
|
56
68
|
|
@@ -77,6 +89,16 @@ module ReVIEW
|
|
77
89
|
self.class.to_s.gsub(/ReVIEW::/, '').gsub(/Builder/, '').downcase
|
78
90
|
end
|
79
91
|
|
92
|
+
def load_words(file)
|
93
|
+
if File.exist?(file)
|
94
|
+
if file =~ /\.csv\Z/i
|
95
|
+
CSV.foreach(file) do |row|
|
96
|
+
@dictionary[row[0]] = row[1]
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
80
102
|
def headline_prefix(level)
|
81
103
|
@sec_counter.inc(level)
|
82
104
|
anchor = @sec_counter.anchor(level)
|
@@ -145,7 +167,9 @@ module ReVIEW
|
|
145
167
|
rows = adjust_n_cols(rows)
|
146
168
|
|
147
169
|
begin
|
148
|
-
|
170
|
+
if caption.present?
|
171
|
+
table_header id, caption
|
172
|
+
end
|
149
173
|
rescue KeyError
|
150
174
|
error "no such table: #{id}"
|
151
175
|
end
|
@@ -339,6 +363,24 @@ module ReVIEW
|
|
339
363
|
"#{arg}[rotate 90 degree]"
|
340
364
|
end
|
341
365
|
|
366
|
+
def inline_balloon(arg)
|
367
|
+
"← #{arg}"
|
368
|
+
end
|
369
|
+
|
370
|
+
def inline_w(s)
|
371
|
+
translated = @dictionary[s]
|
372
|
+
if translated
|
373
|
+
escape(translated)
|
374
|
+
else
|
375
|
+
warn "word not bound: #{s}"
|
376
|
+
escape("[missing word: #{s}]")
|
377
|
+
end
|
378
|
+
end
|
379
|
+
|
380
|
+
def inline_wb(s)
|
381
|
+
inline_b(unescape(inline_w(s)))
|
382
|
+
end
|
383
|
+
|
342
384
|
def raw(str)
|
343
385
|
if matched = str.match(/\|(.*?)\|(.*)/)
|
344
386
|
builders = matched[1].split(',').map { |i| i.gsub(/\s/, '') }
|
@@ -427,31 +469,71 @@ module ReVIEW
|
|
427
469
|
)
|
428
470
|
end
|
429
471
|
|
430
|
-
def graph(lines, id, command, caption =
|
472
|
+
def graph(lines, id, command, caption = '')
|
431
473
|
c = target_name
|
432
|
-
dir = File.join(@book.
|
474
|
+
dir = File.join(@book.imagedir, c)
|
433
475
|
FileUtils.mkdir_p(dir)
|
434
476
|
file = "#{id}.#{image_ext}"
|
435
477
|
file_path = File.join(dir, file)
|
436
478
|
|
437
479
|
line = self.unescape(lines.join("\n"))
|
438
|
-
|
439
|
-
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
|
446
|
-
|
447
|
-
cmd = cmds[command.to_sym]
|
448
|
-
warn cmd
|
449
|
-
system cmd
|
480
|
+
|
481
|
+
tf = Tempfile.new('review_graph')
|
482
|
+
tf.puts line
|
483
|
+
tf.close
|
484
|
+
begin
|
485
|
+
file_path = send("graph_#{command}".to_sym, id, file_path, line, tf.path)
|
486
|
+
ensure
|
487
|
+
tf.unlink
|
488
|
+
end
|
450
489
|
@chapter.image_index.image_finder.add_entry(file_path)
|
451
490
|
|
452
491
|
image(lines, id, caption)
|
453
492
|
end
|
454
493
|
|
494
|
+
def system_graph(id, *args)
|
495
|
+
@logger.info args.join(' ')
|
496
|
+
Kernel.system(*args) or @logger.error("failed to run command for id #{id}: #{args.join(' ')}")
|
497
|
+
end
|
498
|
+
|
499
|
+
def graph_graphviz(id, file_path, _line, tf_path)
|
500
|
+
system_graph(id, 'dot', "-T#{image_ext}", "-o#{file_path}", tf_path)
|
501
|
+
file_path
|
502
|
+
end
|
503
|
+
|
504
|
+
def graph_gnuplot(id, file_path, line, tf_path)
|
505
|
+
File.open(tf_path, 'w') do |tf|
|
506
|
+
tf.puts <<EOTGNUPLOT
|
507
|
+
set terminal #{image_ext == 'eps' ? 'postscript eps' : image_ext}
|
508
|
+
set output "#{file_path}"
|
509
|
+
#{line}
|
510
|
+
EOTGNUPLOT
|
511
|
+
end
|
512
|
+
system_graph(id, 'gnuplot', tf_path)
|
513
|
+
file_path
|
514
|
+
end
|
515
|
+
|
516
|
+
def graph_blockdiag(id, file_path, _line, tf_path)
|
517
|
+
system_graph(id, 'blockdiag', '-a', '-T', image_ext, '-o', file_path, tf_path)
|
518
|
+
file_path
|
519
|
+
end
|
520
|
+
|
521
|
+
def graph_aafigure(id, file_path, _line, tf_path)
|
522
|
+
system_graph(id, 'aafigure', '-t', image_ext, '-o', file_path, tf_path)
|
523
|
+
file_path
|
524
|
+
end
|
525
|
+
|
526
|
+
def graph_plantuml(id, file_path, _line, tf_path)
|
527
|
+
ext = image_ext
|
528
|
+
if ext == 'pdf'
|
529
|
+
ext = 'eps'
|
530
|
+
file_path.sub!(/\.pdf\Z/, '.eps')
|
531
|
+
end
|
532
|
+
system_graph(id, 'java', '-jar', 'plantuml.jar', "-t#{ext}", '-charset', 'UTF-8', tf_path)
|
533
|
+
FileUtils.mv "#{tf_path}.#{ext}", file_path
|
534
|
+
file_path
|
535
|
+
end
|
536
|
+
|
455
537
|
def image_ext
|
456
538
|
raise NotImplementedError
|
457
539
|
end
|
@@ -471,7 +553,9 @@ module ReVIEW
|
|
471
553
|
if matched = str.match(/\A\|(.*?)\|(.*)/)
|
472
554
|
builders = matched[1].split(',').map { |i| i.gsub(/\s/, '') }
|
473
555
|
c = self.class.to_s.gsub('ReVIEW::', '').gsub('Builder', '').downcase
|
474
|
-
|
556
|
+
if builders.include?(c)
|
557
|
+
@tsize = matched[2]
|
558
|
+
end
|
475
559
|
else
|
476
560
|
@tsize = str
|
477
561
|
end
|
@@ -514,5 +598,13 @@ module ReVIEW
|
|
514
598
|
super(str)
|
515
599
|
end
|
516
600
|
end
|
601
|
+
|
602
|
+
def escape(str)
|
603
|
+
str
|
604
|
+
end
|
605
|
+
|
606
|
+
def unescape(str)
|
607
|
+
str
|
608
|
+
end
|
517
609
|
end
|
518
610
|
end # module ReVIEW
|
data/lib/review/catalog.rb
CHANGED
@@ -31,7 +31,22 @@ module ReVIEW
|
|
31
31
|
def parts
|
32
32
|
return '' unless @yaml['CHAPS']
|
33
33
|
|
34
|
-
@yaml['CHAPS'].map
|
34
|
+
part_list = @yaml['CHAPS'].map do |entry|
|
35
|
+
if entry.is_a?(Hash)
|
36
|
+
entry.keys
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
part_list.flatten.compact.join("\n")
|
41
|
+
end
|
42
|
+
|
43
|
+
def replace_part(old_name, new_name)
|
44
|
+
@yaml['CHAPS'].map! do |e|
|
45
|
+
if e.is_a?(Hash) and (e.keys.first == old_name)
|
46
|
+
e = { new_name => e.values.first }
|
47
|
+
end
|
48
|
+
e
|
49
|
+
end
|
35
50
|
end
|
36
51
|
|
37
52
|
def parts_with_chaps
|
@@ -49,7 +64,11 @@ module ReVIEW
|
|
49
64
|
@yaml['POSTDEF'].join("\n")
|
50
65
|
end
|
51
66
|
|
52
|
-
def
|
67
|
+
def to_s
|
68
|
+
YAML.dump(@yaml).gsub(/\A---\n/, '') # remove yaml header
|
69
|
+
end
|
70
|
+
|
71
|
+
def validate!(config, basedir)
|
53
72
|
filenames = []
|
54
73
|
if predef.present?
|
55
74
|
filenames.concat(predef.split(/\n/))
|
@@ -73,8 +92,9 @@ module ReVIEW
|
|
73
92
|
filenames.concat(postdef.split(/\n/))
|
74
93
|
end
|
75
94
|
filenames.each do |filename|
|
76
|
-
|
77
|
-
|
95
|
+
refile = File.join(basedir, config['contentdir'], filename)
|
96
|
+
unless File.exist?(refile)
|
97
|
+
raise FileNotFound, "file not found in catalog.yml: #{refile}"
|
78
98
|
end
|
79
99
|
end
|
80
100
|
end
|
data/lib/review/compiler.rb
CHANGED
@@ -198,6 +198,7 @@ module ReVIEW
|
|
198
198
|
definline :recipe
|
199
199
|
definline :column
|
200
200
|
definline :tcy
|
201
|
+
definline :balloon
|
201
202
|
|
202
203
|
definline :abbr
|
203
204
|
definline :acronym
|
@@ -228,9 +229,10 @@ module ReVIEW
|
|
228
229
|
definline :hidx
|
229
230
|
definline :comment
|
230
231
|
definline :include
|
231
|
-
definline :tcy
|
232
232
|
definline :embed
|
233
233
|
definline :pageref
|
234
|
+
definline :w
|
235
|
+
definline :wb
|
234
236
|
|
235
237
|
private
|
236
238
|
|
data/lib/review/configure.rb
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
#
|
2
|
+
# Copyright (c) 2012-2018 Masanori Kado, Masayoshi Takahashi, Kenshi Muto
|
3
|
+
#
|
4
|
+
# This program is free software.
|
5
|
+
# You can distribute or modify this program under the terms of
|
6
|
+
# the GNU LGPL, Lesser General Public License version 2.1.
|
7
|
+
# For details of the GNU LGPL, see the file "COPYING".
|
8
|
+
#
|
1
9
|
require 'securerandom'
|
2
10
|
|
3
11
|
module ReVIEW
|
@@ -41,6 +49,7 @@ module ReVIEW
|
|
41
49
|
'imgmath' => nil, # for HTML
|
42
50
|
'htmlext' => 'html',
|
43
51
|
'htmlversion' => 5,
|
52
|
+
'contentdir' => '.',
|
44
53
|
'imagedir' => 'images',
|
45
54
|
'image_ext' => %w[png gif jpg jpeg svg ttf woff otf],
|
46
55
|
'fontdir' => 'fonts',
|
@@ -51,9 +60,9 @@ module ReVIEW
|
|
51
60
|
'postdef_file' => 'POSTDEF',
|
52
61
|
'page_metric' => ReVIEW::Book::PageMetric::A5,
|
53
62
|
'ext' => '.re',
|
54
|
-
'image_dir' => 'images',
|
55
63
|
'image_types' => %w[.ai .psd .eps .pdf .tif .tiff .png .bmp .jpg .jpeg .gif .svg],
|
56
64
|
'bib_file' => 'bib.re',
|
65
|
+
'words_file' => nil,
|
57
66
|
'colophon_order' => %w[aut csl trl dsr ill cov edt pbl contact prt],
|
58
67
|
'externallink' => true,
|
59
68
|
# for IDGXML
|
@@ -67,9 +76,10 @@ module ReVIEW
|
|
67
76
|
'image_scale2width' => true,
|
68
77
|
'footnotetext' => nil,
|
69
78
|
'texcommand' => 'uplatex',
|
79
|
+
'texoptions' => '-interaction=nonstopmode -file-line-error',
|
70
80
|
'texdocumentclass' => ['jsbook', 'uplatex,oneside'],
|
71
81
|
'dvicommand' => 'dvipdfmx',
|
72
|
-
'dvioptions' => '-d 5',
|
82
|
+
'dvioptions' => '-d 5 -z 9',
|
73
83
|
# for PDFMaker
|
74
84
|
'pdfmaker' => {
|
75
85
|
'makeindex' => nil, # Make index page
|
@@ -87,18 +97,42 @@ module ReVIEW
|
|
87
97
|
|
88
98
|
def [](key)
|
89
99
|
maker = self.maker
|
90
|
-
|
91
|
-
|
100
|
+
if maker && self.key?(maker) && self.fetch(maker) && self.fetch(maker).key?(key)
|
101
|
+
return self.fetch(maker).fetch(key, nil)
|
102
|
+
end
|
103
|
+
if self.key?(key)
|
104
|
+
return self.fetch(key)
|
105
|
+
end
|
92
106
|
nil
|
93
107
|
end
|
94
108
|
|
95
|
-
def check_version(version)
|
96
|
-
|
109
|
+
def check_version(version, exception: true)
|
110
|
+
unless self.key?('review_version')
|
111
|
+
if exception
|
112
|
+
raise ReVIEW::ConfigError, 'configuration file has no review_version property.'
|
113
|
+
else
|
114
|
+
return false
|
115
|
+
end
|
116
|
+
end
|
97
117
|
|
98
|
-
|
118
|
+
if self['review_version'].blank?
|
119
|
+
return true
|
120
|
+
end
|
99
121
|
|
100
|
-
|
101
|
-
|
122
|
+
if self['review_version'].to_i != version.to_i ## major version
|
123
|
+
if exception
|
124
|
+
raise ReVIEW::ConfigError, 'major version of configuration file is different.'
|
125
|
+
else
|
126
|
+
return false
|
127
|
+
end
|
128
|
+
elsif self['review_version'].to_f > version.to_f ## minor version
|
129
|
+
if exception
|
130
|
+
raise ReVIEW::ConfigError, "Re:VIEW version '#{version}' is older than configuration file's version '#{self['review_version']}'."
|
131
|
+
else
|
132
|
+
return false
|
133
|
+
end
|
134
|
+
end
|
135
|
+
return true
|
102
136
|
end
|
103
137
|
|
104
138
|
def name_of(key)
|
@@ -0,0 +1,57 @@
|
|
1
|
+
# Copyright (c) 2010-2018 Kenshi Muto and Masayoshi Takahashi
|
2
|
+
#
|
3
|
+
# This program is free software.
|
4
|
+
# You can distribute or modify this program under the terms of
|
5
|
+
# the GNU LGPL, Lesser General Public License version 2.1.
|
6
|
+
# For details of the GNU LGPL, see the file "COPYING".
|
7
|
+
#
|
8
|
+
module ReVIEW
|
9
|
+
class EPUBMaker
|
10
|
+
class ReVIEWHeaderListener
|
11
|
+
include REXML::StreamListener
|
12
|
+
def initialize(headlines)
|
13
|
+
@level = nil
|
14
|
+
@content = ''
|
15
|
+
@headlines = headlines
|
16
|
+
end
|
17
|
+
|
18
|
+
def tag_start(name, attrs)
|
19
|
+
if name =~ /\Ah(\d+)/
|
20
|
+
raise "#{name}, #{attrs}" if @level.present?
|
21
|
+
@level = $1.to_i
|
22
|
+
@id = attrs['id'] if attrs['id'].present?
|
23
|
+
@notoc = attrs['notoc'] if attrs['notoc'].present?
|
24
|
+
elsif !@level.nil?
|
25
|
+
if name == 'img' && attrs['alt'].present?
|
26
|
+
@content << attrs['alt']
|
27
|
+
elsif name == 'a' && attrs['id'].present?
|
28
|
+
@id = attrs['id']
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def tag_end(name)
|
34
|
+
if name =~ /\Ah\d+/
|
35
|
+
if @id.present?
|
36
|
+
@headlines.push({ 'level' => @level,
|
37
|
+
'id' => @id,
|
38
|
+
'title' => @content,
|
39
|
+
'notoc' => @notoc })
|
40
|
+
end
|
41
|
+
@content = ''
|
42
|
+
@level = nil
|
43
|
+
@id = nil
|
44
|
+
@notoc = nil
|
45
|
+
end
|
46
|
+
|
47
|
+
true
|
48
|
+
end
|
49
|
+
|
50
|
+
def text(text)
|
51
|
+
if @level.present?
|
52
|
+
@content << text.gsub("\t", ' ')
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|