review 1.0.0 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. data/.travis.yml +1 -2
  2. data/ChangeLog +65 -0
  3. data/Gemfile +5 -0
  4. data/README.rdoc +6 -1
  5. data/Rakefile +14 -28
  6. data/bin/review-check +9 -21
  7. data/bin/review-compile +45 -12
  8. data/bin/review-epubmaker +477 -220
  9. data/bin/review-epubmaker-ng +5 -14
  10. data/bin/review-index +4 -2
  11. data/bin/review-init +94 -0
  12. data/bin/review-pdfmaker +70 -287
  13. data/bin/review-preproc +5 -2
  14. data/bin/review-vol +4 -11
  15. data/debian/changelog +3 -3
  16. data/debian/copyright +5 -3
  17. data/debian/docs +1 -0
  18. data/doc/format.rdoc +57 -11
  19. data/doc/quickstart.rdoc +4 -4
  20. data/doc/sample.yaml +11 -7
  21. data/lib/epubmaker.rb +1 -1
  22. data/lib/epubmaker/epubv2.rb +26 -27
  23. data/lib/epubmaker/epubv3.rb +13 -13
  24. data/lib/epubmaker/producer.rb +1 -1
  25. data/lib/review.rb +3 -4
  26. data/lib/review/book.rb +17 -581
  27. data/lib/review/book/base.rb +247 -0
  28. data/lib/review/book/chapter.rb +81 -0
  29. data/lib/review/book/compilable.rb +163 -0
  30. data/lib/review/book/index.rb +339 -0
  31. data/lib/review/book/page_metric.rb +38 -0
  32. data/lib/review/book/parameters.rb +97 -0
  33. data/lib/review/book/part.rb +44 -0
  34. data/lib/review/book/volume.rb +65 -0
  35. data/lib/review/builder.rb +34 -40
  36. data/lib/review/compiler.rb +32 -13
  37. data/lib/review/configure.rb +38 -0
  38. data/lib/review/ewbbuilder.rb +23 -21
  39. data/lib/review/extentions.rb +3 -0
  40. data/lib/review/extentions/object.rb +9 -0
  41. data/lib/review/{compat.rb → extentions/string.rb} +11 -0
  42. data/lib/review/htmlbuilder.rb +162 -74
  43. data/lib/review/htmlutils.rb +28 -1
  44. data/lib/review/i18n.yaml +11 -0
  45. data/lib/review/idgxmlbuilder.rb +119 -35
  46. data/lib/review/inaobuilder.rb +355 -0
  47. data/lib/review/latexbuilder.rb +133 -59
  48. data/lib/review/latexutils.rb +15 -6
  49. data/lib/review/makerhelper.rb +59 -0
  50. data/lib/review/markdownbuilder.rb +129 -0
  51. data/lib/review/preprocessor.rb +20 -7
  52. data/lib/review/review.tex.erb +250 -0
  53. data/lib/review/textutils.rb +28 -3
  54. data/lib/review/tocparser.rb +20 -12
  55. data/lib/review/tocprinter.rb +7 -3
  56. data/lib/review/topbuilder.rb +44 -27
  57. data/lib/review/version.rb +3 -0
  58. data/review.gemspec +20 -117
  59. data/test/book_test_helper.rb +35 -0
  60. data/test/sample-book/README.md +5 -0
  61. data/test/sample-book/src/CHAPS +2 -0
  62. data/test/sample-book/src/PREDEF +1 -0
  63. data/test/sample-book/src/Rakefile +26 -0
  64. data/test/sample-book/src/_cover.html +3 -0
  65. data/test/sample-book/src/ch01.re +71 -0
  66. data/test/sample-book/src/ch02.re +3 -0
  67. data/test/sample-book/src/config.yml +55 -0
  68. data/test/sample-book/src/images/ch01-imgsample.jpg +0 -0
  69. data/test/sample-book/src/images/cover.jpg +0 -0
  70. data/test/sample-book/src/main.css +251 -0
  71. data/test/sample-book/src/preface.re +15 -0
  72. data/test/sample-book/src/sty/jumoline.sty +310 -0
  73. data/test/sample-book/src/sty/samplemacro.sty +21 -0
  74. data/test/sample-book/src/vendor/jumoline/README +29 -0
  75. data/test/sample-book/src/vendor/jumoline/jumoline.dtx +2988 -0
  76. data/test/sample-book/src/vendor/jumoline/jumoline.ins +6 -0
  77. data/test/test_book.rb +26 -646
  78. data/test/test_book_chapter.rb +418 -0
  79. data/test/test_book_parameter.rb +42 -0
  80. data/test/test_book_part.rb +53 -0
  81. data/test/test_builder.rb +17 -10
  82. data/test/test_compiler.rb +46 -0
  83. data/test/test_epubmaker.rb +1 -1
  84. data/test/test_epubmaker_cmd.rb +36 -0
  85. data/test/test_helper.rb +17 -0
  86. data/test/test_htmlbuilder.rb +156 -24
  87. data/test/test_htmlutils.rb +4 -0
  88. data/test/test_i18n.rb +6 -2
  89. data/test/test_idgxmlbuilder.rb +33 -11
  90. data/test/test_inaobuilder.rb +247 -0
  91. data/test/test_index.rb +31 -0
  92. data/test/test_latexbuilder.rb +115 -35
  93. data/test/test_makerhelper.rb +50 -0
  94. data/test/test_pdfmaker_cmd.rb +36 -0
  95. data/test/test_preprocessor.rb +7 -7
  96. data/test/test_topbuilder.rb +6 -7
  97. data/test/test_uuid.rb +1 -0
  98. metadata +117 -12
  99. data/lib/review/index.rb +0 -323
  100. data/lib/review/volume.rb +0 -66
@@ -29,16 +29,17 @@ module ReVIEW
29
29
  puts
30
30
  end
31
31
 
32
- Compiler.defsyntax(:emlist, :block, 0..1) {|args|
33
- if args[0] and not args[0] == 'noescape'
34
- raise SyntaxError, "unknown //emlist option: #{args[0]}"
35
- end
36
- }
32
+ # Compiler.defsyntax(:emlist, :block, 0..1) {|args|
33
+ # if args[0] and not args[0] == 'noescape'
34
+ # raise SyntaxError, "unknown //emlist option: #{args[0]}"
35
+ # end
36
+ # }
37
37
 
38
- def emlist(lines, noescape = false)
38
+ def emlist(lines, caption = nil)
39
39
  firstline = f.lineno
40
40
  puts
41
- puts '//lst1{'
41
+ puts caption
42
+ puts "//lst1"
42
43
  lines.each do |line|
43
44
  if noescape
44
45
  puts detab(line)
@@ -50,15 +51,16 @@ module ReVIEW
50
51
  puts
51
52
  end
52
53
 
53
- Compiler.defsyntax(:cmd, :block, 0..1) {|args|
54
- if args[0] and not args[0] == 'noescape'
55
- raise SyntaxError, "unknown //cmd option: #{args[0]}"
56
- end
57
- }
54
+ # Compiler.defsyntax(:cmd, :block, 0..1) {|args|
55
+ # if args[0] and not args[0] == 'noescape'
56
+ # raise SyntaxError, "unknown //cmd option: #{args[0]}"
57
+ # end
58
+ # }
58
59
 
59
- def cmd(lines, noescape = false)
60
+ def cmd(lines, caption = nil)
60
61
  puts
61
- puts '//sc1{'
62
+ puts caption
63
+ puts "//sc1{"
62
64
  lines.each do |line|
63
65
  if noescape
64
66
  puts detab(line)
@@ -73,15 +75,15 @@ module ReVIEW
73
75
  puts
74
76
  end
75
77
 
76
- Compiler.defsyntax(:list, :block, 0..1) {|args|
77
- if args[0] and not args[0] == 'noescape'
78
- raise SyntaxError, "unknown //list option: #{args[0]}"
79
- end
80
- }
78
+ # Compiler.defsyntax(:list, :block, 0..1) {|args|
79
+ # if args[0] and not args[0] == 'noescape'
80
+ # raise SyntaxError, "unknown //list option: #{args[0]}"
81
+ # end
82
+ # }
81
83
 
82
- def list(lines, noescape = false)
84
+ def list(lines, id, caption)
83
85
  puts
84
- puts "//l#{list_number(ident)} " + caption
86
+ puts "//l#{list_number(id)} " + caption
85
87
  puts '//lst2{'
86
88
  lines.each do |line|
87
89
  puts escape(detab(line))
@@ -0,0 +1,3 @@
1
+ require 'review/extentions/object'
2
+ require 'review/extentions/string'
3
+
@@ -0,0 +1,9 @@
1
+ class Object
2
+ def blank?
3
+ respond_to?(:empty?) ? empty? : !self
4
+ end
5
+
6
+ def present?
7
+ !blank?
8
+ end
9
+ end
@@ -1,3 +1,7 @@
1
+ if defined?(Encoding) && Encoding.respond_to?("default_external")
2
+ Encoding.default_external = "UTF-8"
3
+ end
4
+
1
5
  unless String.method_defined?(:lines)
2
6
  # Ruby 1.8
3
7
  class String
@@ -20,3 +24,10 @@ else
20
24
  end
21
25
  end
22
26
  end
27
+
28
+ unless String.method_defined?(:each)
29
+ # Ruby 1.9
30
+ class String
31
+ alias each each_line
32
+ end
33
+ end
@@ -21,6 +21,7 @@ module ReVIEW
21
21
  include TextUtils
22
22
  include HTMLUtils
23
23
 
24
+ [:ref].each {|e| Compiler.definline(e) }
24
25
  Compiler.defblock(:memo, 0..1)
25
26
  Compiler.defblock(:tip, 0..1)
26
27
  Compiler.defblock(:info, 0..1)
@@ -50,7 +51,9 @@ module ReVIEW
50
51
  @subsection = 0
51
52
  @subsubsection = 0
52
53
  @subsubsubsection = 0
54
+ @column = 0
53
55
  @noindent = nil
56
+ @ol_num = nil
54
57
  end
55
58
  private :builder_init
56
59
 
@@ -68,25 +71,26 @@ module ReVIEW
68
71
  else
69
72
  # default XHTML header/footer
70
73
  header = <<EOT
71
- <?xml version="1.0" encoding="UTF-8"?>
74
+ <?xml version="1.0" encoding="#{ReVIEW.book.param["outencoding"] || :UTF-8}"?>
72
75
  EOT
73
76
 
74
77
  if ReVIEW.book.param["htmlversion"] == 5
75
78
  header += <<EOT
76
79
  <!DOCTYPE html>
80
+ <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ops="http://www.idpf.org/2007/ops" xml:lang="#{ReVIEW.book.param["language"]}">
81
+ <head>
82
+ <meta charset="#{ReVIEW.book.param["outencoding"] || :UTF-8}" />
77
83
  EOT
78
84
  else
79
85
  header += <<EOT
80
86
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
81
- EOT
82
- end
83
-
84
- header += <<EOT
85
87
  <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ops="http://www.idpf.org/2007/ops" xml:lang="#{ReVIEW.book.param["language"]}">
86
88
  <head>
87
- <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
89
+ <meta http-equiv="Content-Type" content="text/html;charset=#{ReVIEW.book.param["outencoding"] || :UTF-8}" />
88
90
  <meta http-equiv="Content-Style-Type" content="text/css" />
89
91
  EOT
92
+ end
93
+
90
94
  unless ReVIEW.book.param["stylesheet"].nil?
91
95
  ReVIEW.book.param["stylesheet"].each do |style|
92
96
  header += <<EOT
@@ -96,7 +100,7 @@ EOT
96
100
  end
97
101
  header += <<EOT
98
102
  <meta name="generator" content="ReVIEW" />
99
- <title>#{convert_outencoding(@chapter.title)}</title>
103
+ <title>#{convert_outencoding(strip_html(compile_inline(@chapter.title)), ReVIEW.book.param["outencoding"])}</title>
100
104
  </head>
101
105
  <body>
102
106
  EOT
@@ -104,7 +108,7 @@ EOT
104
108
  </body>
105
109
  </html>
106
110
  EOT
107
- header + messages() + @output.string + footer
111
+ header + messages() + convert_outencoding(@output.string, ReVIEW.book.param["outencoding"]) + footer
108
112
  end
109
113
  end
110
114
 
@@ -160,10 +164,17 @@ EOT
160
164
  @subsubsubsection = 0
161
165
  anchor = "#{@chapter.number}"
162
166
  if ReVIEW.book.param["secnolevel"] >= 1
163
- if @chapter.number.to_s =~ /\A\d+\Z/
164
- prefix = "#{I18n.t("chapter", @chapter.number)}#{I18n.t("chapter_postfix")}"
165
- elsif !@chapter.number.nil? && !@chapter.number.to_s.empty?
166
- prefix = "#{@chapter.number}#{I18n.t("chapter_postfix")}"
167
+ if @chapter.number.blank?
168
+ prefix = ""
169
+ else
170
+ placeholder = if @chapter.is_a? ReVIEW::Book::Part
171
+ 'part'
172
+ elsif @chapter.on_POSTDEF?
173
+ 'appendix'
174
+ else
175
+ 'chapter'
176
+ end
177
+ prefix = "#{I18n.t(placeholder, @chapter.number)}#{I18n.t("chapter_postfix")}"
167
178
  end
168
179
  end
169
180
  when 2
@@ -173,10 +184,10 @@ EOT
173
184
  @subsubsubsection = 0
174
185
  anchor = "#{@chapter.number}-#{@section}"
175
186
  if ReVIEW.book.param["secnolevel"] >= 2
176
- if @chapter.number.to_s =~ /\A\d+\Z/
177
- prefix = "#{@chapter.number}.#{@section} "
178
- elsif !@chapter.number.nil? && !@chapter.number.to_s.empty?
179
- prefix = "#{@chapter.number}.#{@section} "
187
+ if @chapter.number.blank? or @chapter.on_POSTDEF?
188
+ prefix = ""
189
+ else
190
+ prefix = "#{@chapter.number}.#{@section}#{I18n.t("chapter_postfix")}"
180
191
  end
181
192
  end
182
193
  when 3
@@ -185,10 +196,10 @@ EOT
185
196
  @subsubsubsection = 0
186
197
  anchor = "#{@chapter.number}-#{@section}-#{@subsection}"
187
198
  if ReVIEW.book.param["secnolevel"] >= 3
188
- if @chapter.number.to_s =~ /\A\d+\Z/
189
- prefix = "#{@chapter.number}.#{@section}.#{@subsection} "
190
- elsif !@chapter.number.nil? && !@chapter.number.to_s.empty?
191
- prefix = "#{@chapter.number}.#{@section}.#{@subsection} "
199
+ if @chapter.number.blank? or @chapter.on_POSTDEF?
200
+ prefix = ""
201
+ else
202
+ prefix = "#{@chapter.number}.#{@section}.#{@subsection}#{I18n.t("chapter_postfix")}"
192
203
  end
193
204
  end
194
205
  when 4
@@ -196,20 +207,20 @@ EOT
196
207
  @subsubsubsection = 0
197
208
  anchor = "#{@chapter.number}-#{@section}-#{@subsection}-#{@subsubsection}"
198
209
  if ReVIEW.book.param["secnolevel"] >= 4
199
- if @chapter.number.to_s =~ /\A\d+\Z/
200
- prefix = "#{@chapter.number}.#{@section}.#{@subsection}.#{@subsubsection} "
201
- elsif !@chapter.number.nil? && !@chapter.number.to_s.empty?
202
- prefix = "#{@chapter.number}.#{@section}.#{@subsection}.#{@subsubsection} "
210
+ if @chapter.number.blank? or @chapter.on_POSTDEF?
211
+ prefix = ""
212
+ else
213
+ prefix = "#{@chapter.number}.#{@section}.#{@subsection}.#{@subsubsection}#{I18n.t("chapter_postfix")}"
203
214
  end
204
215
  end
205
216
  when 5
206
217
  @subsubsubsection += 1
207
218
  anchor = "#{@chapter.number}-#{@section}-#{@subsection}-#{@subsubsection}-#{@subsubsubsection}"
208
219
  if ReVIEW.book.param["secnolevel"] >= 5
209
- if @chapter.number.to_s =~ /\A\d+\Z/
210
- prefix = "#{@chapter.number}.#{@section}.#{@subsection}.#{@subsubsection}.#{@subsubsubsection} "
211
- elsif !@chapter.number.nil? && !@chapter.number.to_s.empty?
212
- prefix = "#{@chapter.number}.#{@section}.#{@subsection}.#{@subsubsection}.#{@subsubsubsection} "
220
+ if @chapter.number.blank? or @chapter.on_POSTDEF?
221
+ prefix = ""
222
+ else
223
+ prefix = "#{@chapter.number}.#{@section}.#{@subsection}.#{@subsubsection}.#{@subsubsubsection}#{I18n.t("chapter_postfix")}"
213
224
  end
214
225
  end
215
226
  end
@@ -222,7 +233,7 @@ EOT
222
233
  puts '' if level > 1
223
234
  a_id = ""
224
235
  unless anchor.nil?
225
- a_id = %Q[<a id="h#{anchor}" />]
236
+ a_id = %Q[<a id="h#{anchor}"></a>]
226
237
  end
227
238
  if caption.empty?
228
239
  puts a_id unless label.nil?
@@ -251,7 +262,21 @@ EOT
251
262
 
252
263
  def column_begin(level, label, caption)
253
264
  puts %Q[<div class="column">]
254
- headline(level, label, caption)
265
+
266
+ @column += 1
267
+ puts '' if level > 1
268
+ a_id = %Q[<a id="column-#{@column}"></a>]
269
+
270
+ if caption.empty?
271
+ puts a_id unless label.nil?
272
+ else
273
+ if label.nil?
274
+ puts %Q[<h#{level}>#{a_id}#{compile_inline(caption)}</h#{level}>]
275
+ else
276
+ puts %Q[<h#{level} id="#{label}">#{a_id}#{compile_inline(caption)}</h#{level}>]
277
+ end
278
+ end
279
+ # headline(level, label, caption)
255
280
  end
256
281
 
257
282
  def column_end(level)
@@ -381,7 +406,12 @@ EOT
381
406
  end
382
407
 
383
408
  def ol_begin
384
- puts '<ol>'
409
+ if @ol_num
410
+ puts "<ol start=\"#{@ol_num}\">" ## it's OK in HTML5, but not OK in XHTML1.1
411
+ @ol_num = nil
412
+ else
413
+ puts '<ol>'
414
+ end
385
415
  end
386
416
 
387
417
  def ol_item(lines, num)
@@ -439,42 +469,46 @@ EOT
439
469
  rescue KeyError
440
470
  error "no such list: #{id}"
441
471
  end
442
- list_body lines
472
+ list_body id, lines
443
473
  puts '</div>'
444
474
  end
445
475
 
446
476
  def list_header(id, caption)
447
477
  if get_chap.nil?
448
- puts %Q[<p class="caption">#{I18n.t("list")}#{I18n.t("format_number_header_without_chapter", [@chapter.list(id).number])} #{compile_inline(caption)}</p>]
478
+ puts %Q[<p class="caption">#{I18n.t("list")}#{I18n.t("format_number_header_without_chapter", [@chapter.list(id).number])}#{I18n.t("caption_prefix")}#{compile_inline(caption)}</p>]
449
479
  else
450
- puts %Q[<p class="caption">#{I18n.t("list")}#{I18n.t("format_number_header", [get_chap, @chapter.list(id).number])} #{compile_inline(caption)}</p>]
480
+ puts %Q[<p class="caption">#{I18n.t("list")}#{I18n.t("format_number_header", [get_chap, @chapter.list(id).number])}#{I18n.t("caption_prefix")}#{compile_inline(caption)}</p>]
451
481
  end
452
482
  end
453
483
 
454
- def list_body(lines)
484
+ def list_body(id, lines)
485
+ id ||= ''
455
486
  print %Q[<pre class="list">]
456
- lines.each do |line|
457
- puts detab(line)
458
- end
487
+ body = lines.inject(''){|i, j| i + detab(j) + "\n"}
488
+ lexer = File.extname(id).gsub(/\./, '')
489
+ puts highlight(:body => body, :lexer => lexer, :format => 'html')
459
490
  puts '</pre>'
460
491
  end
461
492
 
462
- def source(lines, caption)
493
+ def source(lines, caption = nil)
463
494
  puts %Q[<div class="source-code">]
464
495
  source_header caption
465
- source_body lines
496
+ source_body caption, lines
466
497
  puts '</div>'
467
498
  end
468
499
 
469
500
  def source_header(caption)
470
- puts %Q[<p class="caption">#{compile_inline(caption)}</p>]
501
+ if caption.present?
502
+ puts %Q[<p class="caption">#{compile_inline(caption)}</p>]
503
+ end
471
504
  end
472
505
 
473
- def source_body(lines)
506
+ def source_body(id, lines)
507
+ id ||= ''
474
508
  print %Q[<pre class="source">]
475
- lines.each do |line|
476
- puts detab(line)
477
- end
509
+ body = lines.inject(''){|i, j| i + detab(j) + "\n"}
510
+ lexer = File.extname(id).gsub(/\./, '')
511
+ puts highlight(:body => body, :lexer => lexer, :format => 'html')
478
512
  puts '</pre>'
479
513
  end
480
514
 
@@ -495,7 +529,7 @@ EOT
495
529
  puts detab((i+1).to_s.rjust(2) + ": " + line)
496
530
  end
497
531
  puts '</pre>'
498
- end
532
+ end
499
533
 
500
534
  def emlist(lines, caption = nil)
501
535
  puts %Q[<div class="emlist-code">]
@@ -626,9 +660,9 @@ QUOTE
626
660
  def image_header(id, caption)
627
661
  puts %Q[<p class="caption">]
628
662
  if get_chap.nil?
629
- puts %Q[#{I18n.t("image")}#{I18n.t("format_number_header_without_chapter", [@chapter.image(id).number])} #{compile_inline(caption)}]
663
+ puts %Q[#{I18n.t("image")}#{I18n.t("format_number_header_without_chapter", [@chapter.image(id).number])}#{I18n.t("caption_prefix")}#{compile_inline(caption)}]
630
664
  else
631
- puts %Q[#{I18n.t("image")}#{I18n.t("format_number_header", [get_chap, @chapter.image(id).number])} #{compile_inline(caption)}]
665
+ puts %Q[#{I18n.t("image")}#{I18n.t("format_number_header", [get_chap, @chapter.image(id).number])}#{I18n.t("caption_prefix")}#{compile_inline(caption)}]
632
666
  end
633
667
  puts %Q[</p>]
634
668
  end
@@ -674,9 +708,9 @@ QUOTE
674
708
 
675
709
  def table_header(id, caption)
676
710
  if get_chap.nil?
677
- puts %Q[<p class="caption">#{I18n.t("table")}#{I18n.t("format_number_header_without_header", [@chapter.table(id).number])} #{compile_inline(caption)}</p>]
711
+ puts %Q[<p class="caption">#{I18n.t("table")}#{I18n.t("format_number_header_without_chapter", [@chapter.table(id).number])}#{I18n.t("caption_prefix")}#{compile_inline(caption)}</p>]
678
712
  else
679
- puts %Q[<p class="caption">#{I18n.t("table")}#{I18n.t("format_number_header", [get_chap, @chapter.table(id).number])} #{compile_inline(caption)}</p>]
713
+ puts %Q[<p class="caption">#{I18n.t("table")}#{I18n.t("format_number_header", [get_chap, @chapter.table(id).number])}#{I18n.t("caption_prefix")}#{compile_inline(caption)}</p>]
680
714
  end
681
715
  end
682
716
 
@@ -700,16 +734,20 @@ QUOTE
700
734
  puts '</table>'
701
735
  end
702
736
 
703
- def comment(str)
737
+ def comment(lines, comment = nil)
738
+ lines ||= []
739
+ lines.unshift comment unless comment.blank?
704
740
  if ReVIEW.book.param["draft"]
705
- puts %Q(<div class="draft-comment">#{escape_html(str)}</div>)
741
+ str = lines.map{|line| escape_html(line) }.join("<br />")
742
+ puts %Q(<div class="draft-comment">#{str}</div>)
706
743
  else
744
+ str = lines.join("\n")
707
745
  puts %Q(<!-- #{escape_html(str)} -->)
708
746
  end
709
747
  end
710
748
 
711
749
  def footnote(id, str)
712
- puts %Q(<div class="footnote"><p class="footnote"><a id="fn-#{id}">[*#{@chapter.footnote(id).number}] #{compile_inline(str)}</a></p></div>)
750
+ puts %Q(<div class="footnote"><p class="footnote">[<a id="fn-#{id}">*#{@chapter.footnote(id).number}</a>] #{compile_inline(str)}</p></div>)
713
751
  end
714
752
 
715
753
  def indepimage(id, caption="", metric=nil)
@@ -717,14 +755,14 @@ QUOTE
717
755
  caption = "" if caption.nil?
718
756
  puts %Q[<div class="image">]
719
757
  begin
720
- puts %Q[<img src="#{@chapter.image(id).path.sub(/\A\.\//, "")}" alt="#{caption}"#{metrics} />]
758
+ puts %Q[<img src="#{@chapter.image(id).path.sub(/\A\.\//, "")}" alt="#{escape_html(compile_inline(caption))}"#{metrics} />]
721
759
  rescue
722
760
  puts %Q[<pre>missing image: #{id}</pre>]
723
761
  end
724
762
 
725
763
  unless caption.empty?
726
764
  puts %Q[<p class="caption">]
727
- puts %Q[#{I18n.t("numberless_image")} #{compile_inline(caption)}]
765
+ puts %Q[#{I18n.t("numberless_image")}#{I18n.t("caption_prefix")}#{compile_inline(caption)}]
728
766
  puts %Q[</p>]
729
767
  end
730
768
  puts %Q[</div>]
@@ -737,7 +775,7 @@ QUOTE
737
775
  end
738
776
 
739
777
  def label(id)
740
- puts %Q(<a id="#{id}" />)
778
+ puts %Q(<a id="#{id}"></a>)
741
779
  end
742
780
 
743
781
  def linebreak
@@ -760,6 +798,12 @@ QUOTE
760
798
  @noindent = true
761
799
  end
762
800
 
801
+ def inline_labelref(idref)
802
+ %Q[<a target='#{escape_html(idref)}'>「●● #{escape_html(idref)}」</a>]
803
+ end
804
+
805
+ alias inline_ref inline_labelref
806
+
763
807
  def inline_chapref(id)
764
808
  if ReVIEW.book.param["chapterlink"]
765
809
  %Q(<a href="./#{id}.html">#{@chapter.env.chapter_index.display_string(id)}</a>)
@@ -784,7 +828,7 @@ QUOTE
784
828
 
785
829
  def inline_title(id)
786
830
  if ReVIEW.book.param["chapterlink"]
787
- %Q(<a href="./#{id}.html">#{@chapter.env.chapter_index.title(id)}</a>)
831
+ %Q(<a href="./#{id}.html">#{compile_inline(@chapter.env.chapter_index.title(id))}</a>)
788
832
  else
789
833
  @chapter.env.chapter_index.title(id)
790
834
  end
@@ -799,7 +843,11 @@ QUOTE
799
843
  end
800
844
 
801
845
  def compile_ruby(base, ruby)
802
- %Q[<ruby><rb>#{escape_html(base)}</rb><rp>(</rp><rt>#{ruby}</rt><rp>)</rp></ruby>]
846
+ if ReVIEW.book.param["htmlversion"] == 5
847
+ %Q[<ruby>#{escape_html(base)}<rp>#{I18n.t("ruby_prefix")}</rp><rt>#{ruby}</rt><rp>#{I18n.t("ruby_postfix")}</rp></ruby>]
848
+ else
849
+ %Q[<ruby><rb>#{escape_html(base)}</rb><rp>#{I18n.t("ruby_prefix")}</rp><rt>#{ruby}</rt><rp>#{I18n.t("ruby_postfix")}</rp></ruby>]
850
+ end
803
851
  end
804
852
 
805
853
  def compile_kw(word, alt)
@@ -823,12 +871,24 @@ QUOTE
823
871
  %Q(<span class="ami">#{escape_html(str)}</span>)
824
872
  end
825
873
 
874
+ def inline_bou(str)
875
+ %Q(<span class="bou">#{escape_html(str)}</span>)
876
+ end
877
+
826
878
  def inline_tti(str)
827
- %Q(<tt><i>#{escape_html(str)}</i></tt>)
879
+ if ReVIEW.book.param["htmlversion"] == 5
880
+ %Q(<code class="tt"><i>#{escape_html(str)}</i></code>)
881
+ else
882
+ %Q(<tt><i>#{escape_html(str)}</i></tt>)
883
+ end
828
884
  end
829
885
 
830
886
  def inline_ttb(str)
831
- %Q(<tt><b>#{escape_html(str)}</b></tt>)
887
+ if ReVIEW.book.param["htmlversion"] == 5
888
+ %Q(<code class="tt"><b>#{escape_html(str)}</b></code>)
889
+ else
890
+ %Q(<tt><b>#{escape_html(str)}</b></tt>)
891
+ end
832
892
  end
833
893
 
834
894
  def inline_dtp(str)
@@ -836,7 +896,11 @@ QUOTE
836
896
  end
837
897
 
838
898
  def inline_code(str)
839
- %Q(<tt class="inline-code">#{escape_html(str)}</tt>)
899
+ if ReVIEW.book.param["htmlversion"] == 5
900
+ %Q(<code class="inline-code tt">#{escape_html(str)}</code>)
901
+ else
902
+ %Q(<tt class="inline-code">#{escape_html(str)}</tt>)
903
+ end
840
904
  end
841
905
 
842
906
  def inline_idx(str)
@@ -865,7 +929,7 @@ QUOTE
865
929
  end
866
930
 
867
931
  def bibpaper(lines, id, caption)
868
- puts "<div>"
932
+ puts %Q[<div class="bibpaper">]
869
933
  bibpaper_header id, caption
870
934
  unless lines.empty?
871
935
  bibpaper_bibpaper id, caption, lines
@@ -874,17 +938,14 @@ QUOTE
874
938
  end
875
939
 
876
940
  def bibpaper_header(id, caption)
877
- puts %Q(<a id="bib-#{id}">)
878
- puts "[#{@chapter.bibpaper(id).number}] #{compile_inline(caption)}"
879
- puts %Q(</a>)
941
+ print %Q(<a id="bib-#{id}">)
942
+ print "[#{@chapter.bibpaper(id).number}]"
943
+ print %Q(</a>)
944
+ puts " #{compile_inline(caption)}"
880
945
  end
881
946
 
882
947
  def bibpaper_bibpaper(id, caption, lines)
883
- puts %Q(<p>)
884
- lines.each do |line|
885
- puts detab(line)
886
- end
887
- puts %Q(</p>)
948
+ print split_paragraph(lines).join("")
888
949
  end
889
950
 
890
951
  def inline_bib(id)
@@ -892,7 +953,18 @@ QUOTE
892
953
  end
893
954
 
894
955
  def inline_hd_chap(chap, id)
895
- "「#{chap.headline_index.number(id)} #{chap.headline(id).caption}」"
956
+ n = chap.headline_index.number(id)
957
+ if chap.number and ReVIEW.book.param["secnolevel"] >= n.split('.').size
958
+ str = "「#{n} #{compile_inline(chap.headline(id).caption)}」"
959
+ else
960
+ str = "「#{compile_inline(chap.headline(id).caption)}」"
961
+ end
962
+ if ReVIEW.book.param["chapterlink"]
963
+ anchor = "h"+n.gsub(/\./, "-")
964
+ %Q(<a href="#{chap.id}.html\##{anchor}">#{str}</a>)
965
+ else
966
+ str
967
+ end
896
968
  end
897
969
 
898
970
  def inline_list(id)
@@ -988,7 +1060,11 @@ QUOTE
988
1060
  end
989
1061
 
990
1062
  def inline_tt(str)
991
- inline_asis(str, "tt")
1063
+ if ReVIEW.book.param["htmlversion"] == 5
1064
+ %Q(<code class="tt">#{escape_html(str)}</code>)
1065
+ else
1066
+ %Q(<tt>#{escape_html(str)}</tt>)
1067
+ end
992
1068
  end
993
1069
 
994
1070
  def inline_del(str)
@@ -1003,12 +1079,16 @@ QUOTE
1003
1079
  %Q(<u>#{escape_html(str)}</u>)
1004
1080
  end
1005
1081
 
1006
- def inline_recipe(str)
1082
+ def inline_recipe(str)
1007
1083
  %Q(<span class="recipe">「#{escape_html(str)}」</span>)
1008
1084
  end
1009
1085
 
1010
1086
  def inline_icon(id)
1011
- %Q[<img src="#{@chapter.image(id).path.sub(/\A\.\//, "")}" alt="[#{id}]" />]
1087
+ begin
1088
+ %Q[<img src="#{@chapter.image(id).path.sub(/\A\.\//, "")}" alt="[#{id}]" />]
1089
+ rescue
1090
+ %Q[<pre>missing image: #{id}</pre>]
1091
+ end
1012
1092
  end
1013
1093
 
1014
1094
  def inline_uchar(str)
@@ -1047,9 +1127,17 @@ QUOTE
1047
1127
  end
1048
1128
  end
1049
1129
 
1130
+ def centering(lines)
1131
+ puts split_paragraph(lines).join("\n").gsub("<p>", "<p class=\"center\">")
1132
+ end
1133
+
1050
1134
  def image_ext
1051
1135
  "png"
1052
1136
  end
1137
+
1138
+ def olnum(num)
1139
+ @ol_num = num.to_i
1140
+ end
1053
1141
  end
1054
1142
 
1055
1143
  end # module ReVIEW