tmtms-review 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +9 -0
  3. data/COPYING +515 -0
  4. data/ChangeLog +2083 -0
  5. data/README.rdoc +50 -0
  6. data/Rakefile +56 -0
  7. data/VERSION +1 -0
  8. data/bin/review-check +178 -0
  9. data/bin/review-checkdep +63 -0
  10. data/bin/review-compile +205 -0
  11. data/bin/review-epubmaker +661 -0
  12. data/bin/review-epubmaker-ng +176 -0
  13. data/bin/review-index +118 -0
  14. data/bin/review-pdfmaker +208 -0
  15. data/bin/review-preproc +142 -0
  16. data/bin/review-validate +51 -0
  17. data/bin/review-vol +102 -0
  18. data/debian/README.Debian +12 -0
  19. data/debian/README.source +5 -0
  20. data/debian/changelog +5 -0
  21. data/debian/compat +1 -0
  22. data/debian/control +22 -0
  23. data/debian/copyright +62 -0
  24. data/debian/docs +6 -0
  25. data/debian/manpage.1.ex +59 -0
  26. data/debian/patches/path.diff +91 -0
  27. data/debian/patches/series +1 -0
  28. data/debian/review.install +13 -0
  29. data/debian/review.links +4 -0
  30. data/debian/rules +13 -0
  31. data/debian/source/format +1 -0
  32. data/doc/format.rdoc +582 -0
  33. data/doc/format_idg.rdoc +180 -0
  34. data/doc/libepubmaker/sample.yaml +90 -0
  35. data/doc/quickstart.rdoc +188 -0
  36. data/doc/ruby-uuid/README +11 -0
  37. data/doc/ruby-uuid/README.ja +34 -0
  38. data/doc/sample.css +108 -0
  39. data/doc/sample.yaml +62 -0
  40. data/lib/epubmaker.rb +28 -0
  41. data/lib/epubmaker/content.rb +82 -0
  42. data/lib/epubmaker/epubv2.rb +418 -0
  43. data/lib/epubmaker/epubv3.rb +249 -0
  44. data/lib/epubmaker/producer.rb +204 -0
  45. data/lib/epubmaker/resource.rb +66 -0
  46. data/lib/lineinput.rb +155 -0
  47. data/lib/review.rb +3 -0
  48. data/lib/review/book.rb +46 -0
  49. data/lib/review/book/base.rb +235 -0
  50. data/lib/review/book/chapter.rb +81 -0
  51. data/lib/review/book/compilable.rb +159 -0
  52. data/lib/review/book/index.rb +339 -0
  53. data/lib/review/book/page_metric.rb +38 -0
  54. data/lib/review/book/parameters.rb +97 -0
  55. data/lib/review/book/part.rb +44 -0
  56. data/lib/review/book/volume.rb +65 -0
  57. data/lib/review/builder.rb +444 -0
  58. data/lib/review/compiler.rb +550 -0
  59. data/lib/review/configure.rb +38 -0
  60. data/lib/review/epubbuilder.rb +18 -0
  61. data/lib/review/exception.rb +21 -0
  62. data/lib/review/extentions.rb +3 -0
  63. data/lib/review/extentions/object.rb +9 -0
  64. data/lib/review/extentions/string.rb +33 -0
  65. data/lib/review/htmlbuilder.rb +1097 -0
  66. data/lib/review/htmllayout.rb +19 -0
  67. data/lib/review/htmlutils.rb +36 -0
  68. data/lib/review/i18n.rb +30 -0
  69. data/lib/review/i18n.yaml +34 -0
  70. data/lib/review/idgxmlbuilder.rb +1145 -0
  71. data/lib/review/latexbuilder.rb +815 -0
  72. data/lib/review/latexindex.rb +35 -0
  73. data/lib/review/latexutils.rb +79 -0
  74. data/lib/review/preprocessor.rb +563 -0
  75. data/lib/review/review.tex.erb +232 -0
  76. data/lib/review/textbuilder.rb +17 -0
  77. data/lib/review/textutils.rb +66 -0
  78. data/lib/review/tocparser.rb +342 -0
  79. data/lib/review/tocprinter.rb +221 -0
  80. data/lib/review/topbuilder.rb +785 -0
  81. data/lib/review/unfold.rb +138 -0
  82. data/lib/uuid.rb +312 -0
  83. data/review.gemspec +141 -0
  84. data/test/CHAPS +2 -0
  85. data/test/bib.re +13 -0
  86. data/test/book_test_helper.rb +35 -0
  87. data/test/test.re +43 -0
  88. data/test/test_book.rb +598 -0
  89. data/test/test_book_chapter.rb +418 -0
  90. data/test/test_book_parameter.rb +42 -0
  91. data/test/test_book_part.rb +50 -0
  92. data/test/test_builder.rb +144 -0
  93. data/test/test_compiler.rb +44 -0
  94. data/test/test_epubmaker.rb +507 -0
  95. data/test/test_helper.rb +27 -0
  96. data/test/test_htmlbuilder.rb +554 -0
  97. data/test/test_htmlutils.rb +28 -0
  98. data/test/test_i18n.rb +64 -0
  99. data/test/test_idgxmlbuilder.rb +589 -0
  100. data/test/test_index.rb +31 -0
  101. data/test/test_latexbuilder.rb +656 -0
  102. data/test/test_lineinput.rb +198 -0
  103. data/test/test_preprocessor.rb +23 -0
  104. data/test/test_textutils.rb +68 -0
  105. data/test/test_topbuilder.rb +244 -0
  106. data/test/test_uuid.rb +156 -0
  107. metadata +161 -0
@@ -0,0 +1,19 @@
1
+ # Copyright (c) 2009 Narihiro Nakamura <authornari@gmail.com>
2
+ require 'erb'
3
+
4
+ class HTMLLayout
5
+ def initialize(src, title, template)
6
+ @body = src
7
+ @title = title
8
+ @template = template
9
+ end
10
+ attr_reader :body, :title
11
+
12
+ def result
13
+ if File.exist?(@template)
14
+ return ERB.new(IO.read(@template)).result(binding)
15
+ else
16
+ return @src
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,36 @@
1
+ #
2
+ # $Id: htmlutils.rb 2227 2006-05-13 00:09:08Z aamine $
3
+ #
4
+ # Copyright (c) 2002-2006 Minero Aoki
5
+ #
6
+ # This program is free software.
7
+ # You can distribute or modify this program under the terms of
8
+ # the GNU LGPL, Lesser General Public License version 2.1.
9
+ #
10
+
11
+ module ReVIEW
12
+
13
+ module HTMLUtils
14
+ ESC = {
15
+ '&' => '&amp;',
16
+ '<' => '&lt;',
17
+ '>' => '&gt;',
18
+ '"' => '&quot;'
19
+ }
20
+
21
+ def escape_html(str)
22
+ t = ESC
23
+ str.gsub(/[&"<>]/) {|c| t[c] }
24
+ end
25
+
26
+ def unescape_html(str)
27
+ # FIXME better code
28
+ str.gsub('&quot;', '"').gsub('&gt;', '>').gsub('&lt;', '<').gsub('&amp;', '&')
29
+ end
30
+
31
+ def strip_html(str)
32
+ str.gsub(/<\/?[^>]*>/, "")
33
+ end
34
+ end
35
+
36
+ end # module ReVIEW
@@ -0,0 +1,30 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'yaml'
3
+
4
+ module ReVIEW
5
+ class I18n
6
+ def self.setup
7
+ user_i18n = YAML.load_file(File.expand_path "locale.yaml", ENV["PWD"])
8
+ I18n.i18n user_i18n["locale"], user_i18n
9
+ rescue
10
+ I18n.i18n "ja"
11
+ end
12
+
13
+ def self.i18n(locale, user_i18n = {})
14
+ locale ||= "ja"
15
+ i18n_yaml_path = File.expand_path "i18n.yaml", File.dirname(__FILE__)
16
+ @i18n = YAML.load_file(i18n_yaml_path)[locale]
17
+ if @i18n
18
+ @i18n.merge!(user_i18n)
19
+ end
20
+ end
21
+
22
+ def self.t(str, args = nil)
23
+ @i18n[str] % args
24
+ rescue
25
+ str
26
+ end
27
+ end
28
+
29
+ I18n.setup
30
+ end
@@ -0,0 +1,34 @@
1
+ ja:
2
+ image: 図
3
+ table: 表
4
+ list: リスト
5
+ part: 第%d部
6
+ chapter: 第%d章
7
+ chapter_postfix: " "
8
+ appendix: 付録%s
9
+ numberless_image: "図:"
10
+ format_number: "%s.%d"
11
+ format_number_header: "%s.%d:"
12
+ format_number_without_chapter: "%d"
13
+ format_number_header_without_chapter: "%d:"
14
+ caption_prefix: " "
15
+ caption_prefix_idgxml: " "
16
+ ruby_prefix: "("
17
+ ruby_postfix: ")"
18
+
19
+ en:
20
+ image: "Figure "
21
+ table: "Table "
22
+ list: "List "
23
+ chapter: Chapter %d
24
+ chapter_postfix: ". "
25
+ appendix: Appendix %s
26
+ numberless_image: "Figure:"
27
+ format_number: "%s.%d"
28
+ format_number_header: "%s.%d:"
29
+ format_number_without_chapter: "%d"
30
+ format_number_header_without_chapter: "%d:"
31
+ caption_prefix: " "
32
+ caption_prefix_idgxml: " "
33
+ ruby_prefix: "("
34
+ ruby_postfix: ")"
@@ -0,0 +1,1145 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright (c) 2002-2007 Minero Aoki
4
+ # 2008-2012 Minero Aoki, Kenshi Muto
5
+ #
6
+ # This program is free software.
7
+ # You can distribute or modify this program under the terms of
8
+ # the GNU LGPL, Lesser General Public License version 2.1.
9
+ #
10
+
11
+ require 'review/builder'
12
+ require 'review/htmlutils'
13
+ require 'review/textutils'
14
+ require 'nkf'
15
+
16
+ module ReVIEW
17
+
18
+ class IDGXMLBuilder < Builder
19
+
20
+ include TextUtils
21
+ include HTMLUtils
22
+
23
+ [:ttbold, :hint, :maru, :keytop, :labelref, :ref, :pageref, :balloon].each {|e| Compiler.definline(e) }
24
+ Compiler.defsingle(:dtp, 1)
25
+
26
+ Compiler.defblock(:insn, 0..1)
27
+ Compiler.defblock(:memo, 0..1)
28
+ Compiler.defblock(:tip, 0..1)
29
+ Compiler.defblock(:info, 0..1)
30
+ Compiler.defblock(:planning, 0..1)
31
+ Compiler.defblock(:best, 0..1)
32
+ Compiler.defblock(:important, 0..1)
33
+ Compiler.defblock(:security, 0..1)
34
+ Compiler.defblock(:caution, 0..1)
35
+ Compiler.defblock(:notice, 0..1)
36
+ Compiler.defblock(:point, 0..1)
37
+ Compiler.defblock(:shoot, 0..1)
38
+ Compiler.defblock(:reference, 0)
39
+ Compiler.defblock(:term, 0)
40
+ Compiler.defblock(:link, 0..1)
41
+ Compiler.defblock(:practice, 0)
42
+ Compiler.defblock(:expert, 0)
43
+ Compiler.defblock(:rawblock, 0)
44
+
45
+ def pre_paragraph
46
+ '<p>'
47
+ end
48
+
49
+ def post_paragraph
50
+ '</p>'
51
+ end
52
+
53
+ def extname
54
+ '.xml'
55
+ end
56
+
57
+ def builder_init(no_error = false)
58
+ @no_error = no_error
59
+ end
60
+ private :builder_init
61
+
62
+ def builder_init_file
63
+ @warns = []
64
+ @errors = []
65
+ @section = 0
66
+ @subsection = 0
67
+ @subsubsection = 0
68
+ @subsubsubsection = 0
69
+ @noindent = nil
70
+ @rootelement = "doc"
71
+ @secttags = nil
72
+ @tsize = nil
73
+ @texblockequation = 0
74
+ @texinlineequation = 0
75
+
76
+ print %Q(<?xml version="1.0" encoding="UTF-8"?>\n)
77
+ print %Q(<#{@rootelement} xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/">)
78
+ alias puts print unless ReVIEW.book.param["nolf"].nil?
79
+ @secttags = true unless ReVIEW.book.param["structuredxml"].nil?
80
+ end
81
+ private :builder_init_file
82
+
83
+ def result
84
+ s = ""
85
+ unless @secttags.nil?
86
+ s += "</sect4>" if @subsubsubsection > 0
87
+ s += "</sect3>" if @subsubsection > 0
88
+ s += "</sect2>" if @subsection > 0
89
+ s += "</sect>" if @section > 0
90
+ s += "</chapter>" if @chapter.number > 0
91
+ end
92
+ messages() + @output.string + s + "</#{@rootelement}>\n"
93
+ end
94
+
95
+ def warn(msg)
96
+ if @no_error
97
+ @warns.push [@location.filename, @location.lineno, msg]
98
+ puts "----WARNING: #{escape_html(msg)}----"
99
+ else
100
+ $stderr.puts "#{@location}: warning: #{msg}"
101
+ end
102
+ end
103
+
104
+ def error(msg)
105
+ if @no_error
106
+ @errors.push [@location.filename, @location.lineno, msg]
107
+ puts "----ERROR: #{escape_html(msg)}----"
108
+ else
109
+ $stderr.puts "#{@location}: error: #{msg}"
110
+ end
111
+ end
112
+
113
+ def messages
114
+ error_messages() + warning_messages()
115
+ end
116
+
117
+ def error_messages
118
+ return '' if @errors.empty?
119
+ "<h2>Syntax Errors</h2>\n" +
120
+ "<ul>\n" +
121
+ @errors.map {|file, line, msg|
122
+ "<li>#{escape_html(file)}:#{line}: #{escape_html(msg.to_s)}</li>\n"
123
+ }.join('') +
124
+ "</ul>\n"
125
+ end
126
+
127
+ def warning_messages
128
+ return '' if @warns.empty?
129
+ "<h2>Warnings</h2>\n" +
130
+ "<ul>\n" +
131
+ @warns.map {|file, line, msg|
132
+ "<li>#{escape_html(file)}:#{line}: #{escape_html(msg)}</li>\n"
133
+ }.join('') +
134
+ "</ul>\n"
135
+ end
136
+
137
+ def headline(level, label, caption)
138
+ prefix = ""
139
+ case level
140
+ when 1
141
+ unless @secttags.nil?
142
+ print "</sect4>" if @subsubsubsection > 0
143
+ print "</sect3>" if @subsubsection > 0
144
+ print "</sect2>" if @subsection > 0
145
+ print "</sect>" if @section > 0
146
+ end
147
+
148
+ print %Q(<chapter id="chap:#{@chapter.number}">) unless @secttags.nil?
149
+ if @chapter.number.to_s =~ /\A\d+$/
150
+ prefix = "#{I18n.t("chapter", @chapter.number)}#{I18n.t("chapter_postfix")}"
151
+ elsif @chapter.number.present?
152
+ prefix = "#{@chapter.number}#{I18n.t("chapter_postfix")}"
153
+ end
154
+ @section = 0
155
+ @subsection = 0
156
+ @subsubsection = 0
157
+ @subsubsubsection = 0
158
+ when 2
159
+ unless @secttags.nil?
160
+ print "</sect4>" if @subsubsubsection > 0
161
+ print "</sect3>" if @subsubsection > 0
162
+ print "</sect2>" if @subsection > 0
163
+ print "</sect>" if @section > 0
164
+ end
165
+ @section += 1
166
+ print %Q(<sect id="sect:#{@chapter.number}.#{@section}">) unless @secttags.nil?
167
+
168
+ prefix = @chapter.present? ? "#{@chapter.number}.#{@section} " : ""
169
+
170
+ @subsection = 0
171
+ @subsubsection = 0
172
+ @subsubsubsection = 0
173
+ when 3
174
+ unless @secttags.nil?
175
+ print "</sect4>" if @subsubsubsection > 0
176
+ print "</sect3>" if @subsubsection > 0
177
+ print "</sect2>" if @subsection > 0
178
+ end
179
+
180
+ @subsection += 1
181
+ print %Q(<sect2 id="sect:#{@chapter.number}.#{@section}.#{@subsection}">) unless @secttags.nil?
182
+ prefix = @chapter.number.present? ? "#{@chapter.number}.#{@section}.#{@subsection}#{I18n.t("chapter_postfix")}" : ""
183
+
184
+ @subsubsection = 0
185
+ @subsubsubsection = 0
186
+ when 4
187
+ unless @secttags.nil?
188
+ print "</sect4>" if @subsubsubsection > 0
189
+ print "</sect3>" if @subsubsection > 0
190
+ end
191
+
192
+ @subsubsection += 1
193
+ print %Q(<sect3 id="sect:#{@chapter.number}.#{@section}.#{@subsection}.#{@subsubsection}">) unless @secttags.nil?
194
+ prefix = @chapter.number.present? ? "#{@chapter.number}.#{@section}.#{@subsection}.#{@subsubsection}#{I18n.t("chapter_postfix")}" : ""
195
+
196
+ @subsubsubsection = 0
197
+ when 5
198
+ unless @secttags.nil?
199
+ print "</sect4>" if @subsubsubsection > 0
200
+ end
201
+
202
+ @subsubsubsection += 1
203
+ print %Q(<sect4 id="sect:#{@chapter.number}.#{@section}.#{@subsection}.#{@subsubsection}.#{@subsubsubsection}">) unless @secttags.nil?
204
+ prefix = @chapter.number.present? ? "#{@chapter.number}.#{@section}.#{@subsection}.#{@subsubsection}.#{@subsubsubsection}#{I18n.t("chapter_postfix")}" : ""
205
+ else
206
+ raise "caption level too deep or unsupported: #{level}"
207
+ end
208
+
209
+ prefix = "" if (level.to_i > ReVIEW.book.param["secnolevel"])
210
+ label = label.nil? ? "" : " id=\"#{label}\""
211
+ toccaption = escape_html(compile_inline(caption.gsub(/@<fn>\{.+?\}/, '')).gsub(/<[^>]+>/, ''))
212
+ puts %Q(<title#{label} aid:pstyle="h#{level}">#{prefix}#{compile_inline(caption)}</title><?dtp level="#{level}" section="#{prefix}#{toccaption}"?>)
213
+ end
214
+
215
+ def ul_begin
216
+ level = block_given? ? yield : ""
217
+ level = nil if level == 1
218
+ puts "<ul#{level == 1 ? nil : level}>"
219
+ end
220
+
221
+ def ul_item(lines)
222
+ puts %Q(<li aid:pstyle="ul-item">#{lines.join.chomp}</li>)
223
+ end
224
+
225
+ def ul_item_begin(lines)
226
+ print %Q(<li aid:pstyle="ul-item">#{lines.join.chomp})
227
+ end
228
+
229
+ def ul_item_end
230
+ puts "</li>"
231
+ end
232
+
233
+ def choice_single_begin
234
+ puts "<choice type='single'>"
235
+ end
236
+
237
+ def choice_multi_begin
238
+ puts "<choice type='multi'>"
239
+ end
240
+
241
+ def choice_single_end
242
+ puts "</choice>"
243
+ end
244
+
245
+ def choice_multi_end
246
+ puts "</choice>"
247
+ end
248
+
249
+ def ul_end
250
+ level = block_given? ? yield : ""
251
+ level = nil if level == 1
252
+ puts "</ul#{level}>"
253
+ end
254
+
255
+ def ol_begin
256
+ puts '<ol>'
257
+ end
258
+
259
+ def ol_item(lines, num)
260
+ puts %Q(<li aid:pstyle="ol-item" num="#{num}">#{lines.join.chomp}</li>)
261
+ end
262
+
263
+ def ol_end
264
+ puts '</ol>'
265
+ end
266
+
267
+ def dl_begin
268
+ puts '<dl>'
269
+ end
270
+
271
+ def dt(line)
272
+ puts "<dt>#{line}</dt>"
273
+ end
274
+
275
+ def dd(lines)
276
+ puts "<dd>#{lines.join.chomp}</dd>"
277
+ end
278
+
279
+ def dl_end
280
+ puts '</dl>'
281
+ end
282
+
283
+ def paragraph(lines)
284
+ if @noindent.nil?
285
+ if lines[0] =~ /\A(\t+)/
286
+ puts %Q(<p inlist="#{$1.size}">#{lines.join('').sub(/\A\t+/, "")}</p>)
287
+ else
288
+ puts "<p>#{lines.join}</p>"
289
+ end
290
+ else
291
+ puts %Q(<p aid:pstyle="noindent" noindent='1'>#{lines.join}</p>)
292
+ @noindent = nil
293
+ end
294
+ end
295
+
296
+ def read(lines)
297
+ if ReVIEW.book.param["deprecated-blocklines"].nil?
298
+ puts %Q[<lead>#{split_paragraph(lines).join}</lead>]
299
+ else
300
+ puts %Q[<p aid:pstyle="lead">#{lines.join}</p>]
301
+ end
302
+ end
303
+
304
+ alias :lead read
305
+
306
+ def inline_list(id)
307
+ chapter, id = extract_chapter_id(id)
308
+ if get_chap(chapter).nil?
309
+ "<span type='list'>#{I18n.t("list")}#{I18n.t("format_number_without_chapter", [chapter.list(id).number])}</span>"
310
+ else
311
+ "<span type='list'>#{I18n.t("list")}#{I18n.t("format_number", [get_chap(chapter), chapter.list(id).number])}</span>"
312
+ end
313
+ end
314
+
315
+ def list_header(id, caption)
316
+ puts %Q[<codelist>]
317
+ if get_chap.nil?
318
+ 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>]
319
+ else
320
+ puts %Q[<caption>#{I18n.t("list")}#{I18n.t("format_number", [get_chap, @chapter.list(id).number])}#{I18n.t("caption_prefix_idgxml")}#{compile_inline(caption)}</caption>]
321
+ end
322
+ end
323
+
324
+ def list_body(lines)
325
+ print %Q(<pre>)
326
+ no = 1
327
+ lines.each do |line|
328
+ unless ReVIEW.book.param["listinfo"].nil?
329
+ print "<listinfo line=\"#{no}\""
330
+ print " begin=\"1\"" if no == 1
331
+ print " end=\"#{no}\"" if no == lines.size
332
+ print ">"
333
+ end
334
+ print detab(line)
335
+ print "\n"
336
+ print "</listinfo>" unless ReVIEW.book.param["listinfo"].nil?
337
+ no += 1
338
+ end
339
+ puts "</pre></codelist>"
340
+ end
341
+
342
+ def emlist(lines, caption = nil)
343
+ quotedlist lines, 'emlist', caption
344
+ end
345
+
346
+ def emlistnum(lines, caption = nil)
347
+ _lines = []
348
+ lines.each_with_index do |line, i|
349
+ _lines << detab("<span type='lineno'>" + (i + 1).to_s.rjust(2) + ": </span>" + line)
350
+ end
351
+ quotedlist _lines, 'emlistnum', caption
352
+ end
353
+
354
+ def listnum_body(lines)
355
+ print %Q(<pre>)
356
+ lines.each_with_index do |line, i|
357
+ print detab("<span type='lineno'>" + (i + 1).to_s.rjust(2) + ": </span>" + line)
358
+ print "\n"
359
+ end
360
+ puts "</pre></codelist>"
361
+ end
362
+
363
+ def cmd(lines, caption = nil)
364
+ quotedlist lines, 'cmd', caption
365
+ end
366
+
367
+ def quotedlist(lines, css_class, caption)
368
+ print %Q[<list type='#{css_class}'>]
369
+ puts "<caption aid:pstyle='#{css_class}-title'>#{compile_inline(caption)}</caption>" unless caption.nil?
370
+ print %Q[<pre>]
371
+ no = 1
372
+ lines.each do |line|
373
+ unless ReVIEW.book.param["listinfo"].nil?
374
+ print "<listinfo line=\"#{no}\""
375
+ print " begin=\"1\"" if no == 1
376
+ print " end=\"#{no}\"" if no == lines.size
377
+ print ">"
378
+ end
379
+ print detab(line)
380
+ print "\n"
381
+ print "</listinfo>" unless ReVIEW.book.param["listinfo"].nil?
382
+ no += 1
383
+ end
384
+ puts '</pre></list>'
385
+ end
386
+ private :quotedlist
387
+
388
+ def quote(lines)
389
+ if ReVIEW.book.param["deprecated-blocklines"].nil?
390
+ blocked_lines = split_paragraph(lines)
391
+ puts "<quote>#{blocked_lines.join("")}</quote>"
392
+ else
393
+ puts "<quote>#{lines.join("\n")}</quote>"
394
+ end
395
+ end
396
+
397
+ def inline_table(id)
398
+ chapter, id = extract_chapter_id(id)
399
+ if get_chap(chapter).nil?
400
+ "<span type='table'>#{I18n.t("table")}#{I18n.t("format_number_without_chapter", [chapter.table(id).number])}</span>"
401
+ else
402
+ "<span type='table'>#{I18n.t("table")}#{I18n.t("format_number", [get_chap(chapter), chapter.table(id).number])}</span>"
403
+ end
404
+ end
405
+
406
+ def inline_img(id)
407
+ chapter, id = extract_chapter_id(id)
408
+ if get_chap(chapter).nil?
409
+ "<span type='image'>#{I18n.t("image")}#{I18n.t("format_number_without_chapter", [chapter.image(id).number])}</span>"
410
+ else
411
+ "<span type='image'>#{I18n.t("image")}#{I18n.t("format_number", [get_chap(chapter), chapter.image(id).number])}</span>"
412
+ end
413
+ end
414
+
415
+ def handle_metric(str)
416
+ k, v = str.split('=', 2)
417
+ return %Q|#{k}=\"#{v.sub(/\A["']/, '').sub(/["']\Z/, '')}\"|
418
+ end
419
+
420
+ def result_metric(array)
421
+ " #{array.join(' ')}"
422
+ end
423
+
424
+ def image_image(id, caption, metric=nil)
425
+ metrics = parse_metric("idgxml", metric)
426
+ puts "<img>"
427
+ puts %Q[<Image href="file://#{@chapter.image(id).path.sub(/\A.\//, "")}"#{metrics} />]
428
+ image_header id, caption
429
+ puts "</img>"
430
+ end
431
+
432
+ def image_dummy(id, caption, lines)
433
+ if ReVIEW.book.param["subdirmode"]
434
+ warn "image file not exist: images/#{@chapter.id}/#{id}.eps" unless File.exist?("images/#{@chapter.id}/#{id}.eps")
435
+ elsif ReVIEW.book.param["singledirmode"]
436
+ warn "image file not exist: images/#{@chapter.id}/#{id}.eps" unless File.exist?("images/#{id}.eps")
437
+ else
438
+ warn "image file not exist: images/#{@chapter.id}-#{id}.eps" unless File.exist?("images/#{@chapter.id}-#{id}.eps")
439
+ end
440
+ puts "<img>"
441
+ print %Q[<pre aid:pstyle="dummyimage">]
442
+ lines.each do |line|
443
+ print detab(line)
444
+ print "\n"
445
+ end
446
+ print %Q[</pre>]
447
+ image_header id, caption
448
+ puts "</img>"
449
+ end
450
+
451
+ def image_header(id, caption)
452
+ if get_chap.nil?
453
+ puts %Q[<caption>#{I18n.t("image")}#{I18n.t("format_number_without_chapter", [@chapter.image(id).number])}#{I18n.t("caption_prefix_idgxml")}#{compile_inline(caption)}</caption>]
454
+ else
455
+ puts %Q[<caption>#{I18n.t("image")}#{I18n.t("format_number", [get_chap, @chapter.image(id).number])}#{I18n.t("caption_prefix_idgxml")}#{compile_inline(caption)}</caption>]
456
+ end
457
+ end
458
+
459
+ def texequation(lines)
460
+ @texblockequation += 1
461
+ puts %Q[<replace idref="texblock-#{@texblockequation}">]
462
+ puts '<pre>'
463
+ puts "#{lines.join("\n")}"
464
+ puts '</pre>'
465
+ puts '</replace>'
466
+ end
467
+
468
+ def table(lines, id = nil, caption = nil)
469
+ tablewidth = nil
470
+ col = 0
471
+ unless ReVIEW.book.param["tableopt"].nil?
472
+ tablewidth = ReVIEW.book.param["tableopt"].split(",")[0].to_f / 0.351 # mm -> pt
473
+ end
474
+ puts "<table>"
475
+ rows = []
476
+ sepidx = nil
477
+ lines.each_with_index do |line, idx|
478
+ if /\A[\=\-]{12}/ =~ line
479
+ sepidx ||= idx
480
+ next
481
+ end
482
+ if tablewidth.nil?
483
+ rows.push(line.gsub(/\t\.\t/, "\t\t").gsub(/\t\.\.\t/, "\t.\t").gsub(/\t\.\Z/, "\t").gsub(/\t\.\.\Z/, "\t.").gsub(/\A\./, ""))
484
+ else
485
+ rows.push(line.gsub(/\t\.\t/, "\tDUMMYCELLSPLITTER\t").gsub(/\t\.\.\t/, "\t.\t").gsub(/\t\.\Z/, "\tDUMMYCELLSPLITTER").gsub(/\t\.\.\Z/, "\t.").gsub(/\A\./, ""))
486
+ end
487
+ _col = rows[rows.length - 1].split(/\t/).length
488
+ col = _col if _col > col
489
+ end
490
+
491
+ cellwidth = []
492
+ unless tablewidth.nil?
493
+ if @tsize.nil?
494
+ col.times {|n| cellwidth[n] = tablewidth / col }
495
+ else
496
+ cellwidth = @tsize.split(/\s*,\s*/)
497
+ totallength = 0
498
+ cellwidth.size.times do |n|
499
+ cellwidth[n] = cellwidth[n].to_f / 0.351 # mm -> pt
500
+ totallength = totallength + cellwidth[n]
501
+ warn "total length exceeds limit for table: #{id}" if totallength > tablewidth
502
+ end
503
+ if cellwidth.size < col
504
+ cw = (tablewidth - totallength) / (col - cellwidth.size)
505
+ warn "auto cell sizing exceeds limit for table: #{id}" if cw <= 0
506
+ for i in cellwidth.size..(col - 1)
507
+ cellwidth[i] = cw
508
+ end
509
+ end
510
+ end
511
+ end
512
+
513
+ begin
514
+ table_header id, caption unless caption.nil?
515
+ rescue KeyError => err
516
+ error "no such table: #{id}"
517
+ end
518
+ return if rows.empty?
519
+
520
+ if tablewidth.nil?
521
+ print "<tbody>"
522
+ else
523
+ print %Q[<tbody xmlns:aid5="http://ns.adobe.com/AdobeInDesign/5.0/" aid:table="table" aid:trows="#{rows.length}" aid:tcols="#{col}">]
524
+ end
525
+
526
+ if sepidx
527
+ sepidx.times do |y|
528
+ if tablewidth.nil?
529
+ puts %Q[<tr type="header">#{rows.shift}</tr>]
530
+ else
531
+ i = 0
532
+ rows.shift.split(/\t/).each_with_index do |cell, x|
533
+ print %Q[<td xyh="#{x + 1},#{y + 1},#{sepidx}" aid:table="cell" aid:theader="1" aid:crows="1" aid:ccols="1" aid:ccolwidth="#{sprintf("%.13f", cellwidth[i])}">#{cell.sub("DUMMYCELLSPLITTER", "")}</td>]
534
+ i += 1
535
+ end
536
+ end
537
+ end
538
+ end
539
+ trputs(tablewidth, rows, cellwidth, sepidx)
540
+ puts "</tbody></table>"
541
+ @tsize = nil
542
+ end
543
+
544
+ def trputs(tablewidth, rows, cellwidth, sepidx)
545
+ sepidx = 0 if sepidx.nil?
546
+ if tablewidth.nil?
547
+ lastline = rows.pop
548
+ rows.each {|row| puts %Q[<tr>#{row}</tr>] }
549
+ puts %Q[<tr type="lastline">#{lastline}</tr>] unless lastline.nil?
550
+ else
551
+ rows.each_with_index do |row, y|
552
+ i = 0
553
+ row.split(/\t/).each_with_index do |cell, x|
554
+ print %Q[<td xyh="#{x + 1},#{y + 1 + sepidx},#{sepidx}" aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="#{sprintf("%.13f", cellwidth[i])}">#{cell.sub("DUMMYCELLSPLITTER", "")}</td>]
555
+ i += 1
556
+ end
557
+ end
558
+ end
559
+ end
560
+
561
+ def table_header(id, caption)
562
+ if get_chap.nil?
563
+ puts %Q[<caption>#{I18n.t("table")}#{I18n.t("format_number_without_chapter", [@chapter.table(id).number])}#{I18n.t("caption_prefix_idgxml")}#{compile_inline(caption)}</caption>]
564
+ else
565
+ puts %Q[<caption>#{I18n.t("table")}#{I18n.t("format_number", [get_chap, @chapter.table(id).number])}#{I18n.t("caption_prefix_idgxml")}#{compile_inline(caption)}</caption>]
566
+ end
567
+ end
568
+
569
+ def table_begin(ncols)
570
+ end
571
+
572
+ def tr(rows)
573
+ puts %Q[<tr>#{rows.join("\t")}</tr>]
574
+ end
575
+
576
+ def th(str)
577
+ %Q[<?dtp tablerow header?>#{str}]
578
+ end
579
+
580
+ def td(str)
581
+ str
582
+ end
583
+
584
+ def table_end
585
+ print "<?dtp tablerow last?>"
586
+ end
587
+
588
+ def comment(str)
589
+ print %Q(<!-- [Comment] #{escape_html(str)} -->)
590
+ end
591
+
592
+ def footnote(id, str)
593
+ # see inline_fn
594
+ end
595
+
596
+ def inline_fn(id)
597
+ %Q[<footnote>#{compile_inline(@chapter.footnote(id).content.strip)}</footnote>]
598
+ end
599
+
600
+ def compile_ruby(base, ruby)
601
+ %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>]
602
+ end
603
+
604
+ def compile_kw(word, alt)
605
+ '<keyword>' +
606
+ if alt
607
+ then escape_html("#{word}(#{alt.strip})")
608
+ else escape_html(word)
609
+ end +
610
+ '</keyword>' +
611
+ %Q[<index value="#{escape_html(word)}" />] +
612
+ if alt
613
+ alt.split(/\s*,\s*/).collect! {|e| %Q[<index value="#{escape_html(e.strip)}" />] }.join
614
+ else
615
+ ""
616
+ end
617
+ end
618
+
619
+ def compile_href(url, label)
620
+ %Q[<a linkurl='#{escape_html(url)}'>#{label.nil? ? escape_html(url) : escape_html(label)}</a>]
621
+ end
622
+
623
+ def inline_sup(str)
624
+ %Q[<sup>#{escape_html(str)}</sup>]
625
+ end
626
+
627
+ def inline_sub(str)
628
+ %Q[<sub>#{escape_html(str)}</sub>]
629
+ end
630
+
631
+ def inline_raw(str)
632
+ %Q[#{super(str).gsub("\\n", "\n")}]
633
+ end
634
+
635
+ def inline_hint(str)
636
+ if ReVIEW.book.param["nolf"].nil?
637
+ %Q[\n<hint>#{escape_html(str)}</hint>]
638
+ else
639
+ %Q[<hint>#{escape_html(str)}</hint>]
640
+ end
641
+ end
642
+
643
+ def inline_maru(str)
644
+ if str =~ /\A\d+\Z/
645
+ sprintf("&#x%x;", 9311 + str.to_i)
646
+ elsif str =~ /\A[A-Z]\Z/
647
+ begin
648
+ sprintf("&#x%x;", 9398 + str.codepoints.to_a[0] - 65)
649
+ rescue NoMethodError
650
+ sprintf("&#x%x;", 9398 + str[0] - 65)
651
+ end
652
+ elsif str =~ /\A[a-z]\Z/
653
+ begin
654
+ sprintf("&#x%x;", 9392 + str.codepoints.to_a[0] - 65)
655
+ rescue NoMethodError
656
+ sprintf("&#x%x;", 9392 + str[0] - 65)
657
+ end
658
+ else
659
+ raise "can't parse maru: #{str}"
660
+ end
661
+ end
662
+
663
+ def inline_idx(str)
664
+ %Q(#{escape_html(str)}<index value="#{escape_html(str)}" />)
665
+ end
666
+
667
+ def inline_hidx(str)
668
+ %Q(<index value="#{escape_html(str)}" />)
669
+ end
670
+
671
+ def inline_ami(str)
672
+ %Q(<ami>#{escape_html(str)}</ami>)
673
+ end
674
+
675
+ def inline_i(str)
676
+ %Q(<i>#{escape_html(str)}</i>)
677
+ end
678
+
679
+ def inline_b(str)
680
+ %Q(<b>#{escape_html(str)}</b>)
681
+ end
682
+
683
+ def inline_tt(str)
684
+ %Q(<tt>#{escape_html(str)}</tt>)
685
+ end
686
+
687
+ def inline_ttb(str)
688
+ index = escape_html(str).gsub(/<.*?>/, "").gsub(/\*/, "ESCAPED_ASTERISK").gsub(/'/, "&#27;")
689
+ %Q(<tt style='bold'>#{escape_html(str)}</tt><index value='#{index}' />)
690
+ end
691
+
692
+ alias :inline_ttbold inline_ttb
693
+
694
+ def inline_tti(str)
695
+ %Q(<tt style='italic'>#{escape_html(str)}</tt>)
696
+ end
697
+
698
+ def inline_u(str)
699
+ %Q(<underline>#{escape_html(str)}</underline>)
700
+ end
701
+
702
+ def inline_icon(id)
703
+ begin
704
+ %Q[<Image href="file://#{@chapter.image(id).path.sub(/\A\.\//, "")}" type="inline" />]
705
+ rescue
706
+ warn "no such icon image: #{id}"
707
+ ""
708
+ end
709
+ end
710
+
711
+ def inline_bou(str)
712
+ %Q[<bou>#{escape_html(str)}</bou>]
713
+ end
714
+
715
+ def inline_keytop(str)
716
+ %Q[<keytop>#{escape_html(str)}</keytop>]
717
+ end
718
+
719
+ def inline_labelref(idref)
720
+ %Q[<ref idref='#{escape_html(idref)}'>「●● #{escape_html(idref)}」</ref>] # FIXME:節名とタイトルも込みで要出力
721
+ end
722
+
723
+ alias inline_ref inline_labelref
724
+
725
+ def inline_pageref(idref)
726
+ %Q[<pageref idref='#{escape_html(idref)}'>●●</pageref>] # ページ番号を参照
727
+ end
728
+
729
+ def inline_balloon(str)
730
+ %Q[<balloon>#{escape_html(str).gsub(/@maru\[(\d+)\]/) {|m| inline_maru($1)}}</balloon>]
731
+ end
732
+
733
+ def inline_uchar(str)
734
+ %Q[&#x#{str};]
735
+ end
736
+
737
+ def inline_m(str)
738
+ @texinlineequation += 1
739
+ %Q[<replace idref="texinline-#{@texinlineequation}"><pre>#{escape_html(str)}</pre></replace>]
740
+ end
741
+
742
+ def noindent
743
+ @noindent = true
744
+ end
745
+
746
+ def linebreak
747
+ # FIXME:pが閉じちゃってるので一度戻らないといけないが、難しい…。
748
+ puts "<br />"
749
+ end
750
+
751
+ def pagebreak
752
+ puts "<pagebreak />"
753
+ end
754
+
755
+ def nonum_begin(level, label, caption)
756
+ puts %Q[<title aid:pstyle="h#{level}">#{compile_inline(caption)}</title><?dtp level="#{level}" section="#{escape_html(compile_inline(caption))}"?>]
757
+ end
758
+
759
+ def nonum_end(level)
760
+ end
761
+
762
+ def circle_begin(level, label, caption)
763
+ puts %Q[<title aid:pstyle="smallcircle">&#x2022;#{compile_inline(caption)}</title>]
764
+ end
765
+
766
+ def circle_end(level)
767
+ end
768
+
769
+ def common_column_begin(type, caption)
770
+ print "<#{type}column>"
771
+ puts %Q[<title aid:pstyle="#{type}column-title">#{compile_inline(caption)}</title>]
772
+ end
773
+
774
+ def common_column_end(type)
775
+ puts "</#{type}column>"
776
+ end
777
+
778
+ def column_begin(level, label, caption)
779
+ common_column_begin("", caption)
780
+ end
781
+
782
+ def column_end(level)
783
+ common_column_end("")
784
+ end
785
+
786
+ def xcolumn_begin(level, label, caption)
787
+ common_column_begin("x", caption)
788
+ end
789
+
790
+ def xcolumn_end(level)
791
+ common_column_end("x")
792
+ end
793
+
794
+ def world_begin(level, label, caption)
795
+ common_column_begin("world", caption)
796
+ end
797
+
798
+ def world_end(level)
799
+ common_column_end("world")
800
+ end
801
+
802
+ def hood_begin(level, label, caption)
803
+ common_column_begin("hood", caption)
804
+ end
805
+
806
+ def hood_end(level)
807
+ common_column_end("hood")
808
+ end
809
+
810
+ def edition_begin(level, label, caption)
811
+ common_column_begin("edition", caption)
812
+ end
813
+
814
+ def edition_end(level)
815
+ common_column_end("edition")
816
+ end
817
+
818
+ def insideout_begin(level, label, caption)
819
+ common_column_begin("insideout", caption)
820
+ end
821
+
822
+ def insideout_end(level)
823
+ common_column_end("insideout")
824
+ end
825
+
826
+ def ref_begin(level, label, caption)
827
+ if !label.nil?
828
+ puts "<reference id='#{label}'>"
829
+ else
830
+ puts "<reference>"
831
+ end
832
+ end
833
+
834
+ def ref_end(level)
835
+ puts "</reference>"
836
+ end
837
+
838
+ def sup_begin(level, label, caption)
839
+ if !label.nil?
840
+ puts "<supplement id='#{label}'>"
841
+ else
842
+ puts "<supplement>"
843
+ end
844
+ end
845
+
846
+ def sup_end(level)
847
+ puts "</supplement>"
848
+ end
849
+
850
+ def flushright(lines)
851
+ if ReVIEW.book.param["deprecated-blocklines"].nil?
852
+ puts split_paragraph(lines).join.gsub("<p>", "<p align='right'>")
853
+ else
854
+ puts "<p align='right'>#{lines.join("\n")}</p>"
855
+ end
856
+ end
857
+
858
+ def centering(lines)
859
+ puts split_paragraph(lines).join.gsub("<p>", "<p align='center'>")
860
+ end
861
+
862
+ def captionblock(type, lines, caption, specialstyle = nil)
863
+ print "<#{type}>"
864
+ style = specialstyle.nil? ? "#{type}-title" : specialstyle
865
+ puts "<title aid:pstyle='#{style}'>#{compile_inline(caption)}</title>" unless caption.nil?
866
+ if ReVIEW.book.param["deprecated-blocklines"].nil?
867
+ blocked_lines = split_paragraph(lines)
868
+ puts "#{blocked_lines.join}</#{type}>"
869
+ else
870
+ puts "#{lines.join("\n")}</#{type}>"
871
+ end
872
+ end
873
+
874
+ def note(lines, caption = nil)
875
+ captionblock("note", lines, caption)
876
+ end
877
+
878
+ def memo(lines, caption = nil)
879
+ captionblock("memo", lines, caption)
880
+ end
881
+
882
+ def tip(lines, caption = nil)
883
+ captionblock("tip", lines, caption)
884
+ end
885
+
886
+ def info(lines, caption = nil)
887
+ captionblock("info", lines, caption)
888
+ end
889
+
890
+ def planning(lines, caption = nil)
891
+ captionblock("planning", lines, caption)
892
+ end
893
+
894
+ def best(lines, caption = nil)
895
+ captionblock("best", lines, caption)
896
+ end
897
+
898
+ def important(lines, caption = nil)
899
+ captionblock("important", lines, caption)
900
+ end
901
+
902
+ def security(lines, caption = nil)
903
+ captionblock("security", lines, caption)
904
+ end
905
+
906
+ def caution(lines, caption = nil)
907
+ captionblock("caution", lines, caption)
908
+ end
909
+
910
+ def term(lines)
911
+ captionblock("term", lines, nil)
912
+ end
913
+
914
+ def link(lines, caption = nil)
915
+ captionblock("link", lines, caption)
916
+ end
917
+
918
+ def notice(lines, caption = nil)
919
+ if caption.nil?
920
+ captionblock("notice", lines, nil)
921
+ else
922
+ captionblock("notice-t", lines, caption, "notice-title")
923
+ end
924
+ end
925
+
926
+ def point(lines, caption = nil)
927
+ if caption.nil?
928
+ captionblock("point", lines, nil)
929
+ else
930
+ captionblock("point-t", lines, caption, "point-title")
931
+ end
932
+ end
933
+
934
+ def shoot(lines, caption = nil)
935
+ if caption.nil?
936
+ captionblock("shoot", lines, nil)
937
+ else
938
+ captionblock("shoot-t", lines, caption, "shoot-title")
939
+ end
940
+ end
941
+
942
+ def reference(lines)
943
+ captionblock("reference", lines, nil)
944
+ end
945
+
946
+ def practice(lines)
947
+ captionblock("practice", lines, nil)
948
+ end
949
+
950
+ def expert(lines)
951
+ captionblock("expert", lines, nil)
952
+ end
953
+
954
+ def syntaxblock(type, lines, caption)
955
+ if caption.nil?
956
+ puts %Q[<#{type}>]
957
+ else
958
+ titleopentag = %Q[caption aid:pstyle="#{type}-title"]
959
+ titleclosetag = "caption"
960
+ if type == "insn"
961
+ titleopentag = %Q[floattitle type="insn"]
962
+ titleclosetag = "floattitle"
963
+ end
964
+ puts %Q[<#{type}><#{titleopentag}>#{compile_inline(caption)}</#{titleclosetag}>]
965
+ end
966
+ no = 1
967
+ lines.each do |line|
968
+ unless ReVIEW.book.param["listinfo"].nil?
969
+ print %Q[<listinfo line="#{no}"]
970
+ print %Q[ begin="1"] if no == 1
971
+ print %Q[ end="#{no}"] if no == lines.size
972
+ print %Q[>]
973
+ end
974
+ print detab(line)
975
+ print "\n"
976
+ print "</listinfo>" unless ReVIEW.book.param["listinfo"].nil?
977
+ no += 1
978
+ end
979
+ puts "</#{type}>"
980
+ end
981
+
982
+ def insn(lines, caption = nil)
983
+ syntaxblock("insn", lines, caption)
984
+ end
985
+
986
+ def box(lines, caption = nil)
987
+ syntaxblock("box", lines, caption)
988
+ end
989
+
990
+ def indepimage(id, caption=nil, metric=nil)
991
+ metrics = parse_metric("idgxml", metric)
992
+ puts "<img>"
993
+ begin
994
+ puts %Q[<Image href="file://#{@chapter.image(id).path.sub(/\A\.\//, "")}"#{metrics} />]
995
+ rescue
996
+ warn %Q[no such image: #{id}]
997
+ end
998
+ puts %Q[<caption>#{compile_inline(caption)}</caption>] if !caption.nil? && !caption.empty?
999
+ puts "</img>"
1000
+ end
1001
+
1002
+ alias :numberlessimage indepimage
1003
+
1004
+ def label(id)
1005
+ # FIXME
1006
+ print "<label id='#{id}' />"
1007
+ end
1008
+
1009
+ def tsize(str)
1010
+ @tsize = str
1011
+ end
1012
+
1013
+ def dtp(str)
1014
+ print %Q(<?dtp #{str} ?>)
1015
+ end
1016
+
1017
+ def hr
1018
+ print "<hr />"
1019
+ end
1020
+
1021
+ def bpo(lines)
1022
+ puts %Q[<bpo>#{lines.join("\n")}</bpo>]
1023
+ end
1024
+
1025
+ def inline_dtp(str)
1026
+ "<?dtp #{str} ?>"
1027
+ end
1028
+
1029
+ def inline_code(str)
1030
+ %Q[<tt type='inline-code'>#{escape_html(str)}</tt>]
1031
+ end
1032
+
1033
+ def inline_br(str)
1034
+ "\n"
1035
+ end
1036
+
1037
+ def rawblock(lines)
1038
+ no = 1
1039
+ lines.each do |l|
1040
+ print l.gsub("&lt;", "<").gsub("&gt;", ">").gsub("&quot;", "\"").gsub("&amp;", "&")
1041
+ print "\n" unless lines.length == no
1042
+ no = no + 1
1043
+ end
1044
+ end
1045
+
1046
+ def text(str)
1047
+ str
1048
+ end
1049
+
1050
+ def inline_chapref(id)
1051
+ chs = ["", "「", "」"]
1052
+ unless ReVIEW.book.param["chapref"].nil?
1053
+ _chs = convert_inencoding(ReVIEW.book.param["chapref"],
1054
+ ReVIEW.book.param["inencoding"]).split(",")
1055
+ if _chs.size != 3
1056
+ error "--chapsplitter must have exactly 3 parameters with comma."
1057
+ else
1058
+ chs = _chs
1059
+ end
1060
+ else
1061
+ end
1062
+ s = "#{chs[0]}#{@chapter.env.chapter_index.number(id)}#{chs[1]}#{@chapter.env.chapter_index.title(id)}#{chs[2]}"
1063
+ if ReVIEW.book.param["chapterlink"]
1064
+ %Q(<link href="#{id}">#{s}</link>)
1065
+ else
1066
+ s
1067
+ end
1068
+ rescue KeyError
1069
+ error "unknown chapter: #{id}"
1070
+ nofunc_text("[UnknownChapter:#{id}]")
1071
+ end
1072
+
1073
+ def inline_chap(id)
1074
+ if ReVIEW.book.param["chapterlink"]
1075
+ %Q(<link href="#{id}">#{@chapter.env.chapter_index.number(id)}</link>)
1076
+ else
1077
+ @chapter.env.chapter_index.number(id)
1078
+ end
1079
+ rescue KeyError
1080
+ error "unknown chapter: #{id}"
1081
+ nofunc_text("[UnknownChapter:#{id}]")
1082
+ end
1083
+
1084
+ def inline_title(id)
1085
+ if ReVIEW.book.param["chapterlink"]
1086
+ %Q(<link href="#{id}">#{@chapter.env.chapter_index.title(id)}</link>)
1087
+ else
1088
+ @chapter.env.chapter_index.title(id)
1089
+ end
1090
+ rescue KeyError
1091
+ error "unknown chapter: #{id}"
1092
+ nofunc_text("[UnknownChapter:#{id}]")
1093
+ end
1094
+
1095
+ def source_header(caption)
1096
+ puts %Q[<source>]
1097
+ puts %Q[<caption>#{compile_inline(caption)}</caption>]
1098
+ end
1099
+
1100
+ def source_body(lines)
1101
+ puts %Q[<pre>]
1102
+ lines.each do |line|
1103
+ print detab(line)
1104
+ print "\n"
1105
+ end
1106
+ puts %Q[</pre></source>]
1107
+ end
1108
+
1109
+ def bibpaper(lines, id, caption)
1110
+ bibpaper_header id, caption
1111
+ unless lines.empty?
1112
+ bibpaper_bibpaper id, caption, lines
1113
+ end
1114
+ puts %Q(</bibitem>)
1115
+ end
1116
+
1117
+ def bibpaper_header(id, caption)
1118
+ puts %Q(<bibitem id="bib-#{id}">)
1119
+ puts "<caption><span type='bibno'>[#{@chapter.bibpaper(id).number}] </span>#{compile_inline(caption)}</caption>"
1120
+ end
1121
+
1122
+ def bibpaper_bibpaper(id, caption, lines)
1123
+ print split_paragraph(lines).join("")
1124
+ end
1125
+
1126
+ def inline_bib(id)
1127
+ %Q(<span type='bibref' idref='#{id}'>[#{@chapter.bibpaper(id).number}]</span>)
1128
+ end
1129
+
1130
+ def inline_recipe(id)
1131
+ # FIXME
1132
+ %Q(<recipe idref="#{escape_html(id)}">[XXX]「#{escape_html(id)}」 p.XX</recipe>)
1133
+ end
1134
+
1135
+ def nofunc_text(str)
1136
+ escape_html(str)
1137
+ end
1138
+
1139
+ def image_ext
1140
+ "eps"
1141
+ end
1142
+
1143
+ end
1144
+
1145
+ end # module ReVIEW