review-peg 0.1.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 (174) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +36 -0
  3. data/.rubocop.yml +47 -0
  4. data/.rubocop_todo.yml +605 -0
  5. data/.travis.yml +18 -0
  6. data/COPYING +515 -0
  7. data/ChangeLog +2449 -0
  8. data/Dockerfile +22 -0
  9. data/Gemfile +6 -0
  10. data/README.rdoc +81 -0
  11. data/Rakefile +51 -0
  12. data/bin/review-catalog-converter-peg +129 -0
  13. data/bin/review-check-peg +169 -0
  14. data/bin/review-checkdep-peg +63 -0
  15. data/bin/review-compile-peg +202 -0
  16. data/bin/review-epubmaker-legacy-peg +1024 -0
  17. data/bin/review-epubmaker-peg +44 -0
  18. data/bin/review-index-peg +110 -0
  19. data/bin/review-init-peg +151 -0
  20. data/bin/review-pdfmaker-peg +18 -0
  21. data/bin/review-preproc-peg +131 -0
  22. data/bin/review-validate-peg +51 -0
  23. data/bin/review-vol-peg +100 -0
  24. data/debian/README.Debian +12 -0
  25. data/debian/README.source +5 -0
  26. data/debian/changelog +5 -0
  27. data/debian/compat +1 -0
  28. data/debian/control +22 -0
  29. data/debian/copyright +62 -0
  30. data/debian/docs +6 -0
  31. data/debian/manpage.1.ex +59 -0
  32. data/debian/patches/path.diff +91 -0
  33. data/debian/patches/series +1 -0
  34. data/debian/review.install +13 -0
  35. data/debian/review.links +4 -0
  36. data/debian/rules +13 -0
  37. data/debian/source/format +1 -0
  38. data/doc/NEWS.ja.md +350 -0
  39. data/doc/NEWS.md +354 -0
  40. data/doc/catalog.ja.md +53 -0
  41. data/doc/catalog.md +52 -0
  42. data/doc/format.ja.md +734 -0
  43. data/doc/format.md +746 -0
  44. data/doc/format_idg.ja.md +203 -0
  45. data/doc/quickstart.ja.md +222 -0
  46. data/doc/quickstart.md +252 -0
  47. data/doc/ruby-uuid/README +11 -0
  48. data/doc/ruby-uuid/README.ja +34 -0
  49. data/doc/sample.css +108 -0
  50. data/doc/sample.yml +238 -0
  51. data/lib/epubmaker.rb +24 -0
  52. data/lib/epubmaker/content.rb +93 -0
  53. data/lib/epubmaker/epubcommon.rb +424 -0
  54. data/lib/epubmaker/epubv2.rb +139 -0
  55. data/lib/epubmaker/epubv3.rb +222 -0
  56. data/lib/epubmaker/producer.rb +330 -0
  57. data/lib/lineinput.rb +107 -0
  58. data/lib/review.rb +3 -0
  59. data/lib/review/book.rb +43 -0
  60. data/lib/review/book/base.rb +401 -0
  61. data/lib/review/book/chapter.rb +100 -0
  62. data/lib/review/book/compilable.rb +184 -0
  63. data/lib/review/book/image_finder.rb +71 -0
  64. data/lib/review/book/index.rb +413 -0
  65. data/lib/review/book/page_metric.rb +47 -0
  66. data/lib/review/book/part.rb +54 -0
  67. data/lib/review/book/volume.rb +67 -0
  68. data/lib/review/builder.rb +452 -0
  69. data/lib/review/catalog.rb +52 -0
  70. data/lib/review/compiler.rb +5183 -0
  71. data/lib/review/compiler/literals_1_9.kpeg +22 -0
  72. data/lib/review/compiler/literals_1_9.rb +435 -0
  73. data/lib/review/configure.rb +64 -0
  74. data/lib/review/epubbuilder.rb +18 -0
  75. data/lib/review/epubmaker.rb +480 -0
  76. data/lib/review/ewbbuilder.rb +381 -0
  77. data/lib/review/exception.rb +21 -0
  78. data/lib/review/extentions.rb +4 -0
  79. data/lib/review/extentions/array.rb +25 -0
  80. data/lib/review/extentions/object.rb +9 -0
  81. data/lib/review/extentions/string.rb +33 -0
  82. data/lib/review/htmlbuilder.rb +1166 -0
  83. data/lib/review/htmllayout.rb +41 -0
  84. data/lib/review/htmltoc.rb +45 -0
  85. data/lib/review/htmlutils.rb +90 -0
  86. data/lib/review/i18n.rb +96 -0
  87. data/lib/review/i18n.yml +169 -0
  88. data/lib/review/idgxmlbuilder.rb +1233 -0
  89. data/lib/review/inaobuilder.rb +357 -0
  90. data/lib/review/latexbuilder.rb +941 -0
  91. data/lib/review/latexindex.rb +35 -0
  92. data/lib/review/latexutils.rb +95 -0
  93. data/lib/review/layout.tex.erb +340 -0
  94. data/lib/review/lineinput.rb +17 -0
  95. data/lib/review/location.rb +24 -0
  96. data/lib/review/makerhelper.rb +67 -0
  97. data/lib/review/markdownbuilder.rb +339 -0
  98. data/lib/review/node.rb +288 -0
  99. data/lib/review/pdfmaker.rb +332 -0
  100. data/lib/review/preprocessor.rb +530 -0
  101. data/lib/review/review.kpeg +745 -0
  102. data/lib/review/sec_counter.rb +69 -0
  103. data/lib/review/template.rb +21 -0
  104. data/lib/review/textbuilder.rb +17 -0
  105. data/lib/review/textutils.rb +16 -0
  106. data/lib/review/tocparser.rb +348 -0
  107. data/lib/review/tocprinter.rb +205 -0
  108. data/lib/review/topbuilder.rb +796 -0
  109. data/lib/review/unfold.rb +138 -0
  110. data/lib/review/version.rb +3 -0
  111. data/lib/uuid.rb +312 -0
  112. data/review.gemspec +32 -0
  113. data/templates/html/layout-html5.html.erb +17 -0
  114. data/templates/html/layout-xhtml1.html.erb +20 -0
  115. data/templates/ncx/epubv2.ncx.erb +11 -0
  116. data/templates/opf/epubv2.opf.erb +21 -0
  117. data/templates/opf/epubv3.opf.erb +18 -0
  118. data/templates/xml/container.xml.erb +6 -0
  119. data/test/CHAPS +2 -0
  120. data/test/assets/test.xml.erb +3 -0
  121. data/test/assets/test_template.tex +255 -0
  122. data/test/assets/test_template_backmatter.tex +32 -0
  123. data/test/bib.re +13 -0
  124. data/test/book_test_helper.rb +35 -0
  125. data/test/sample-book/README.md +7 -0
  126. data/test/sample-book/src/Rakefile +58 -0
  127. data/test/sample-book/src/_cover.html +3 -0
  128. data/test/sample-book/src/catalog.yml +10 -0
  129. data/test/sample-book/src/ch01.re +71 -0
  130. data/test/sample-book/src/ch02.re +3 -0
  131. data/test/sample-book/src/config.yml +186 -0
  132. data/test/sample-book/src/images/ch01-imgsample.jpg +0 -0
  133. data/test/sample-book/src/images/cover.jpg +0 -0
  134. data/test/sample-book/src/preface.re +15 -0
  135. data/test/sample-book/src/sty/jumoline.sty +310 -0
  136. data/test/sample-book/src/sty/reviewmacro.sty +39 -0
  137. data/test/sample-book/src/style.css +251 -0
  138. data/test/sample-book/src/vendor/jumoline/README +29 -0
  139. data/test/sample-book/src/vendor/jumoline/jumoline.dtx +2988 -0
  140. data/test/sample-book/src/vendor/jumoline/jumoline.ins +6 -0
  141. data/test/test.re +43 -0
  142. data/test/test_book.rb +556 -0
  143. data/test/test_book_chapter.rb +280 -0
  144. data/test/test_book_part.rb +54 -0
  145. data/test/test_builder.rb +80 -0
  146. data/test/test_catalog.rb +119 -0
  147. data/test/test_catalog_converter_cmd.rb +73 -0
  148. data/test/test_compiler.rb +92 -0
  149. data/test/test_configure.rb +50 -0
  150. data/test/test_epub3maker.rb +529 -0
  151. data/test/test_epubmaker.rb +569 -0
  152. data/test/test_epubmaker_cmd.rb +40 -0
  153. data/test/test_helper.rb +92 -0
  154. data/test/test_htmlbuilder.rb +1114 -0
  155. data/test/test_htmltoc.rb +32 -0
  156. data/test/test_htmlutils.rb +50 -0
  157. data/test/test_i18n.rb +180 -0
  158. data/test/test_idgxmlbuilder.rb +608 -0
  159. data/test/test_image_finder.rb +82 -0
  160. data/test/test_inaobuilder.rb +245 -0
  161. data/test/test_index.rb +174 -0
  162. data/test/test_latexbuilder.rb +732 -0
  163. data/test/test_lineinput.rb +182 -0
  164. data/test/test_makerhelper.rb +66 -0
  165. data/test/test_markdownbuilder.rb +125 -0
  166. data/test/test_pdfmaker.rb +171 -0
  167. data/test/test_pdfmaker_cmd.rb +40 -0
  168. data/test/test_preprocessor.rb +23 -0
  169. data/test/test_review_ext.rb +31 -0
  170. data/test/test_template.rb +26 -0
  171. data/test/test_textutils.rb +32 -0
  172. data/test/test_topbuilder.rb +291 -0
  173. data/test/test_uuid.rb +157 -0
  174. metadata +357 -0
@@ -0,0 +1,47 @@
1
+ #
2
+ # $Id: book.rb 4315 2009-09-02 04:15:24Z kmuto $
3
+ #
4
+ # Copyright (c) 2002-2008 Minero Aoki
5
+ # 2009 Minero Aoki, Kenshi Muto
6
+ #
7
+ # This program is free software.
8
+ # You can distribute or modify this program under the terms of
9
+ # the GNU LGPL, Lesser General Public License version 2.1.
10
+ # For details of the GNU LGPL, see the file "COPYING".
11
+ #
12
+ module ReVIEW
13
+ module Book
14
+ class PageMetric
15
+
16
+ MetricData = Struct.new(:n_lines, :n_columns)
17
+
18
+ def initialize(list_lines, list_columns, text_lines, text_columns, page_per_kbyte)
19
+ @list = MetricData.new(list_lines, list_columns)
20
+ @text = MetricData.new(text_lines, text_columns)
21
+ @page_per_kbyte = page_per_kbyte
22
+ end
23
+
24
+ A5 = PageMetric.new(46, 80, 30, 74, 1)
25
+ B5 = PageMetric.new(46, 80, 30, 74, 2)
26
+
27
+ # backward compatible
28
+ def PageMetric.a5
29
+ ReVIEW::Book::PageMetric::A5
30
+ end
31
+
32
+ # backward compatible
33
+ def PageMetric.b5
34
+ ReVIEW::Book::PageMetric::B5
35
+ end
36
+
37
+ attr_reader :list
38
+ attr_reader :text
39
+ attr_reader :page_per_kbyte
40
+
41
+ def ==(other)
42
+ self.list == other.list && self.text == other.text && self.page_per_kbyte == other.page_per_kbyte
43
+ end
44
+
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,54 @@
1
+ #
2
+ # $Id: book.rb 4315 2009-09-02 04:15:24Z kmuto $
3
+ #
4
+ # Copyright (c) 2002-2008 Minero Aoki
5
+ # 2009-2014 Minero Aoki, Kenshi Muto
6
+ #
7
+ # This program is free software.
8
+ # You can distribute or modify this program under the terms of
9
+ # the GNU LGPL, Lesser General Public License version 2.1.
10
+ # For details of the GNU LGPL, see the file "COPYING".
11
+ #
12
+ require 'review/book/compilable'
13
+ module ReVIEW
14
+ module Book
15
+ class Part
16
+ include Compilable
17
+
18
+ def initialize(book, number, chapters, name="")
19
+ @book = book
20
+ @number = number
21
+ @chapters = chapters
22
+ @path = name
23
+ @name = name ? File.basename(name, '.re') : nil
24
+ end
25
+
26
+ attr_reader :number
27
+ attr_reader :chapters
28
+ attr_reader :name
29
+
30
+ def each_chapter(&block)
31
+ @chapters.each(&block)
32
+ end
33
+
34
+ def volume
35
+ vol = Volume.sum(@chapters.map {|chap| chap.volume })
36
+ vol.page_per_kbyte = @book.page_metric.page_per_kbyte
37
+ vol
38
+ end
39
+
40
+ def file?
41
+ (name.present? and path =~ /\.re\z/) ? true : false
42
+ end
43
+
44
+ def format_number(heading = true)
45
+ if heading
46
+ "#{I18n.t("part", @number)}"
47
+ else
48
+ "#{@number}"
49
+ end
50
+ end
51
+
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,67 @@
1
+ #
2
+ # $Id: volume.rb 3883 2008-02-10 11:48:23Z aamine $
3
+ #
4
+ # Copyright (c) 2002-2007 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
+ # For details of the GNU LGPL, see the file "COPYING".
10
+ #
11
+ module ReVIEW
12
+ module Book
13
+ class Volume
14
+
15
+ def Volume.count_file(path)
16
+ b = c = l = 0
17
+ File.foreach(path) do |line|
18
+ next if %r<\A\#@> =~ line
19
+ text = line.gsub(/\s+/, '')
20
+ b += text.bytesize
21
+ c += text.charsize
22
+ l += 1
23
+ end
24
+ new(b, c, l)
25
+ end
26
+
27
+ def Volume.sum(vols)
28
+ vols.inject(new()) {|sum, i| sum + i }
29
+ end
30
+
31
+ def Volume.dummy
32
+ new(-1, -1, -1)
33
+ end
34
+
35
+ def initialize(bytes = 0, chars = 0, lines = 0)
36
+ @bytes = bytes
37
+ @chars = chars
38
+ @lines = lines
39
+ @page_per_kbyte = nil
40
+ end
41
+
42
+ attr_reader :bytes
43
+ attr_reader :chars
44
+ attr_accessor :lines
45
+ attr_accessor :page_per_kbyte
46
+
47
+ def kbytes
48
+ (@bytes.to_f / 1024).ceil
49
+ end
50
+
51
+ def page
52
+ (kbytes.to_f/@page_per_kbyte).ceil
53
+ end
54
+
55
+ def to_s
56
+ "#{kbytes()}KB #{@chars}C #{@lines}L #{page()}P"
57
+ end
58
+
59
+ def +(other)
60
+ Volume.new(@bytes + other.bytes,
61
+ @chars + other.chars,
62
+ @lines + other.lines)
63
+ end
64
+
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,452 @@
1
+ # encoding: utf-8
2
+ #
3
+ # Copyright (c) 2002-2014 Minero Aoki, Kenshi Muto
4
+ #
5
+ # This program is free software.
6
+ # You can distribute or modify this program under the terms of
7
+ # the GNU LGPL, Lesser General Public License version 2.1.
8
+ #
9
+
10
+ require 'review/book/index'
11
+ require 'review/exception'
12
+ require 'review/textutils'
13
+ require 'review/compiler'
14
+ require 'review/sec_counter'
15
+ require 'stringio'
16
+ require 'cgi'
17
+
18
+ module ReVIEW
19
+
20
+ class Builder
21
+ include TextUtils
22
+
23
+ CAPTION_TITLES = %w(note memo tip info planning best important security caution term link notice point shoot reference practice expert)
24
+
25
+ attr_accessor :output
26
+ attr_accessor :ast
27
+
28
+ def pre_paragraph
29
+ nil
30
+ end
31
+ def post_paragraph
32
+ nil
33
+ end
34
+
35
+ def initialize(strict = false, *args)
36
+ @strict = strict
37
+ builder_init(*args)
38
+ end
39
+
40
+ def builder_init(*args)
41
+ end
42
+ private :builder_init
43
+
44
+ def bind(compiler, chapter, location)
45
+ @compiler = compiler
46
+ @chapter = chapter
47
+ @location = location
48
+ @ast = nil
49
+ @output = StringIO.new
50
+ @book = @chapter.book if @chapter.present?
51
+ @tabwidth = nil
52
+ if @book && @book.config && @book.config["tabwidth"]
53
+ @tabwidth = @book.config["tabwidth"]
54
+ end
55
+ builder_init_file
56
+ end
57
+
58
+ def builder_init_file
59
+ @sec_counter = SecCounter.new(5, @chapter)
60
+ end
61
+ private :builder_init_file
62
+
63
+ def result
64
+ @output.string
65
+ end
66
+
67
+ alias_method :raw_result, :result
68
+
69
+ def print(*s)
70
+ raise NotImplementedError, "XXX: `print` method is obsoleted. Do not use it."
71
+ end
72
+
73
+ def puts(*s)
74
+ raise NotImplementedError, "XXX: `puts` method is obsoleted. Do not use it."
75
+ end
76
+
77
+ def target_name
78
+ self.class.to_s.gsub(/ReVIEW::/, '').gsub(/Builder/, '').downcase
79
+ end
80
+
81
+ def headline_prefix(level)
82
+ @sec_counter.inc(level)
83
+ anchor = @sec_counter.anchor(level)
84
+ prefix = @sec_counter.prefix(level, @book.config["secnolevel"])
85
+ [prefix, anchor]
86
+ end
87
+ private :headline_prefix
88
+
89
+ def list(lines, id, caption = nil, lang = nil)
90
+ buf = ""
91
+ begin
92
+ buf << list_header(id, caption, lang)
93
+ rescue KeyError
94
+ error "no such list: #{id}"
95
+ end
96
+ buf << list_body(id, lines, lang)
97
+ buf
98
+ end
99
+
100
+ def listnum(lines, id, caption = nil, lang = nil)
101
+ buf = ""
102
+ begin
103
+ buf << list_header(id, caption, lang)
104
+ rescue KeyError
105
+ error "no such list: #{id}"
106
+ end
107
+ buf << listnum_body(lines, lang)
108
+ buf
109
+ end
110
+
111
+ def source(lines, caption = nil)
112
+ buf = ""
113
+ buf << source_header(caption)
114
+ buf << source_body(lines, lang)
115
+ buf
116
+ end
117
+
118
+ def image(lines, id, caption, metric = nil)
119
+ if @chapter.image(id).bound?
120
+ image_image id, caption, metric
121
+ else
122
+ warn "image not bound: #{id}" if @strict
123
+ image_dummy id, caption, lines
124
+ end
125
+ end
126
+
127
+ def table(lines, id = nil, caption = nil)
128
+ buf = ""
129
+ rows = []
130
+ sepidx = nil
131
+ lines.each_with_index do |line, idx|
132
+ if /\A[\=\-]{12}/ =~ line
133
+ # just ignore
134
+ #error "too many table separator" if sepidx
135
+ sepidx ||= idx
136
+ next
137
+ end
138
+ rows.push line.strip.split(/\t+/).map {|s| s.sub(/\A\./, '') }
139
+ end
140
+ rows = adjust_n_cols(rows)
141
+
142
+ begin
143
+ buf << table_header(id, caption) unless caption.nil?
144
+ rescue KeyError
145
+ error "no such table: #{id}"
146
+ end
147
+ return buf if rows.empty?
148
+ buf << table_begin(rows.first.size)
149
+ if sepidx
150
+ sepidx.times do
151
+ buf << tr(rows.shift.map {|s| th(s) })
152
+ end
153
+ rows.each do |cols|
154
+ buf << tr(cols.map {|s| td(s) })
155
+ end
156
+ else
157
+ rows.each do |cols|
158
+ h, *cs = *cols
159
+ buf << tr([th(h)] + cs.map {|s| td(s) })
160
+ end
161
+ end
162
+ buf << table_end
163
+ buf
164
+ end
165
+
166
+ def adjust_n_cols(rows)
167
+ rows.each do |cols|
168
+ while cols.last and cols.last.strip.empty?
169
+ cols.pop
170
+ end
171
+ end
172
+ n_maxcols = rows.map {|cols| cols.size }.max
173
+ rows.each do |cols|
174
+ cols.concat [''] * (n_maxcols - cols.size)
175
+ end
176
+ rows
177
+ end
178
+ private :adjust_n_cols
179
+
180
+ #def footnote(id, str)
181
+ # @footnotes.push [id, str]
182
+ #end
183
+ #
184
+ #def flush_footnote
185
+ # footnote_begin
186
+ # @footnotes.each do |id, str|
187
+ # footnote_item(id, str)
188
+ # end
189
+ # footnote_end
190
+ #end
191
+
192
+ # def compile_inline(s)
193
+ # @compiler.text(s)
194
+ # end
195
+
196
+ def inline_chapref(id)
197
+ @book.chapter_index.display_string(id)
198
+ rescue KeyError
199
+ error "unknown chapter: #{id}"
200
+ nofunc_text("[UnknownChapter:#{id}]")
201
+ end
202
+
203
+ def inline_chap(id)
204
+ @book.chapter_index.number(id)
205
+ rescue KeyError
206
+ error "unknown chapter: #{id}"
207
+ nofunc_text("[UnknownChapter:#{id}]")
208
+ end
209
+
210
+ def inline_title(id)
211
+ @book.chapter_index.title(id)
212
+ rescue KeyError
213
+ error "unknown chapter: #{id}"
214
+ nofunc_text("[UnknownChapter:#{id}]")
215
+ end
216
+
217
+ def inline_list(id)
218
+ "#{I18n.t("list")}#{@chapter.list(id).number}"
219
+ rescue KeyError
220
+ error "unknown list: #{id}"
221
+ nofunc_text("[UnknownList:#{id}]")
222
+ end
223
+
224
+ def inline_img(id)
225
+ "#{I18n.t("image")}#{@chapter.image(id).number}"
226
+ rescue KeyError
227
+ error "unknown image: #{id}"
228
+ nofunc_text("[UnknownImage:#{id}]")
229
+ end
230
+
231
+ def inline_imgref(id)
232
+ img = inline_img(id)
233
+
234
+ if @chapter.image(id).caption
235
+ "#{img}#{I18n.t('image_quote', @chapter.image(id).caption)}"
236
+ else
237
+ img
238
+ end
239
+ end
240
+
241
+ def inline_table(id)
242
+ "#{I18n.t("table")}#{@chapter.table(id).number}"
243
+ rescue KeyError
244
+ error "unknown table: #{id}"
245
+ nofunc_text("[UnknownTable:#{id}]")
246
+ end
247
+
248
+ def inline_fn(id)
249
+ @chapter.footnote(id).content
250
+ rescue KeyError
251
+ error "unknown footnote: #{id}"
252
+ nofunc_text("[UnknownFootnote:#{id}]")
253
+ end
254
+
255
+ def inline_bou(str)
256
+ text(str)
257
+ end
258
+
259
+ def inline_ruby(base, ruby)
260
+ compile_ruby(base, ruby)
261
+ end
262
+
263
+ def inline_kw(word, alt = nil)
264
+ compile_kw(word, alt)
265
+ end
266
+
267
+ def inline_href(url, label = nil)
268
+ url = url.strip
269
+ label = label.strip if label
270
+ compile_href(url, label)
271
+ end
272
+
273
+ def text(str)
274
+ str
275
+ end
276
+
277
+ def bibpaper(lines, id, caption)
278
+ buf = ""
279
+ buf << bibpaper_header(id, caption)
280
+ unless lines.empty?
281
+ buf << "\n"
282
+ buf << bibpaper_bibpaper(id, caption, lines)
283
+ end
284
+ buf << "\n"
285
+ buf
286
+ end
287
+
288
+ def node_inline_hd(nodelist)
289
+ id = nodelist[0].to_raw
290
+ m = /\A([^|]+)\|(.+)/.match(id)
291
+ chapter = @book.chapters.detect{|chap| chap.id == m[1]} if m && m[1]
292
+ return inline_hd_chap(chapter, m[2]) if chapter
293
+ return inline_hd_chap(@chapter, id)
294
+ end
295
+
296
+ def inline_column(id)
297
+ @chapter.column(id).caption
298
+ rescue
299
+ error "unknown column: #{id}"
300
+ nofunc_text("[UnknownColumn:#{id}]")
301
+ end
302
+
303
+ def raw(str)
304
+ if matched = str.match(/\|(.*?)\|(.*)/)
305
+ builders = matched[1].split(/,/).map{|i| i.gsub(/\s/, '') }
306
+ c = target_name
307
+ if builders.include?(c)
308
+ matched[2].gsub("\\n", "\n")
309
+ else
310
+ ""
311
+ end
312
+ else
313
+ str.gsub("\\n", "\n")
314
+ end
315
+ end
316
+
317
+ def warn(msg)
318
+ $stderr.puts "#{@location}: warning: #{msg}"
319
+ end
320
+
321
+ def error(msg)
322
+ raise ApplicationError, "error: #{msg} at #{@compiler.show_pos} \n (#{@compiler.failure_oneline})"
323
+ end
324
+
325
+ def handle_metric(str)
326
+ str
327
+ end
328
+
329
+ def result_metric(array)
330
+ array.join(',')
331
+ end
332
+
333
+ def parse_metric(type, metric)
334
+ return "" if metric.blank?
335
+ params = metric.split(/,\s*/)
336
+ results = []
337
+ params.each do |p|
338
+ if p =~ /\A.+?::/
339
+ if p =~ /\A#{type}::/
340
+ p.sub!(/\A#{type}::/, '')
341
+ else
342
+ next
343
+ end
344
+ end
345
+ p = handle_metric(p)
346
+ results.push(p)
347
+ end
348
+ return result_metric(results)
349
+ end
350
+
351
+ def get_chap(chapter = @chapter)
352
+ if @book.config["secnolevel"] > 0 && !chapter.number.nil? && !chapter.number.to_s.empty?
353
+ return chapter.format_number(nil)
354
+ end
355
+ return nil
356
+ end
357
+
358
+ def extract_chapter_id(chap_ref)
359
+ m = /\A([\w+-]+)\|(.+)/.match(chap_ref)
360
+ if m
361
+ return [@book.chapters.detect{|chap| chap.id == m[1]}, m[2]]
362
+ else
363
+ return [@chapter, chap_ref]
364
+ end
365
+ end
366
+
367
+ def captionblock(type, lines, caption, specialstyle = nil)
368
+ raise NotImplementedError
369
+ end
370
+
371
+ CAPTION_TITLES.each do |name|
372
+ class_eval %Q{
373
+ def #{name}(lines, caption = nil)
374
+ captionblock("#{name}", lines, caption)
375
+ end
376
+ }
377
+ end
378
+
379
+ def graph(lines, id, command, caption = nil)
380
+ c = target_name
381
+ dir = File.join(@book.basedir, @book.image_dir, c)
382
+ Dir.mkdir(dir) unless File.exist?(dir)
383
+ file = "#{id}.#{image_ext}"
384
+ file_path = File.join(dir, file)
385
+
386
+ line = self.unescape(lines.join("\n"))
387
+ cmds = {
388
+ :graphviz => "echo '#{line}' | dot -T#{image_ext} -o#{file_path}",
389
+ :gnuplot => "echo 'set terminal " +
390
+ "#{(image_ext == "eps") ? "postscript eps" : image_ext}\n" +
391
+ " set output \"#{file_path}\"\n#{line}' | gnuplot",
392
+ :blockdiag => "echo '#{line}' "+
393
+ "| blockdiag -a -T #{image_ext} -o #{file_path} /dev/stdin",
394
+ :aafigure => "echo '#{line}' | aafigure -t#{image_ext} -o#{file_path}",
395
+ }
396
+ cmd = cmds[command.to_sym]
397
+ warn cmd
398
+ system cmd
399
+ @chapter.image_index.image_finder.add_entry(file_path)
400
+
401
+ image(lines, id, caption ||= "")
402
+ end
403
+
404
+ def image_ext
405
+ raise NotImplementedError
406
+ end
407
+
408
+ def inline_include(file_name)
409
+ File.open(file_name).read
410
+ end
411
+
412
+ def include(file_name)
413
+ File.foreach(file_name) do |line|
414
+ paragraph([line])
415
+ end
416
+ end
417
+
418
+ def ul_item_begin(lines)
419
+ ul_item(lines)
420
+ end
421
+
422
+ def ul_item_end
423
+ ""
424
+ end
425
+
426
+ def inline_raw(args)
427
+ if matched = args.match(/\|(.*?)\|(.*)/)
428
+ builders = matched[1].split(/,/).map{|i| i.gsub(/\s/, '') }
429
+ c = self.class.to_s.gsub(/ReVIEW::/, '').gsub(/Builder/, '').downcase
430
+ if builders.include?(c)
431
+ matched[2].gsub("\\n", "\n")
432
+ else
433
+ ""
434
+ end
435
+ else
436
+ args.gsub("\\n", "\n")
437
+ end
438
+ end
439
+
440
+ ## override TextUtils::detab
441
+ def detab(str, num = nil)
442
+ if num
443
+ super(str, num)
444
+ elsif @tabwidth
445
+ super(str, @tabwidth)
446
+ else
447
+ super(str)
448
+ end
449
+ end
450
+ end
451
+
452
+ end # module ReVIEW