review 2.4.0 → 2.5.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.
Files changed (54) hide show
  1. checksums.yaml +5 -5
  2. data/.rubocop.yml +20 -5
  3. data/.travis.yml +2 -1
  4. data/NEWS.ja.md +93 -0
  5. data/NEWS.md +77 -0
  6. data/README.md +1 -1
  7. data/bin/review +38 -12
  8. data/bin/review-compile +106 -88
  9. data/bin/review-epubmaker +6 -1
  10. data/bin/review-init +21 -1
  11. data/bin/review-textmaker +16 -0
  12. data/doc/config.yml.sample +6 -1
  13. data/doc/format.ja.md +23 -0
  14. data/doc/format.md +20 -2
  15. data/doc/quickstart.ja.md +8 -4
  16. data/doc/quickstart.md +11 -8
  17. data/lib/review/book/base.rb +29 -18
  18. data/lib/review/book/index.rb +10 -5
  19. data/lib/review/builder.rb +58 -33
  20. data/lib/review/catalog.rb +30 -0
  21. data/lib/review/compiler.rb +53 -19
  22. data/lib/review/configure.rb +15 -14
  23. data/lib/review/epubmaker.rb +15 -4
  24. data/lib/review/htmlbuilder.rb +56 -24
  25. data/lib/review/idgxmlbuilder.rb +17 -7
  26. data/lib/review/latexbuilder.rb +113 -38
  27. data/lib/review/markdownbuilder.rb +12 -5
  28. data/lib/review/md2inaobuilder.rb +3 -1
  29. data/lib/review/pdfmaker.rb +23 -9
  30. data/lib/review/plaintextbuilder.rb +683 -0
  31. data/lib/review/rstbuilder.rb +30 -10
  32. data/lib/review/textmaker.rb +158 -0
  33. data/lib/review/textutils.rb +10 -1
  34. data/lib/review/topbuilder.rb +32 -417
  35. data/lib/review/version.rb +1 -1
  36. data/lib/review/webmaker.rb +29 -8
  37. data/review.gemspec +3 -4
  38. data/templates/html/layout-xhtml1.html.erb +0 -2
  39. data/templates/latex/layout.tex.erb +6 -4
  40. data/templates/web/html/layout-xhtml1.html.erb +0 -2
  41. data/test/book_test_helper.rb +1 -0
  42. data/test/run_test.rb +1 -1
  43. data/test/sample-book/src/Rakefile +19 -3
  44. data/test/syntax-book/Rakefile +19 -3
  45. data/test/test_catalog.rb +45 -0
  46. data/test/test_compiler.rb +8 -2
  47. data/test/test_htmlbuilder.rb +22 -0
  48. data/test/test_idgxmlbuilder.rb +22 -0
  49. data/test/test_index.rb +31 -0
  50. data/test/test_latexbuilder.rb +48 -16
  51. data/test/test_plaintextbuilder.rb +390 -0
  52. data/test/test_textutils.rb +2 -0
  53. data/test/test_topbuilder.rb +23 -1
  54. metadata +13 -7
@@ -28,7 +28,9 @@ module ReVIEW
28
28
  end
29
29
 
30
30
  def blank
31
- @output.puts unless @blank_seen
31
+ unless @blank_seen
32
+ @output.puts
33
+ end
32
34
  @blank_seen = true
33
35
  end
34
36
 
@@ -132,7 +134,9 @@ module ReVIEW
132
134
  end
133
135
 
134
136
  def compile_href(url, label)
135
- label = url if label.blank?
137
+ if label.blank?
138
+ label = url
139
+ end
136
140
  "[#{label}](#{url})"
137
141
  end
138
142
 
@@ -174,7 +178,6 @@ module ReVIEW
174
178
  "#{I18n.t('image')}#{@chapter.image(id).number}"
175
179
  rescue KeyError
176
180
  error "unknown image: #{id}"
177
- nofunc_text("[UnknownImage:#{id}]")
178
181
  end
179
182
 
180
183
  def indepimage(_lines, id, caption = '', _metric = nil)
@@ -193,7 +196,9 @@ module ReVIEW
193
196
 
194
197
  def cmd(lines)
195
198
  puts '```shell-session'
196
- lines.each { |line| puts detab(line) }
199
+ lines.each do |line|
200
+ puts detab(line)
201
+ end
197
202
  puts '```'
198
203
  end
199
204
 
@@ -297,7 +302,9 @@ module ReVIEW
297
302
  def comment(lines, comment = nil)
298
303
  return unless @book.config['draft']
299
304
  lines ||= []
300
- lines.unshift comment unless comment.blank?
305
+ unless comment.blank?
306
+ lines.unshift comment
307
+ end
301
308
  str = lines.join('<br />')
302
309
  puts %Q(<div class="red">#{escape_html(str)}</div>)
303
310
  end
@@ -20,7 +20,9 @@ module ReVIEW
20
20
  def cmd(lines)
21
21
  # WEB+DB では使っていないらしいけど
22
22
  puts '!!! cmd'
23
- lines.each { |line| puts detab(line) }
23
+ lines.each do |line|
24
+ puts detab(line)
25
+ end
24
26
  puts ''
25
27
  end
26
28
 
@@ -107,10 +107,16 @@ module ReVIEW
107
107
  @config = ReVIEW::Configure.values
108
108
  @config.maker = 'pdfmaker'
109
109
  cmd_config, yamlfile = parse_opts(args)
110
- loader = ReVIEW::YAMLLoader.new
111
- @config.deep_merge!(loader.load_file(yamlfile))
110
+ error "#{yamlfile} not found." unless File.exist?(yamlfile)
111
+
112
+ begin
113
+ loader = ReVIEW::YAMLLoader.new
114
+ @config.deep_merge!(loader.load_file(yamlfile))
115
+ rescue => e
116
+ error "yaml error #{e.message}"
117
+ end
112
118
  # YAML configs will be overridden by command line options.
113
- @config.merge!(cmd_config)
119
+ @config.deep_merge!(cmd_config)
114
120
  I18n.setup(@config['language'])
115
121
  @basedir = File.dirname(yamlfile)
116
122
  @basehookdir = File.absolute_path(File.dirname(yamlfile))
@@ -120,7 +126,13 @@ module ReVIEW
120
126
  rescue ReVIEW::ConfigError => e
121
127
  warn e.message
122
128
  end
123
- generate_pdf(yamlfile)
129
+
130
+ begin
131
+ generate_pdf(yamlfile)
132
+ rescue ApplicationError => e
133
+ raise if @config['debug']
134
+ error(e.message)
135
+ end
124
136
  end
125
137
 
126
138
  def make_input_files(book, yamlfile)
@@ -218,9 +230,6 @@ module ReVIEW
218
230
 
219
231
  check_compile_status(@config['ignore-errors'])
220
232
 
221
- @config['usepackage'] = ''
222
- @config['usepackage'] = "\\usepackage{#{@config['texstyle']}}" if @config['texstyle']
223
-
224
233
  copy_images(@config['imagedir'], File.join(@path, @config['imagedir']))
225
234
  copy_sty(File.join(Dir.pwd, 'sty'), @path)
226
235
  copy_sty(File.join(Dir.pwd, 'sty'), @path, 'fd')
@@ -255,8 +264,13 @@ module ReVIEW
255
264
  Dir.chdir(to) do
256
265
  images = Dir.glob('**/*').find_all { |f| File.file?(f) and f =~ /\.(jpg|jpeg|png|pdf|ai|eps|tif)\z/ }
257
266
  break if images.empty?
258
- system('extractbb', *images)
259
- system_or_raise('ebb', *images) unless system('extractbb', '-m', *images)
267
+ if @config['pdfmaker']['bbox']
268
+ system('extractbb', '-B', @config['pdfmaker']['bbox'], *images)
269
+ system_or_raise('ebb', '-B', @config['pdfmaker']['bbox'], *images) unless system('extractbb', '-B', @config['pdfmaker']['bbox'], '-m', *images)
270
+ else
271
+ system('extractbb', *images)
272
+ system_or_raise('ebb', *images) unless system('extractbb', '-m', *images)
273
+ end
260
274
  end
261
275
  end
262
276
 
@@ -0,0 +1,683 @@
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
+ #
7
+
8
+ require 'review/builder'
9
+ require 'review/textutils'
10
+
11
+ module ReVIEW
12
+ class PLAINTEXTBuilder < Builder
13
+ include TextUtils
14
+
15
+ %i[ttbold hint maru keytop labelref ref balloon strong].each do |e|
16
+ Compiler.definline(e)
17
+ end
18
+ Compiler.defsingle(:dtp, 1)
19
+
20
+ Compiler.defblock(:insn, 1)
21
+ Compiler.defblock(:planning, 0..1)
22
+ Compiler.defblock(:best, 0..1)
23
+ Compiler.defblock(:securty, 0..1)
24
+ Compiler.defblock(:point, 0..1)
25
+ Compiler.defblock(:reference, 0)
26
+ Compiler.defblock(:term, 0)
27
+ Compiler.defblock(:practice, 0)
28
+ Compiler.defblock(:expert, 0)
29
+ Compiler.defblock(:link, 0..1)
30
+ Compiler.defblock(:shoot, 0..1)
31
+
32
+ def pre_paragraph
33
+ ''
34
+ end
35
+
36
+ def post_paragraph
37
+ ''
38
+ end
39
+
40
+ def extname
41
+ '.txt'
42
+ end
43
+
44
+ def builder_init_file
45
+ @section = 0
46
+ @subsection = 0
47
+ @subsubsection = 0
48
+ @subsubsubsection = 0
49
+ @blank_seen = true
50
+ @sec_counter = SecCounter.new(5, @chapter)
51
+ end
52
+ private :builder_init_file
53
+
54
+ def olnum(num)
55
+ @ol_num = num.to_i
56
+ end
57
+
58
+ def print(s)
59
+ @blank_seen = false
60
+ super
61
+ end
62
+ private :print
63
+
64
+ def puts(s)
65
+ @blank_seen = false
66
+ super
67
+ end
68
+ private :puts
69
+
70
+ def blank
71
+ @output.puts unless @blank_seen
72
+ @blank_seen = true
73
+ end
74
+ private :blank
75
+
76
+ def result
77
+ @output.string
78
+ end
79
+
80
+ def headline(level, _label, caption)
81
+ prefix, _anchor = headline_prefix(level)
82
+ puts %Q(#{prefix}#{compile_inline(caption)})
83
+ end
84
+
85
+ def ul_begin
86
+ blank
87
+ end
88
+
89
+ def ul_item(lines)
90
+ puts lines.join
91
+ end
92
+
93
+ def ul_end
94
+ blank
95
+ end
96
+
97
+ def ol_begin
98
+ blank
99
+ @olitem = 0
100
+ end
101
+
102
+ def ol_item(lines, num)
103
+ puts "#{num} #{lines.join}"
104
+ end
105
+
106
+ def ol_end
107
+ blank
108
+ @olitem = nil
109
+ end
110
+
111
+ def dl_begin
112
+ blank
113
+ end
114
+
115
+ def dt(line)
116
+ puts line
117
+ end
118
+
119
+ def dd(lines)
120
+ split_paragraph(lines).each do |paragraph|
121
+ puts paragraph.gsub(/\n/, '')
122
+ end
123
+ end
124
+
125
+ def dl_end
126
+ blank
127
+ end
128
+
129
+ def paragraph(lines)
130
+ puts lines.join
131
+ end
132
+
133
+ def read(lines)
134
+ puts split_paragraph(lines).join("\n")
135
+ blank
136
+ end
137
+
138
+ alias_method :lead, :read
139
+
140
+ def inline_list(id)
141
+ chapter, id = extract_chapter_id(id)
142
+ if get_chap(chapter)
143
+ %Q(#{I18n.t('list')}#{I18n.t('format_number', [get_chap(chapter), chapter.list(id).number])})
144
+ else
145
+ %Q(#{I18n.t('list')}#{I18n.t('format_number_without_chapter', [chapter.list(id).number])})
146
+ end
147
+ rescue KeyError
148
+ error "unknown list: #{id}"
149
+ end
150
+
151
+ def list_header(id, caption, _lang)
152
+ blank
153
+ if get_chap
154
+ puts %Q(#{I18n.t('list')}#{I18n.t('format_number', [get_chap, @chapter.list(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)})
155
+ else
156
+ puts %Q(#{I18n.t('list')}#{I18n.t('format_number_without_chapter', [@chapter.list(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)})
157
+ end
158
+ blank
159
+ end
160
+
161
+ def list_body(_id, lines, _lang)
162
+ lines.each do |line|
163
+ puts detab(line)
164
+ end
165
+ blank
166
+ end
167
+
168
+ def base_block(_type, lines, caption = nil)
169
+ blank
170
+ puts compile_inline(caption) if caption.present?
171
+ puts lines.join("\n")
172
+ blank
173
+ end
174
+
175
+ def base_parablock(_type, lines, caption = nil)
176
+ blank
177
+ puts compile_inline(caption) if caption.present?
178
+ puts split_paragraph(lines).join("\n")
179
+ blank
180
+ end
181
+
182
+ def emlist(lines, caption = nil, _lang = nil)
183
+ base_block 'emlist', lines, caption
184
+ end
185
+
186
+ def emlistnum(lines, caption = nil, _lang = nil)
187
+ blank
188
+ puts compile_inline(caption) if caption.present?
189
+ lines.each_with_index do |line, i|
190
+ puts((i + 1).to_s.rjust(2) + ": #{line}")
191
+ end
192
+ blank
193
+ end
194
+
195
+ def listnum_body(lines, _lang)
196
+ lines.each_with_index do |line, i|
197
+ puts((i + 1).to_s.rjust(2) + ": #{line}")
198
+ end
199
+ blank
200
+ end
201
+
202
+ def cmd(lines, caption = nil)
203
+ base_block 'cmd', lines, caption
204
+ end
205
+
206
+ def quote(lines)
207
+ base_parablock 'quote', lines, nil
208
+ end
209
+
210
+ def inline_table(id)
211
+ chapter, id = extract_chapter_id(id)
212
+ if get_chap(chapter)
213
+ "#{I18n.t('table')}#{I18n.t('format_number', [get_chap(chapter), chapter.table(id).number])}"
214
+ else
215
+ "#{I18n.t('table')}#{I18n.t('format_number_without_chapter', [chapter.table(id).number])}"
216
+ end
217
+ rescue KeyError
218
+ error "unknown table: #{id}"
219
+ end
220
+
221
+ def inline_img(id)
222
+ chapter, id = extract_chapter_id(id)
223
+ if get_chap(chapter)
224
+ "#{I18n.t('image')}#{I18n.t('format_number', [get_chap(chapter), chapter.image(id).number])}"
225
+ else
226
+ "#{I18n.t('image')}#{I18n.t('format_number_without_chapter', [chapter.image(id).number])}"
227
+ end
228
+ rescue KeyError
229
+ error "unknown image: #{id}"
230
+ end
231
+
232
+ def image(_lines, id, caption, _metric = nil)
233
+ blank
234
+ if get_chap
235
+ puts "#{I18n.t('image')}#{I18n.t('format_number', [get_chap, @chapter.image(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)}"
236
+ else
237
+ puts "#{I18n.t('image')}#{I18n.t('format_number_without_chapter', [@chapter.image(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)}"
238
+ end
239
+ blank
240
+ end
241
+
242
+ def texequation(lines)
243
+ puts lines.join("\n")
244
+ blank
245
+ end
246
+
247
+ def table(lines, id = nil, caption = nil)
248
+ blank
249
+ rows = []
250
+ sepidx = nil
251
+ lines.each_with_index do |line, idx|
252
+ if /\A[\=\-]{12}/ =~ line
253
+ # just ignore
254
+ # error "too many table separator" if sepidx
255
+ sepidx ||= idx
256
+ next
257
+ end
258
+ rows.push(line.strip.split(/\t+/).map { |s| s.sub(/\A\./, '') })
259
+ end
260
+ rows = adjust_n_cols(rows)
261
+
262
+ begin
263
+ table_header id, caption if caption.present?
264
+ rescue KeyError
265
+ error "no such table: #{id}"
266
+ end
267
+ return if rows.empty?
268
+ table_begin rows.first.size
269
+ if sepidx
270
+ sepidx.times do
271
+ tr(rows.shift.map { |s| th(s) })
272
+ end
273
+ rows.each do |cols|
274
+ tr(cols.map { |s| td(s) })
275
+ end
276
+ else
277
+ rows.each do |cols|
278
+ h, *cs = *cols
279
+ tr([th(h)] + cs.map { |s| td(s) })
280
+ end
281
+ end
282
+ table_end
283
+ end
284
+
285
+ def table_header(id, caption)
286
+ if id.nil?
287
+ puts compile_inline(caption)
288
+ elsif get_chap
289
+ puts "#{I18n.t('table')}#{I18n.t('format_number', [get_chap, @chapter.table(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)}"
290
+ else
291
+ puts "#{I18n.t('table')}#{I18n.t('format_number_without_chapter', [@chapter.table(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)}"
292
+ end
293
+ blank
294
+ end
295
+
296
+ def table_begin(_ncols)
297
+ end
298
+
299
+ def imgtable(_lines, id, caption = nil, _metric = nil)
300
+ blank
301
+ table_header id, caption if caption.present?
302
+ blank
303
+ end
304
+
305
+ def tr(rows)
306
+ puts rows.join("\t")
307
+ end
308
+
309
+ def table_end
310
+ blank
311
+ end
312
+
313
+ def comment(lines, comment = nil)
314
+ end
315
+
316
+ def footnote(id, str)
317
+ puts "注#{@chapter.footnote(id).number} #{compile_inline(str)}"
318
+ end
319
+
320
+ def inline_fn(id)
321
+ " 注#{@chapter.footnote(id).number} "
322
+ rescue KeyError
323
+ error "unknown footnote: #{id}"
324
+ end
325
+
326
+ def compile_ruby(base, _ruby)
327
+ base
328
+ end
329
+
330
+ def compile_kw(word, alt)
331
+ if alt
332
+ "#{word}(#{alt.strip})"
333
+ else
334
+ word
335
+ end
336
+ end
337
+
338
+ def compile_href(url, label)
339
+ if label
340
+ "#{label}(#{url})"
341
+ else
342
+ url
343
+ end
344
+ end
345
+
346
+ def inline_raw(str)
347
+ super(str).gsub('\\n', "\n")
348
+ end
349
+
350
+ def inline_hidx(_str)
351
+ ''
352
+ end
353
+
354
+ def inline_icon(_id)
355
+ ''
356
+ end
357
+
358
+ def inline_balloon(str)
359
+ %Q(←#{str.gsub(/@maru\[(\d+)\]/, inline_maru('\1'))})
360
+ end
361
+
362
+ def inline_uchar(str)
363
+ [str.to_i(16)].pack('U')
364
+ end
365
+
366
+ def inline_comment(_str)
367
+ ''
368
+ end
369
+
370
+ def bibpaper(lines, id, caption)
371
+ bibpaper_header id, caption
372
+ bibpaper_bibpaper id, caption, lines unless lines.empty?
373
+ end
374
+
375
+ def bibpaper_header(id, caption)
376
+ print @chapter.bibpaper(id).number
377
+ puts " #{compile_inline(caption)}"
378
+ end
379
+
380
+ def bibpaper_bibpaper(_id, _caption, lines)
381
+ print split_paragraph(lines).join
382
+ end
383
+
384
+ def inline_bib(id)
385
+ %Q(#{@chapter.bibpaper(id).number} )
386
+ rescue KeyError
387
+ error "unknown bib: #{id}"
388
+ end
389
+
390
+ def inline_hd_chap(chap, id)
391
+ if chap.number
392
+ n = chap.headline_index.number(id)
393
+ return I18n.t('chapter_quote', "#{n} #{compile_inline(chap.headline(id).caption)}") if @book.config['secnolevel'] >= n.split('.').size
394
+ end
395
+ I18n.t('chapter_quote', compile_inline(chap.headline(id).caption))
396
+ rescue KeyError
397
+ error "unknown headline: #{id}"
398
+ end
399
+
400
+ def noindent
401
+ end
402
+
403
+ def nonum_begin(_level, _label, caption)
404
+ puts compile_inline(caption)
405
+ end
406
+
407
+ def nonum_end(_level)
408
+ end
409
+
410
+ def notoc_begin(_level, _label, caption)
411
+ puts compile_inline(caption)
412
+ end
413
+
414
+ def notoc_end(level)
415
+ end
416
+
417
+ def nodisp_begin(level, label, caption)
418
+ end
419
+
420
+ def nodisp_end(level)
421
+ end
422
+
423
+ def common_column_begin(_type, caption)
424
+ blank
425
+ puts compile_inline(caption)
426
+ end
427
+
428
+ def common_column_end(_type)
429
+ blank
430
+ end
431
+
432
+ def column_begin(_level, _label, caption)
433
+ common_column_begin('column', caption)
434
+ end
435
+
436
+ def column_end(_level)
437
+ common_column_end('column')
438
+ end
439
+
440
+ def xcolumn_begin(_level, _label, caption)
441
+ common_column_begin('xcolumn', caption)
442
+ end
443
+
444
+ def xcolumn_end(_level)
445
+ common_column_end('xcolumn')
446
+ end
447
+
448
+ def world_begin(_level, _label, caption)
449
+ common_column_begin('world', caption)
450
+ end
451
+
452
+ def world_end(_level)
453
+ common_column_end('world')
454
+ end
455
+
456
+ def hood_begin(_level, _label, caption)
457
+ common_column_begin('hood', caption)
458
+ end
459
+
460
+ def hood_end(_level)
461
+ common_column_end('hood')
462
+ end
463
+
464
+ def edition_begin(_level, _label, caption)
465
+ common_column_begin('edition', caption)
466
+ end
467
+
468
+ def edition_end(_level)
469
+ common_column_end('edition')
470
+ end
471
+
472
+ def insideout_begin(_level, _label, caption)
473
+ common_column_begin('insideout', caption)
474
+ end
475
+
476
+ def insideout_end(_level)
477
+ common_column_end('insideout')
478
+ end
479
+
480
+ def ref_begin(_level, _label, caption)
481
+ common_column_begin('ref', caption)
482
+ end
483
+
484
+ def ref_end(_level)
485
+ common_column_end('ref')
486
+ end
487
+
488
+ def sup_begin(_level, _label, caption)
489
+ common_column_begin('sup', caption)
490
+ end
491
+
492
+ def sup_end(_level)
493
+ common_column_end('sup')
494
+ end
495
+
496
+ def flushright(lines)
497
+ base_parablock 'flushright', lines, nil
498
+ end
499
+
500
+ def centering(lines)
501
+ base_parablock 'centering', lines, nil
502
+ end
503
+
504
+ def note(lines, caption = nil)
505
+ base_parablock 'note', lines, caption
506
+ end
507
+
508
+ def memo(lines, caption = nil)
509
+ base_parablock 'memo', lines, caption
510
+ end
511
+
512
+ def tip(lines, caption = nil)
513
+ base_parablock 'tip', lines, caption
514
+ end
515
+
516
+ def info(lines, caption = nil)
517
+ base_parablock 'info', lines, caption
518
+ end
519
+
520
+ def planning(lines, caption = nil)
521
+ base_parablock 'planning', lines, caption
522
+ end
523
+
524
+ def best(lines, caption = nil)
525
+ base_parablock 'best', lines, caption
526
+ end
527
+
528
+ def important(lines, caption = nil)
529
+ base_parablock 'important', lines, caption
530
+ end
531
+
532
+ def security(lines, caption = nil)
533
+ base_parablock 'security', lines, caption
534
+ end
535
+
536
+ def caution(lines, caption = nil)
537
+ base_parablock 'caution', lines, caption
538
+ end
539
+
540
+ def term(lines)
541
+ base_parablock 'term', lines, nil
542
+ end
543
+
544
+ def link(lines, caption = nil)
545
+ base_parablock 'link', lines, caption
546
+ end
547
+
548
+ def notice(lines, caption = nil)
549
+ base_parablock 'notice', lines, caption
550
+ end
551
+
552
+ def point(lines, caption = nil)
553
+ base_parablock 'point', lines, caption
554
+ end
555
+
556
+ def shoot(lines, caption = nil)
557
+ base_parablock 'shoot', lines, caption
558
+ end
559
+
560
+ def reference(lines)
561
+ base_parablock 'reference', lines, nil
562
+ end
563
+
564
+ def practice(lines)
565
+ base_parablock 'practice', lines, nil
566
+ end
567
+
568
+ def expert(lines)
569
+ base_parablock 'expert', lines, nil
570
+ end
571
+
572
+ def insn(lines, caption = nil)
573
+ base_block 'insn', lines, caption
574
+ end
575
+
576
+ def warning(lines, caption = nil)
577
+ base_parablock 'warning', lines, caption
578
+ end
579
+
580
+ alias_method :box, :insn
581
+
582
+ def indepimage(_lines, _id, caption = nil, _metric = nil)
583
+ blank
584
+ puts "図 #{compile_inline(caption)}" if caption.present?
585
+ blank
586
+ end
587
+
588
+ alias_method :numberlessimage, :indepimage
589
+
590
+ def label(_id)
591
+ ''
592
+ end
593
+
594
+ def dtp(str)
595
+ end
596
+
597
+ def bpo(lines)
598
+ base_block 'bpo', lines, nil
599
+ end
600
+
601
+ def inline_dtp(_str)
602
+ ''
603
+ end
604
+
605
+ def inline_del(_str)
606
+ ''
607
+ end
608
+
609
+ def inline_br(_str)
610
+ "\n"
611
+ end
612
+
613
+ def text(str)
614
+ str
615
+ end
616
+
617
+ def inline_chap(id)
618
+ # "「第#{super}章 #{inline_title(id)}」"
619
+ # "第#{super}章"
620
+ super
621
+ end
622
+
623
+ def inline_chapref(id)
624
+ chs = ['', '「', '」']
625
+ if @book.config['chapref']
626
+ chs2 = @book.config['chapref'].split(',')
627
+ error '--chapsplitter must have exactly 3 parameters with comma.' if chs2.size != 3
628
+ chs = chs2
629
+ end
630
+ "#{chs[0]}#{@book.chapter_index.number(id)}#{chs[1]}#{@book.chapter_index.title(id)}#{chs[2]}"
631
+ rescue KeyError
632
+ error "unknown chapter: #{id}"
633
+ end
634
+
635
+ def source(lines, caption = nil, _lang = nil)
636
+ base_block 'source', lines, caption
637
+ end
638
+
639
+ def inline_labelref(_idref)
640
+ '●'
641
+ end
642
+
643
+ alias_method :inline_ref, :inline_labelref
644
+
645
+ def inline_pageref(_idref)
646
+ '●ページ' # ページ番号を参照
647
+ end
648
+
649
+ def circle_begin(_level, _label, caption)
650
+ puts "・#{caption}"
651
+ end
652
+
653
+ def circle_end(level)
654
+ end
655
+
656
+ def nofunc_text(str)
657
+ str
658
+ end
659
+
660
+ alias_method :th, :nofunc_text
661
+ alias_method :td, :nofunc_text
662
+ alias_method :inline_sup, :nofunc_text
663
+ alias_method :inline_sub, :nofunc_text
664
+ alias_method :inline_hint, :nofunc_text
665
+ alias_method :inline_maru, :nofunc_text
666
+ alias_method :inline_idx, :nofunc_text
667
+ alias_method :inline_ami, :nofunc_text
668
+ alias_method :inline_i, :nofunc_text
669
+ alias_method :inline_em, :nofunc_text
670
+ alias_method :inline_b, :nofunc_text
671
+ alias_method :inline_strong, :nofunc_text
672
+ alias_method :inline_tt, :nofunc_text
673
+ alias_method :inline_code, :nofunc_text
674
+ alias_method :inline_ttb, :nofunc_text
675
+ alias_method :inline_ttbold, :nofunc_text
676
+ alias_method :inline_tti, :nofunc_text
677
+ alias_method :inline_ttibold, :nofunc_text
678
+ alias_method :inline_u, :nofunc_text
679
+ alias_method :inline_bou, :nofunc_text
680
+ alias_method :inline_keytop, :nofunc_text
681
+ alias_method :inline_m, :nofunc_text
682
+ end
683
+ end # module ReVIEW