review 0.6.0 → 0.9.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 (68) hide show
  1. data/ChangeLog +441 -0
  2. data/README.rdoc +25 -0
  3. data/Rakefile +13 -1
  4. data/VERSION +1 -1
  5. data/bin/review-check +1 -1
  6. data/bin/review-compile +19 -10
  7. data/bin/review-epubmaker +114 -17
  8. data/bin/review-index +8 -1
  9. data/bin/review-pdfmaker +378 -0
  10. data/bin/review-preproc +2 -3
  11. data/bin/review-vol +1 -2
  12. data/debian/README.Debian +12 -0
  13. data/debian/README.source +5 -0
  14. data/debian/changelog +5 -0
  15. data/debian/compat +1 -0
  16. data/debian/control +22 -0
  17. data/debian/copyright +60 -0
  18. data/debian/docs +5 -0
  19. data/debian/manpage.1.ex +59 -0
  20. data/debian/patches/path.diff +91 -0
  21. data/debian/patches/series +1 -0
  22. data/debian/review.install +13 -0
  23. data/debian/review.links +4 -0
  24. data/debian/rules +13 -0
  25. data/debian/source/format +1 -0
  26. data/doc/format.rdoc +477 -0
  27. data/doc/format.re +19 -0
  28. data/doc/format_idg.rdoc +180 -0
  29. data/doc/ruby-uuid/README +11 -0
  30. data/doc/ruby-uuid/README.ja +34 -0
  31. data/doc/sample.css +17 -0
  32. data/doc/sample.yaml +8 -4
  33. data/lib/lineinput.rb +1 -1
  34. data/lib/review/book.rb +43 -36
  35. data/lib/review/builder.rb +78 -33
  36. data/lib/review/compiler.rb +45 -48
  37. data/lib/review/epubbuilder.rb +1 -675
  38. data/lib/review/exception.rb +1 -1
  39. data/lib/review/htmlbuilder.rb +627 -49
  40. data/lib/review/htmlutils.rb +5 -0
  41. data/lib/review/idgxmlbuilder.rb +239 -250
  42. data/lib/review/index.rb +84 -7
  43. data/lib/review/latexbuilder.rb +261 -42
  44. data/lib/review/latexutils.rb +15 -6
  45. data/lib/review/preprocessor.rb +40 -6
  46. data/lib/review/textutils.rb +22 -0
  47. data/lib/review/topbuilder.rb +4 -1
  48. data/lib/uuid.rb +312 -0
  49. data/review.gemspec +44 -12
  50. data/test/CHAPS +2 -0
  51. data/test/bib.re +13 -0
  52. data/test/test.re +43 -0
  53. data/test/test_book.rb +1191 -0
  54. data/test/test_builder.rb +147 -0
  55. data/test/test_htmlbuilder.rb +191 -10
  56. data/test/test_htmlutils.rb +24 -0
  57. data/test/test_idgxmlbuilder.rb +310 -0
  58. data/test/test_index.rb +15 -0
  59. data/test/test_latexbuilder.rb +217 -6
  60. data/test/test_lineinput.rb +198 -0
  61. data/test/test_textutils.rb +68 -0
  62. data/test/test_uuid.rb +156 -0
  63. metadata +43 -10
  64. data/doc/format.txt +0 -434
  65. data/doc/format_idg.txt +0 -194
  66. data/doc/format_sjis.txt +0 -313
  67. data/setup.rb +0 -1587
  68. data/test/test_epubbuilder.rb +0 -73
@@ -22,6 +22,11 @@ module ReVIEW
22
22
  t = ESC
23
23
  str.gsub(/[&"<>]/) {|c| t[c] }
24
24
  end
25
+
26
+ def unescape_html(str)
27
+ # FIXME better code
28
+ str.gsub('&quot;', '"').gsub('&gt;', '>').gsub('&lt;', '<').gsub('&amp;', '&')
29
+ end
25
30
  end
26
31
 
27
32
  end # module ReVIEW
@@ -1,3 +1,4 @@
1
+ # encoding: utf-8
1
2
  #
2
3
  # Copyright (c) 2002-2007 Minero Aoki
3
4
  # 2008-2010 Minero Aoki, Kenshi Muto
@@ -19,11 +20,10 @@ module ReVIEW
19
20
  include TextUtils
20
21
  include HTMLUtils
21
22
 
22
- [:i, :tt, :ttbold, :tti, :idx, :hidx, :dtp, :sup, :sub, :hint, :raw, :maru, :keytop, :labelref, :ref, :pageref, :u, :icon, :balloon, :uchar].each {|e|
23
+ [:ttbold, :hint, :maru, :keytop, :labelref, :ref, :pageref, :icon, :balloon].each {|e|
23
24
  Compiler.definline(e)
24
25
  }
25
26
  Compiler.defsingle(:dtp, 1)
26
- Compiler.defsingle(:indepimage, 1)
27
27
 
28
28
  Compiler.defblock(:insn, 0..1)
29
29
  Compiler.defblock(:memo, 0..1)
@@ -41,11 +41,17 @@ module ReVIEW
41
41
  Compiler.defblock(:term, 0)
42
42
  Compiler.defblock(:link, 0..1)
43
43
  Compiler.defblock(:practice, 0)
44
- Compiler.defblock(:box, 0..1)
45
44
  Compiler.defblock(:expert, 0)
46
- Compiler.defblock(:lead, 0)
47
45
  Compiler.defblock(:rawblock, 0)
48
46
 
47
+ def pre_paragraph
48
+ '<p>'
49
+ end
50
+
51
+ def post_paragraph
52
+ '</p>'
53
+ end
54
+
49
55
  def extname
50
56
  '.xml'
51
57
  end
@@ -55,11 +61,6 @@ module ReVIEW
55
61
  end
56
62
  private :builder_init
57
63
 
58
- def setParameter(param)
59
- @param = param
60
- alias puts print unless @param["nolf"].nil?
61
- end
62
-
63
64
  def builder_init_file
64
65
  @warns = []
65
66
  @errors = []
@@ -71,9 +72,12 @@ module ReVIEW
71
72
  @rootelement = "doc"
72
73
  @secttags = nil
73
74
  @tsize = nil
75
+ @texblockequation = 0
76
+ @texinlineequation = 0
74
77
 
75
78
  print %Q(<?xml version="1.0" encoding="UTF-8"?>\n)
76
79
  print %Q(<#{@rootelement} xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/">)
80
+ alias puts print unless ReVIEW.book.param["nolf"].nil?
77
81
  end
78
82
  private :builder_init_file
79
83
 
@@ -203,9 +207,9 @@ module ReVIEW
203
207
  raise "caption level too deep or unsupported: #{level}"
204
208
  end
205
209
 
206
- prefix = "" if (level.to_i > @param["secnolevel"])
210
+ prefix = "" if (level.to_i > ReVIEW.book.param["secnolevel"])
207
211
  label = label.nil? ? "" : " id=\"#{label}\""
208
- puts %Q(<title#{label} aid:pstyle="h#{level}">#{prefix}#{escape_html(caption)}</title><?dtp level="#{level}" section="#{prefix}#{escape_html(caption)}"?>)
212
+ puts %Q(<title#{label} aid:pstyle="h#{level}">#{prefix}#{compile_inline(caption)}</title><?dtp level="#{level}" section="#{prefix}#{escape_html(compile_inline(caption))}"?>)
209
213
  end
210
214
 
211
215
  def ul_begin
@@ -266,41 +270,32 @@ module ReVIEW
266
270
 
267
271
  def paragraph(lines)
268
272
  if @noindent.nil?
269
- if lines[0] =~ /^(\t+)/
270
- puts %Q(<p inlist="#{$1.size}">#{lines.join('').sub(/^\t+/, "")}</p>)
273
+ if lines[0] =~ /\A(\t+)/
274
+ puts %Q(<p inlist="#{$1.size}">#{lines.join('').sub(/\A\t+/, "")}</p>)
271
275
  else
272
- puts "<p>#{lines.join('')}</p>"
276
+ puts "<p>#{lines.join}</p>"
273
277
  end
274
278
  else
275
- puts %Q(<p aid:pstyle="noindent" noindent='1'>#{lines.join('')}</p>)
279
+ puts %Q(<p aid:pstyle="noindent" noindent='1'>#{lines.join}</p>)
276
280
  @noindent = nil
277
281
  end
278
282
  end
279
283
 
280
284
  def read(lines)
281
- puts %Q[<p aid:pstyle="lead">#{lines.join('')}</p>]
285
+ blocked_lines = ReVIEW.book.param["deprecated-blocklines"].nil? ? split_paragraph(lines) : lines
286
+ puts %Q[<p aid:pstyle="lead">#{blocked_lines.join}</p>]
282
287
  end
283
288
 
284
- def lead(lines)
285
- read(lines)
286
- end
289
+ alias :lead read
287
290
 
288
291
  def inline_list(id)
289
- if !@chapter.number.nil? && !@chapter.number.to_s.empty?
290
- "<span type='list'>リスト#{@chapter.number}.#{@chapter.list(id).number}</span>"
291
- else
292
- "<span type='list'>リスト#{@chapter.list(id).number}</span>"
293
- end
292
+ chapter, id = extract_chapter_id(id)
293
+ "<span type='list'>リスト#{getChap(chapter)}#{chapter.list(id).number}</span>"
294
294
  end
295
295
 
296
296
  def list_header(id, caption)
297
- if !@chapter.number.nil? && !@chapter.number.to_s.empty?
298
- puts %Q[<codelist>]
299
- puts %Q[<caption>リスト#{@chapter.number}.#{@chapter.list(id).number} #{escape_html(caption)}</caption>]
300
- else
301
- puts %Q[<codelist>]
302
- puts %Q[<caption>リスト#{@chapter.list(id).number} #{escape_html(caption)}</caption>]
303
- end
297
+ puts %Q[<codelist>]
298
+ puts %Q[<caption>リスト#{getChap}#{@chapter.list(id).number} #{compile_inline(caption)}</caption>]
304
299
  end
305
300
 
306
301
  def list_body(lines)
@@ -319,7 +314,7 @@ module ReVIEW
319
314
  def emlistnum(lines, caption = nil)
320
315
  _lines = []
321
316
  lines.each_with_index do |line, i|
322
- _lines << detab("<span type='lineno'>" + (i+1).to_s.rjust(2) + ": </span>" + line)
317
+ _lines << detab("<span type='lineno'>" + (i + 1).to_s.rjust(2) + ": </span>" + line)
323
318
  end
324
319
  quotedlist _lines, 'emlist', caption
325
320
  end
@@ -327,7 +322,7 @@ module ReVIEW
327
322
  def listnum_body(lines)
328
323
  print %Q(<pre>)
329
324
  lines.each_with_index do |line, i|
330
- print detab("<span type='lineno'>" + (i+1).to_s.rjust(2) + ": </span>" + line)
325
+ print detab("<span type='lineno'>" + (i + 1).to_s.rjust(2) + ": </span>" + line)
331
326
  print "\n"
332
327
  end
333
328
  puts "</pre></codelist>"
@@ -339,11 +334,11 @@ module ReVIEW
339
334
 
340
335
  def quotedlist(lines, css_class, caption)
341
336
  print %Q[<list type='#{css_class}'>]
342
- puts "<caption aid:pstyle='#{css_class}-title'>#{escape_html(caption)}</caption>" unless caption.nil?
337
+ puts "<caption aid:pstyle='#{css_class}-title'>#{compile_inline(caption)}</caption>" unless caption.nil?
343
338
  print %Q[<pre>]
344
339
  no = 1
345
340
  lines.each do |line|
346
- unless @param["listinfo"].nil?
341
+ unless ReVIEW.book.param["listinfo"].nil?
347
342
  print "<listinfo line=\"#{no}\""
348
343
  print " begin=\"1\"" if no == 1
349
344
  print " end=\"#{no}\"" if no == lines.size
@@ -351,7 +346,7 @@ module ReVIEW
351
346
  end
352
347
  print detab(line)
353
348
  print "\n"
354
- print "</listinfo>" unless @param["listinfo"].nil?
349
+ print "</listinfo>" unless ReVIEW.book.param["listinfo"].nil?
355
350
  no += 1
356
351
  end
357
352
  puts '</pre></list>'
@@ -359,34 +354,46 @@ module ReVIEW
359
354
  private :quotedlist
360
355
 
361
356
  def quote(lines)
362
- puts "<quote>#{lines.join("\n")}</quote>"
357
+ if ReVIEW.book.param["deprecated-blocklines"].nil?
358
+ blocked_lines = split_paragraph(lines)
359
+ puts "<quote>#{blocked_lines.join("")}</quote>"
360
+ else
361
+ puts "<quote>#{lines.join("\n")}</quote>"
362
+ end
363
363
  end
364
364
 
365
365
  def inline_table(id)
366
- if !@chapter.number.nil? && !@chapter.number.to_s.empty?
367
- "<span type='table'>表#{@chapter.number}.#{@chapter.table(id).number}</span>"
368
- else
369
- "<span type='table'>表#{@chapter.table(id).number}</span>"
370
- end
366
+ chapter, id = extract_chapter_id(id)
367
+ "<span type='table'>表#{getChap(chapter)}#{chapter.table(id).number}</span>"
371
368
  end
372
369
 
373
370
  def inline_img(id)
374
- if !@chapter.number.nil? && !@chapter.number.to_s.empty?
375
- "<span type='image'>図#{@chapter.number}.#{@chapter.image(id).number}</span>"
376
- else
377
- "<span type='image'>図#{@chapter.image(id).number}</span>"
378
- end
371
+ chapter, id = extract_chapter_id(id)
372
+ "<span type='image'>図#{getChap(chapter)}#{chapter.image(id).number}</span>"
373
+ end
374
+
375
+ def parse_metric(metric)
376
+ return [] if metric.nil? || metric.empty?
377
+ params = []
378
+ values = metric.split(/\s*?,\s*?/)
379
+ return [] if values.size == 0
380
+ values.each {|value|
381
+ k, v = value.split("=", 2)
382
+ params.push("#{k}=\"" + v.gsub("\"", '') + "\"")
383
+ }
384
+ return params
379
385
  end
380
386
 
381
- def image_image(id, metric, caption)
387
+ def image_image(id, caption, metric=nil)
382
388
  puts "<img>"
383
- puts %Q[<Image href="file://#{@chapter.image(id).path.sub(/\A.\//, "")}" />]
389
+ params = parse_metric(metric)
390
+ puts %Q[<Image href="file://#{@chapter.image(id).path.sub(/\A.\//, "")}" #{params.join(" ")} />]
384
391
  image_header id, caption
385
392
  puts "</img>"
386
393
  end
387
394
 
388
395
  def image_dummy(id, caption, lines)
389
- if @param["subdirmode"].nil?
396
+ if ReVIEW.book.param["subdirmode"].nil?
390
397
  warn "image file not exist: images/#{@chapter.id}-#{id}.eps" unless File.exist?("images/#{@chapter.id}-#{id}.eps")
391
398
  else
392
399
  warn "image file not exist: images/#{@chapter.id}/#{id}.eps" unless File.exist?("images/#{@chapter.id}/#{id}.eps")
@@ -403,27 +410,29 @@ module ReVIEW
403
410
  end
404
411
 
405
412
  def image_header(id, caption)
406
- if !@chapter.number.nil? && !@chapter.number.to_s.empty?
407
- puts %Q[<caption>図#{@chapter.number}.#{@chapter.image(id).number} #{escape_html(caption)}</caption>]
408
- else
409
- puts %Q[<caption>図#{@chapter.image(id).number} #{escape_html(caption)}</caption>]
410
- end
413
+ puts %Q[<caption>図#{getChap}#{@chapter.image(id).number} #{compile_inline(caption)}</caption>]
414
+ end
415
+
416
+ def texequation(lines)
417
+ @texblockequation += 1
418
+ puts %Q[<replace idref="texblock-#{@texblockequation}">]
419
+ puts '<pre>'
420
+ puts "#{lines.join("\n")}"
421
+ puts '</pre>'
422
+ puts '</replace>'
411
423
  end
412
424
 
413
425
  def table(lines, id = nil, caption = nil)
414
- # puts %Q(<表 xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/" aid:table="table">)
415
426
  tablewidth = nil
416
427
  col = 0
417
- unless @param["tableopt"].nil?
418
- tablewidth = @param["tableopt"].split(",")[0].to_f / 0.351 # mm -> pt
428
+ unless ReVIEW.book.param["tableopt"].nil?
429
+ tablewidth = ReVIEW.book.param["tableopt"].split(",")[0].to_f / 0.351 # mm -> pt
419
430
  end
420
431
  puts "<table>"
421
432
  rows = []
422
433
  sepidx = nil
423
434
  lines.each_with_index do |line, idx|
424
435
  if /\A[\=\-]{12}/ =~ line
425
- # just ignore
426
- #error "too many table separator" if sepidx
427
436
  sepidx ||= idx
428
437
  next
429
438
  end
@@ -446,7 +455,7 @@ module ReVIEW
446
455
  cellwidth = @tsize.split(/\s*,\s*/)
447
456
  totallength = 0
448
457
  cellwidth.size.times {|n|
449
- cellwidth[n] = cellwidth[n].to_f / 0.351 # mm->pt
458
+ cellwidth[n] = cellwidth[n].to_f / 0.351 # mm -> pt
450
459
  totallength = totallength + cellwidth[n]
451
460
  warn "total length exceeds limit for table: #{id}" if totallength > tablewidth
452
461
  }
@@ -470,93 +479,65 @@ module ReVIEW
470
479
  if tablewidth.nil?
471
480
  print "<tbody>"
472
481
  else
473
- print "<tbody xmlns:aid5=\"http://ns.adobe.com/AdobeInDesign/5.0/\" aid:table=\"table\" aid:trows=\"#{rows.length}\" aid:tcols=\"#{col}\">"
482
+ print %Q[<tbody xmlns:aid5="http://ns.adobe.com/AdobeInDesign/5.0/" aid:table="table" aid:trows="#{rows.length}" aid:tcols="#{col}">]
474
483
  end
475
484
 
476
485
  if sepidx
477
486
  sepidx.times do
478
487
  if tablewidth.nil?
479
- puts "<tr type=\"header\">" + rows.shift + "</tr>"
488
+ puts %Q[<tr type="header">#{rows.shift}</tr>]
480
489
  else
481
490
  i = 0
482
491
  rows.shift.split(/\t/).each {|cell|
483
- print "<td aid:table=\"cell\" aid:theader=\"1\" aid:crows=\"1\" aid:ccols=\"1\" aid:ccolwidth=\"#{cellwidth[i]}\">#{cell.sub("DUMMYCELLSPLITTER", "")}</td>"
484
- i = i + 1
492
+ print %Q[<td aid:table="cell" aid:theader="1" aid:crows="1" aid:ccols="1" aid:ccolwidth="#{sprintf("%.13f", cellwidth[i])}">#{cell.sub("DUMMYCELLSPLITTER", "")}</td>]
493
+ i += 1
485
494
  }
486
495
  end
487
496
  end
497
+ end
498
+ trputs(tablewidth, rows, cellwidth)
499
+ puts "</tbody></table>"
500
+ @tsize = nil
501
+ end
488
502
 
489
- if tablewidth.nil?
490
- lastline = rows.pop
491
- rows.each do |row|
492
- puts "<tr>" + row + "</tr>"
493
- end
494
- puts "<tr type=\"lastline\">" + lastline + "</tr>" unless lastline.nil?
495
- else
496
- rows.each do |row|
497
- i = 0
498
- row.split(/\t/).each {|cell|
499
- print "<td aid:table=\"cell\" aid:crows=\"1\" aid:ccols=\"1\" aid:ccolwidth=\"#{cellwidth[i]}\">#{cell.sub("DUMMYCELLSPLITTER", "")}</td>"
500
- i = i + 1
501
- }
502
- end
503
+ def trputs(tablewidth, rows, cellwidth)
504
+ if tablewidth.nil?
505
+ lastline = rows.pop
506
+ rows.each do |row|
507
+ puts %Q[<tr>#{row}</tr>]
503
508
  end
509
+ puts %Q[<tr type="lastline">#{lastline}</tr>] unless lastline.nil?
504
510
  else
505
- if tablewidth.nil?
506
- lastline = rows.pop
507
- rows.each do |row|
508
- puts "<tr>" + row + "</tr>"
509
- end
510
- puts "<tr type=\"lastline\">" + lastline + "</tr>" unless lastline.nil?
511
- else
512
- rows.each do |row|
513
- i = 0
514
- row.split(/\t/).each {|cell|
515
- print "<td aid:table=\"cell\" aid:crows=\"1\" aid:ccols=\"1\" aid:ccolwidth=\"#{cellwidth[i]}\">#{cell.sub("DUMMYCELLSPLITTER", "")}</td>"
516
- i = i + 1
517
- }
518
- end
511
+ rows.each do |row|
512
+ i = 0
513
+ row.split(/\t/).each {|cell|
514
+ print %Q[<td aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="#{sprintf("%.13f", cellwidth[i])}">#{cell.sub("DUMMYCELLSPLITTER", "")}</td>]
515
+ i += 1
516
+ }
519
517
  end
520
518
  end
521
- print "</tbody>"
522
- puts "</table>"
523
- @tsize = nil
524
519
  end
525
520
 
526
521
  def table_header(id, caption)
527
- if !@chapter.number.nil? && !@chapter.number.to_s.empty?
528
- puts %Q[<caption>表#{@chapter.number}.#{@chapter.table(id).number} #{escape_html(caption)}</caption>]
529
- else
530
- puts %Q[<caption>表#{@chapter.table(id).number} #{escape_html(caption)}</caption>]
531
- end
522
+ puts %Q[<caption>表#{getChap}#{@chapter.table(id).number} #{compile_inline(caption)}</caption>]
532
523
  end
533
524
 
534
525
  def table_begin(ncols)
535
- # aid:trows="" aid:tcols="" widths="列1の幅, 列2の幅, ..."をdtp命令で入れておく
536
- # puts %Q(<表 xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/" aid:table="table">)
537
526
  end
538
527
 
539
528
  def tr(rows)
540
- # FIXME
541
- puts "<tr>" + rows.join("\t") + "</tr>"
529
+ puts %Q[<tr>#{rows.join("\t")}</tr>]
542
530
  end
543
531
 
544
532
  def th(str)
545
- # FIXME aid:ccolwidth=""
546
- # FIXME strが2回エスケープされている
547
- # %Q(<セル aid:table="cell" aid:theader="" aid:crows="1" aid:ccols="1">#{str}</セル>)
548
- %Q(<?dtp tablerow header?>#{str})
533
+ %Q[<?dtp tablerow header?>#{str}]
549
534
  end
550
535
 
551
536
  def td(str)
552
- # FIXME aid:ccolwidth=""
553
- # FIXME strが2回エスケープされている
554
- # %Q(<セル aid:table="cell" aid:crows="1" aid:ccols="1">#{str}</セル>)
555
537
  str
556
538
  end
557
539
 
558
540
  def table_end
559
- # puts '</表>'
560
541
  print "<?dtp tablerow last?>"
561
542
  end
562
543
 
@@ -565,63 +546,71 @@ module ReVIEW
565
546
  end
566
547
 
567
548
  def footnote(id, str)
568
- # FIXME: inline_fnと合わせて処理必要。2パースの処理をすべきか
569
- # puts %Q(<footnote id="#{id}" no="#{@chapter.footnote(id).number}">#{compile_inline(str)}</footnote>)
549
+ # see inline_fn
570
550
  end
571
551
 
572
552
  def inline_fn(id)
573
- %Q(<footnote>#{compile_inline(@chapter.footnote(id).content.strip)}</footnote>)
553
+ %Q[<footnote>#{compile_inline(@chapter.footnote(id).content.strip)}</footnote>]
574
554
  end
575
555
 
576
556
  def compile_ruby(base, ruby)
577
- %Q(<GroupRuby><aid:ruby xmlns:aid="http://ns.adobe.com/AdobeInDesign/3.0/"><aid:rb>#{escape_html(base.sub(/\A\s+/, "").sub(/\s+$/, ""))}</aid:rb><aid:rt>#{escape_html(ruby.sub(/\A\s+/, "").sub(/\s+$/, ""))}</aid:rt></aid:ruby></GroupRuby>)
557
+ %Q[<GroupRuby><aid:ruby xmlns:aid="http://ns.adobe.com/AdobeInDesign/3.0/"><aid:rb>#{escape_html(base.sub(/\A\s+/, "").sub(/\s+$/, ""))}</aid:rb><aid:rt>#{escape_html(ruby.sub(/\A\s+/, "").sub(/\s+$/, ""))}</aid:rt></aid:ruby></GroupRuby>]
578
558
  end
579
559
 
580
560
  def compile_kw(word, alt)
581
561
  '<keyword>' +
582
562
  if alt
583
- #then escape_html(word + sprintf(@locale[:parens], alt.strip))
584
- then escape_html(word + "(#{alt.strip})")
563
+ then escape_html("#{word}(#{alt.strip})")
585
564
  else escape_html(word)
586
565
  end +
587
566
  '</keyword>' +
588
- %Q(<index value="#{escape_html(word)}" />) +
567
+ %Q[<index value="#{escape_html(word)}" />] +
589
568
  if alt
590
- alt.split(/\s*,\s*/).collect! {|e| %Q(<index value="#{escape_html(e.strip)}" />) }.join
569
+ alt.split(/\s*,\s*/).collect! {|e| %Q[<index value="#{escape_html(e.strip)}" />] }.join
591
570
  else
592
571
  ""
593
572
  end
594
573
  end
595
574
 
596
575
  def compile_href(url, label)
597
- %Q(<a linkurl='#{url}'>#{label.nil? ? url : label}</a>)
576
+ %Q[<a linkurl='#{url}'>#{label.nil? ? url : label}</a>]
598
577
  end
599
578
 
600
579
  def inline_sup(str)
601
- %Q(<sup>#{escape_html(str)}</sup>)
580
+ %Q[<sup>#{escape_html(str)}</sup>]
602
581
  end
603
582
 
604
583
  def inline_sub(str)
605
- %Q(<sub>#{escape_html(str)}</sub>)
584
+ %Q[<sub>#{escape_html(str)}</sub>]
606
585
  end
607
586
 
608
587
  def inline_raw(str)
609
- %Q(#{str.gsub("\\n", "\n")})
588
+ %Q[#{str.gsub("\\n", "\n")}]
610
589
  end
611
590
 
612
591
  def inline_hint(str)
613
- if @param["nolf"].nil?
614
- %Q(\n<hint>#{escape_html(str)}</hint>)
592
+ if ReVIEW.book.param["nolf"].nil?
593
+ %Q[\n<hint>#{escape_html(str)}</hint>]
615
594
  else
616
- %Q(<hint>#{escape_html(str)}</hint>)
595
+ %Q[<hint>#{escape_html(str)}</hint>]
617
596
  end
618
597
  end
619
598
 
620
599
  def inline_maru(str)
621
- if str =~ /^\d+$/
600
+ if str =~ /\A\d+$/
622
601
  sprintf("&#x%x;", 9311 + str.to_i)
623
- elsif str =~ /^[A-Za-z]$/
624
- sprintf("&#x%x;", 9398 + str[0] - 65)
602
+ elsif str =~ /\A[A-Z]$/
603
+ begin
604
+ sprintf("&#x%x;", 9398 + str.codepoints.to_a[0] - 65)
605
+ rescue NoMethodError
606
+ sprintf("&#x%x;", 9398 + str[0] - 65)
607
+ end
608
+ elsif str =~ /\A[a-z]$/
609
+ begin
610
+ sprintf("&#x%x;", 9392 + str.codepoints.to_a[0] - 65)
611
+ rescue NoMethodError
612
+ sprintf("&#x%x;", 9392 + str[0] - 65)
613
+ end
625
614
  else
626
615
  raise "can't parse maru: #{str}"
627
616
  end
@@ -651,11 +640,13 @@ module ReVIEW
651
640
  %Q(<tt>#{escape_html(str)}</tt>)
652
641
  end
653
642
 
654
- def inline_ttbold(str)
643
+ def inline_ttb(str)
655
644
  index = escape_html(str).gsub(/<.*?>/, "").gsub(/\*/, "ESCAPED_ASTERISK").gsub(/'/, "&#27;")
656
645
  %Q(<tt style='bold'>#{escape_html(str)}</tt><index value='#{index}' />)
657
646
  end
658
647
 
648
+ alias :inline_ttbold inline_ttb
649
+
659
650
  def inline_tti(str)
660
651
  %Q(<tt style='italic'>#{escape_html(str)}</tt>)
661
652
  end
@@ -665,39 +656,43 @@ module ReVIEW
665
656
  end
666
657
 
667
658
  def inline_icon(id)
668
- if @param["subdirmode"].nil?
669
- warn "image file not exist: images/#{@chapter.id}-#{id}.eps" unless File.exist?("images/#{@chapter.id}-#{id}.eps")
670
- %Q[<Image href="file://images/#{@chapter.id}-#{id}.eps" type='inline'/>]
671
- else
672
- warn "image file not exist: images/#{@chapter.id}/#{id}.eps" unless File.exist?("images/#{@chapter.id}/#{id}.eps")
673
- %Q[<Image href="file://images/#{@chapter.id}/#{id}.eps" type='inline'/>]
659
+ begin
660
+ %Q[<Image href="file://#{@chapter.image(id).path.sub(/\A\.\//, "")}" type="inline" />]
661
+ rescue
662
+ warn "no such icon image: #{id}"
663
+ ""
674
664
  end
675
665
  end
676
666
 
677
667
  def inline_bou(str)
678
- %Q(<bou>#{escape_html(str)}</bou>)
668
+ %Q[<bou>#{escape_html(str)}</bou>]
679
669
  end
680
670
 
681
671
  def inline_keytop(str)
682
- %Q(<keytop>#{escape_html(str)}</keytop>)
672
+ %Q[<keytop>#{escape_html(str)}</keytop>]
683
673
  end
684
674
 
685
675
  def inline_labelref(idref)
686
- %Q(<ref idref='#{idref}'>「●● #{idref}」</ref>) # FIXME:節名とタイトルも込みで要出力
676
+ %Q[<ref idref='#{idref}'>「●● #{idref}」</ref>] # FIXME:節名とタイトルも込みで要出力
687
677
  end
688
678
 
689
679
  alias inline_ref inline_labelref
690
680
 
691
681
  def inline_pageref(idref)
692
- %Q(<pageref idref='#{idref}'>●●</pageref>) # ページ番号を参照
682
+ %Q[<pageref idref='#{idref}'>●●</pageref>] # ページ番号を参照
693
683
  end
694
684
 
695
685
  def inline_balloon(str)
696
- %Q(<balloon>#{escape_html(str).gsub(/@maru\[(\d+)\]/) {|m| inline_maru($1)}}</balloon>)
686
+ %Q[<balloon>#{escape_html(str).gsub(/@maru\[(\d+)\]/) {|m| inline_maru($1)}}</balloon>]
697
687
  end
698
688
 
699
689
  def inline_uchar(str)
700
- %Q(&#x#{str};)
690
+ %Q[&#x#{str};]
691
+ end
692
+
693
+ def inline_m(str)
694
+ @texinlineequation += 1
695
+ %Q[<replace idref="texinline-#{@texinlineequation}"><pre>#{escape_html(str)}</pre></replace>]
701
696
  end
702
697
 
703
698
  def noindent
@@ -714,71 +709,74 @@ module ReVIEW
714
709
  end
715
710
 
716
711
  def nonum_begin(level, label, caption)
717
- puts %Q(<title aid:pstyle="h#{level}">#{escape_html(caption)}</title><?dtp level="#{level}" section="#{escape_html(caption)}"?>)
712
+ puts %Q[<title aid:pstyle="h#{level}">#{compile_inline(caption)}</title><?dtp level="#{level}" section="#{escape_html(compile_inline(caption))}"?>]
718
713
  end
719
714
 
720
715
  def nonum_end(level)
721
716
  end
722
717
 
723
718
  def circle_begin(level, label, caption)
724
- puts %Q(<title aid:pstyle="smallcircle">&#x2022;#{escape_html(caption)}</title>)
719
+ puts %Q[<title aid:pstyle="smallcircle">&#x2022;#{compile_inline(caption)}</title>]
725
720
  end
726
721
 
727
722
  def circle_end(level)
728
723
  end
729
724
 
725
+ def common_column_begin(type, caption)
726
+ print "<#{type}column>"
727
+ puts %Q[<title aid:pstyle="#{type}column-title">#{compile_inline(caption)}</title>]
728
+ end
729
+
730
+ def common_column_end(type)
731
+ puts "</#{type}column>"
732
+ end
733
+
730
734
  def column_begin(level, label, caption)
731
- print "<column>"
732
- puts %Q(<title aid:pstyle="column-title">#{escape_html(caption)}</title>)
735
+ common_column_begin("", caption)
733
736
  end
734
737
 
735
738
  def column_end(level)
736
- puts "</column>"
739
+ common_column_end("")
737
740
  end
738
741
 
739
742
  def xcolumn_begin(level, label, caption)
740
- print "<xcolumn>"
741
- puts %Q(<title aid:pstyle="xcolumn-title">#{escape_html(caption)}</title>)
743
+ common_column_begin("x", caption)
742
744
  end
743
745
 
744
746
  def xcolumn_end(level)
745
- puts "</xcolumn>"
747
+ common_column_end("x")
746
748
  end
747
749
 
748
750
  def world_begin(level, label, caption)
749
- print "<worldcolumn>"
750
- puts %Q(<title aid:pstyle="worldcolumn-title">#{escape_html(caption)}</title>)
751
+ common_column_begin("world", caption)
751
752
  end
752
753
 
753
754
  def world_end(level)
754
- puts "</worldcolumn>"
755
+ common_column_end("world")
755
756
  end
756
757
 
757
758
  def hood_begin(level, label, caption)
758
- print "<hoodcolumn>"
759
- puts %Q(<title aid:pstyle="hoodcolumn-title">#{escape_html(caption)}</title>)
759
+ common_column_begin("hood", caption)
760
760
  end
761
761
 
762
762
  def hood_end(level)
763
- puts "</hoodcolumn>"
763
+ common_column_end("hood")
764
764
  end
765
765
 
766
766
  def edition_begin(level, label, caption)
767
- print "<editioncolumn>"
768
- puts %Q(<title aid:pstyle="editioncolumn-title">#{escape_html(caption)}</title>)
767
+ common_column_begin("edition", caption)
769
768
  end
770
769
 
771
770
  def edition_end(level)
772
- puts "</editioncolumn>"
771
+ common_column_end("edition")
773
772
  end
774
773
 
775
774
  def insideout_begin(level, label, caption)
776
- print "<insideoutcolumn>"
777
- puts %Q(<title aid:pstyle="insideoutcolumn-title">#{escape_html(caption)}</title>)
775
+ common_column_begin("insideout", caption)
778
776
  end
779
777
 
780
778
  def insideout_end(level)
781
- puts "</insideoutcolumn>"
779
+ common_column_end("insideout")
782
780
  end
783
781
 
784
782
  def ref_begin(level, label, caption)
@@ -806,168 +804,155 @@ module ReVIEW
806
804
  end
807
805
 
808
806
  def flushright(lines)
809
- puts "<p align='right'>#{lines.join("\n")}</p>"
807
+ if ReVIEW.book.param["deprecated-blocklines"].nil?
808
+ puts split_paragraph(lines).join.gsub("<p>", "<p align='right'>")
809
+ else
810
+ puts "<p align='right'>#{lines.join("\n")}</p>"
811
+ end
812
+ end
813
+
814
+ def captionblock(type, lines, caption, specialstyle = nil)
815
+ print "<#{type}>"
816
+ style = specialstyle.nil? ? "#{type}-title" : specialstyle
817
+ puts "<title aid:pstyle='#{style}'>#{compile_inline(caption)}</title>" unless caption.nil?
818
+ if ReVIEW.book.param["deprecated-blocklines"].nil?
819
+ blocked_lines = split_paragraph(lines)
820
+ puts "#{blocked_lines.join}</#{type}>"
821
+ else
822
+ puts "#{lines.join("\n")}</#{type}>"
823
+ end
810
824
  end
811
825
 
812
826
  def note(lines, caption = nil)
813
- print "<note>"
814
- puts "<title aid:pstyle='note-title'>#{escape_html(caption)}</title>" unless caption.nil?
815
- puts "#{lines.join("\n")}</note>"
827
+ captionblock("note", lines, caption)
816
828
  end
817
829
 
818
830
  def memo(lines, caption = nil)
819
- print "<memo>"
820
- puts "<title aid:pstyle='memo-title'>#{escape_html(caption)}</title>" unless caption.nil?
821
- puts "#{lines.join("\n")}</memo>"
831
+ captionblock("memo", lines, caption)
822
832
  end
823
833
 
824
834
  def tip(lines, caption = nil)
825
- print "<tip>"
826
- puts "<title aid:pstyle='tip-title'>#{escape_html(caption)}</title>" unless caption.nil?
827
- puts "#{lines.join("\n")}</tip>"
835
+ captionblock("tip", lines, caption)
828
836
  end
829
837
 
830
838
  def info(lines, caption = nil)
831
- print "<info>"
832
- puts "<title aid:pstyle='info-title'>#{escape_html(caption)}</title>" unless caption.nil?
833
- puts "#{lines.join("\n")}</info>"
839
+ captionblock("info", lines, caption)
834
840
  end
835
841
 
836
842
  def planning(lines, caption = nil)
837
- print "<planning>"
838
- puts "<title aid:pstyle='planning-title'>#{escape_html(caption)}</title>" unless caption.nil?
839
- puts "#{lines.join("\n")}</planning>"
843
+ captionblock("planning", lines, caption)
840
844
  end
841
845
 
842
846
  def best(lines, caption = nil)
843
- print "<best>"
844
- puts "<title aid:pstyle='best-title'>#{escape_html(caption)}</title>" unless caption.nil?
845
- puts "#{lines.join("\n")}</best>"
847
+ captionblock("best", lines, caption)
846
848
  end
847
849
 
848
850
  def important(lines, caption = nil)
849
- print "<important>"
850
- puts "<title aid:pstyle='important-title'>#{escape_html(caption)}</title>" unless caption.nil?
851
- puts "#{lines.join("\n")}</important>"
851
+ captionblock("important", lines, caption)
852
852
  end
853
853
 
854
854
  def security(lines, caption = nil)
855
- print "<security>"
856
- puts "<title aid:pstyle='security-title'>#{escape_html(caption)}</title>" unless caption.nil?
857
- puts "#{lines.join("\n")}</security>"
855
+ captionblock("security", lines, caption)
858
856
  end
859
857
 
860
858
  def caution(lines, caption = nil)
861
- print "<caution>"
862
- puts "<title aid:pstyle='caution-title'>#{escape_html(caption)}</title>" unless caption.nil?
863
- puts "#{lines.join("\n")}</caution>"
859
+ captionblock("caution", lines, caption)
864
860
  end
865
861
 
866
862
  def term(lines)
867
- puts "<term>#{lines.join("\n")}</term>"
863
+ captionblock("term", lines, nil)
868
864
  end
869
865
 
870
866
  def link(lines, caption = nil)
871
- print "<link>"
872
- puts "<title aid:pstyle='link-title'>#{escape_html(caption)}</title>" unless caption.nil?
873
- puts "#{lines.join("\n")}</link>"
867
+ captionblock("link", lines, caption)
874
868
  end
875
869
 
876
870
  def notice(lines, caption = nil)
877
871
  if caption.nil?
878
- puts "<notice>#{lines.join("\n")}</notice>"
872
+ captionblock("notice", lines, nil)
879
873
  else
880
- puts "<notice-t><title aid:pstyle='notice-title'>#{escape_html(caption)}</title>"
881
- puts "#{lines.join("\n")}</notice-t>"
874
+ captionblock("notice-t", lines, caption, "notice-title")
882
875
  end
883
876
  end
884
877
 
885
878
  def point(lines, caption = nil)
886
879
  if caption.nil?
887
- puts "<point>#{lines.join("\n")}</point>"
880
+ captionblock("point", lines, nil)
888
881
  else
889
- puts "<point-t><title aid:pstyle='point-title'>#{escape_html(caption)}</title>"
890
- puts "#{lines.join("\n")}</point-t>"
882
+ captionblock("point-t", lines, caption, "point-title")
891
883
  end
892
884
  end
893
885
 
894
886
  def shoot(lines, caption = nil)
895
887
  if caption.nil?
896
- puts "<shoot>#{lines.join("\n")}</shoot>"
888
+ captionblock("shoot", lines, nil)
897
889
  else
898
- puts "<shoot-t><title aid:pstyle='shoot-title'>#{escape_html(caption)}</title>"
899
- puts "#{lines.join("\n")}</shoot-t>"
890
+ captionblock("shoot-t", lines, caption, "shoot-title")
900
891
  end
901
892
  end
902
893
 
903
894
  def reference(lines)
904
- puts "<reference>#{lines.join("\n")}</reference>"
895
+ captionblock("reference", lines, nil)
905
896
  end
906
897
 
907
898
  def practice(lines)
908
- puts "<practice>#{lines.join("\n")}</practice>"
899
+ captionblock("practice", lines, nil)
909
900
  end
910
-
901
+
911
902
  def expert(lines)
912
- puts "<expert>#{lines.join("\n")}</expert>"
903
+ captionblock("expert", lines, nil)
913
904
  end
914
905
 
915
- def insn(lines, caption = nil)
906
+ def syntaxblock(type, lines, caption)
916
907
  if caption.nil?
917
- puts %Q[<insn>]
908
+ puts %Q[<#{type}>]
918
909
  else
919
- puts %Q[<insn><floattitle type="insn">#{escape_html(caption)}</floattitle>]
910
+ titleopentag = %Q[caption aid:pstyle="#{type}-title"]
911
+ titleclosetag = "caption"
912
+ if type == "insn"
913
+ titleopentag = %Q[floattitle type="insn"]
914
+ titleclosetag = "floattitle"
915
+ end
916
+ puts %Q[<#{type}><#{titleopentag}>#{compile_inline(caption)}</#{titleclosetag}>]
920
917
  end
921
918
  no = 1
922
919
  lines.each do |line|
923
- unless @param["listinfo"].nil?
924
- print "<listinfo line=\"#{no}\""
925
- print " begin=\"1\"" if no == 1
926
- print " end=\"#{no}\"" if no == lines.size
927
- print ">"
920
+ unless ReVIEW.book.param["listinfo"].nil?
921
+ print %Q[<listinfo line="#{no}"]
922
+ print %Q[ begin="1"] if no == 1
923
+ print %Q[ end="#{no}"] if no == lines.size
924
+ print %Q[>]
928
925
  end
929
926
  print detab(line)
930
927
  print "\n"
931
- print "</listinfo>" unless @param["listinfo"].nil?
928
+ print "</listinfo>" unless ReVIEW.book.param["listinfo"].nil?
932
929
  no += 1
933
930
  end
934
- puts "</insn>"
931
+ puts "</#{type}>"
932
+ end
933
+
934
+ def insn(lines, caption = nil)
935
+ syntaxblock("insn", lines, caption)
935
936
  end
936
937
 
937
938
  def box(lines, caption = nil)
938
- if caption.nil?
939
- print %Q[<box>]
940
- else
941
- puts %Q[<box><caption aid:pstyle="box-title">#{escape_html(caption)}</caption>]
942
- end
943
- no = 1
944
- lines.each do |line|
945
- unless @param["listinfo"].nil?
946
- print "<listinfo line=\"#{no}\""
947
- print " begin=\"1\"" if no == 1
948
- print " end=\"#{no}\"" if no == lines.size
949
- print ">"
950
- end
951
- print detab(line)
952
- print "\n"
953
- print "</listinfo>" unless @param["listinfo"].nil?
954
- no += 1
955
- end
956
- puts "</box>"
939
+ syntaxblock("box", lines, caption)
957
940
  end
958
941
 
959
- def indepimage(id)
942
+ def indepimage(id, caption=nil, metric=nil)
960
943
  puts "<img>"
961
- if @param["subdirmode"].nil?
962
- warn "image file not exist: images/#{@chapter.id}-#{id}.eps" unless File.exist?("images/#{@chapter.id}-#{id}.eps")
963
- puts %Q[<Image href="file://images/#{@chapter.id}-#{id}.eps" />]
964
- else
965
- warn "image file not exist: images/#{@chapter.id}/#{id}.eps" unless File.exist?("images/#{@chapter.id}/#{id}.eps")
966
- puts %Q[<Image href="file://images/#{@chapter.id}/#{id}.eps" />]
944
+ params = parse_metric(metric)
945
+ begin
946
+ puts %Q[<Image href="file://#{@chapter.image(id).path.sub(/\A\.\//, "")}" #{params.join(" ")} />]
947
+ rescue
948
+ warn %Q[no such image: #{id}]
967
949
  end
950
+ puts %Q[<caption>#{compile_inline(caption)}</caption>] if !caption.nil? && !caption.empty?
968
951
  puts "</img>"
969
952
  end
970
953
 
954
+ alias :numberlessimage indepimage
955
+
971
956
  def label(id)
972
957
  # FIXME
973
958
  print "<label id='#{id}' />"
@@ -982,7 +967,7 @@ module ReVIEW
982
967
  end
983
968
 
984
969
  def hr
985
- print "<hr/>"
970
+ print "<hr />"
986
971
  end
987
972
 
988
973
  def bpo(lines)
@@ -997,6 +982,10 @@ module ReVIEW
997
982
  %Q(<tt type='inline-code'>#{escape_html(str)}</tt>)
998
983
  end
999
984
 
985
+ def inline_br(str)
986
+ "\n"
987
+ end
988
+
1000
989
  def rawblock(lines)
1001
990
  no = 1
1002
991
  lines.each {|l|
@@ -1012,8 +1001,8 @@ module ReVIEW
1012
1001
 
1013
1002
  def inline_chapref(id)
1014
1003
  chs = ["", "「", "」"]
1015
- unless @param["chapref"].nil?
1016
- _chs = NKF.nkf("-w", @param["chapref"]).split(",")
1004
+ unless ReVIEW.book.param["chapref"].nil?
1005
+ _chs = NKF.nkf("-w", ReVIEW.book.param["chapref"]).split(",")
1017
1006
  if _chs.size != 3
1018
1007
  error "--chapsplitter must have exactly 3 parameters with comma."
1019
1008
  else
@@ -1029,7 +1018,7 @@ module ReVIEW
1029
1018
 
1030
1019
  def source_header(caption)
1031
1020
  puts %Q[<source>]
1032
- puts %Q[<caption>#{escape_html(caption)}</caption>]
1021
+ puts %Q[<caption>#{compile_inline(caption)}</caption>]
1033
1022
  end
1034
1023
 
1035
1024
  def source_body(lines)
@@ -1051,7 +1040,7 @@ module ReVIEW
1051
1040
 
1052
1041
  def bibpaper_header(id, caption)
1053
1042
  puts %Q(<bibitem id="bib-#{id}">)
1054
- puts "<caption><span type='bibno'>[#{@chapter.bibpaper(id).number}] </span>#{escape_html(caption)}</caption>"
1043
+ puts "<caption><span type='bibno'>[#{@chapter.bibpaper(id).number}] </span>#{compile_inline(caption)}</caption>"
1055
1044
  end
1056
1045
 
1057
1046
  def bibpaper_bibpaper(id, caption, lines)