review 4.1.0 → 5.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/ruby-tex.yml +35 -0
- data/.github/workflows/ruby-win.yml +19 -9
- data/.github/workflows/ruby.yml +7 -3
- data/.rubocop.yml +138 -34
- data/NEWS.ja.md +285 -0
- data/NEWS.md +285 -1
- data/README.md +7 -6
- data/Rakefile +7 -2
- data/bin/review +2 -4
- data/bin/review-catalog-converter +4 -4
- data/bin/review-check +8 -12
- data/bin/review-checkdep +2 -5
- data/bin/review-compile +18 -34
- data/bin/review-epub2html +1 -4
- data/bin/review-epubmaker +3 -4
- data/bin/review-idgxmlmaker +1 -3
- data/bin/review-index +5 -86
- data/bin/review-init +1 -4
- data/bin/review-pdfmaker +1 -3
- data/bin/review-preproc +30 -38
- data/bin/review-textmaker +1 -3
- data/bin/review-update +1 -4
- data/bin/review-validate +4 -4
- data/bin/review-vol +5 -82
- data/bin/review-webmaker +1 -3
- data/doc/config.yml.sample +45 -11
- data/doc/config.yml.sample-simple +3 -3
- data/doc/format.ja.md +103 -13
- data/doc/format.md +104 -16
- data/doc/makeindex.ja.md +2 -2
- data/doc/pdfmaker.ja.md +42 -0
- data/doc/pdfmaker.md +41 -0
- data/doc/quickstart.ja.md +19 -6
- data/doc/quickstart.md +18 -6
- data/doc/writing_vertical.ja.md +6 -0
- data/lib/review.rb +1 -1
- data/lib/review/book.rb +2 -2
- data/lib/review/book/base.rb +67 -29
- data/lib/review/book/bib.rb +21 -0
- data/lib/review/book/book_unit.rb +158 -0
- data/lib/review/book/chapter.rb +33 -26
- data/lib/review/book/index.rb +24 -185
- data/lib/review/book/index/item.rb +7 -1
- data/lib/review/book/page_metric.rb +7 -7
- data/lib/review/book/part.rb +26 -11
- data/lib/review/book/volume.rb +5 -5
- data/lib/review/builder.rb +121 -52
- data/lib/review/call_hook.rb +20 -0
- data/lib/review/catalog.rb +3 -2
- data/lib/review/compiler.rb +230 -111
- data/lib/review/configure.rb +91 -7
- data/lib/review/converter.rb +1 -1
- data/lib/review/epub2html.rb +6 -1
- data/lib/review/epubmaker.rb +124 -152
- data/lib/review/epubmaker/content.rb +113 -0
- data/lib/review/epubmaker/epubcommon.rb +372 -0
- data/lib/review/epubmaker/epubv2.rb +178 -0
- data/lib/review/epubmaker/epubv3.rb +231 -0
- data/lib/review/epubmaker/producer.rb +167 -0
- data/lib/review/epubmaker/reviewheaderlistener.rb +12 -2
- data/lib/review/epubmaker/zip_exporter.rb +84 -0
- data/lib/review/exception.rb +13 -0
- data/lib/review/htmlbuilder.rb +176 -89
- data/lib/review/htmlutils.rb +8 -11
- data/lib/review/i18n.rb +2 -1
- data/lib/review/idgxmlbuilder.rb +165 -75
- data/lib/review/idgxmlmaker.rb +24 -28
- data/lib/review/img_math.rb +238 -0
- data/lib/review/index_builder.rb +645 -0
- data/lib/review/init.rb +9 -17
- data/lib/review/latexbox.rb +58 -0
- data/lib/review/latexbuilder.rb +193 -75
- data/lib/review/latexutils.rb +9 -1
- data/lib/review/lineinput.rb +112 -2
- data/lib/review/loggable.rb +27 -0
- data/lib/review/logger.rb +90 -3
- data/lib/review/makerhelper.rb +17 -188
- data/lib/review/markdownbuilder.rb +54 -4
- data/lib/review/pdfmaker.rb +76 -84
- data/lib/review/plaintextbuilder.rb +106 -22
- data/lib/review/preprocessor.rb +107 -303
- data/lib/review/preprocessor/directive.rb +35 -0
- data/lib/review/preprocessor/line.rb +34 -0
- data/lib/review/preprocessor/repository.rb +177 -0
- data/lib/review/rstbuilder.rb +27 -8
- data/lib/review/sec_counter.rb +14 -0
- data/lib/review/template.rb +11 -1
- data/lib/review/textmaker.rb +27 -32
- data/lib/review/textutils.rb +3 -12
- data/lib/review/tocprinter.rb +242 -97
- data/lib/review/topbuilder.rb +98 -31
- data/lib/review/update.rb +12 -13
- data/lib/review/version.rb +1 -1
- data/lib/review/volumeprinter.rb +97 -0
- data/lib/review/webmaker.rb +40 -47
- data/lib/review/webtocprinter.rb +39 -35
- data/lib/review/yamlloader.rb +2 -1
- data/review.gemspec +5 -3
- data/samples/sample-book/src/config-epub2.yml +1 -1
- data/samples/sample-book/src/config.yml +3 -3
- data/samples/sample-book/src/lib/tasks/review.rake +19 -1
- data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +2 -1
- data/samples/syntax-book/Gemfile +1 -1
- data/samples/syntax-book/ch01.re +1 -1
- data/samples/syntax-book/ch02.re +21 -6
- data/samples/syntax-book/ch03.re +1 -1
- data/samples/syntax-book/config.yml +1 -1
- data/samples/syntax-book/images/img3-2.png +0 -0
- data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +2 -1
- data/templates/html/_colophon.html.erb +23 -0
- data/templates/html/_colophon_history.html.erb +9 -0
- data/templates/html/_cover.html.erb +10 -0
- data/templates/html/_part_body.html.erb +6 -0
- data/templates/html/_titlepage.html.erb +20 -0
- data/templates/html/layout-html5.html.erb +6 -0
- data/templates/html/layout-xhtml1.html.erb +6 -0
- data/templates/latex/config.erb +35 -23
- data/templates/latex/review-jlreq/README.md +3 -1
- data/templates/latex/review-jlreq/review-base.sty +36 -23
- data/templates/latex/review-jlreq/review-jlreq.cls +18 -25
- data/templates/latex/review-jlreq/review-style.sty +6 -1
- data/templates/latex/review-jlreq/review-tcbox.sty +348 -0
- data/templates/latex/review-jlreq/reviewmacro.sty +5 -0
- data/templates/latex/review-jsbook/README.md +7 -5
- data/templates/latex/review-jsbook/review-base.sty +40 -24
- data/templates/latex/review-jsbook/review-jsbook.cls +13 -3
- data/templates/latex/review-jsbook/review-style.sty +6 -1
- data/templates/latex/review-jsbook/review-tcbox.sty +348 -0
- data/templates/latex/review-jsbook/reviewmacro.sty +5 -0
- data/templates/opf/epubv2.opf.erb +7 -7
- data/templates/opf/epubv3.opf.erb +7 -7
- data/templates/opf/opf_manifest_epubv2.opf.erb +10 -0
- data/templates/opf/opf_manifest_epubv3.opf.erb +10 -0
- data/templates/opf/opf_metainfo_epubv2.opf.erb +17 -0
- data/templates/opf/opf_metainfo_epubv3.opf.erb +49 -0
- data/templates/opf/opf_tocx_epubv2.opf.erb +9 -0
- data/templates/opf/opf_tocx_epubv3.opf.erb +17 -0
- data/templates/web/html/layout-html5.html.erb +9 -8
- data/templates/web/html/layout-xhtml1.html.erb +6 -0
- data/test/assets/header_listener.html +35 -0
- data/test/assets/img_math/img1.png +0 -0
- data/test/assets/img_math/img2.png +0 -0
- data/test/assets/img_math/img3.png +0 -0
- data/test/assets/syntax_book_index_detail.txt +58 -0
- data/test/assets/test_template.tex +6 -3
- data/test/assets/test_template_backmatter.tex +6 -3
- data/test/book_test_helper.rb +11 -5
- data/test/run_test.rb +1 -1
- data/test/test_book.rb +54 -63
- data/test/test_book_chapter.rb +95 -54
- data/test/test_book_part.rb +3 -3
- data/test/test_builder.rb +29 -20
- data/test/test_catalog_converter_cmd.rb +1 -1
- data/test/test_converter.rb +1 -0
- data/test/test_epub3maker.rb +170 -126
- data/test/test_epubmaker.rb +254 -129
- data/test/test_epubmaker_cmd.rb +15 -4
- data/test/test_helper.rb +12 -5
- data/test/test_htmlbuilder.rb +926 -76
- data/test/test_htmlutils.rb +0 -12
- data/test/test_i18n.rb +33 -33
- data/test/test_idgxmlbuilder.rb +531 -20
- data/test/test_idgxmlmaker_cmd.rb +7 -3
- data/test/test_img_math.rb +111 -0
- data/test/test_index.rb +62 -52
- data/test/test_indexbuilder.rb +52 -0
- data/test/test_latexbuilder.rb +891 -20
- data/test/test_latexbuilder_v2.rb +56 -10
- data/test/test_lineinput.rb +20 -93
- data/test/test_logger.rb +7 -7
- data/test/test_makerhelper.rb +0 -12
- data/test/test_markdownbuilder.rb +32 -0
- data/test/test_pdfmaker.rb +100 -11
- data/test/test_pdfmaker_cmd.rb +3 -3
- data/test/test_plaintextbuilder.rb +546 -32
- data/test/test_preprocessor.rb +188 -1
- data/test/test_review_ext.rb +2 -1
- data/test/test_reviewheaderlistener.rb +49 -0
- data/test/test_rstbuilder.rb +25 -1
- data/test/test_sec_counter.rb +156 -0
- data/test/test_template.rb +12 -2
- data/test/test_textmaker_cmd.rb +5 -1
- data/test/test_tocprinter.rb +46 -0
- data/test/test_topbuilder.rb +324 -20
- data/test/test_update.rb +44 -44
- data/test/test_webtocprinter.rb +75 -43
- data/test/test_zip_exporter.rb +5 -6
- 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 +106 -22
- data/.rubocop_todo.yml +0 -7
- data/lib/epubmaker.rb +0 -23
- data/lib/epubmaker/content.rb +0 -110
- data/lib/epubmaker/epubcommon.rb +0 -441
- data/lib/epubmaker/epubv2.rb +0 -143
- data/lib/epubmaker/epubv3.rb +0 -233
- data/lib/epubmaker/producer.rb +0 -375
- data/lib/epubmaker/zip_exporter.rb +0 -81
- data/lib/lineinput.rb +0 -155
- data/lib/review/book/compilable.rb +0 -178
- data/lib/review/tocparser.rb +0 -275
- data/test/test_tocparser.rb +0 -25
@@ -0,0 +1,35 @@
|
|
1
|
+
# Copyright (c) 2010-2021 Minero Aoki, Kenshi Muto
|
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
|
+
|
9
|
+
module ReVIEW
|
10
|
+
class Preprocessor
|
11
|
+
class Directive
|
12
|
+
def initialize(op, args, opts)
|
13
|
+
@op = op
|
14
|
+
@args = args
|
15
|
+
@opts = opts
|
16
|
+
end
|
17
|
+
|
18
|
+
attr_reader :op
|
19
|
+
attr_reader :args
|
20
|
+
attr_reader :opts
|
21
|
+
|
22
|
+
def arg
|
23
|
+
@args.first
|
24
|
+
end
|
25
|
+
|
26
|
+
def opt
|
27
|
+
@opts.first
|
28
|
+
end
|
29
|
+
|
30
|
+
def [](key)
|
31
|
+
@opts[key]
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# Copyright (c) 2010-2021 Minero Aoki, Kenshi Muto
|
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
|
+
|
9
|
+
module ReVIEW
|
10
|
+
class Preprocessor
|
11
|
+
class Line
|
12
|
+
def initialize(number, string)
|
13
|
+
@number = number
|
14
|
+
@string = string
|
15
|
+
end
|
16
|
+
|
17
|
+
attr_reader :number
|
18
|
+
attr_reader :string
|
19
|
+
alias_method :to_s, :string
|
20
|
+
|
21
|
+
def edit
|
22
|
+
self.class.new(@number, yield(@string))
|
23
|
+
end
|
24
|
+
|
25
|
+
def empty?
|
26
|
+
@string.strip.empty?
|
27
|
+
end
|
28
|
+
|
29
|
+
def num_indent
|
30
|
+
@string.slice(/\A\s*/).size
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
# Copyright (c) 2010-2021 Minero Aoki, Kenshi Muto
|
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
|
+
|
9
|
+
require 'review/textutils'
|
10
|
+
require 'review/loggable'
|
11
|
+
|
12
|
+
module ReVIEW
|
13
|
+
class Preprocessor
|
14
|
+
class Repository
|
15
|
+
include TextUtils
|
16
|
+
include Loggable
|
17
|
+
|
18
|
+
def initialize(param)
|
19
|
+
@repository = {}
|
20
|
+
@config = param
|
21
|
+
@leave_content = nil
|
22
|
+
@logger = ReVIEW.logger
|
23
|
+
end
|
24
|
+
|
25
|
+
def fetch_file(file)
|
26
|
+
file_descripter(file)['file']
|
27
|
+
end
|
28
|
+
|
29
|
+
def fetch_range(file, name)
|
30
|
+
fetch(file, 'range', name)
|
31
|
+
end
|
32
|
+
|
33
|
+
def fetch(file, type, name)
|
34
|
+
table = file_descripter(file)[type] or return nil
|
35
|
+
table[name]
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def file_descripter(fname)
|
41
|
+
@leave_content = File.extname(fname) == '.re'
|
42
|
+
return @repository[fname] if @repository[fname]
|
43
|
+
|
44
|
+
@repository[fname] = git?(fname) ? parse_git_blob(fname) : parse_file(fname)
|
45
|
+
end
|
46
|
+
|
47
|
+
def git?(fname)
|
48
|
+
fname.start_with?('git|')
|
49
|
+
end
|
50
|
+
|
51
|
+
def parse_git_blob(g_obj)
|
52
|
+
IO.popen('git show ' + g_obj.sub(/\Agit\|/, ''), 'r') do |f|
|
53
|
+
@inf = f
|
54
|
+
return _parse_file(f)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def parse_file(fname)
|
59
|
+
File.open(fname, 'rt:BOM|utf-8') do |f|
|
60
|
+
@inf = f
|
61
|
+
return _parse_file(f)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def _parse_file(f)
|
66
|
+
whole = []
|
67
|
+
repo = { 'file' => whole }
|
68
|
+
curr = { 'WHOLE' => whole }
|
69
|
+
lineno = 1
|
70
|
+
yacchack = false # remove ';'-only lines.
|
71
|
+
opened = [['(not opened)', '(not opened)']] * 3
|
72
|
+
|
73
|
+
f.each do |line|
|
74
|
+
begin
|
75
|
+
case line
|
76
|
+
when /(?:\A\#@|\#@@)([a-z]+)_(begin|end)\((.*)\)/
|
77
|
+
type = check_type($1)
|
78
|
+
direction = $2
|
79
|
+
spec = check_spec($3)
|
80
|
+
case direction
|
81
|
+
when 'begin'
|
82
|
+
key = "#{type}/#{spec}"
|
83
|
+
if curr[key]
|
84
|
+
app_error "begin x2: #{key}"
|
85
|
+
end
|
86
|
+
(repo[type] ||= {})[spec] = curr[key] = []
|
87
|
+
when 'end'
|
88
|
+
curr.delete("#{type}/#{spec}") or
|
89
|
+
app_error "end before begin: #{type}/#{spec}"
|
90
|
+
else
|
91
|
+
app_error 'must not happen'
|
92
|
+
end
|
93
|
+
|
94
|
+
when %r{(?:\A\#@|\#@@)([a-z]+)/(\w+)\{}
|
95
|
+
type = check_type($1)
|
96
|
+
spec = check_spec($2)
|
97
|
+
key = "#{type}/#{spec}"
|
98
|
+
if curr[key]
|
99
|
+
app_error "begin x2: #{key}"
|
100
|
+
end
|
101
|
+
(repo[type] ||= {})[spec] = curr[key] = []
|
102
|
+
opened.push([type, spec])
|
103
|
+
|
104
|
+
when %r{(?:\A\#@|\#@@)([a-z]+)/(\w+)\}}
|
105
|
+
type = check_type($1)
|
106
|
+
spec = check_spec($2)
|
107
|
+
curr.delete("#{type}/#{spec}") or
|
108
|
+
app_error "end before begin: #{type}/#{spec}"
|
109
|
+
opened.delete("#{type}/#{spec}")
|
110
|
+
|
111
|
+
when /(?:\A\#@|\#@@)\}/
|
112
|
+
type, spec = opened.last
|
113
|
+
curr.delete("#{type}/#{spec}") or
|
114
|
+
app_error "closed before open: #{type}/#{spec}"
|
115
|
+
opened.pop
|
116
|
+
|
117
|
+
when /(?:\A\#@|\#@@)yacchack/
|
118
|
+
yacchack = true
|
119
|
+
|
120
|
+
when /\A\#@-/ # does not increment line number.
|
121
|
+
line = canonical($')
|
122
|
+
curr.each_value { |list| list.push(Line.new(nil, line)) }
|
123
|
+
|
124
|
+
else
|
125
|
+
next if yacchack && (line.strip == ';')
|
126
|
+
|
127
|
+
line = canonical(line)
|
128
|
+
curr.each_value { |list| list.push(Line.new(lineno, line)) }
|
129
|
+
lineno += 1
|
130
|
+
end
|
131
|
+
rescue ApplicationError => e
|
132
|
+
@has_errors = true
|
133
|
+
error e.message, location: location
|
134
|
+
end
|
135
|
+
end
|
136
|
+
if curr.size > 1
|
137
|
+
curr.delete('WHOLE')
|
138
|
+
curr.each { |range, lines| warn "#{@inf.path}: unclosed range: #{range} (begin @#{lines.first.number})" }
|
139
|
+
@has_errors = true
|
140
|
+
end
|
141
|
+
|
142
|
+
if @has_errors
|
143
|
+
error! 'repository failed.'
|
144
|
+
end
|
145
|
+
|
146
|
+
repo
|
147
|
+
end
|
148
|
+
|
149
|
+
def canonical(line)
|
150
|
+
if @leave_content
|
151
|
+
return line
|
152
|
+
end
|
153
|
+
|
154
|
+
tabwidth = @config['tabwidth'] || 8
|
155
|
+
if tabwidth > 0
|
156
|
+
detab(line, tabwidth).rstrip + "\n"
|
157
|
+
else
|
158
|
+
line
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
def check_type(type)
|
163
|
+
app_error "wrong type: #{type.inspect}" unless Preprocessor::TYPES.index(type)
|
164
|
+
type
|
165
|
+
end
|
166
|
+
|
167
|
+
def check_spec(spec)
|
168
|
+
app_error "wrong spec: #{spec.inspect}" unless /\A\w+\z/ =~ spec
|
169
|
+
spec
|
170
|
+
end
|
171
|
+
|
172
|
+
def location
|
173
|
+
"#{@inf.path}:#{@inf.lineno}"
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
end
|
data/lib/review/rstbuilder.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2008-
|
1
|
+
# Copyright (c) 2008-2020 Minero Aoki, Kenshi Muto
|
2
2
|
# 2002-2006 Minero Aoki
|
3
3
|
#
|
4
4
|
# This program is free software.
|
@@ -54,12 +54,12 @@ module ReVIEW
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def builder_init_file
|
57
|
+
super
|
57
58
|
@section = 0
|
58
59
|
@subsection = 0
|
59
60
|
@subsubsection = 0
|
60
61
|
@subsubsubsection = 0
|
61
62
|
@blank_seen = true
|
62
|
-
@sec_counter = SecCounter.new(5, @chapter)
|
63
63
|
@ul_indent = 0
|
64
64
|
@ol_indent = 0
|
65
65
|
@in_role = false
|
@@ -86,7 +86,7 @@ module ReVIEW
|
|
86
86
|
private :blank
|
87
87
|
|
88
88
|
def result
|
89
|
-
@output.string
|
89
|
+
solve_nest(@output.string)
|
90
90
|
end
|
91
91
|
|
92
92
|
def headline(level, label, caption)
|
@@ -97,7 +97,7 @@ module ReVIEW
|
|
97
97
|
end
|
98
98
|
p = '='
|
99
99
|
case level
|
100
|
-
when 1
|
100
|
+
when 1
|
101
101
|
unless label
|
102
102
|
puts ".. _#{@chapter.name}:"
|
103
103
|
blank
|
@@ -155,7 +155,7 @@ module ReVIEW
|
|
155
155
|
|
156
156
|
def dd(lines)
|
157
157
|
split_paragraph(lines).each do |paragraph|
|
158
|
-
puts " #{paragraph.
|
158
|
+
puts " #{paragraph.delete("\n")}"
|
159
159
|
end
|
160
160
|
end
|
161
161
|
|
@@ -373,8 +373,9 @@ module ReVIEW
|
|
373
373
|
|
374
374
|
def compile_kw(word, alt)
|
375
375
|
if alt
|
376
|
-
|
377
|
-
else
|
376
|
+
" **#{word}(#{alt.strip})** "
|
377
|
+
else
|
378
|
+
" **#{word}** "
|
378
379
|
end
|
379
380
|
end
|
380
381
|
|
@@ -582,6 +583,24 @@ module ReVIEW
|
|
582
583
|
base_parablock('centering', lines, nil)
|
583
584
|
end
|
584
585
|
|
586
|
+
CAPTION_TITLES.each do |name|
|
587
|
+
class_eval %Q(
|
588
|
+
def #{name}_begin(caption = nil)
|
589
|
+
check_nested_minicolumn
|
590
|
+
@doc_status[:minicolumn] = '#{name}'
|
591
|
+
puts ".. #{name}::"
|
592
|
+
blank
|
593
|
+
puts " " + compile_inline(caption).to_s unless caption.nil?
|
594
|
+
print " "
|
595
|
+
end
|
596
|
+
|
597
|
+
def #{name}_end
|
598
|
+
blank
|
599
|
+
@doc_status[:minicolumn] = nil
|
600
|
+
end
|
601
|
+
), __FILE__, __LINE__ - 14
|
602
|
+
end
|
603
|
+
|
585
604
|
def note(lines, caption = nil)
|
586
605
|
base_parablock('note', lines, caption)
|
587
606
|
end
|
@@ -705,7 +724,7 @@ module ReVIEW
|
|
705
724
|
str
|
706
725
|
end
|
707
726
|
|
708
|
-
def inline_chap(id)
|
727
|
+
def inline_chap(id) # rubocop:disable Lint/UselessMethodDefinition
|
709
728
|
super
|
710
729
|
end
|
711
730
|
|
data/lib/review/sec_counter.rb
CHANGED
@@ -37,11 +37,25 @@ module ReVIEW
|
|
37
37
|
str
|
38
38
|
end
|
39
39
|
|
40
|
+
def number_list
|
41
|
+
buf = @counter.dup
|
42
|
+
while buf.present?
|
43
|
+
if buf.last == 0
|
44
|
+
buf.pop
|
45
|
+
else
|
46
|
+
return buf
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
buf
|
51
|
+
end
|
52
|
+
|
40
53
|
def prefix(level, secnolevel)
|
41
54
|
return nil if @chapter.number.blank?
|
42
55
|
|
43
56
|
if level == 1
|
44
57
|
return nil unless secnolevel >= 1
|
58
|
+
|
45
59
|
if @chapter.is_a?(ReVIEW::Book::Part)
|
46
60
|
num = @chapter.number
|
47
61
|
"#{I18n.t('part', num)}#{I18n.t('chapter_postfix')}"
|
data/lib/review/template.rb
CHANGED
@@ -10,10 +10,20 @@ module ReVIEW
|
|
10
10
|
self.new(filename, mode)
|
11
11
|
end
|
12
12
|
|
13
|
+
def self.generate(path:, binding:, mode: 1, template_dir: ReVIEW::Template::TEMPLATE_DIR)
|
14
|
+
template_file = File.expand_path(path, template_dir)
|
15
|
+
self.new(template_file, mode).result(binding)
|
16
|
+
end
|
17
|
+
|
13
18
|
def initialize(filename = nil, mode = nil)
|
14
19
|
return unless filename
|
20
|
+
|
15
21
|
content = File.read(filename)
|
16
|
-
@erb =
|
22
|
+
@erb = if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.6')
|
23
|
+
ERB.new(content, trim_mode: mode)
|
24
|
+
else
|
25
|
+
ERB.new(content, nil, mode)
|
26
|
+
end
|
17
27
|
end
|
18
28
|
|
19
29
|
def result(bind_data = nil)
|
data/lib/review/textmaker.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2018-
|
1
|
+
# Copyright (c) 2018-2021 Kenshi Muto
|
2
2
|
#
|
3
3
|
# This program is free software.
|
4
4
|
# You can distribute or modify this program under the terms of
|
@@ -16,10 +16,13 @@ require 'review/yamlloader'
|
|
16
16
|
require 'review/topbuilder'
|
17
17
|
require 'review/version'
|
18
18
|
require 'review/makerhelper'
|
19
|
+
require 'review/img_math'
|
20
|
+
require 'review/loggable'
|
19
21
|
|
20
22
|
module ReVIEW
|
21
23
|
class TEXTMaker
|
22
24
|
include MakerHelper
|
25
|
+
include Loggable
|
23
26
|
|
24
27
|
attr_accessor :config, :basedir
|
25
28
|
|
@@ -27,15 +30,8 @@ module ReVIEW
|
|
27
30
|
@basedir = nil
|
28
31
|
@logger = ReVIEW.logger
|
29
32
|
@plaintext = nil
|
30
|
-
|
31
|
-
|
32
|
-
def error(msg)
|
33
|
-
@logger.error msg
|
34
|
-
exit 1
|
35
|
-
end
|
36
|
-
|
37
|
-
def warn(msg)
|
38
|
-
@logger.warn msg
|
33
|
+
@img_math = nil
|
34
|
+
@compile_errors = nil
|
39
35
|
end
|
40
36
|
|
41
37
|
def self.execute(*args)
|
@@ -70,36 +66,31 @@ module ReVIEW
|
|
70
66
|
end
|
71
67
|
|
72
68
|
def remove_old_files(path)
|
73
|
-
cleanup_mathimg
|
69
|
+
@img_math.cleanup_mathimg
|
74
70
|
FileUtils.rm_rf(path)
|
75
71
|
end
|
76
72
|
|
77
73
|
def execute(*args)
|
78
|
-
@config = ReVIEW::Configure.values
|
79
|
-
@config.maker = 'textmaker'
|
80
74
|
cmd_config, yamlfile = parse_opts(args)
|
81
|
-
error "#{yamlfile} not found." unless File.exist?(yamlfile)
|
75
|
+
error! "#{yamlfile} not found." unless File.exist?(yamlfile)
|
82
76
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
error "yaml error #{e.message}"
|
88
|
-
end
|
77
|
+
@config = ReVIEW::Configure.create(maker: 'textmaker',
|
78
|
+
yamlfile: yamlfile,
|
79
|
+
config: cmd_config)
|
80
|
+
@img_math = ReVIEW::ImgMath.new(@config, path_name: '_review_math_text')
|
89
81
|
|
90
|
-
# YAML configs will be overridden by command line options.
|
91
|
-
@config.deep_merge!(cmd_config)
|
92
82
|
I18n.setup(@config['language'])
|
93
83
|
begin
|
94
84
|
generate_text_files(yamlfile)
|
85
|
+
@logger.success("built #{build_path}")
|
95
86
|
rescue ApplicationError => e
|
96
87
|
raise if @config['debug']
|
97
|
-
|
88
|
+
|
89
|
+
error! e.message
|
98
90
|
end
|
99
91
|
|
100
|
-
|
101
|
-
|
102
|
-
make_math_images(math_dir)
|
92
|
+
if @config['math_format'] == 'imgmath'
|
93
|
+
@img_math.make_math_images
|
103
94
|
end
|
104
95
|
end
|
105
96
|
|
@@ -109,19 +100,22 @@ module ReVIEW
|
|
109
100
|
remove_old_files(@path)
|
110
101
|
Dir.mkdir(@path)
|
111
102
|
|
112
|
-
@book = ReVIEW::Book.
|
113
|
-
@book.config = @config
|
103
|
+
@book = ReVIEW::Book::Base.new(@basedir, config: @config)
|
114
104
|
|
115
105
|
build_body(@path, yamlfile)
|
106
|
+
|
107
|
+
if @compile_errors
|
108
|
+
app_error 'compile error, No TEXT file output.'
|
109
|
+
end
|
116
110
|
end
|
117
111
|
|
118
112
|
def build_body(basetmpdir, _yamlfile)
|
119
113
|
base_path = Pathname.new(@basedir)
|
120
114
|
builder = nil
|
121
115
|
if @plaintext
|
122
|
-
builder = ReVIEW::PLAINTEXTBuilder.new
|
116
|
+
builder = ReVIEW::PLAINTEXTBuilder.new(img_math: @img_math)
|
123
117
|
else
|
124
|
-
builder = ReVIEW::TOPBuilder.new
|
118
|
+
builder = ReVIEW::TOPBuilder.new(img_math: @img_math)
|
125
119
|
end
|
126
120
|
@converter = ReVIEW::Converter.new(@book, builder)
|
127
121
|
@book.parts.each do |part|
|
@@ -166,8 +160,9 @@ module ReVIEW
|
|
166
160
|
begin
|
167
161
|
@converter.convert(filename, File.join(basetmpdir, textfile))
|
168
162
|
rescue => e
|
169
|
-
|
170
|
-
|
163
|
+
@compile_errors = true
|
164
|
+
error "compile error in #{filename} (#{e.class})"
|
165
|
+
error e.message
|
171
166
|
end
|
172
167
|
end
|
173
168
|
end
|