review 4.0.0 → 4.1.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 +39 -0
- data/.github/workflows/ruby.yml +27 -0
- data/.rubocop.yml +10 -7
- data/Dockerfile +21 -5
- data/NEWS.ja.md +101 -1
- data/NEWS.md +102 -2
- data/README.md +10 -7
- data/appveyor.yml +0 -20
- data/bin/review-compile +1 -1
- data/bin/review-validate +1 -1
- data/doc/config.yml.sample +12 -1
- data/doc/config.yml.sample-simple +1 -0
- data/doc/format.ja.md +16 -4
- data/doc/format.md +2 -1
- data/doc/quickstart.ja.md +40 -23
- data/doc/quickstart.md +33 -15
- data/lib/review/book/base.rb +8 -7
- data/lib/review/book/index.rb +50 -56
- data/lib/review/book/index/item.rb +1 -1
- data/lib/review/builder.rb +26 -4
- data/lib/review/compiler.rb +6 -3
- data/lib/review/configure.rb +5 -3
- data/lib/review/epubmaker.rb +15 -2
- data/lib/review/extentions/string.rb +0 -4
- data/lib/review/htmlbuilder.rb +4 -15
- data/lib/review/idgxmlbuilder.rb +10 -19
- data/lib/review/idgxmlmaker.rb +10 -3
- data/lib/review/init.rb +8 -1
- data/lib/review/latexbuilder.rb +13 -6
- data/lib/review/pdfmaker.rb +24 -9
- data/lib/review/rstbuilder.rb +2 -2
- data/lib/review/textmaker.rb +7 -1
- data/lib/review/tocparser.rb +6 -2
- data/lib/review/version.rb +1 -1
- data/lib/review/webmaker.rb +8 -1
- data/review.gemspec +2 -2
- data/samples/sample-book/src/.gitignore +1 -0
- data/samples/sample-book/src/config-ebook.yml +4 -0
- data/samples/sample-book/src/config-jlreq-ebook.yml +4 -0
- data/samples/sample-book/src/config.yml +1 -1
- data/samples/sample-book/src/lib/tasks/review.rake +10 -6
- data/samples/syntax-book/ch01.re +4 -2
- data/samples/syntax-book/ch02.re +8 -16
- data/samples/syntax-book/config-jlreq-lualatex.yml +4 -0
- data/samples/syntax-book/config-print.yml +3 -0
- data/samples/syntax-book/config.yml +1 -1
- data/samples/syntax-book/lib/tasks/review.rake +23 -8
- data/templates/latex/config.erb +6 -6
- data/templates/latex/review-jlreq/review-base.sty +14 -4
- data/templates/latex/review-jlreq/review-jlreq.cls +10 -1
- data/templates/latex/review-jlreq/review-style.sty +1 -1
- data/templates/latex/review-jsbook/review-base.sty +10 -0
- data/templates/latex/review-jsbook/review-jsbook.cls +1 -1
- data/templates/latex/review-jsbook/review-style.sty +1 -1
- data/test/assets/test_template.tex +6 -6
- data/test/assets/test_template_backmatter.tex +6 -6
- data/test/test_book.rb +8 -0
- data/test/test_book_chapter.rb +4 -2
- data/test/test_catalog.rb +1 -0
- data/test/test_epubmaker_cmd.rb +12 -5
- data/test/test_helper.rb +11 -6
- data/test/test_htmlbuilder.rb +80 -8
- data/test/test_idgxmlbuilder.rb +57 -2
- data/test/test_idgxmlmaker_cmd.rb +46 -0
- data/test/test_image_finder.rb +52 -70
- data/test/test_index.rb +12 -12
- data/test/test_latexbuilder.rb +171 -8
- data/test/test_latexbuilder_v2.rb +9 -7
- data/test/test_pdfmaker_cmd.rb +99 -5
- data/test/test_textmaker_cmd.rb +54 -0
- data/test/test_topbuilder.rb +59 -0
- data/vendor/jsclasses/LICENSE +1 -1
- data/vendor/jsclasses/jis/jsarticle.cls +53 -14
- data/vendor/jsclasses/jis/jsbook.cls +53 -14
- data/vendor/jsclasses/jis/jsclasses.dtx +84 -25
- data/vendor/jsclasses/jis/jslogo.dtx +4 -4
- data/vendor/jsclasses/jis/jslogo.sty +3 -3
- data/vendor/jsclasses/jis/jspf.cls +52 -13
- data/vendor/jsclasses/jis/jsreport.cls +53 -14
- data/vendor/jsclasses/jis/kiyou.cls +53 -14
- data/vendor/jsclasses/jis/okumacro.dtx +4 -5
- data/vendor/jsclasses/jis/okumacro.sty +3 -4
- data/vendor/jsclasses/jsarticle.cls +53 -14
- data/vendor/jsclasses/jsbook.cls +53 -14
- data/vendor/jsclasses/jsclasses.dtx +84 -25
- data/vendor/jsclasses/jsclasses.pdf +0 -0
- data/vendor/jsclasses/jslogo.dtx +4 -4
- data/vendor/jsclasses/jslogo.pdf +0 -0
- data/vendor/jsclasses/jslogo.sty +3 -3
- data/vendor/jsclasses/jspf.cls +52 -13
- data/vendor/jsclasses/jsreport.cls +53 -14
- data/vendor/jsclasses/kiyou.cls +53 -14
- data/vendor/jsclasses/okumacro.dtx +4 -5
- data/vendor/jsclasses/okumacro.pdf +0 -0
- data/vendor/jsclasses/okumacro.sty +3 -4
- metadata +15 -6
- data/samples/syntax-book/review-ext.rb +0 -14
data/lib/review/htmlbuilder.rb
CHANGED
|
@@ -373,12 +373,7 @@ module ReVIEW
|
|
|
373
373
|
|
|
374
374
|
def list(lines, id, caption, lang = nil)
|
|
375
375
|
puts %Q(<div id="#{normalize_id(id)}" class="caption-code">)
|
|
376
|
-
|
|
377
|
-
list_header(id, caption, lang)
|
|
378
|
-
rescue KeyError
|
|
379
|
-
error "no such list: #{id}"
|
|
380
|
-
end
|
|
381
|
-
list_body(id, lines, lang)
|
|
376
|
+
super(lines, id, caption, lang)
|
|
382
377
|
puts '</div>'
|
|
383
378
|
end
|
|
384
379
|
|
|
@@ -403,8 +398,7 @@ module ReVIEW
|
|
|
403
398
|
|
|
404
399
|
def source(lines, caption = nil, lang = nil)
|
|
405
400
|
puts %Q(<div class="source-code">)
|
|
406
|
-
|
|
407
|
-
source_body(caption, lines, lang)
|
|
401
|
+
super(lines, caption, lang)
|
|
408
402
|
puts '</div>'
|
|
409
403
|
end
|
|
410
404
|
|
|
@@ -414,7 +408,7 @@ module ReVIEW
|
|
|
414
408
|
end
|
|
415
409
|
end
|
|
416
410
|
|
|
417
|
-
def source_body(
|
|
411
|
+
def source_body(lines, lang)
|
|
418
412
|
print %Q(<pre class="source">)
|
|
419
413
|
body = lines.inject('') { |i, j| i + detab(j) + "\n" }
|
|
420
414
|
lexer = lang
|
|
@@ -424,12 +418,7 @@ module ReVIEW
|
|
|
424
418
|
|
|
425
419
|
def listnum(lines, id, caption, lang = nil)
|
|
426
420
|
puts %Q(<div id="#{normalize_id(id)}" class="code">)
|
|
427
|
-
|
|
428
|
-
list_header(id, caption, lang)
|
|
429
|
-
rescue KeyError
|
|
430
|
-
error "no such list: #{id}"
|
|
431
|
-
end
|
|
432
|
-
listnum_body(lines, lang)
|
|
421
|
+
super(lines, id, caption, lang)
|
|
433
422
|
puts '</div>'
|
|
434
423
|
end
|
|
435
424
|
|
data/lib/review/idgxmlbuilder.rb
CHANGED
|
@@ -297,12 +297,7 @@ module ReVIEW
|
|
|
297
297
|
|
|
298
298
|
def list(lines, id, caption, lang = nil)
|
|
299
299
|
puts '<codelist>'
|
|
300
|
-
|
|
301
|
-
list_header(id, caption, lang)
|
|
302
|
-
rescue KeyError
|
|
303
|
-
error "no such list: #{id}"
|
|
304
|
-
end
|
|
305
|
-
list_body(id, lines, lang)
|
|
300
|
+
super(lines, id, caption, lang)
|
|
306
301
|
puts '</codelist>'
|
|
307
302
|
end
|
|
308
303
|
|
|
@@ -327,12 +322,7 @@ module ReVIEW
|
|
|
327
322
|
|
|
328
323
|
def listnum(lines, id, caption, lang = nil)
|
|
329
324
|
puts '<codelist>'
|
|
330
|
-
|
|
331
|
-
list_header(id, caption, lang)
|
|
332
|
-
rescue KeyError
|
|
333
|
-
error "no such list: #{id}"
|
|
334
|
-
end
|
|
335
|
-
listnum_body(lines, lang)
|
|
325
|
+
super(lines, id, caption, lang)
|
|
336
326
|
puts '</codelist>'
|
|
337
327
|
end
|
|
338
328
|
|
|
@@ -490,6 +480,7 @@ module ReVIEW
|
|
|
490
480
|
else
|
|
491
481
|
print %Q(<tbody xmlns:aid5="http://ns.adobe.com/AdobeInDesign/5.0/" aid:table="table" aid:trows="#{rows.length}" aid:tcols="#{@col}">)
|
|
492
482
|
end
|
|
483
|
+
@table_id = id
|
|
493
484
|
table_rows(sepidx, rows)
|
|
494
485
|
puts '</tbody></table>'
|
|
495
486
|
@tsize = nil
|
|
@@ -508,7 +499,7 @@ module ReVIEW
|
|
|
508
499
|
else
|
|
509
500
|
rows.push(line.gsub(/\t\.\t/, "\t\t").gsub(/\t\.\.\t/, "\t.\t").gsub(/\t\.\Z/, "\t").gsub(/\t\.\.\Z/, "\t.").gsub(/\A\./, ''))
|
|
510
501
|
end
|
|
511
|
-
col2 = rows[rows.length - 1].split(
|
|
502
|
+
col2 = rows[rows.length - 1].split(table_row_separator_regexp).length
|
|
512
503
|
@col = col2 if col2 > @col
|
|
513
504
|
end
|
|
514
505
|
error 'no rows in the table' if rows.empty?
|
|
@@ -526,11 +517,11 @@ module ReVIEW
|
|
|
526
517
|
cellwidth.size.times do |n|
|
|
527
518
|
cellwidth[n] = cellwidth[n].to_f / @book.config['pt_to_mm_unit'].to_f
|
|
528
519
|
totallength += cellwidth[n]
|
|
529
|
-
warn "total length exceeds limit for table: #{
|
|
520
|
+
warn "total length exceeds limit for table: #{@table_id}" if totallength > @tablewidth
|
|
530
521
|
end
|
|
531
522
|
if cellwidth.size < @col
|
|
532
523
|
cw = (@tablewidth - totallength) / (@col - cellwidth.size)
|
|
533
|
-
warn "auto cell sizing exceeds limit for table: #{
|
|
524
|
+
warn "auto cell sizing exceeds limit for table: #{@table_id}" if cw <= 0
|
|
534
525
|
(cellwidth.size..(@col - 1)).each { |i| cellwidth[i] = cw }
|
|
535
526
|
end
|
|
536
527
|
end
|
|
@@ -542,7 +533,7 @@ module ReVIEW
|
|
|
542
533
|
puts %Q(<tr type="header">#{rows.shift}</tr>)
|
|
543
534
|
else
|
|
544
535
|
i = 0
|
|
545
|
-
rows.shift.split(
|
|
536
|
+
rows.shift.split(table_row_separator_regexp).each_with_index do |cell, x|
|
|
546
537
|
print %Q(<td xyh="#{x + 1},#{y + 1},#{sepidx}" aid:table="cell" aid:theader="1" aid:crows="1" aid:ccols="1" aid:ccolwidth="#{sprintf('%.3f', cellwidth[i])}">#{cell.sub('DUMMYCELLSPLITTER', '')}</td>)
|
|
547
538
|
i += 1
|
|
548
539
|
end
|
|
@@ -557,7 +548,7 @@ module ReVIEW
|
|
|
557
548
|
if tablewidth
|
|
558
549
|
rows.each_with_index do |row, y|
|
|
559
550
|
i = 0
|
|
560
|
-
row.split(
|
|
551
|
+
row.split(table_row_separator_regexp).each_with_index do |cell, x|
|
|
561
552
|
print %Q(<td xyh="#{x + 1},#{y + 1 + sepidx},#{sepidx}" aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="#{sprintf('%.3f', cellwidth[i])}">#{cell.sub('DUMMYCELLSPLITTER', '')}</td>)
|
|
562
553
|
i += 1
|
|
563
554
|
end
|
|
@@ -602,7 +593,7 @@ module ReVIEW
|
|
|
602
593
|
end
|
|
603
594
|
|
|
604
595
|
def imgtable(lines, id, caption = nil, metric = nil)
|
|
605
|
-
if @chapter.
|
|
596
|
+
if @chapter.image_bound?(id)
|
|
606
597
|
metrics = parse_metric('idgxml', metric)
|
|
607
598
|
puts '<table>'
|
|
608
599
|
table_header(id, caption) if caption.present?
|
|
@@ -1155,7 +1146,7 @@ module ReVIEW
|
|
|
1155
1146
|
error "unknown chapter: #{id}"
|
|
1156
1147
|
end
|
|
1157
1148
|
|
|
1158
|
-
def source(lines, caption, lang = nil)
|
|
1149
|
+
def source(lines, caption = nil, lang = nil)
|
|
1159
1150
|
puts '<source>'
|
|
1160
1151
|
source_header(caption)
|
|
1161
1152
|
source_body(lines, lang)
|
data/lib/review/idgxmlmaker.rb
CHANGED
|
@@ -44,11 +44,13 @@ module ReVIEW
|
|
|
44
44
|
opts = OptionParser.new
|
|
45
45
|
@table = nil
|
|
46
46
|
@filter = nil
|
|
47
|
+
@buildonly = nil
|
|
47
48
|
|
|
48
49
|
opts.banner = 'Usage: review-idgxmlmaker [options] configfile'
|
|
49
50
|
opts.version = ReVIEW::VERSION
|
|
50
51
|
opts.on('-w', '--width widthoftypepage', 'Specify the width of type page for layouting tables (mm).') { |v| @table = v }
|
|
51
52
|
opts.on('-f', '--filter filterprogrampath', 'Specify the filter path.') { |v| @filter = v }
|
|
53
|
+
opts.on('-y', '--only file1,file2,...', 'Build only specified files.') { |v| @buildonly = v.split(/\s*,\s*/).map { |m| m.strip.sub(/\.re\Z/, '') } }
|
|
52
54
|
opts.on('--help', 'Prints this message and quit.') do
|
|
53
55
|
puts opts.help
|
|
54
56
|
exit 0
|
|
@@ -116,13 +118,14 @@ module ReVIEW
|
|
|
116
118
|
ENV['REVIEW_FNAME'] = File.basename(xmlfile).sub(/.xml\Z/, '.re')
|
|
117
119
|
begin
|
|
118
120
|
o, e, s = Open3.capture3(@filter, stdin_data: File.read(xmlfile))
|
|
121
|
+
unless e.empty?
|
|
122
|
+
warn("filter error for #{xmlfile}: #{e}")
|
|
123
|
+
end
|
|
119
124
|
if s.success?
|
|
120
125
|
File.write(xmlfile, o) # override
|
|
121
|
-
else
|
|
122
|
-
warn("filter error for #{xmlfile}: #{e.message}")
|
|
123
126
|
end
|
|
124
127
|
rescue => e
|
|
125
|
-
warn("filter error for #{xmlfile}: #{e}")
|
|
128
|
+
warn("filter error for #{xmlfile}: #{e.message}")
|
|
126
129
|
end
|
|
127
130
|
end
|
|
128
131
|
|
|
@@ -169,6 +172,10 @@ module ReVIEW
|
|
|
169
172
|
filename = Pathname.new(chap.path).relative_path_from(base_path).to_s
|
|
170
173
|
end
|
|
171
174
|
id = File.basename(filename).sub(/\.re\Z/, '')
|
|
175
|
+
if @buildonly && !@buildonly.include?(id)
|
|
176
|
+
warn "skip #{id}.re"
|
|
177
|
+
return
|
|
178
|
+
end
|
|
172
179
|
|
|
173
180
|
xmlfile = "#{id}.xml"
|
|
174
181
|
|
data/lib/review/init.rb
CHANGED
|
@@ -82,6 +82,9 @@ module ReVIEW
|
|
|
82
82
|
opts.on('', '--epub-version VERSION', 'define EPUB version.') do |version|
|
|
83
83
|
@epub_version = version
|
|
84
84
|
end
|
|
85
|
+
opts.on('', '--without-config-comment', "don't include comments in config.yml.") do
|
|
86
|
+
@without_config_comment = true
|
|
87
|
+
end
|
|
85
88
|
opts.on('', '--without-doc', "don't generate doc files.") do
|
|
86
89
|
@without_doc = true
|
|
87
90
|
end
|
|
@@ -176,6 +179,10 @@ EOS
|
|
|
176
179
|
content.gsub!(/^#\s*texdocumentclass:.*$/, %Q(texdocumentclass: ["#{@template}", "#{@tex_documentclass_opts[@template]}"]))
|
|
177
180
|
end
|
|
178
181
|
|
|
182
|
+
if @without_config_comment
|
|
183
|
+
content = content.split("\n").delete_if { |l| l.strip.start_with?('#') || l.strip.empty? }.join("\n")
|
|
184
|
+
end
|
|
185
|
+
|
|
179
186
|
File.open(File.join(dir, 'config.yml'), 'w') { |f| f.write content }
|
|
180
187
|
if @webui && !@web_result[2].empty?
|
|
181
188
|
File.open(File.join(dir, 'config-ebook.yml'), 'w') do |f|
|
|
@@ -292,7 +299,7 @@ EOS
|
|
|
292
299
|
next
|
|
293
300
|
end
|
|
294
301
|
|
|
295
|
-
if fname
|
|
302
|
+
if fname.start_with?('/') || fname =~ /\.\./ # simple fool proof
|
|
296
303
|
made = nil
|
|
297
304
|
break
|
|
298
305
|
end
|
data/lib/review/latexbuilder.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Copyright (c) 2002-2007 Minero Aoki
|
|
2
2
|
# 2008-2009 Minero Aoki, Kenshi Muto
|
|
3
|
-
# 2010-
|
|
3
|
+
# 2010-2020 Minero Aoki, Kenshi Muto, TAKAHASHI Masayoshi
|
|
4
4
|
#
|
|
5
5
|
# This program is free software.
|
|
6
6
|
# You can distribute or modify this program under the terms of
|
|
@@ -60,7 +60,7 @@ module ReVIEW
|
|
|
60
60
|
require 'nkf'
|
|
61
61
|
@index_mecab = MeCab::Tagger.new(@book.config['pdfmaker']['makeindex_mecab_opts'])
|
|
62
62
|
rescue LoadError
|
|
63
|
-
|
|
63
|
+
warn 'not found MeCab'
|
|
64
64
|
end
|
|
65
65
|
end
|
|
66
66
|
|
|
@@ -299,8 +299,7 @@ module ReVIEW
|
|
|
299
299
|
end
|
|
300
300
|
|
|
301
301
|
def dt(str)
|
|
302
|
-
str.
|
|
303
|
-
str.sub!(/\]/) { '\rbrack{}' }
|
|
302
|
+
str = str.gsub('[', '\lbrack{}').gsub(']', '\rbrack{}')
|
|
304
303
|
puts '\item[' + str + '] \mbox{} \\\\'
|
|
305
304
|
end
|
|
306
305
|
|
|
@@ -482,8 +481,16 @@ module ReVIEW
|
|
|
482
481
|
def image_header(id, caption)
|
|
483
482
|
end
|
|
484
483
|
|
|
484
|
+
def parse_metric(type, metric)
|
|
485
|
+
s = super(type, metric)
|
|
486
|
+
if @book.config['pdfmaker']['use_original_image_size'] && s.empty? && !metric.present?
|
|
487
|
+
return ' ' # pass empty to \reviewincludegraphics
|
|
488
|
+
end
|
|
489
|
+
s
|
|
490
|
+
end
|
|
491
|
+
|
|
485
492
|
def handle_metric(str)
|
|
486
|
-
if @book.config['image_scale2width'] && str =~ /\Ascale=([\d.]+)\Z/
|
|
493
|
+
if @book.config['pdfmaker']['image_scale2width'] && str =~ /\Ascale=([\d.]+)\Z/
|
|
487
494
|
return "width=#{$1}\\maxwidth"
|
|
488
495
|
end
|
|
489
496
|
str
|
|
@@ -1019,7 +1026,7 @@ module ReVIEW
|
|
|
1019
1026
|
def inline_fn(id)
|
|
1020
1027
|
if @book.config['footnotetext']
|
|
1021
1028
|
macro("footnotemark[#{@chapter.footnote(id).number}]", '')
|
|
1022
|
-
elsif @doc_status[:caption] || @doc_status[:table] || @doc_status[:column]
|
|
1029
|
+
elsif @doc_status[:caption] || @doc_status[:table] || @doc_status[:column] || @doc_status[:dt]
|
|
1023
1030
|
@foottext[id] = @chapter.footnote(id).number
|
|
1024
1031
|
macro('protect\\footnotemark', '')
|
|
1025
1032
|
else
|
data/lib/review/pdfmaker.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (c) 2010-
|
|
1
|
+
# Copyright (c) 2010-2020 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
|
|
@@ -100,6 +100,7 @@ module ReVIEW
|
|
|
100
100
|
def parse_opts(args)
|
|
101
101
|
cmd_config = {}
|
|
102
102
|
opts = OptionParser.new
|
|
103
|
+
@buildonly = nil
|
|
103
104
|
|
|
104
105
|
opts.banner = 'Usage: review-pdfmaker configfile'
|
|
105
106
|
opts.version = ReVIEW::VERSION
|
|
@@ -109,6 +110,7 @@ module ReVIEW
|
|
|
109
110
|
end
|
|
110
111
|
opts.on('--[no-]debug', 'Keep temporary files.') { |debug| cmd_config['debug'] = debug }
|
|
111
112
|
opts.on('--ignore-errors', 'Ignore review-compile errors.') { cmd_config['ignore-errors'] = true }
|
|
113
|
+
opts.on('-y', '--only file1,file2,...', 'Build only specified files.') { |v| @buildonly = v.split(/\s*,\s*/).map { |m| m.strip.sub(/\.re\Z/, '') } }
|
|
112
114
|
|
|
113
115
|
opts.parse!(args)
|
|
114
116
|
if args.size != 1
|
|
@@ -166,8 +168,13 @@ module ReVIEW
|
|
|
166
168
|
if part.name.present?
|
|
167
169
|
@config['use_part'] = true
|
|
168
170
|
if part.file?
|
|
169
|
-
|
|
170
|
-
|
|
171
|
+
if @buildonly && !@buildonly.include?(part.name)
|
|
172
|
+
warn "skip #{part.name}.re"
|
|
173
|
+
input_files['CHAPS'] << %Q(\\part{}\n)
|
|
174
|
+
else
|
|
175
|
+
output_chaps(part.name)
|
|
176
|
+
input_files['CHAPS'] << %Q(\\input{#{part.name}.tex}\n)
|
|
177
|
+
end
|
|
171
178
|
else
|
|
172
179
|
input_files['CHAPS'] << %Q(\\part{#{part.name}}\n)
|
|
173
180
|
end
|
|
@@ -175,11 +182,18 @@ module ReVIEW
|
|
|
175
182
|
|
|
176
183
|
part.chapters.each do |chap|
|
|
177
184
|
filename = File.basename(chap.path, '.*')
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
185
|
+
entry = "\\input{#{filename}.tex}\n"
|
|
186
|
+
if @buildonly && !@buildonly.include?(filename)
|
|
187
|
+
warn "skip #{filename}.re"
|
|
188
|
+
entry = "\\chapter{}\n"
|
|
189
|
+
else
|
|
190
|
+
output_chaps(filename)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
input_files['PREDEF'] << entry if chap.on_predef?
|
|
194
|
+
input_files['CHAPS'] << entry if chap.on_chaps?
|
|
195
|
+
input_files['APPENDIX'] << entry if chap.on_appendix?
|
|
196
|
+
input_files['POSTDEF'] << entry if chap.on_postdef?
|
|
183
197
|
end
|
|
184
198
|
end
|
|
185
199
|
|
|
@@ -235,8 +249,9 @@ module ReVIEW
|
|
|
235
249
|
end
|
|
236
250
|
|
|
237
251
|
call_hook('hook_beforemakeindex')
|
|
238
|
-
if @config['pdfmaker']['makeindex'] && File.
|
|
252
|
+
if @config['pdfmaker']['makeindex'] && File.size?("#{@mastertex}.idx")
|
|
239
253
|
system_or_raise(*[makeindex_command, makeindex_options, @mastertex].flatten.compact)
|
|
254
|
+
system_or_raise(*[texcommand, texoptions, "#{@mastertex}.tex"].flatten.compact)
|
|
240
255
|
end
|
|
241
256
|
call_hook('hook_aftermakeindex')
|
|
242
257
|
|
data/lib/review/rstbuilder.rb
CHANGED
data/lib/review/textmaker.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (c) 2018-
|
|
1
|
+
# Copyright (c) 2018-2020 Kenshi Muto
|
|
2
2
|
#
|
|
3
3
|
# This program is free software.
|
|
4
4
|
# You can distribute or modify this program under the terms of
|
|
@@ -45,10 +45,12 @@ module ReVIEW
|
|
|
45
45
|
def parse_opts(args)
|
|
46
46
|
cmd_config = {}
|
|
47
47
|
opts = OptionParser.new
|
|
48
|
+
@buildonly = nil
|
|
48
49
|
|
|
49
50
|
opts.banner = 'Usage: review-textmaker [-n] configfile'
|
|
50
51
|
opts.version = ReVIEW::VERSION
|
|
51
52
|
opts.on('-n', 'No decoration.') { @plaintext = true }
|
|
53
|
+
opts.on('-y', '--only file1,file2,...', 'Build only specified files.') { |v| @buildonly = v.split(/\s*,\s*/).map { |m| m.strip.sub(/\.re\Z/, '') } }
|
|
52
54
|
opts.on('--help', 'Prints this message and quit.') do
|
|
53
55
|
puts opts.help
|
|
54
56
|
exit 0
|
|
@@ -154,6 +156,10 @@ module ReVIEW
|
|
|
154
156
|
filename = Pathname.new(chap.path).relative_path_from(base_path).to_s
|
|
155
157
|
end
|
|
156
158
|
id = File.basename(filename).sub(/\.re\Z/, '')
|
|
159
|
+
if @buildonly && !@buildonly.include?(id)
|
|
160
|
+
warn "skip #{id}.re"
|
|
161
|
+
return
|
|
162
|
+
end
|
|
157
163
|
|
|
158
164
|
textfile = "#{id}.txt"
|
|
159
165
|
|
data/lib/review/tocparser.rb
CHANGED
|
@@ -31,6 +31,7 @@ module ReVIEW
|
|
|
31
31
|
def parse(f, chap)
|
|
32
32
|
roots = [] # list of chapters
|
|
33
33
|
node_stack = []
|
|
34
|
+
@chap = chap
|
|
34
35
|
filename = chap.path
|
|
35
36
|
while line = f.gets
|
|
36
37
|
case line
|
|
@@ -52,7 +53,7 @@ module ReVIEW
|
|
|
52
53
|
node_stack.push(dummy_chapter)
|
|
53
54
|
roots.push(dummy_chapter)
|
|
54
55
|
end
|
|
55
|
-
next if label
|
|
56
|
+
next if label.start_with?('[/') # ex) "[/column]"
|
|
56
57
|
sec = Section.new(lev, label.gsub(/\A\{.*?\}\s?/, ''))
|
|
57
58
|
node_stack.pop until node_stack.last.level < sec.level
|
|
58
59
|
node_stack.last.add_child(sec)
|
|
@@ -73,7 +74,7 @@ module ReVIEW
|
|
|
73
74
|
beg = f.lineno
|
|
74
75
|
list.add(line)
|
|
75
76
|
while line = f.gets
|
|
76
|
-
break if
|
|
77
|
+
break if line.start_with?('//}')
|
|
77
78
|
list.add(line)
|
|
78
79
|
end
|
|
79
80
|
error!(filename, beg, 'unterminated list') unless line
|
|
@@ -107,6 +108,9 @@ module ReVIEW
|
|
|
107
108
|
b = ReVIEW::TEXTBuilder.new
|
|
108
109
|
dummy_book = ReVIEW::Book::Base.load
|
|
109
110
|
dummy_chapter = ReVIEW::Book::Chapter.new(dummy_book, 1, '-', nil, StringIO.new)
|
|
111
|
+
if @chap
|
|
112
|
+
dummy_chapter = @chap
|
|
113
|
+
end
|
|
110
114
|
dummy_loc = Location.new('', StringIO.new)
|
|
111
115
|
b.bind(ReVIEW::Compiler.new(b), dummy_chapter, dummy_loc)
|
|
112
116
|
b.compile_inline(line)
|
data/lib/review/version.rb
CHANGED
data/lib/review/webmaker.rb
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Copyright (c) 2016-
|
|
1
|
+
# Copyright (c) 2016-2020 Masayoshi Takahashi, Masanori Kado, Kenshi Muto
|
|
2
2
|
#
|
|
3
3
|
# This program is free software.
|
|
4
4
|
# You can distribute or modify this program under the terms of
|
|
@@ -50,6 +50,7 @@ module ReVIEW
|
|
|
50
50
|
def parse_opts(args)
|
|
51
51
|
cmd_config = {}
|
|
52
52
|
opts = OptionParser.new
|
|
53
|
+
@buildonly = nil
|
|
53
54
|
|
|
54
55
|
opts.banner = 'Usage: review-webmaker [option] configfile'
|
|
55
56
|
opts.version = ReVIEW::VERSION
|
|
@@ -58,6 +59,7 @@ module ReVIEW
|
|
|
58
59
|
exit 0
|
|
59
60
|
end
|
|
60
61
|
opts.on('--ignore-errors', 'Ignore review-compile errors.') { cmd_config['ignore-errors'] = true }
|
|
62
|
+
opts.on('-y', '--only file1,file2,...', 'Build only specified files.') { |v| @buildonly = v.split(/\s*,\s*/).map { |m| m.strip.sub(/\.re\Z/, '') } }
|
|
61
63
|
|
|
62
64
|
opts.parse!(args)
|
|
63
65
|
if args.size != 1
|
|
@@ -186,6 +188,11 @@ module ReVIEW
|
|
|
186
188
|
end
|
|
187
189
|
id = File.basename(filename).sub(/\.re\Z/, '')
|
|
188
190
|
|
|
191
|
+
if @buildonly && !@buildonly.include?(id)
|
|
192
|
+
warn "skip #{id}.re"
|
|
193
|
+
return
|
|
194
|
+
end
|
|
195
|
+
|
|
189
196
|
htmlfile = "#{id}.#{@config['htmlext']}"
|
|
190
197
|
|
|
191
198
|
if @config['params'].present?
|