review 2.4.0 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rubocop.yml +20 -5
- data/.travis.yml +2 -1
- data/NEWS.ja.md +93 -0
- data/NEWS.md +77 -0
- data/README.md +1 -1
- data/bin/review +38 -12
- data/bin/review-compile +106 -88
- data/bin/review-epubmaker +6 -1
- data/bin/review-init +21 -1
- data/bin/review-textmaker +16 -0
- data/doc/config.yml.sample +6 -1
- data/doc/format.ja.md +23 -0
- data/doc/format.md +20 -2
- data/doc/quickstart.ja.md +8 -4
- data/doc/quickstart.md +11 -8
- data/lib/review/book/base.rb +29 -18
- data/lib/review/book/index.rb +10 -5
- data/lib/review/builder.rb +58 -33
- data/lib/review/catalog.rb +30 -0
- data/lib/review/compiler.rb +53 -19
- data/lib/review/configure.rb +15 -14
- data/lib/review/epubmaker.rb +15 -4
- data/lib/review/htmlbuilder.rb +56 -24
- data/lib/review/idgxmlbuilder.rb +17 -7
- data/lib/review/latexbuilder.rb +113 -38
- data/lib/review/markdownbuilder.rb +12 -5
- data/lib/review/md2inaobuilder.rb +3 -1
- data/lib/review/pdfmaker.rb +23 -9
- data/lib/review/plaintextbuilder.rb +683 -0
- data/lib/review/rstbuilder.rb +30 -10
- data/lib/review/textmaker.rb +158 -0
- data/lib/review/textutils.rb +10 -1
- data/lib/review/topbuilder.rb +32 -417
- data/lib/review/version.rb +1 -1
- data/lib/review/webmaker.rb +29 -8
- data/review.gemspec +3 -4
- data/templates/html/layout-xhtml1.html.erb +0 -2
- data/templates/latex/layout.tex.erb +6 -4
- data/templates/web/html/layout-xhtml1.html.erb +0 -2
- data/test/book_test_helper.rb +1 -0
- data/test/run_test.rb +1 -1
- data/test/sample-book/src/Rakefile +19 -3
- data/test/syntax-book/Rakefile +19 -3
- data/test/test_catalog.rb +45 -0
- data/test/test_compiler.rb +8 -2
- data/test/test_htmlbuilder.rb +22 -0
- data/test/test_idgxmlbuilder.rb +22 -0
- data/test/test_index.rb +31 -0
- data/test/test_latexbuilder.rb +48 -16
- data/test/test_plaintextbuilder.rb +390 -0
- data/test/test_textutils.rb +2 -0
- data/test/test_topbuilder.rb +23 -1
- metadata +13 -7
data/lib/review/rstbuilder.rb
CHANGED
@@ -20,7 +20,9 @@ module ReVIEW
|
|
20
20
|
class RSTBuilder < Builder
|
21
21
|
include TextUtils
|
22
22
|
|
23
|
-
%i[ttbold hint maru keytop labelref ref balloon strong].each
|
23
|
+
%i[ttbold hint maru keytop labelref ref balloon strong].each do |e|
|
24
|
+
Compiler.definline(e)
|
25
|
+
end
|
24
26
|
Compiler.defsingle(:dtp, 1)
|
25
27
|
|
26
28
|
Compiler.defblock(:insn, 1)
|
@@ -152,7 +154,9 @@ module ReVIEW
|
|
152
154
|
end
|
153
155
|
|
154
156
|
def dd(lines)
|
155
|
-
split_paragraph(lines).each
|
157
|
+
split_paragraph(lines).each do |paragraph|
|
158
|
+
puts " #{paragraph.gsub(/\n/, '')}"
|
159
|
+
end
|
156
160
|
end
|
157
161
|
|
158
162
|
def dl_end
|
@@ -160,7 +164,9 @@ module ReVIEW
|
|
160
164
|
|
161
165
|
def paragraph(lines)
|
162
166
|
pre = ''
|
163
|
-
|
167
|
+
if @in_role
|
168
|
+
pre = ' '
|
169
|
+
end
|
164
170
|
puts pre + lines.join
|
165
171
|
puts "\n"
|
166
172
|
end
|
@@ -186,7 +192,9 @@ module ReVIEW
|
|
186
192
|
end
|
187
193
|
|
188
194
|
def list_body(_id, lines, _lang)
|
189
|
-
lines.each
|
195
|
+
lines.each do |line|
|
196
|
+
puts '-' + detab(line)
|
197
|
+
end
|
190
198
|
end
|
191
199
|
|
192
200
|
def base_block(_type, lines, caption = nil)
|
@@ -213,7 +221,9 @@ module ReVIEW
|
|
213
221
|
lang ||= 'none'
|
214
222
|
puts ".. code-block:: #{lang}"
|
215
223
|
blank
|
216
|
-
lines.each
|
224
|
+
lines.each do |line|
|
225
|
+
puts ' ' + detab(line)
|
226
|
+
end
|
217
227
|
blank
|
218
228
|
end
|
219
229
|
|
@@ -227,18 +237,24 @@ module ReVIEW
|
|
227
237
|
puts ".. code-block:: #{lang}"
|
228
238
|
puts ' :linenos:'
|
229
239
|
blank
|
230
|
-
lines.each
|
240
|
+
lines.each do |line|
|
241
|
+
puts ' ' + detab(line)
|
242
|
+
end
|
231
243
|
blank
|
232
244
|
end
|
233
245
|
|
234
246
|
def listnum_body(lines, _lang)
|
235
|
-
lines.each_with_index
|
247
|
+
lines.each_with_index do |line, i|
|
248
|
+
puts(i + 1).to_s.rjust(2) + ": #{line}"
|
249
|
+
end
|
236
250
|
blank
|
237
251
|
end
|
238
252
|
|
239
253
|
def cmd(lines, _caption = nil)
|
240
254
|
puts '.. code-block:: bash'
|
241
|
-
lines.each
|
255
|
+
lines.each do |line|
|
256
|
+
puts ' ' + detab(line)
|
257
|
+
end
|
242
258
|
end
|
243
259
|
|
244
260
|
def quote(lines)
|
@@ -257,7 +273,9 @@ module ReVIEW
|
|
257
273
|
|
258
274
|
def image_image(id, caption, metric)
|
259
275
|
chapter, id = extract_chapter_id(id)
|
260
|
-
|
276
|
+
if metric
|
277
|
+
scale = metric.split('=')[1].to_f * 100
|
278
|
+
end
|
261
279
|
|
262
280
|
puts ".. _#{id}:"
|
263
281
|
blank
|
@@ -353,7 +371,9 @@ module ReVIEW
|
|
353
371
|
end
|
354
372
|
|
355
373
|
def compile_href(url, label)
|
356
|
-
|
374
|
+
if label.blank?
|
375
|
+
label = url
|
376
|
+
end
|
357
377
|
" `#{label} <#{url}>`_ "
|
358
378
|
end
|
359
379
|
|
@@ -0,0 +1,158 @@
|
|
1
|
+
# Copyright (c) 2018 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
|
+
require 'optparse'
|
9
|
+
require 'yaml'
|
10
|
+
require 'fileutils'
|
11
|
+
|
12
|
+
require 'review/converter'
|
13
|
+
require 'review/configure'
|
14
|
+
require 'review/book'
|
15
|
+
require 'review/yamlloader'
|
16
|
+
require 'review/topbuilder'
|
17
|
+
require 'review/version'
|
18
|
+
|
19
|
+
module ReVIEW
|
20
|
+
class TEXTMaker
|
21
|
+
attr_accessor :config, :basedir
|
22
|
+
|
23
|
+
def initialize
|
24
|
+
@basedir = nil
|
25
|
+
@logger = ReVIEW.logger
|
26
|
+
@plaintext = nil
|
27
|
+
end
|
28
|
+
|
29
|
+
def error(msg)
|
30
|
+
@logger.error "#{File.basename($PROGRAM_NAME, '.*')}: #{msg}"
|
31
|
+
exit 1
|
32
|
+
end
|
33
|
+
|
34
|
+
def warn(msg)
|
35
|
+
@logger.warn "#{File.basename($PROGRAM_NAME, '.*')}: #{msg}"
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.execute(*args)
|
39
|
+
self.new.execute(*args)
|
40
|
+
end
|
41
|
+
|
42
|
+
def parse_opts(args)
|
43
|
+
cmd_config = {}
|
44
|
+
opts = OptionParser.new
|
45
|
+
|
46
|
+
opts.banner = 'Usage: review-textmaker [-n] configfile'
|
47
|
+
opts.version = ReVIEW::VERSION
|
48
|
+
opts.on('-n', 'No decoration.') { @plaintext = true }
|
49
|
+
opts.on('--help', 'Prints this message and quit.') do
|
50
|
+
puts opts.help
|
51
|
+
exit 0
|
52
|
+
end
|
53
|
+
|
54
|
+
opts.parse!(args)
|
55
|
+
if args.size != 1
|
56
|
+
puts opts.help
|
57
|
+
exit 0
|
58
|
+
end
|
59
|
+
|
60
|
+
[cmd_config, args[0]]
|
61
|
+
end
|
62
|
+
|
63
|
+
def build_path
|
64
|
+
"#{@config['bookname']}-text"
|
65
|
+
end
|
66
|
+
|
67
|
+
def remove_old_files(path)
|
68
|
+
FileUtils.rm_rf(path)
|
69
|
+
end
|
70
|
+
|
71
|
+
def execute(*args)
|
72
|
+
@config = ReVIEW::Configure.values
|
73
|
+
@config.maker = 'textmaker'
|
74
|
+
cmd_config, yamlfile = parse_opts(args)
|
75
|
+
error "#{yamlfile} not found." unless File.exist?(yamlfile)
|
76
|
+
|
77
|
+
begin
|
78
|
+
loader = ReVIEW::YAMLLoader.new
|
79
|
+
@config.deep_merge!(loader.load_file(yamlfile))
|
80
|
+
rescue => e
|
81
|
+
error "yaml error #{e.message}"
|
82
|
+
end
|
83
|
+
# YAML configs will be overridden by command line options.
|
84
|
+
@config.deep_merge!(cmd_config)
|
85
|
+
I18n.setup(@config['language'])
|
86
|
+
begin
|
87
|
+
generate_text_files(yamlfile)
|
88
|
+
rescue ApplicationError => e
|
89
|
+
raise if @config['debug']
|
90
|
+
error(e.message)
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
def generate_text_files(yamlfile)
|
95
|
+
@basedir = File.dirname(yamlfile)
|
96
|
+
@path = build_path
|
97
|
+
remove_old_files(@path)
|
98
|
+
Dir.mkdir(@path)
|
99
|
+
|
100
|
+
@book = ReVIEW::Book.load(@basedir)
|
101
|
+
@book.config = @config
|
102
|
+
|
103
|
+
build_body(@path, yamlfile)
|
104
|
+
end
|
105
|
+
|
106
|
+
def build_body(basetmpdir, _yamlfile)
|
107
|
+
base_path = Pathname.new(@basedir)
|
108
|
+
builder = nil
|
109
|
+
if @plaintext
|
110
|
+
builder = ReVIEW::PLAINTEXTBuilder.new
|
111
|
+
else
|
112
|
+
builder = ReVIEW::TOPBuilder.new
|
113
|
+
end
|
114
|
+
@converter = ReVIEW::Converter.new(@book, builder)
|
115
|
+
@book.parts.each do |part|
|
116
|
+
if part.name.present?
|
117
|
+
if part.file?
|
118
|
+
build_chap(part, base_path, basetmpdir, true)
|
119
|
+
else
|
120
|
+
textfile = "part_#{part.number}.txt"
|
121
|
+
build_part(part, basetmpdir, textfile)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
part.chapters.each { |chap| build_chap(chap, base_path, basetmpdir, false) }
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def build_part(part, basetmpdir, textfile)
|
130
|
+
File.open("#{basetmpdir}/#{textfile}", 'w') do |f|
|
131
|
+
f.print '■H1■' unless @plaintext
|
132
|
+
f.print ReVIEW::I18n.t('part', part.number)
|
133
|
+
f.print " #{part.name.strip}" if part.name.strip.present?
|
134
|
+
f.puts
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
def build_chap(chap, base_path, basetmpdir, ispart)
|
139
|
+
filename = ''
|
140
|
+
|
141
|
+
if ispart.present?
|
142
|
+
filename = chap.path
|
143
|
+
else
|
144
|
+
filename = Pathname.new(chap.path).relative_path_from(base_path).to_s
|
145
|
+
end
|
146
|
+
id = filename.sub(/\.re\Z/, '')
|
147
|
+
|
148
|
+
textfile = "#{id}.txt"
|
149
|
+
|
150
|
+
begin
|
151
|
+
@converter.convert(filename, File.join(basetmpdir, textfile))
|
152
|
+
rescue => e
|
153
|
+
warn "compile error in #{filename} (#{e.class})"
|
154
|
+
warn e.message
|
155
|
+
end
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
data/lib/review/textutils.rb
CHANGED
@@ -15,9 +15,10 @@ module ReVIEW
|
|
15
15
|
def split_paragraph(lines)
|
16
16
|
pre = pre_paragraph
|
17
17
|
post = post_paragraph
|
18
|
+
trimmed_lines = trim_lines(lines)
|
18
19
|
|
19
20
|
blocked_lines = [[]]
|
20
|
-
|
21
|
+
trimmed_lines.each do |element|
|
21
22
|
if element.empty?
|
22
23
|
blocked_lines << [] if blocked_lines.last != []
|
23
24
|
else
|
@@ -28,5 +29,13 @@ module ReVIEW
|
|
28
29
|
blocked_lines.map! { |i| [pre] + i + [post] } if pre && post
|
29
30
|
blocked_lines.map(&:join)
|
30
31
|
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def trim_lines(lines)
|
36
|
+
new_lines = lines.dup
|
37
|
+
new_lines.pop while new_lines[-1] && new_lines[-1].strip.empty?
|
38
|
+
new_lines
|
39
|
+
end
|
31
40
|
end
|
32
41
|
end
|
data/lib/review/topbuilder.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (c) 2008-
|
1
|
+
# Copyright (c) 2008-2018 Minero Aoki, Kenshi Muto
|
2
2
|
# 2002-2006 Minero Aoki
|
3
3
|
#
|
4
4
|
# This program is free software.
|
@@ -6,47 +6,12 @@
|
|
6
6
|
# the GNU LGPL, Lesser General Public License version 2.1.
|
7
7
|
#
|
8
8
|
|
9
|
-
require 'review/
|
10
|
-
require 'review/textutils'
|
9
|
+
require 'review/plaintextbuilder'
|
11
10
|
|
12
11
|
module ReVIEW
|
13
|
-
class TOPBuilder <
|
14
|
-
include TextUtils
|
15
|
-
|
16
|
-
%i[ttbold hint maru keytop labelref ref balloon strong].each { |e| Compiler.definline(e) }
|
17
|
-
Compiler.defsingle(:dtp, 1)
|
18
|
-
|
19
|
-
Compiler.defblock(:insn, 1)
|
20
|
-
Compiler.defblock(:planning, 0..1)
|
21
|
-
Compiler.defblock(:best, 0..1)
|
22
|
-
Compiler.defblock(:securty, 0..1)
|
23
|
-
Compiler.defblock(:point, 0..1)
|
24
|
-
Compiler.defblock(:reference, 0)
|
25
|
-
Compiler.defblock(:term, 0)
|
26
|
-
Compiler.defblock(:practice, 0)
|
27
|
-
Compiler.defblock(:expert, 0)
|
28
|
-
Compiler.defblock(:link, 0..1)
|
29
|
-
Compiler.defblock(:shoot, 0..1)
|
30
|
-
|
31
|
-
def pre_paragraph
|
32
|
-
''
|
33
|
-
end
|
34
|
-
|
35
|
-
def post_paragraph
|
36
|
-
''
|
37
|
-
end
|
38
|
-
|
39
|
-
def extname
|
40
|
-
'.txt'
|
41
|
-
end
|
42
|
-
|
12
|
+
class TOPBuilder < PLAINTEXTBuilder
|
43
13
|
def builder_init_file
|
44
|
-
|
45
|
-
@subsection = 0
|
46
|
-
@subsubsection = 0
|
47
|
-
@subsubsubsection = 0
|
48
|
-
@blank_seen = true
|
49
|
-
@sec_counter = SecCounter.new(5, @chapter)
|
14
|
+
super
|
50
15
|
|
51
16
|
@titles = {
|
52
17
|
'emlist' => 'インラインリスト',
|
@@ -94,77 +59,27 @@ module ReVIEW
|
|
94
59
|
end
|
95
60
|
private :builder_init_file
|
96
61
|
|
97
|
-
def print(s)
|
98
|
-
@blank_seen = false
|
99
|
-
super
|
100
|
-
end
|
101
|
-
private :print
|
102
|
-
|
103
|
-
def puts(s)
|
104
|
-
@blank_seen = false
|
105
|
-
super
|
106
|
-
end
|
107
|
-
private :puts
|
108
|
-
|
109
|
-
def blank
|
110
|
-
@output.puts unless @blank_seen
|
111
|
-
@blank_seen = true
|
112
|
-
end
|
113
|
-
private :blank
|
114
|
-
|
115
|
-
def result
|
116
|
-
@output.string
|
117
|
-
end
|
118
|
-
|
119
62
|
def headline(level, _label, caption)
|
120
63
|
prefix, _anchor = headline_prefix(level)
|
121
64
|
puts %Q(■H#{level}■#{prefix}#{compile_inline(caption)})
|
122
65
|
end
|
123
66
|
|
124
|
-
def ul_begin
|
125
|
-
blank
|
126
|
-
end
|
127
|
-
|
128
67
|
def ul_item(lines)
|
129
68
|
puts "●\t#{lines.join}"
|
130
69
|
end
|
131
70
|
|
132
|
-
def ul_end
|
133
|
-
blank
|
134
|
-
end
|
135
|
-
|
136
|
-
def ol_begin
|
137
|
-
blank
|
138
|
-
@olitem = 0
|
139
|
-
end
|
140
|
-
|
141
71
|
def ol_item(lines, num)
|
142
72
|
puts "#{num}\t#{lines.join}"
|
143
73
|
end
|
144
74
|
|
145
|
-
def ol_end
|
146
|
-
blank
|
147
|
-
@olitem = nil
|
148
|
-
end
|
149
|
-
|
150
|
-
def dl_begin
|
151
|
-
blank
|
152
|
-
end
|
153
|
-
|
154
75
|
def dt(line)
|
155
76
|
puts "★#{line}☆"
|
156
77
|
end
|
157
78
|
|
158
79
|
def dd(lines)
|
159
|
-
split_paragraph(lines).each
|
160
|
-
|
161
|
-
|
162
|
-
def dl_end
|
163
|
-
blank
|
164
|
-
end
|
165
|
-
|
166
|
-
def paragraph(lines)
|
167
|
-
puts lines.join
|
80
|
+
split_paragraph(lines).each do |paragraph|
|
81
|
+
puts "\t#{paragraph.gsub(/\n/, '')}"
|
82
|
+
end
|
168
83
|
end
|
169
84
|
|
170
85
|
def read(lines)
|
@@ -176,15 +91,6 @@ module ReVIEW
|
|
176
91
|
|
177
92
|
alias_method :lead, :read
|
178
93
|
|
179
|
-
def inline_list(id)
|
180
|
-
chapter, id = extract_chapter_id(id)
|
181
|
-
if get_chap(chapter)
|
182
|
-
%Q(#{I18n.t('list')}#{I18n.t('format_number', [get_chap(chapter), chapter.list(id).number])})
|
183
|
-
else
|
184
|
-
%Q(#{I18n.t('list')}#{I18n.t('format_number_without_chapter', [chapter.list(id).number])})
|
185
|
-
end
|
186
|
-
end
|
187
|
-
|
188
94
|
def list_header(id, caption, _lang)
|
189
95
|
blank
|
190
96
|
puts "◆→開始:#{@titles['list']}←◆"
|
@@ -197,7 +103,9 @@ module ReVIEW
|
|
197
103
|
end
|
198
104
|
|
199
105
|
def list_body(_id, lines, _lang)
|
200
|
-
lines.each
|
106
|
+
lines.each do |line|
|
107
|
+
puts detab(line)
|
108
|
+
end
|
201
109
|
puts "◆→終了:#{@titles['list']}←◆"
|
202
110
|
blank
|
203
111
|
end
|
@@ -220,59 +128,25 @@ module ReVIEW
|
|
220
128
|
blank
|
221
129
|
end
|
222
130
|
|
223
|
-
def emlist(lines, caption = nil, _lang = nil)
|
224
|
-
base_block 'emlist', lines, caption
|
225
|
-
end
|
226
|
-
|
227
131
|
def emlistnum(lines, caption = nil, _lang = nil)
|
228
132
|
blank
|
229
133
|
puts "◆→開始:#{@titles['emlist']}←◆"
|
230
134
|
puts "■#{compile_inline(caption)}" if caption.present?
|
231
|
-
lines.each_with_index
|
135
|
+
lines.each_with_index do |line, i|
|
136
|
+
puts((i + 1).to_s.rjust(2) + ": #{line}")
|
137
|
+
end
|
232
138
|
puts "◆→終了:#{@titles['emlist']}←◆"
|
233
139
|
blank
|
234
140
|
end
|
235
141
|
|
236
142
|
def listnum_body(lines, _lang)
|
237
|
-
lines.each_with_index
|
143
|
+
lines.each_with_index do |line, i|
|
144
|
+
puts((i + 1).to_s.rjust(2) + ": #{line}")
|
145
|
+
end
|
238
146
|
puts "◆→終了:#{@titles['list']}←◆"
|
239
147
|
blank
|
240
148
|
end
|
241
149
|
|
242
|
-
def cmd(lines, caption = nil)
|
243
|
-
base_block 'cmd', lines, caption
|
244
|
-
end
|
245
|
-
|
246
|
-
def quote(lines)
|
247
|
-
base_parablock 'quote', lines, nil
|
248
|
-
end
|
249
|
-
|
250
|
-
def inline_table(id)
|
251
|
-
chapter, id = extract_chapter_id(id)
|
252
|
-
if get_chap(chapter)
|
253
|
-
"#{I18n.t('table')}#{I18n.t('format_number', [get_chap(chapter), chapter.table(id).number])}"
|
254
|
-
else
|
255
|
-
"#{I18n.t('table')}#{I18n.t('format_number_without_chapter', [chapter.table(id).number])}"
|
256
|
-
end
|
257
|
-
end
|
258
|
-
|
259
|
-
def inline_img(id)
|
260
|
-
chapter, id = extract_chapter_id(id)
|
261
|
-
if get_chap(chapter)
|
262
|
-
"#{I18n.t('image')}#{I18n.t('format_number', [get_chap(chapter), chapter.image(id).number])}"
|
263
|
-
else
|
264
|
-
"#{I18n.t('image')}#{I18n.t('format_number_without_chapter', [chapter.image(id).number])}"
|
265
|
-
end
|
266
|
-
end
|
267
|
-
|
268
|
-
def handle_metric(str)
|
269
|
-
str
|
270
|
-
end
|
271
|
-
|
272
|
-
def result_metric(array)
|
273
|
-
array.join(',')
|
274
|
-
end
|
275
|
-
|
276
150
|
def image(lines, id, caption, metric = nil)
|
277
151
|
metrics = parse_metric('top', metric)
|
278
152
|
metrics = " #{metrics}" if metrics.present?
|
@@ -288,7 +162,9 @@ module ReVIEW
|
|
288
162
|
puts "◆→#{@chapter.image(id).path}#{metrics}←◆"
|
289
163
|
else
|
290
164
|
warn "image not bound: #{id}"
|
291
|
-
lines.each
|
165
|
+
lines.each do |line|
|
166
|
+
puts line
|
167
|
+
end
|
292
168
|
end
|
293
169
|
puts "◆→終了:#{@titles['image']}←◆"
|
294
170
|
blank
|
@@ -326,8 +202,12 @@ module ReVIEW
|
|
326
202
|
return if rows.empty?
|
327
203
|
table_begin rows.first.size
|
328
204
|
if sepidx
|
329
|
-
sepidx.times
|
330
|
-
|
205
|
+
sepidx.times do
|
206
|
+
tr(rows.shift.map { |s| th(s) })
|
207
|
+
end
|
208
|
+
rows.each do |cols|
|
209
|
+
tr(cols.map { |s| td(s) })
|
210
|
+
end
|
331
211
|
else
|
332
212
|
rows.each do |cols|
|
333
213
|
h, *cs = *cols
|
@@ -337,32 +217,10 @@ module ReVIEW
|
|
337
217
|
table_end
|
338
218
|
end
|
339
219
|
|
340
|
-
def table_header(id, caption)
|
341
|
-
if id.nil?
|
342
|
-
puts compile_inline(caption)
|
343
|
-
elsif get_chap
|
344
|
-
puts "#{I18n.t('table')}#{I18n.t('format_number', [get_chap, @chapter.table(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)}"
|
345
|
-
else
|
346
|
-
puts "#{I18n.t('table')}#{I18n.t('format_number_without_chapter', [@chapter.table(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)}"
|
347
|
-
end
|
348
|
-
blank
|
349
|
-
end
|
350
|
-
|
351
|
-
def table_begin(ncols)
|
352
|
-
end
|
353
|
-
|
354
|
-
def tr(rows)
|
355
|
-
puts rows.join("\t")
|
356
|
-
end
|
357
|
-
|
358
220
|
def th(str)
|
359
221
|
"★#{str}☆"
|
360
222
|
end
|
361
223
|
|
362
|
-
def td(str)
|
363
|
-
str
|
364
|
-
end
|
365
|
-
|
366
224
|
def table_end
|
367
225
|
puts "◆→終了:#{@titles['table']}←◆"
|
368
226
|
blank
|
@@ -371,7 +229,9 @@ module ReVIEW
|
|
371
229
|
def comment(lines, comment = nil)
|
372
230
|
return unless @book.config['draft']
|
373
231
|
lines ||= []
|
374
|
-
|
232
|
+
unless comment.blank?
|
233
|
+
lines.unshift comment
|
234
|
+
end
|
375
235
|
str = lines.join
|
376
236
|
puts "◆→#{str}←◆"
|
377
237
|
end
|
@@ -382,6 +242,8 @@ module ReVIEW
|
|
382
242
|
|
383
243
|
def inline_fn(id)
|
384
244
|
"【注#{@chapter.footnote(id).number}】"
|
245
|
+
rescue KeyError
|
246
|
+
error "unknown footnote: #{id}"
|
385
247
|
end
|
386
248
|
|
387
249
|
def compile_ruby(base, ruby)
|
@@ -411,10 +273,6 @@ module ReVIEW
|
|
411
273
|
"#{str}◆→DTP連絡:「#{str}」は下付き←◆"
|
412
274
|
end
|
413
275
|
|
414
|
-
def inline_raw(str)
|
415
|
-
super(str).gsub('\\n', "\n")
|
416
|
-
end
|
417
|
-
|
418
276
|
def inline_hint(str)
|
419
277
|
"◆→ヒントスタイルここから←◆#{str}◆→ヒントスタイルここまで←◆"
|
420
278
|
end
|
@@ -484,10 +342,6 @@ module ReVIEW
|
|
484
342
|
%Q(\t←#{str.gsub(/@maru\[(\d+)\]/, inline_maru('\1'))})
|
485
343
|
end
|
486
344
|
|
487
|
-
def inline_uchar(str)
|
488
|
-
[str.to_i(16)].pack('U')
|
489
|
-
end
|
490
|
-
|
491
345
|
def inline_comment(str)
|
492
346
|
if @book.config['draft']
|
493
347
|
"◆→#{str}←◆"
|
@@ -500,30 +354,15 @@ module ReVIEW
|
|
500
354
|
%Q(◆→TeX式ここから←◆#{str}◆→TeX式ここまで←◆)
|
501
355
|
end
|
502
356
|
|
503
|
-
def bibpaper(lines, id, caption)
|
504
|
-
bibpaper_header id, caption
|
505
|
-
bibpaper_bibpaper id, caption, lines unless lines.empty?
|
506
|
-
end
|
507
|
-
|
508
357
|
def bibpaper_header(id, caption)
|
509
358
|
print "[#{@chapter.bibpaper(id).number}]"
|
510
359
|
puts " #{compile_inline(caption)}"
|
511
360
|
end
|
512
361
|
|
513
|
-
def bibpaper_bibpaper(_id, _caption, lines)
|
514
|
-
print split_paragraph(lines).join
|
515
|
-
end
|
516
|
-
|
517
362
|
def inline_bib(id)
|
518
363
|
%Q([#{@chapter.bibpaper(id).number}])
|
519
|
-
|
520
|
-
|
521
|
-
def inline_hd_chap(chap, id)
|
522
|
-
if chap.number
|
523
|
-
n = chap.headline_index.number(id)
|
524
|
-
return I18n.t('chapter_quote', "#{n} #{compile_inline(chap.headline(id).caption)}") if @book.config['secnolevel'] >= n.split('.').size
|
525
|
-
end
|
526
|
-
I18n.t('chapter_quote', compile_inline(chap.headline(id).caption))
|
364
|
+
rescue KeyError
|
365
|
+
error "unknown bib: #{id}"
|
527
366
|
end
|
528
367
|
|
529
368
|
def noindent
|
@@ -534,23 +373,10 @@ module ReVIEW
|
|
534
373
|
puts "■H#{level}■#{compile_inline(caption)}"
|
535
374
|
end
|
536
375
|
|
537
|
-
def nonum_end(level)
|
538
|
-
end
|
539
|
-
|
540
376
|
def notoc_begin(level, _label, caption)
|
541
377
|
puts "■H#{level}■#{compile_inline(caption)}◆→DTP連絡:目次に掲載しない←◆"
|
542
378
|
end
|
543
379
|
|
544
|
-
def notoc_end(level)
|
545
|
-
end
|
546
|
-
|
547
|
-
def nodisp_begin(level, label, caption)
|
548
|
-
# return empty
|
549
|
-
end
|
550
|
-
|
551
|
-
def nodisp_end(level)
|
552
|
-
end
|
553
|
-
|
554
380
|
def common_column_begin(type, caption)
|
555
381
|
blank
|
556
382
|
puts "◆→開始:#{@titles[type]}←◆"
|
@@ -562,156 +388,6 @@ module ReVIEW
|
|
562
388
|
blank
|
563
389
|
end
|
564
390
|
|
565
|
-
def column_begin(_level, _label, caption)
|
566
|
-
common_column_begin('column', caption)
|
567
|
-
end
|
568
|
-
|
569
|
-
def column_end(_level)
|
570
|
-
common_column_end('column')
|
571
|
-
end
|
572
|
-
|
573
|
-
def xcolumn_begin(_level, _label, caption)
|
574
|
-
common_column_begin('xcolumn', caption)
|
575
|
-
end
|
576
|
-
|
577
|
-
def xcolumn_end(_level)
|
578
|
-
common_column_end('xcolumn')
|
579
|
-
end
|
580
|
-
|
581
|
-
def world_begin(_level, _label, caption)
|
582
|
-
common_column_begin('world', caption)
|
583
|
-
end
|
584
|
-
|
585
|
-
def world_end(_level)
|
586
|
-
common_column_end('world')
|
587
|
-
end
|
588
|
-
|
589
|
-
def hood_begin(_level, _label, caption)
|
590
|
-
common_column_begin('hood', caption)
|
591
|
-
end
|
592
|
-
|
593
|
-
def hood_end(_level)
|
594
|
-
common_column_end('hood')
|
595
|
-
end
|
596
|
-
|
597
|
-
def edition_begin(_level, _label, caption)
|
598
|
-
common_column_begin('edition', caption)
|
599
|
-
end
|
600
|
-
|
601
|
-
def edition_end(_level)
|
602
|
-
common_column_end('edition')
|
603
|
-
end
|
604
|
-
|
605
|
-
def insideout_begin(_level, _label, caption)
|
606
|
-
common_column_begin('insideout', caption)
|
607
|
-
end
|
608
|
-
|
609
|
-
def insideout_end(_level)
|
610
|
-
common_column_end('insideout')
|
611
|
-
end
|
612
|
-
|
613
|
-
def ref_begin(_level, _label, caption)
|
614
|
-
common_column_begin('ref', caption)
|
615
|
-
end
|
616
|
-
|
617
|
-
def ref_end(_level)
|
618
|
-
common_column_end('ref')
|
619
|
-
end
|
620
|
-
|
621
|
-
def sup_begin(_level, _label, caption)
|
622
|
-
common_column_begin('sup', caption)
|
623
|
-
end
|
624
|
-
|
625
|
-
def sup_end(_level)
|
626
|
-
common_column_end('sup')
|
627
|
-
end
|
628
|
-
|
629
|
-
def flushright(lines)
|
630
|
-
base_parablock 'flushright', lines, nil
|
631
|
-
end
|
632
|
-
|
633
|
-
def centering(lines)
|
634
|
-
base_parablock 'centering', lines, nil
|
635
|
-
end
|
636
|
-
|
637
|
-
def note(lines, caption = nil)
|
638
|
-
base_parablock 'note', lines, caption
|
639
|
-
end
|
640
|
-
|
641
|
-
def memo(lines, caption = nil)
|
642
|
-
base_parablock 'memo', lines, caption
|
643
|
-
end
|
644
|
-
|
645
|
-
def tip(lines, caption = nil)
|
646
|
-
base_parablock 'tip', lines, caption
|
647
|
-
end
|
648
|
-
|
649
|
-
def info(lines, caption = nil)
|
650
|
-
base_parablock 'info', lines, caption
|
651
|
-
end
|
652
|
-
|
653
|
-
def planning(lines, caption = nil)
|
654
|
-
base_parablock 'planning', lines, caption
|
655
|
-
end
|
656
|
-
|
657
|
-
def best(lines, caption = nil)
|
658
|
-
base_parablock 'best', lines, caption
|
659
|
-
end
|
660
|
-
|
661
|
-
def important(lines, caption = nil)
|
662
|
-
base_parablock 'important', lines, caption
|
663
|
-
end
|
664
|
-
|
665
|
-
def security(lines, caption = nil)
|
666
|
-
base_parablock 'security', lines, caption
|
667
|
-
end
|
668
|
-
|
669
|
-
def caution(lines, caption = nil)
|
670
|
-
base_parablock 'caution', lines, caption
|
671
|
-
end
|
672
|
-
|
673
|
-
def term(lines)
|
674
|
-
base_parablock 'term', lines, nil
|
675
|
-
end
|
676
|
-
|
677
|
-
def link(lines, caption = nil)
|
678
|
-
base_parablock 'link', lines, caption
|
679
|
-
end
|
680
|
-
|
681
|
-
def notice(lines, caption = nil)
|
682
|
-
base_parablock 'notice', lines, caption
|
683
|
-
end
|
684
|
-
|
685
|
-
def point(lines, caption = nil)
|
686
|
-
base_parablock 'point', lines, caption
|
687
|
-
end
|
688
|
-
|
689
|
-
def shoot(lines, caption = nil)
|
690
|
-
base_parablock 'shoot', lines, caption
|
691
|
-
end
|
692
|
-
|
693
|
-
def reference(lines)
|
694
|
-
base_parablock 'reference', lines, nil
|
695
|
-
end
|
696
|
-
|
697
|
-
def practice(lines)
|
698
|
-
base_parablock 'practice', lines, nil
|
699
|
-
end
|
700
|
-
|
701
|
-
def expert(lines)
|
702
|
-
base_parablock 'expert', lines, nil
|
703
|
-
end
|
704
|
-
|
705
|
-
def insn(lines, caption = nil)
|
706
|
-
base_block 'insn', lines, caption
|
707
|
-
end
|
708
|
-
|
709
|
-
def warning(lines, caption = nil)
|
710
|
-
base_parablock 'warning', lines, caption
|
711
|
-
end
|
712
|
-
|
713
|
-
alias_method :box, :insn
|
714
|
-
|
715
391
|
def indepimage(_lines, id, caption = nil, metric = nil)
|
716
392
|
metrics = parse_metric('top', metric)
|
717
393
|
metrics = " #{metrics}" if metrics.present?
|
@@ -728,64 +404,10 @@ module ReVIEW
|
|
728
404
|
|
729
405
|
alias_method :numberlessimage, :indepimage
|
730
406
|
|
731
|
-
def label(_id)
|
732
|
-
# FIXME
|
733
|
-
''
|
734
|
-
end
|
735
|
-
|
736
|
-
def dtp(str)
|
737
|
-
# FIXME
|
738
|
-
end
|
739
|
-
|
740
|
-
def bpo(lines)
|
741
|
-
base_block 'bpo', lines, nil
|
742
|
-
end
|
743
|
-
|
744
|
-
def inline_dtp(_str)
|
745
|
-
# FIXME
|
746
|
-
''
|
747
|
-
end
|
748
|
-
|
749
|
-
def inline_del(_str)
|
750
|
-
# FIXME
|
751
|
-
''
|
752
|
-
end
|
753
|
-
|
754
407
|
def inline_code(str)
|
755
408
|
"△#{str}☆"
|
756
409
|
end
|
757
410
|
|
758
|
-
def inline_br(_str)
|
759
|
-
"\n"
|
760
|
-
end
|
761
|
-
|
762
|
-
def text(str)
|
763
|
-
str
|
764
|
-
end
|
765
|
-
|
766
|
-
def inline_chap(id)
|
767
|
-
# "「第#{super}章 #{inline_title(id)}」"
|
768
|
-
# "第#{super}章"
|
769
|
-
super
|
770
|
-
end
|
771
|
-
|
772
|
-
def inline_chapref(id)
|
773
|
-
chs = ['', '「', '」']
|
774
|
-
if @book.config['chapref']
|
775
|
-
chs2 = @book.config['chapref'].split(',')
|
776
|
-
error '--chapsplitter must have exactly 3 parameters with comma.' if chs2.size != 3
|
777
|
-
chs = chs2
|
778
|
-
end
|
779
|
-
"#{chs[0]}#{@book.chapter_index.number(id)}#{chs[1]}#{@book.chapter_index.title(id)}#{chs[2]}"
|
780
|
-
rescue KeyError
|
781
|
-
error "unknown chapter: #{id}"
|
782
|
-
nofunc_text("[UnknownChapter:#{id}]")
|
783
|
-
end
|
784
|
-
|
785
|
-
def source(lines, caption = nil, _lang = nil)
|
786
|
-
base_block 'source', lines, caption
|
787
|
-
end
|
788
|
-
|
789
411
|
def inline_ttibold(str)
|
790
412
|
"▲#{str}☆◆→等幅フォント太字イタ←◆"
|
791
413
|
end
|
@@ -803,12 +425,5 @@ module ReVIEW
|
|
803
425
|
def circle_begin(_level, _label, caption)
|
804
426
|
puts "・\t#{caption}"
|
805
427
|
end
|
806
|
-
|
807
|
-
def circle_end(level)
|
808
|
-
end
|
809
|
-
|
810
|
-
def nofunc_text(str)
|
811
|
-
str
|
812
|
-
end
|
813
428
|
end
|
814
429
|
end # module ReVIEW
|