review 3.2.0 → 4.0.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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +26 -4
  3. data/.travis.yml +1 -1
  4. data/NEWS.ja.md +97 -1
  5. data/NEWS.md +97 -1
  6. data/bin/review-catalog-converter +1 -1
  7. data/bin/review-check +5 -5
  8. data/bin/review-checkdep +1 -1
  9. data/bin/review-compile +5 -5
  10. data/bin/review-idgxmlmaker +16 -0
  11. data/bin/review-index +7 -7
  12. data/bin/review-preproc +9 -9
  13. data/bin/review-validate +2 -2
  14. data/bin/review-vol +5 -5
  15. data/doc/config.yml.sample +14 -6
  16. data/doc/config.yml.sample-simple +1 -1
  17. data/doc/format.ja.md +15 -5
  18. data/doc/format.md +30 -18
  19. data/doc/pdfmaker.ja.md +1 -1
  20. data/doc/pdfmaker.md +1 -1
  21. data/lib/review/book.rb +1 -1
  22. data/lib/review/book/base.rb +23 -63
  23. data/lib/review/book/chapter.rb +18 -3
  24. data/lib/review/book/compilable.rb +5 -0
  25. data/lib/review/book/index.rb +26 -65
  26. data/lib/review/book/index/item.rb +40 -0
  27. data/lib/review/book/part.rb +22 -2
  28. data/lib/review/builder.rb +60 -40
  29. data/lib/review/catalog.rb +12 -15
  30. data/lib/review/compiler.rb +68 -36
  31. data/lib/review/configure.rb +10 -7
  32. data/lib/review/epubmaker.rb +5 -2
  33. data/lib/review/htmlbuilder.rb +24 -71
  34. data/lib/review/htmlutils.rb +2 -3
  35. data/lib/review/i18n.rb +2 -2
  36. data/lib/review/idgxmlbuilder.rb +101 -55
  37. data/lib/review/idgxmlmaker.rb +184 -0
  38. data/lib/review/init-web/finish.html +10 -0
  39. data/lib/review/init-web/index.html +190 -0
  40. data/lib/review/init-web/review-layout-design.js +691 -0
  41. data/lib/review/init.rb +110 -26
  42. data/lib/review/latexbuilder.rb +76 -54
  43. data/lib/review/lineinput.rb +1 -1
  44. data/lib/review/logger.rb +4 -8
  45. data/lib/review/makerhelper.rb +6 -4
  46. data/lib/review/markdownbuilder.rb +25 -38
  47. data/lib/review/md2inaobuilder.rb +3 -5
  48. data/lib/review/pdfmaker.rb +15 -15
  49. data/lib/review/plaintextbuilder.rb +67 -76
  50. data/lib/review/preprocessor.rb +13 -13
  51. data/lib/review/rstbuilder.rb +31 -31
  52. data/lib/review/textmaker.rb +13 -3
  53. data/lib/review/textutils.rb +77 -2
  54. data/lib/review/tocparser.rb +17 -17
  55. data/lib/review/tocprinter.rb +8 -8
  56. data/lib/review/topbuilder.rb +76 -57
  57. data/lib/review/update.rb +16 -16
  58. data/lib/review/version.rb +1 -1
  59. data/lib/review/webmaker.rb +2 -2
  60. data/lib/review/yamlloader.rb +3 -0
  61. data/review.gemspec +4 -3
  62. data/samples/sample-book/README.md +7 -2
  63. data/samples/sample-book/src/.gitignore +153 -0
  64. data/samples/sample-book/src/config-jlreq.yml +6 -0
  65. data/samples/sample-book/src/lib/tasks/review.rake +20 -9
  66. data/samples/sample-book/src/lib/tasks/z01_copy_sty.rake +14 -8
  67. data/samples/syntax-book/ch03.re +3 -6
  68. data/samples/syntax-book/config-jlreq.yml +5 -0
  69. data/samples/syntax-book/lib/tasks/review.rake +7 -7
  70. data/samples/syntax-book/lib/tasks/z01_copy_sty.rake +14 -8
  71. data/templates/latex/config.erb +6 -0
  72. data/templates/latex/layout.tex.erb +1 -0
  73. data/templates/latex/review-jlreq/review-base.sty +93 -31
  74. data/templates/latex/review-jlreq/review-jlreq.cls +6 -0
  75. data/templates/latex/review-jlreq/review-style.sty +3 -0
  76. data/templates/latex/review-jsbook/README.md +39 -0
  77. data/templates/latex/review-jsbook/review-base.sty +65 -10
  78. data/templates/latex/review-jsbook/review-jsbook.cls +4 -0
  79. data/templates/latex/review-jsbook/review-style.sty +4 -1
  80. data/test/assets/test_template.tex +11 -3
  81. data/test/assets/test_template_backmatter.tex +11 -3
  82. data/test/test_book.rb +65 -19
  83. data/test/test_catalog.rb +18 -42
  84. data/test/test_catalog_converter_cmd.rb +1 -1
  85. data/test/test_epubmaker_cmd.rb +2 -2
  86. data/test/test_helper.rb +1 -1
  87. data/test/test_htmlbuilder.rb +144 -55
  88. data/test/test_i18n.rb +25 -25
  89. data/test/test_idgxmlbuilder.rb +60 -18
  90. data/test/test_image_finder.rb +6 -6
  91. data/test/test_latexbuilder.rb +128 -24
  92. data/test/test_latexbuilder_v2.rb +23 -23
  93. data/test/test_logger.rb +14 -1
  94. data/test/test_makerhelper.rb +3 -3
  95. data/test/test_markdownbuilder.rb +45 -4
  96. data/test/test_md2inaobuilder.rb +12 -2
  97. data/test/test_pdfmaker.rb +1 -1
  98. data/test/test_pdfmaker_cmd.rb +1 -1
  99. data/test/test_plaintextbuilder.rb +31 -6
  100. data/test/test_rstbuilder.rb +33 -4
  101. data/test/test_textutils.rb +109 -2
  102. data/test/test_topbuilder.rb +35 -7
  103. data/test/test_update.rb +17 -8
  104. data/test/test_yamlloader.rb +13 -0
  105. metadata +26 -2
@@ -12,7 +12,6 @@ require 'review/htmlutils'
12
12
  require 'review/template'
13
13
  require 'review/textutils'
14
14
  require 'review/webtocprinter'
15
- require 'digest'
16
15
  require 'tmpdir'
17
16
  require 'open3'
18
17
 
@@ -308,7 +307,7 @@ module ReVIEW
308
307
  end
309
308
 
310
309
  def ul_item_begin(lines)
311
- print "<li>#{lines.join}"
310
+ print "<li>#{join_lines_to_paragraph(lines)}"
312
311
  end
313
312
 
314
313
  def ul_item_end
@@ -329,7 +328,7 @@ module ReVIEW
329
328
  end
330
329
 
331
330
  def ol_item(lines, _num)
332
- puts "<li>#{lines.join}</li>"
331
+ puts "<li>#{join_lines_to_paragraph(lines)}</li>"
333
332
  end
334
333
 
335
334
  def ol_end
@@ -345,7 +344,7 @@ module ReVIEW
345
344
  end
346
345
 
347
346
  def dd(lines)
348
- puts "<dd>#{lines.join}</dd>"
347
+ puts "<dd>#{join_lines_to_paragraph(lines)}</dd>"
349
348
  end
350
349
 
351
350
  def dl_end
@@ -354,10 +353,10 @@ module ReVIEW
354
353
 
355
354
  def paragraph(lines)
356
355
  if @noindent
357
- puts %Q(<p class="noindent">#{lines.join}</p>)
356
+ puts %Q(<p class="noindent">#{join_lines_to_paragraph(lines)}</p>)
358
357
  @noindent = nil
359
358
  else
360
- puts "<p>#{lines.join}</p>"
359
+ puts "<p>#{join_lines_to_paragraph(lines)}</p>"
361
360
  end
362
361
  end
363
362
 
@@ -375,11 +374,11 @@ module ReVIEW
375
374
  def list(lines, id, caption, lang = nil)
376
375
  puts %Q(<div id="#{normalize_id(id)}" class="caption-code">)
377
376
  begin
378
- list_header id, caption, lang
377
+ list_header(id, caption, lang)
379
378
  rescue KeyError
380
379
  error "no such list: #{id}"
381
380
  end
382
- list_body id, lines, lang
381
+ list_body(id, lines, lang)
383
382
  puts '</div>'
384
383
  end
385
384
 
@@ -404,8 +403,8 @@ module ReVIEW
404
403
 
405
404
  def source(lines, caption = nil, lang = nil)
406
405
  puts %Q(<div class="source-code">)
407
- source_header caption
408
- source_body caption, lines, lang
406
+ source_header(caption)
407
+ source_body(caption, lines, lang)
409
408
  puts '</div>'
410
409
  end
411
410
 
@@ -426,11 +425,11 @@ module ReVIEW
426
425
  def listnum(lines, id, caption, lang = nil)
427
426
  puts %Q(<div id="#{normalize_id(id)}" class="code">)
428
427
  begin
429
- list_header id, caption, lang
428
+ list_header(id, caption, lang)
430
429
  rescue KeyError
431
430
  error "no such list: #{id}"
432
431
  end
433
- listnum_body lines, lang
432
+ listnum_body(lines, lang)
434
433
  puts '</div>'
435
434
  end
436
435
 
@@ -541,7 +540,8 @@ module ReVIEW
541
540
 
542
541
  def texequation(lines, id = nil, caption = '')
543
542
  if id
544
- texequation_header id, caption
543
+ puts %Q(<div id="#{normalize_id(id)}" class="caption-equation">)
544
+ texequation_header(id, caption)
545
545
  end
546
546
 
547
547
  texequation_body(lines)
@@ -552,7 +552,6 @@ module ReVIEW
552
552
  end
553
553
 
554
554
  def texequation_header(id, caption)
555
- puts %Q(<div id="#{normalize_id(id)}" class="caption-equation">)
556
555
  if get_chap
557
556
  puts %Q(<p class="caption">#{I18n.t('equation')}#{I18n.t('format_number_header', [get_chap, @chapter.equation(id).number])}#{I18n.t('caption_prefix')}#{compile_inline(caption)}</p>)
558
557
  else
@@ -566,11 +565,11 @@ module ReVIEW
566
565
  require 'math_ml'
567
566
  require 'math_ml/symbol/character_reference'
568
567
  p = MathML::LaTeX::Parser.new(symbol: MathML::Symbol::CharacterReference)
569
- puts p.parse(unescape(lines.join("\n")), true)
568
+ print p.parse(lines.join("\n") + "\n", true)
570
569
  elsif @book.config['imgmath']
571
570
  fontsize = @book.config['imgmath_options']['fontsize'].to_f
572
571
  lineheight = @book.config['imgmath_options']['lineheight'].to_f
573
- math_str = "\\begin{equation*}\n\\fontsize{#{fontsize}}{#{lineheight}}\\selectfont\n#{unescape(lines.join("\n"))}\n\\end{equation*}\n"
572
+ math_str = "\\begin{equation*}\n\\fontsize{#{fontsize}}{#{lineheight}}\\selectfont\n#{lines.join("\n")}\n\\end{equation*}\n"
574
573
  key = Digest::SHA256.hexdigest(math_str)
575
574
  math_dir = File.join(@book.config['imagedir'], '_review_math')
576
575
  Dir.mkdir(math_dir) unless Dir.exist?(math_dir)
@@ -616,7 +615,7 @@ module ReVIEW
616
615
  metrics = parse_metric('html', metric)
617
616
  puts %Q(<div id="#{normalize_id(id)}" class="image">)
618
617
  puts %Q(<img src="#{@chapter.image(id).path.sub(%r{\A\./}, '')}" alt="#{escape(compile_inline(caption))}"#{metrics} />)
619
- image_header id, caption
618
+ image_header(id, caption)
620
619
  puts '</div>'
621
620
  end
622
621
 
@@ -628,7 +627,7 @@ module ReVIEW
628
627
  puts detab(line)
629
628
  end
630
629
  puts '</pre>'
631
- image_header id, caption
630
+ image_header(id, caption)
632
631
  puts '</div>'
633
632
  end
634
633
 
@@ -643,47 +642,12 @@ module ReVIEW
643
642
  end
644
643
 
645
644
  def table(lines, id = nil, caption = nil)
646
- rows = []
647
- sepidx = nil
648
- lines.each_with_index do |line, idx|
649
- if /\A[\=\-]{12}/ =~ line
650
- # just ignore
651
- # error "too many table separator" if sepidx
652
- sepidx ||= idx
653
- next
654
- end
655
- rows.push(line.strip.split(/\t+/).map { |s| s.sub(/\A\./, '') })
656
- end
657
- rows = adjust_n_cols(rows)
658
- error 'no rows in the table' if rows.empty?
659
-
660
645
  if id
661
646
  puts %Q(<div id="#{normalize_id(id)}" class="table">)
662
647
  else
663
648
  puts %Q(<div class="table">)
664
649
  end
665
- begin
666
- if caption.present?
667
- table_header id, caption
668
- end
669
- rescue KeyError
670
- error "no such table: #{id}"
671
- end
672
- table_begin rows.first.size
673
- if sepidx
674
- sepidx.times do
675
- tr(rows.shift.map { |s| th(s) })
676
- end
677
- rows.each do |cols|
678
- tr(cols.map { |s| td(s) })
679
- end
680
- else
681
- rows.each do |cols|
682
- h, *cs = *cols
683
- tr([th(h)] + cs.map { |s| td(s) })
684
- end
685
- end
686
- table_end
650
+ super(lines, id, caption)
687
651
  puts '</div>'
688
652
  end
689
653
 
@@ -718,16 +682,16 @@ module ReVIEW
718
682
  end
719
683
 
720
684
  def imgtable(lines, id, caption = nil, metric = nil)
721
- unless @chapter.image(id).bound?
685
+ unless @chapter.image_bound?(id)
722
686
  warn "image not bound: #{id}"
723
- image_dummy id, caption, lines
687
+ image_dummy(id, caption, lines)
724
688
  return
725
689
  end
726
690
 
727
691
  puts %Q(<div id="#{normalize_id(id)}" class="imgtable image">)
728
692
  begin
729
693
  if caption.present?
730
- table_header id, caption
694
+ table_header(id, caption)
731
695
  end
732
696
  rescue KeyError
733
697
  error "no such table: #{id}"
@@ -750,7 +714,7 @@ module ReVIEW
750
714
  def comment(lines, comment = nil)
751
715
  return unless @book.config['draft']
752
716
  lines ||= []
753
- lines.unshift escape(comment) unless comment.blank?
717
+ lines.unshift(escape(comment)) unless comment.blank?
754
718
  str = lines.join('<br />')
755
719
  puts %Q(<div class="draft-comment">#{str}</div>)
756
720
  end
@@ -978,8 +942,8 @@ module ReVIEW
978
942
 
979
943
  def bibpaper(lines, id, caption)
980
944
  puts %Q(<div class="bibpaper">)
981
- bibpaper_header id, caption
982
- bibpaper_bibpaper id, caption, lines unless lines.empty?
945
+ bibpaper_header(id, caption)
946
+ bibpaper_bibpaper(id, caption, lines) unless lines.empty?
983
947
  puts '</div>'
984
948
  end
985
949
 
@@ -1219,17 +1183,6 @@ module ReVIEW
1219
1183
  @ol_num = num.to_i
1220
1184
  end
1221
1185
 
1222
- def defer_math_image(str, path, key)
1223
- # for Re:VIEW >3
1224
- File.open(File.join(File.dirname(path), '__IMGMATH_BODY__.tex'), 'a+') do |f|
1225
- f.puts str
1226
- f.puts '\\clearpage'
1227
- end
1228
- File.open(File.join(File.dirname(path), '__IMGMATH_BODY__.map'), 'a+') do |f|
1229
- f.puts key
1230
- end
1231
- end
1232
-
1233
1186
  def make_math_image(str, path, fontsize = 12)
1234
1187
  # Re:VIEW 2 compatibility
1235
1188
  fontsize2 = (fontsize * 1.2).round.to_i
@@ -82,7 +82,7 @@ module ReVIEW
82
82
  begin
83
83
  require 'pygments'
84
84
  begin
85
- Pygments.highlight(unescape(body),
85
+ Pygments.highlight(body,
86
86
  options: options,
87
87
  formatter: format,
88
88
  lexer: lexer)
@@ -128,8 +128,7 @@ module ReVIEW
128
128
  return body
129
129
  end
130
130
 
131
- text = unescape(body)
132
- formatter.format(lexer.lex(text))
131
+ formatter.format(lexer.lex(body))
133
132
  end
134
133
 
135
134
  def normalize_id(id)
@@ -90,7 +90,7 @@ module ReVIEW
90
90
  end
91
91
  else
92
92
  user_i18n.each do |key, values|
93
- raise KeyError, "Invalid locale file: #{path}" unless values.is_a? Hash
93
+ raise KeyError, "Invalid locale file: #{path}" unless values.is_a?(Hash)
94
94
  @store[key].merge!(values)
95
95
  end
96
96
  end
@@ -165,7 +165,7 @@ module ReVIEW
165
165
  end
166
166
  end
167
167
  remove_args.reverse_each do |idx|
168
- args.delete_at idx
168
+ args.delete_at(idx)
169
169
  end
170
170
  args_matched = (frmt.count('%') <= args.size)
171
171
  frmt.gsub!('##', '%%')
@@ -1,4 +1,4 @@
1
- # Copyright (c) 2008-2018 Minero Aoki, Kenshi Muto
1
+ # Copyright (c) 2008-2019 Minero Aoki, Kenshi Muto
2
2
  # 2002-2007 Minero Aoki
3
3
  #
4
4
  # This program is free software.
@@ -16,7 +16,9 @@ module ReVIEW
16
16
  include TextUtils
17
17
  include HTMLUtils
18
18
 
19
- %i[ttbold hint maru keytop labelref ref].each { |e| Compiler.definline(e) }
19
+ %i[ttbold hint maru keytop labelref ref strong em].each do |e|
20
+ Compiler.definline(e)
21
+ end
20
22
  Compiler.defsingle(:dtp, 1)
21
23
 
22
24
  Compiler.defblock(:insn, 0..1)
@@ -165,7 +167,7 @@ module ReVIEW
165
167
  end
166
168
 
167
169
  def ul_item_begin(lines)
168
- print %Q(<li aid:pstyle="ul-item">#{lines.join.chomp})
170
+ print %Q(<li aid:pstyle="ul-item">#{join_lines_to_paragraph(lines).chomp})
169
171
  end
170
172
 
171
173
  def ul_item_end
@@ -200,7 +202,7 @@ module ReVIEW
200
202
  end
201
203
 
202
204
  def ol_item(lines, num)
203
- puts %Q(<li aid:pstyle="ol-item" olnum="#{@ol_num}" num="#{num}">#{lines.join.chomp}</li>)
205
+ puts %Q(<li aid:pstyle="ol-item" olnum="#{@ol_num}" num="#{num}">#{join_lines_to_paragraph(lines).chomp}</li>)
204
206
  @ol_num += 1
205
207
  end
206
208
 
@@ -222,7 +224,7 @@ module ReVIEW
222
224
  end
223
225
 
224
226
  def dd(lines)
225
- puts "<dd>#{lines.join.chomp}</dd>"
227
+ puts "<dd>#{join_lines_to_paragraph(lines).chomp}</dd>"
226
228
  end
227
229
 
228
230
  def dl_end
@@ -232,12 +234,12 @@ module ReVIEW
232
234
  def paragraph(lines)
233
235
  if @noindent.nil?
234
236
  if lines[0] =~ /\A(\t+)/
235
- puts %Q(<p inlist="#{$1.size}">#{lines.join.sub(/\A\t+/, '')}</p>)
237
+ puts %Q(<p inlist="#{$1.size}">#{join_lines_to_paragraph(lines).sub(/\A\t+/, '')}</p>)
236
238
  else
237
- puts "<p>#{lines.join}</p>"
239
+ puts "<p>#{join_lines_to_paragraph(lines)}</p>"
238
240
  end
239
241
  else
240
- puts %Q(<p aid:pstyle="noindent" noindent='1'>#{lines.join}</p>)
242
+ puts %Q(<p aid:pstyle="noindent" noindent='1'>#{join_lines_to_paragraph(lines)}</p>)
241
243
  @noindent = nil
242
244
  end
243
245
  end
@@ -269,7 +271,6 @@ module ReVIEW
269
271
  end
270
272
 
271
273
  def list_header(id, caption, _lang)
272
- puts '<codelist>'
273
274
  return true unless caption.present?
274
275
  if get_chap.nil?
275
276
  puts %Q(<caption>#{I18n.t('list')}#{I18n.t('format_number_without_chapter', [@chapter.list(id).number])}#{I18n.t('caption_prefix_idgxml')}#{compile_inline(caption)}</caption>)
@@ -294,14 +295,25 @@ module ReVIEW
294
295
  end
295
296
  end
296
297
 
298
+ def list(lines, id, caption, lang = nil)
299
+ puts '<codelist>'
300
+ begin
301
+ list_header(id, caption, lang)
302
+ rescue KeyError
303
+ error "no such list: #{id}"
304
+ end
305
+ list_body(id, lines, lang)
306
+ puts '</codelist>'
307
+ end
308
+
297
309
  def list_body(_id, lines, _lang)
298
310
  print '<pre>'
299
311
  codelines_body(lines)
300
- puts '</pre></codelist>'
312
+ print '</pre>'
301
313
  end
302
314
 
303
315
  def emlist(lines, caption = nil, _lang = nil)
304
- quotedlist lines, 'emlist', caption
316
+ quotedlist(lines, 'emlist', caption)
305
317
  end
306
318
 
307
319
  def emlistnum(lines, caption = nil, _lang = nil)
@@ -310,7 +322,18 @@ module ReVIEW
310
322
  lines.each_with_index do |line, i|
311
323
  lines2 << detab(%Q(<span type='lineno'>) + (i + first_line_num).to_s.rjust(2) + ': </span>' + line)
312
324
  end
313
- quotedlist lines2, 'emlistnum', caption
325
+ quotedlist(lines2, 'emlistnum', caption)
326
+ end
327
+
328
+ def listnum(lines, id, caption, lang = nil)
329
+ puts '<codelist>'
330
+ begin
331
+ list_header(id, caption, lang)
332
+ rescue KeyError
333
+ error "no such list: #{id}"
334
+ end
335
+ listnum_body(lines, lang)
336
+ puts '</codelist>'
314
337
  end
315
338
 
316
339
  def listnum_body(lines, _lang)
@@ -329,11 +352,11 @@ module ReVIEW
329
352
  print '</listinfo>' if @book.config['listinfo']
330
353
  no += 1
331
354
  end
332
- puts '</pre></codelist>'
355
+ print '</pre>'
333
356
  end
334
357
 
335
358
  def cmd(lines, caption = nil)
336
- quotedlist lines, 'cmd', caption
359
+ quotedlist(lines, 'cmd', caption)
337
360
  end
338
361
 
339
362
  def quotedlist(lines, css_class, caption)
@@ -398,7 +421,7 @@ module ReVIEW
398
421
  metrics = parse_metric('idgxml', metric)
399
422
  puts '<img>'
400
423
  puts %Q(<Image href="file://#{@chapter.image(id).path.sub(%r{\A./}, '')}"#{metrics} />)
401
- image_header id, caption
424
+ image_header(id, caption)
402
425
  puts '</img>'
403
426
  end
404
427
 
@@ -410,7 +433,7 @@ module ReVIEW
410
433
  print "\n"
411
434
  end
412
435
  print '</pre>'
413
- image_header id, caption
436
+ image_header(id, caption)
414
437
  puts '</img>'
415
438
  warn "image not bound: #{id}"
416
439
  end
@@ -437,7 +460,7 @@ module ReVIEW
437
460
 
438
461
  puts %Q(<replace idref="texblock-#{@texblockequation}">)
439
462
  puts '<pre>'
440
- puts lines.join("\n")
463
+ print lines.join("\n")
441
464
  puts '</pre>'
442
465
  puts '</replace>'
443
466
 
@@ -447,63 +470,75 @@ module ReVIEW
447
470
  end
448
471
 
449
472
  def table(lines, id = nil, caption = nil)
450
- tablewidth = @book.config['tableopt'] ? @book.config['tableopt'].split(',')[0].to_f / @book.config['pt_to_mm_unit'].to_f : nil
451
- col = 0
473
+ @tablewidth = nil
474
+ if @book.config['tableopt']
475
+ @tablewidth = @book.config['tableopt'].split(',')[0].to_f / @book.config['pt_to_mm_unit'].to_f
476
+ end
477
+ @col = 0
452
478
 
453
- rows = []
479
+ sepidx, rows = parse_table_rows(lines)
480
+ puts '<table>'
481
+
482
+ begin
483
+ table_header(id, caption) if caption.present?
484
+ rescue KeyError
485
+ error "no such table: #{id}"
486
+ end
487
+
488
+ if @tablewidth.nil?
489
+ print '<tbody>'
490
+ else
491
+ print %Q(<tbody xmlns:aid5="http://ns.adobe.com/AdobeInDesign/5.0/" aid:table="table" aid:trows="#{rows.length}" aid:tcols="#{@col}">)
492
+ end
493
+ table_rows(sepidx, rows)
494
+ puts '</tbody></table>'
495
+ @tsize = nil
496
+ end
497
+
498
+ def parse_table_rows(lines)
454
499
  sepidx = nil
500
+ rows = []
455
501
  lines.each_with_index do |line, idx|
456
502
  if /\A[\=\-]{12}/ =~ line
457
503
  sepidx ||= idx
458
504
  next
459
505
  end
460
- if tablewidth
506
+ if @tablewidth
461
507
  rows.push(line.gsub(/\t\.\t/, "\tDUMMYCELLSPLITTER\t").gsub(/\t\.\.\t/, "\t.\t").gsub(/\t\.\Z/, "\tDUMMYCELLSPLITTER").gsub(/\t\.\.\Z/, "\t.").gsub(/\A\./, ''))
462
508
  else
463
509
  rows.push(line.gsub(/\t\.\t/, "\t\t").gsub(/\t\.\.\t/, "\t.\t").gsub(/\t\.\Z/, "\t").gsub(/\t\.\.\Z/, "\t.").gsub(/\A\./, ''))
464
510
  end
465
511
  col2 = rows[rows.length - 1].split(/\t/).length
466
- col = col2 if col2 > col
512
+ @col = col2 if col2 > @col
467
513
  end
468
514
  error 'no rows in the table' if rows.empty?
515
+ [sepidx, rows]
516
+ end
469
517
 
470
- puts '<table>'
471
-
518
+ def table_rows(sepidx, rows)
472
519
  cellwidth = []
473
- if tablewidth
520
+ if @tablewidth
474
521
  if @tsize.nil?
475
- col.times { |n| cellwidth[n] = tablewidth / col }
522
+ @col.times { |n| cellwidth[n] = @tablewidth / @col }
476
523
  else
477
524
  cellwidth = @tsize.split(/\s*,\s*/)
478
525
  totallength = 0
479
526
  cellwidth.size.times do |n|
480
527
  cellwidth[n] = cellwidth[n].to_f / @book.config['pt_to_mm_unit'].to_f
481
528
  totallength += cellwidth[n]
482
- warn "total length exceeds limit for table: #{id}" if totallength > tablewidth
529
+ warn "total length exceeds limit for table: #{id}" if totallength > @tablewidth
483
530
  end
484
- if cellwidth.size < col
485
- cw = (tablewidth - totallength) / (col - cellwidth.size)
531
+ if cellwidth.size < @col
532
+ cw = (@tablewidth - totallength) / (@col - cellwidth.size)
486
533
  warn "auto cell sizing exceeds limit for table: #{id}" if cw <= 0
487
- (cellwidth.size..(col - 1)).each { |i| cellwidth[i] = cw }
534
+ (cellwidth.size..(@col - 1)).each { |i| cellwidth[i] = cw }
488
535
  end
489
536
  end
490
537
  end
491
538
 
492
- begin
493
- table_header id, caption if caption.present?
494
- rescue KeyError
495
- error "no such table: #{id}"
496
- end
497
-
498
- if tablewidth.nil?
499
- print '<tbody>'
500
- else
501
- print %Q(<tbody xmlns:aid5="http://ns.adobe.com/AdobeInDesign/5.0/" aid:table="table" aid:trows="#{rows.length}" aid:tcols="#{col}">)
502
- end
503
-
504
539
  if sepidx
505
540
  sepidx.times do |y|
506
- if tablewidth.nil?
541
+ if @tablewidth.nil?
507
542
  puts %Q(<tr type="header">#{rows.shift}</tr>)
508
543
  else
509
544
  i = 0
@@ -514,9 +549,7 @@ module ReVIEW
514
549
  end
515
550
  end
516
551
  end
517
- trputs(tablewidth, rows, cellwidth, sepidx)
518
- puts '</tbody></table>'
519
- @tsize = nil
552
+ trputs(@tablewidth, rows, cellwidth, sepidx)
520
553
  end
521
554
 
522
555
  def trputs(tablewidth, rows, cellwidth, sepidx)
@@ -562,7 +595,6 @@ module ReVIEW
562
595
  end
563
596
 
564
597
  def table_end
565
- print '<?dtp tablerow last?>'
566
598
  end
567
599
 
568
600
  def emtable(lines, caption = nil)
@@ -573,19 +605,19 @@ module ReVIEW
573
605
  if @chapter.image(id).bound?
574
606
  metrics = parse_metric('idgxml', metric)
575
607
  puts '<table>'
576
- table_header id, caption if caption.present?
608
+ table_header(id, caption) if caption.present?
577
609
  puts %Q(<imgtable><Image href="file://#{@chapter.image(id).path.sub(%r{\A./}, '')}"#{metrics} /></imgtable>)
578
610
  puts '</table>'
579
611
  else
580
612
  warn "image not bound: #{id}" if @strict
581
- image_dummy id, caption, lines
613
+ image_dummy(id, caption, lines)
582
614
  end
583
615
  end
584
616
 
585
617
  def comment(lines, comment = nil)
586
618
  return unless @book.config['draft']
587
619
  lines ||= []
588
- lines.unshift escape(comment) unless comment.blank?
620
+ lines.unshift(escape(comment)) unless comment.blank?
589
621
  str = lines.join("\n")
590
622
  print "<msg>#{str}</msg>"
591
623
  end
@@ -691,6 +723,14 @@ module ReVIEW
691
723
  %Q(<b>#{escape(str)}</b>)
692
724
  end
693
725
 
726
+ def inline_em(str)
727
+ %Q(<em>#{escape(str)}</em>)
728
+ end
729
+
730
+ def inline_strong(str)
731
+ %Q(<strong>#{escape(str)}</strong>)
732
+ end
733
+
694
734
  def inline_tt(str)
695
735
  %Q(<tt>#{escape(str)}</tt>)
696
736
  end
@@ -1115,25 +1155,31 @@ module ReVIEW
1115
1155
  error "unknown chapter: #{id}"
1116
1156
  end
1117
1157
 
1118
- def source_header(caption)
1158
+ def source(lines, caption, lang = nil)
1119
1159
  puts '<source>'
1160
+ source_header(caption)
1161
+ source_body(lines, lang)
1162
+ puts '</source>'
1163
+ end
1164
+
1165
+ def source_header(caption)
1120
1166
  puts %Q(<caption>#{compile_inline(caption)}</caption>) if caption.present?
1121
1167
  end
1122
1168
 
1123
1169
  def source_body(lines, _lang)
1124
1170
  puts '<pre>'
1125
1171
  codelines_body(lines)
1126
- puts '</pre></source>'
1172
+ print '</pre>'
1127
1173
  end
1128
1174
 
1129
1175
  def bibpaper(lines, id, caption)
1130
- bibpaper_header id, caption
1131
- bibpaper_bibpaper id, caption, lines unless lines.empty?
1176
+ puts %Q(<bibitem id="bib-#{id}">)
1177
+ bibpaper_header(id, caption)
1178
+ bibpaper_bibpaper(id, caption, lines) unless lines.empty?
1132
1179
  puts '</bibitem>'
1133
1180
  end
1134
1181
 
1135
1182
  def bibpaper_header(id, caption)
1136
- puts %Q(<bibitem id="bib-#{id}">)
1137
1183
  puts "<caption><span type='bibno'>[#{@chapter.bibpaper(id).number}] </span>#{compile_inline(caption)}</caption>" if caption.present?
1138
1184
  end
1139
1185