review 3.0.0 → 4.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-win.yml +39 -0
- data/.github/workflows/ruby.yml +27 -0
- data/.rubocop.yml +50 -12
- data/.travis.yml +17 -8
- data/Dockerfile +21 -5
- data/NEWS.ja.md +358 -0
- data/NEWS.md +358 -1
- data/README.md +11 -8
- data/appveyor.yml +1 -3
- data/bin/review-catalog-converter +4 -4
- data/bin/review-check +8 -8
- data/bin/review-checkdep +1 -1
- data/bin/review-compile +12 -12
- data/bin/review-epubmaker +3 -35
- data/bin/review-idgxmlmaker +16 -0
- data/bin/review-index +2 -89
- data/bin/review-preproc +14 -19
- data/bin/review-validate +3 -3
- data/bin/review-vol +4 -78
- data/doc/LICENSE +1 -1
- data/doc/config.yml.sample +46 -12
- data/doc/config.yml.sample-simple +4 -2
- data/doc/format.ja.md +37 -13
- data/doc/format.md +35 -20
- data/doc/pdfmaker.ja.md +43 -1
- data/doc/pdfmaker.md +42 -1
- data/doc/quickstart.ja.md +46 -26
- data/doc/quickstart.md +38 -17
- data/lib/epubmaker/epubcommon.rb +10 -5
- data/lib/epubmaker/epubv2.rb +1 -1
- data/lib/epubmaker/epubv3.rb +1 -0
- data/lib/epubmaker/producer.rb +4 -2
- data/lib/review/book.rb +1 -1
- data/lib/review/book/base.rb +38 -79
- data/lib/review/book/chapter.rb +18 -3
- data/lib/review/book/compilable.rb +6 -5
- data/lib/review/book/index.rb +69 -101
- data/lib/review/book/index/item.rb +40 -0
- data/lib/review/book/page_metric.rb +7 -7
- data/lib/review/book/part.rb +28 -5
- data/lib/review/book/volume.rb +3 -4
- data/lib/review/builder.rb +105 -44
- data/lib/review/catalog.rb +13 -16
- data/lib/review/compiler.rb +84 -72
- data/lib/review/configure.rb +19 -8
- data/lib/review/epub2html.rb +37 -4
- data/lib/review/epubmaker.rb +62 -7
- data/lib/review/extentions/string.rb +0 -4
- data/lib/review/htmlbuilder.rb +102 -115
- data/lib/review/htmlutils.rb +2 -3
- data/lib/review/i18n.rb +2 -2
- data/lib/review/i18n.yml +9 -0
- data/lib/review/idgxmlbuilder.rb +153 -74
- data/lib/review/idgxmlmaker.rb +191 -0
- data/lib/review/init-web/finish.html +10 -0
- data/lib/review/init-web/index.html +190 -0
- data/lib/review/init-web/review-layout-design.js +691 -0
- data/lib/review/init.rb +125 -34
- data/lib/review/latexbuilder.rb +199 -88
- data/lib/review/lineinput.rb +1 -1
- data/lib/review/location.rb +32 -0
- data/lib/review/logger.rb +4 -8
- data/lib/review/makerhelper.rb +24 -5
- data/lib/review/markdownbuilder.rb +31 -37
- data/lib/review/md2inaobuilder.rb +3 -5
- data/lib/review/pdfmaker.rb +44 -22
- data/lib/review/plaintextbuilder.rb +106 -85
- data/lib/review/preprocessor.rb +32 -41
- data/lib/review/rstbuilder.rb +33 -33
- data/lib/review/textmaker.rb +19 -3
- data/lib/review/textutils.rb +76 -2
- data/lib/review/tocprinter.rb +231 -102
- data/lib/review/topbuilder.rb +114 -61
- data/lib/review/update.rb +19 -19
- data/lib/review/version.rb +1 -1
- data/lib/review/volumeprinter.rb +99 -0
- data/lib/review/webmaker.rb +11 -4
- data/lib/review/webtocprinter.rb +38 -35
- data/lib/review/yamlloader.rb +26 -16
- data/review.gemspec +6 -4
- data/samples/sample-book/README.md +7 -2
- data/samples/sample-book/src/.gitignore +154 -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-jlreq.yml +6 -0
- data/samples/sample-book/src/config.yml +2 -2
- data/samples/sample-book/src/lib/tasks/review.rake +29 -14
- data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +14 -8
- data/samples/syntax-book/ch01.re +4 -2
- data/samples/syntax-book/ch02.re +8 -16
- data/samples/syntax-book/ch03.re +3 -6
- data/samples/syntax-book/config-jlreq-lualatex.yml +4 -0
- data/samples/syntax-book/config-jlreq.yml +5 -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 +30 -15
- data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +14 -8
- data/templates/latex/config.erb +16 -0
- data/templates/latex/layout.tex.erb +4 -0
- data/templates/latex/review-jlreq/review-base.sty +150 -61
- data/templates/latex/review-jlreq/review-jlreq.cls +74 -8
- data/templates/latex/review-jlreq/review-style.sty +4 -1
- data/templates/latex/review-jsbook/README.md +39 -0
- data/templates/latex/review-jsbook/review-base.sty +101 -23
- data/templates/latex/review-jsbook/review-jsbook.cls +28 -5
- data/templates/latex/review-jsbook/review-style.sty +5 -2
- data/templates/opf/epubv3.opf.erb +1 -0
- data/templates/web/html/layout-html5.html.erb +2 -2
- data/test/assets/test_template.tex +24 -3
- data/test/assets/test_template_backmatter.tex +24 -3
- data/test/test_book.rb +75 -21
- data/test/test_book_chapter.rb +4 -2
- data/test/test_book_part.rb +3 -3
- data/test/test_builder.rb +16 -0
- data/test/test_catalog.rb +24 -42
- data/test/test_catalog_converter_cmd.rb +1 -1
- data/test/test_epubmaker_cmd.rb +14 -7
- data/test/test_helper.rb +15 -7
- data/test/test_htmlbuilder.rb +909 -159
- data/test/test_i18n.rb +25 -25
- data/test/test_idgxmlbuilder.rb +395 -38
- data/test/test_idgxmlmaker_cmd.rb +46 -0
- data/test/test_image_finder.rb +52 -70
- data/test/test_index.rb +50 -10
- data/test/test_latexbuilder.rb +1194 -106
- data/test/test_latexbuilder_v2.rb +628 -97
- data/test/test_logger.rb +14 -1
- data/test/test_makerhelper.rb +3 -3
- data/test/test_markdownbuilder.rb +134 -16
- data/test/test_md2inaobuilder.rb +32 -9
- data/test/test_pdfmaker.rb +18 -1
- data/test/test_pdfmaker_cmd.rb +100 -6
- data/test/test_plaintextbuilder.rb +371 -25
- data/test/test_preprocessor.rb +2 -16
- data/test/test_rstbuilder.rb +249 -26
- data/test/test_textmaker_cmd.rb +54 -0
- data/test/test_textutils.rb +109 -2
- data/test/test_topbuilder.rb +546 -31
- data/test/test_update.rb +17 -8
- data/test/test_webtocprinter.rb +66 -34
- data/test/test_yamlloader.rb +13 -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 +55 -10
- data/lib/review/tocparser.rb +0 -271
- data/samples/syntax-book/review-ext.rb +0 -14
- data/test/test_tocparser.rb +0 -25
data/bin/review-check
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
|
-
# Copyright (c) 2010-
|
3
|
+
# Copyright (c) 2010-2019 Kenshi Muto, Minero Aoki
|
4
4
|
# 1999-2007 Minero Aoki
|
5
5
|
#
|
6
6
|
# This program is free software.
|
@@ -50,7 +50,7 @@ def main
|
|
50
50
|
end
|
51
51
|
opts.on('--text', 'Check text.') do
|
52
52
|
modes ||= []
|
53
|
-
modes.push
|
53
|
+
modes.push(:text)
|
54
54
|
end
|
55
55
|
opts.on('--help', 'print this message and quit.') do
|
56
56
|
puts opts.help
|
@@ -58,8 +58,8 @@ def main
|
|
58
58
|
end
|
59
59
|
begin
|
60
60
|
opts.parse!
|
61
|
-
rescue OptionParser::ParseError =>
|
62
|
-
@logger.error(
|
61
|
+
rescue OptionParser::ParseError => e
|
62
|
+
@logger.error(e.message)
|
63
63
|
puts opts.help
|
64
64
|
exit 1
|
65
65
|
end
|
@@ -72,7 +72,7 @@ def main
|
|
72
72
|
modes.each do |mode|
|
73
73
|
case mode
|
74
74
|
when :text
|
75
|
-
check_text
|
75
|
+
check_text(files)
|
76
76
|
else
|
77
77
|
raise 'must not happen'
|
78
78
|
end
|
@@ -122,9 +122,9 @@ def words_re(rc)
|
|
122
122
|
next if line[0, 1] == '#'
|
123
123
|
if / !/ =~ line
|
124
124
|
line, n = *line.split('!', 2)
|
125
|
-
nega.push
|
125
|
+
nega.push(n.strip)
|
126
126
|
end
|
127
|
-
words.push
|
127
|
+
words.push(line.strip)
|
128
128
|
end
|
129
129
|
return Regexp.compile(words.join('|')),
|
130
130
|
nega.empty? ? nil : Regexp.compile(nega.join('|'))
|
@@ -157,7 +157,7 @@ def each_paragraph(f)
|
|
157
157
|
break if line.strip.empty?
|
158
158
|
break if %r{\A(?:=|//[\w\}])} =~ line
|
159
159
|
next if /\A\#@/ =~ line
|
160
|
-
buf.push
|
160
|
+
buf.push(line.strip)
|
161
161
|
end
|
162
162
|
yield buf, lineno
|
163
163
|
@review_utils_word_ok = nil
|
data/bin/review-checkdep
CHANGED
data/bin/review-compile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
|
-
# Copyright (c) 2008-
|
3
|
+
# Copyright (c) 2008-2019 Kenshi Muto, Masayoshi Takahashi, KADO Masanori, Minero Aoki
|
4
4
|
# Copyright (c) 1999-2007 Minero Aoki
|
5
5
|
#
|
6
6
|
# This program is free software.
|
@@ -35,7 +35,7 @@ def _main
|
|
35
35
|
@logger = ReVIEW.logger
|
36
36
|
@mode = :files
|
37
37
|
@basedir = nil
|
38
|
-
if
|
38
|
+
if File.basename($PROGRAM_NAME).start_with?('review2')
|
39
39
|
@target = File.basename($PROGRAM_NAME, '.rb').sub('review2', '')
|
40
40
|
else
|
41
41
|
@target = nil
|
@@ -50,7 +50,7 @@ def _main
|
|
50
50
|
begin
|
51
51
|
loader = ReVIEW::YAMLLoader.new
|
52
52
|
if @config['yaml']
|
53
|
-
error "#{config['yaml']} not found." unless File.exist?(@config['yaml'])
|
53
|
+
error "#{@config['yaml']} not found." unless File.exist?(@config['yaml'])
|
54
54
|
begin
|
55
55
|
@config.deep_merge!(loader.load_file(@config['yaml']))
|
56
56
|
rescue => e
|
@@ -88,7 +88,7 @@ def _main
|
|
88
88
|
compiler = ReVIEW::Compiler.new(load_strategy_class(@target, @check_only))
|
89
89
|
result = compiler.compile(chap)
|
90
90
|
if @output_filename
|
91
|
-
write
|
91
|
+
write(@output_filename, result)
|
92
92
|
else
|
93
93
|
puts result unless @check_only
|
94
94
|
end
|
@@ -99,18 +99,18 @@ def _main
|
|
99
99
|
compiler = ReVIEW::Compiler.new(load_strategy_class(@target, @check_only))
|
100
100
|
book.chapters.each do |chap|
|
101
101
|
str = compiler.compile(chap)
|
102
|
-
write
|
102
|
+
write("#{chap.name}#{compiler.strategy.extname}", str) unless @check_only
|
103
103
|
end
|
104
104
|
# PART
|
105
105
|
book.parts_in_file.each do |part|
|
106
106
|
str = compiler.compile(part)
|
107
|
-
write
|
107
|
+
write("#{part.name}#{compiler.strategy.extname}", str) unless @check_only
|
108
108
|
end
|
109
109
|
else
|
110
110
|
raise "must not happen: #{@mode}"
|
111
111
|
end
|
112
|
-
rescue ReVIEW::ApplicationError =>
|
113
|
-
error(
|
112
|
+
rescue ReVIEW::ApplicationError => e
|
113
|
+
error(e.message)
|
114
114
|
end
|
115
115
|
end
|
116
116
|
|
@@ -162,20 +162,20 @@ def parse_opts
|
|
162
162
|
raise OptionParser::ParseError, 'no target given'
|
163
163
|
end
|
164
164
|
end
|
165
|
-
rescue OptionParser::ParseError =>
|
166
|
-
warn(
|
165
|
+
rescue OptionParser::ParseError => e
|
166
|
+
warn(e.message)
|
167
167
|
$stderr.puts opts.help
|
168
168
|
exit 1
|
169
169
|
end
|
170
170
|
end
|
171
171
|
|
172
172
|
def error(msg)
|
173
|
-
@logger.error
|
173
|
+
@logger.error msg
|
174
174
|
exit 1
|
175
175
|
end
|
176
176
|
|
177
177
|
def warn(msg)
|
178
|
-
@logger.warn
|
178
|
+
@logger.warn msg
|
179
179
|
end
|
180
180
|
|
181
181
|
def load_strategy_class(target, strict)
|
data/bin/review-epubmaker
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# Copyright (c) 2010-
|
2
|
+
# Copyright (c) 2010-2019 Kenshi Muto and Masayoshi Takahashi
|
3
3
|
#
|
4
4
|
# This program is free software.
|
5
5
|
# You can distribute or modify this program under the terms of
|
@@ -10,39 +10,7 @@ require 'pathname'
|
|
10
10
|
require 'optparse'
|
11
11
|
bindir = Pathname.new(__FILE__).realpath.dirname
|
12
12
|
$LOAD_PATH.unshift((bindir + '../lib').realpath)
|
13
|
-
require 'review/epubmaker'
|
14
|
-
require 'review/version'
|
15
|
-
|
16
|
-
@logger = ReVIEW.logger
|
17
|
-
|
18
|
-
rv = ReVIEW::EPUBMaker.new
|
19
|
-
|
20
|
-
opts = OptionParser.new
|
21
|
-
opts.version = ReVIEW::VERSION
|
22
|
-
opts.banner = "Usage: #{File.basename($PROGRAM_NAME)} [options] YAML_filename [export_filename]"
|
23
|
-
opts.on('--help', 'Prints this message and quit.') do
|
24
|
-
puts opts.help
|
25
|
-
exit 0
|
26
|
-
end
|
27
13
|
|
28
|
-
|
29
|
-
opts.parse!
|
30
|
-
rescue OptionParser::ParseError => err
|
31
|
-
@logger.error err.message
|
32
|
-
$stderr.puts opts.help
|
33
|
-
exit 1
|
34
|
-
end
|
35
|
-
|
36
|
-
if ARGV.size < 1
|
37
|
-
puts opts.help
|
38
|
-
exit 1
|
39
|
-
end
|
40
|
-
|
41
|
-
unless File.exist?(ARGV[0])
|
42
|
-
@logger.error "#{File.basename($PROGRAM_NAME, '.*')}: #{ARGV[0]} not found."
|
43
|
-
exit 1
|
44
|
-
end
|
14
|
+
require 'review/epubmaker'
|
45
15
|
|
46
|
-
|
47
|
-
bookname = ARGV[1]
|
48
|
-
rv.produce(yaml_file, bookname)
|
16
|
+
ReVIEW::EPUBMaker.execute(*ARGV)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# Copyright (c) 2019 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
|
+
#
|
9
|
+
|
10
|
+
require 'pathname'
|
11
|
+
bindir = Pathname.new(__FILE__).realpath.dirname
|
12
|
+
$LOAD_PATH.unshift((bindir + '../lib').realpath)
|
13
|
+
|
14
|
+
require 'review/idgxmlmaker'
|
15
|
+
|
16
|
+
ReVIEW::IDGXMLMaker.execute(*ARGV)
|
data/bin/review-index
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
|
-
# Copyright (c) 2008-
|
3
|
+
# Copyright (c) 2008-2020 Minero Aoki, Kenshi Muto
|
4
4
|
# 1999-2007 Minero Aoki
|
5
5
|
#
|
6
6
|
# This program is free software.
|
@@ -14,93 +14,6 @@ require 'pathname'
|
|
14
14
|
bindir = Pathname.new(__FILE__).realpath.dirname
|
15
15
|
$LOAD_PATH.unshift((bindir + '../lib').realpath)
|
16
16
|
|
17
|
-
require 'review/book'
|
18
|
-
require 'review/tocparser'
|
19
17
|
require 'review/tocprinter'
|
20
|
-
require 'review/version'
|
21
|
-
require 'optparse'
|
22
18
|
|
23
|
-
|
24
|
-
@logger = ReVIEW.logger
|
25
|
-
Signal.trap(:INT) { exit 1 }
|
26
|
-
if RUBY_PLATFORM !~ /mswin(?!ce)|mingw|cygwin|bccwin/
|
27
|
-
Signal.trap(:PIPE, 'IGNORE')
|
28
|
-
end
|
29
|
-
_main
|
30
|
-
rescue Errno::EPIPE
|
31
|
-
exit 0
|
32
|
-
end
|
33
|
-
|
34
|
-
def _main
|
35
|
-
yamlfile = 'config.yml'
|
36
|
-
printer_class = ReVIEW::TextTOCPrinter
|
37
|
-
source = nil
|
38
|
-
upper = ReVIEW::TOCPrinter.default_upper_level
|
39
|
-
param = {}
|
40
|
-
book = ReVIEW::Book::Base.load
|
41
|
-
|
42
|
-
opts = OptionParser.new
|
43
|
-
opts.version = ReVIEW::VERSION
|
44
|
-
opts.on('--yaml=YAML', 'Read configurations from YAML file.') { |yaml| yamlfile = yaml }
|
45
|
-
opts.on('-a', '--all', 'print all chapters.') { source = book }
|
46
|
-
opts.on('-p', '--part N', 'list only part N.') do |n|
|
47
|
-
source = book.part(Integer(n)) or
|
48
|
-
error_exit "part #{n} does not exist in this book"
|
49
|
-
end
|
50
|
-
opts.on('-c', '--chapter C', 'list only chapter C.') do |c|
|
51
|
-
begin
|
52
|
-
source = ReVIEW::Book::Part.new(nil, 1, [book.chapter(c)])
|
53
|
-
rescue
|
54
|
-
error_exit "chapter #{c} does not exist in this book"
|
55
|
-
end
|
56
|
-
end
|
57
|
-
opts.on('-l', '--level N', 'list upto N level (1..4, default=4)') do |n|
|
58
|
-
upper = Integer(n)
|
59
|
-
unless (0..4).cover?(upper) # 0 is hidden option
|
60
|
-
$stderr.puts '-l/--level option accepts only 1..4'
|
61
|
-
exit 1
|
62
|
-
end
|
63
|
-
end
|
64
|
-
opts.on('--text', 'output in plain text (default)') { printer_class = ReVIEW::TextTOCPrinter }
|
65
|
-
opts.on('--html', 'output in HTML (deprecated)') { printer_class = ReVIEW::HTMLTOCPrinter }
|
66
|
-
opts.on('--help', 'print this message and quit.') do
|
67
|
-
puts opts.help
|
68
|
-
exit 0
|
69
|
-
end
|
70
|
-
begin
|
71
|
-
opts.parse!
|
72
|
-
rescue OptionParser::ParseError => err
|
73
|
-
@logger.error err.message
|
74
|
-
$stderr.puts opts.help
|
75
|
-
exit 1
|
76
|
-
end
|
77
|
-
|
78
|
-
book.config = ReVIEW::Configure.values
|
79
|
-
book.load_config(yamlfile) if yamlfile
|
80
|
-
|
81
|
-
if source
|
82
|
-
error_exit '-a/-s option and file arguments are exclusive' unless ARGV.empty?
|
83
|
-
else
|
84
|
-
puts opts.help
|
85
|
-
exit 0
|
86
|
-
end
|
87
|
-
|
88
|
-
begin
|
89
|
-
printer = printer_class.new(upper, param)
|
90
|
-
if source.is_a?(ReVIEW::Book::Part)
|
91
|
-
printer.print_part source
|
92
|
-
else
|
93
|
-
printer.print_book source
|
94
|
-
end
|
95
|
-
rescue ReVIEW::Error, Errno::ENOENT => err
|
96
|
-
raise if $DEBUG
|
97
|
-
error_exit err.message
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
def error_exit(msg)
|
102
|
-
@logger.error "#{File.basename($PROGRAM_NAME)}: #{msg}"
|
103
|
-
exit 1
|
104
|
-
end
|
105
|
-
|
106
|
-
main
|
19
|
+
ReVIEW::TOCPrinter.execute(*ARGV)
|
data/bin/review-preproc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
|
-
# Copyright (c) 2010-
|
3
|
+
# Copyright (c) 2010-2019 Minero Aoki, Kenshi Muto
|
4
4
|
# 1999-2007 Minero Aoki
|
5
5
|
#
|
6
6
|
# This program is free software.
|
@@ -39,7 +39,7 @@ def main
|
|
39
39
|
if ENV['REVIEW_SAFE_MODE'].to_i & 2 > 0
|
40
40
|
@logger.warn 'review-preproc-ext.rb is prohibited in safe mode. ignored.'
|
41
41
|
else
|
42
|
-
Kernel.load
|
42
|
+
Kernel.load(File.expand_path('review-preproc-ext.rb'))
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
@@ -52,7 +52,6 @@ def main
|
|
52
52
|
opts.on('-c', '--check', 'Check if preprocess is needed.') { mode = :check }
|
53
53
|
opts.on('-d', '--diff', 'Show diff from current file.') { mode = :diff }
|
54
54
|
opts.on('--replace', 'Replace file by preprocessed one.') { mode = :replace }
|
55
|
-
opts.on('-s', '--strip', 'Strip preprocessor tags.') { mode = :strip }
|
56
55
|
opts.on('--tabwidth=WIDTH', "Replace tabs with space characters. (0: don't replace)") { |width| param['tabwidth'] = width.to_i }
|
57
56
|
opts.on('--help', 'Print this message and quit.') do
|
58
57
|
puts opts.help
|
@@ -60,8 +59,8 @@ def main
|
|
60
59
|
end
|
61
60
|
begin
|
62
61
|
opts.parse!
|
63
|
-
rescue OptionParser::ParseError =>
|
64
|
-
@logger.error
|
62
|
+
rescue OptionParser::ParseError => e
|
63
|
+
@logger.error e.message
|
65
64
|
$stderr.puts opts.help
|
66
65
|
exit 1
|
67
66
|
end
|
@@ -72,39 +71,35 @@ def main
|
|
72
71
|
current_file = path
|
73
72
|
case mode
|
74
73
|
when :output
|
75
|
-
File.open(path) { |f| pp.process
|
74
|
+
File.open(path) { |f| pp.process(f, $stdout) }
|
76
75
|
when :replace
|
77
|
-
File.write
|
78
|
-
File.rename
|
76
|
+
File.write("#{path}.pptmp", preproc(pp, path))
|
77
|
+
File.rename("#{path}.pptmp", path)
|
79
78
|
when :diff, :check
|
80
79
|
tmp = '/tmp/review.pptmp'
|
81
80
|
begin
|
82
|
-
File.write
|
81
|
+
File.write(tmp, preproc(pp, path))
|
83
82
|
if mode == :check
|
84
|
-
system
|
83
|
+
system("diff -qu #{path} #{tmp} >/dev/null || echo #{path}")
|
85
84
|
else
|
86
|
-
system
|
85
|
+
system("diff -u #{path} #{tmp}")
|
87
86
|
end
|
88
87
|
ensure
|
89
|
-
FileUtils.rm_f
|
90
|
-
end
|
91
|
-
when :strip
|
92
|
-
File.open(path) do |f|
|
93
|
-
ReVIEW::Preprocessor::Strip.new(f).each { |line| puts line }
|
88
|
+
FileUtils.rm_f(tmp)
|
94
89
|
end
|
95
90
|
else
|
96
91
|
raise "must not happen: #{mode}"
|
97
92
|
end
|
98
93
|
end
|
99
|
-
rescue ReVIEW::Error =>
|
94
|
+
rescue ReVIEW::Error => e
|
100
95
|
raise if $DEBUG
|
101
|
-
@logger.error
|
96
|
+
@logger.error e.message
|
102
97
|
exit 1
|
103
98
|
end
|
104
99
|
|
105
100
|
def preproc(pp, path)
|
106
101
|
buf = StringIO.new
|
107
|
-
File.open(path) { |f| pp.process
|
102
|
+
File.open(path) { |f| pp.process(f, buf) }
|
108
103
|
buf.string
|
109
104
|
end
|
110
105
|
|
data/bin/review-validate
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
-
# Copyright (c) 2010-
|
2
|
+
# Copyright (c) 2010-2019 Kenshi Muto
|
3
3
|
#
|
4
4
|
# This program is free software
|
5
5
|
# You can distribute or modify this program under the terms of
|
@@ -30,7 +30,7 @@ ARGF.each do |line|
|
|
30
30
|
@logger.warn "#{ln}: block #{new_block} started, but previous block #{block} didn't close yet."
|
31
31
|
end
|
32
32
|
block = new_block
|
33
|
-
elsif line
|
33
|
+
elsif line.start_with?('//}')
|
34
34
|
if block.nil?
|
35
35
|
@logger.warn "#{ln}: block ended, but not opened."
|
36
36
|
end
|
@@ -48,7 +48,7 @@ ARGF.each do |line|
|
|
48
48
|
@logger.warn "#{ln}: found '*' without the head space. Is it correct?"
|
49
49
|
end
|
50
50
|
elsif line =~ /\A\s+(\d+\.)\s+/ && line =~ /\A\s+\*\s+/
|
51
|
-
unless
|
51
|
+
unless %w[list emlist listnum emlistnum cmd image table].include?(block)
|
52
52
|
@logger.warn "#{ln}: found itemized list or numbered list in #{block}. Is it correct?"
|
53
53
|
end
|
54
54
|
elsif block == 'table'
|
data/bin/review-vol
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
#
|
3
|
-
# Copyright (c) 2014-
|
3
|
+
# Copyright (c) 2014-2020 Minero Aoki, Kenshi Muto
|
4
4
|
# 2003-2014 Minero Aoki
|
5
5
|
#
|
6
6
|
# This program is free software.
|
@@ -14,82 +14,8 @@ require 'pathname'
|
|
14
14
|
bindir = Pathname.new(__FILE__).realpath.dirname
|
15
15
|
$LOAD_PATH.unshift((bindir + '../lib').realpath)
|
16
16
|
|
17
|
-
require 'review'
|
18
|
-
require 'optparse'
|
17
|
+
require 'review/volumeprinter'
|
19
18
|
|
20
|
-
|
21
|
-
|
22
|
-
def main
|
23
|
-
@logger = ReVIEW.logger
|
24
|
-
@config = ReVIEW::Configure.values
|
25
|
-
|
26
|
-
part_sensitive = false
|
27
|
-
basedir = nil
|
28
|
-
yamlfile = 'config.yml'
|
29
|
-
opts = OptionParser.new
|
30
|
-
opts.version = ReVIEW::VERSION
|
31
|
-
opts.on('--yaml=YAML', 'Read configurations from YAML file.') { |yaml| yamlfile = yaml }
|
32
|
-
opts.on('-P', '--part-sensitive', 'Prints volume of each parts.') { part_sensitive = true }
|
33
|
-
opts.on('--directory=DIR', 'Compile all chapters in DIR.') { |path| basedir = path }
|
34
|
-
opts.on('--help', 'Print this message and quit') do
|
35
|
-
puts opts.help
|
36
|
-
exit 0
|
37
|
-
end
|
38
|
-
begin
|
39
|
-
opts.parse!
|
40
|
-
rescue OptionParser::ParseError => err
|
41
|
-
@logger.error err.message
|
42
|
-
$stderr.puts opts.help
|
43
|
-
exit 1
|
44
|
-
end
|
45
|
-
|
46
|
-
book = basedir ? ReVIEW::Book.load(basedir) : ReVIEW::Book::Base.load
|
47
|
-
book.config = @config
|
48
|
-
if yamlfile
|
49
|
-
book.load_config(yamlfile)
|
50
|
-
end
|
51
|
-
|
52
|
-
if part_sensitive
|
53
|
-
sep = ''
|
54
|
-
book.each_part do |part|
|
55
|
-
print sep
|
56
|
-
sep = "\n"
|
57
|
-
if part.number
|
58
|
-
puts "Part #{part.number} #{part.name}"
|
59
|
-
end
|
60
|
-
part.each_chapter do |chap|
|
61
|
-
print_chapter_volume chap
|
62
|
-
end
|
63
|
-
puts ' --------------------'
|
64
|
-
print_volume part.volume
|
65
|
-
end
|
66
|
-
else
|
67
|
-
book.each_chapter do |chap|
|
68
|
-
print_chapter_volume chap
|
69
|
-
end
|
70
|
-
end
|
71
|
-
puts '============================='
|
72
|
-
print_volume book.volume # puts "Total #{book.volume}"
|
73
|
-
rescue ReVIEW::ApplicationError, Errno::ENOENT => err
|
74
|
-
raise if $DEBUG
|
75
|
-
@logger.error "#{File.basename($PROGRAM_NAME)}: #{err.message}"
|
76
|
-
exit 1
|
77
|
-
end
|
78
|
-
|
79
|
-
def print_chapter_volume(chap)
|
80
|
-
vol = chap.volume
|
81
|
-
title = chap.title
|
82
|
-
printf "%s %3dKB %6dC %5dL %3dP %s %-s\n",
|
83
|
-
chapnumstr(chap.number), vol.kbytes, vol.chars, vol.lines, vol.page,
|
84
|
-
"#{chap.name} ".ljust(25, '.'), title
|
19
|
+
if File.basename($PROGRAM_NAME) == File.basename(__FILE__)
|
20
|
+
ReVIEW::VolumePrinter.execute(*ARGV)
|
85
21
|
end
|
86
|
-
|
87
|
-
def print_volume(vol)
|
88
|
-
printf " %3dKB %6dC %5dL %3dP\n", vol.kbytes, vol.chars, vol.lines, vol.page
|
89
|
-
end
|
90
|
-
|
91
|
-
def chapnumstr(n)
|
92
|
-
n ? sprintf('%2d.', n) : ' '
|
93
|
-
end
|
94
|
-
|
95
|
-
main
|