Class: ReVIEW::Builder

Inherits:
Object show all
Includes:
TextUtils
Defined in:
lib/review/builder.rb

Constant Summary collapse

CAPTION_TITLES =
%w(note memo tip info planning best important security caution term link notice point shoot reference practice expert)

Instance Method Summary collapse

Methods included from TextUtils

#split_paragraph

Constructor Details

#initialize(strict = false, *args) ⇒ Builder

Returns a new instance of Builder.



32
33
34
35
# File 'lib/review/builder.rb', line 32

def initialize(strict = false, *args)
  @strict = strict
  builder_init(*args)
end

Instance Method Details

#bibpaper(lines, id, caption) ⇒ Object



270
271
272
273
274
275
276
277
# File 'lib/review/builder.rb', line 270

def bibpaper(lines, id, caption)
  bibpaper_header id, caption
  unless lines.empty?
    puts ""
    bibpaper_bibpaper id, caption, lines
  end
  puts ""
end

#bind(compiler, chapter, location) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/review/builder.rb', line 41

def bind(compiler, chapter, location)
  @compiler = compiler
  @chapter = chapter
  @location = location
  @output = StringIO.new
  @book = @chapter.book if @chapter.present?
  @tabwidth = nil
  if @book && @book.config && @book.config["tabwidth"]
    @tabwidth = @book.config["tabwidth"]
  end
  builder_init_file
end

#captionblock(type, lines, caption, specialstyle = nil) ⇒ Object

Raises:

  • (NotImplementedError)


357
358
359
# File 'lib/review/builder.rb', line 357

def captionblock(type, lines, caption, specialstyle = nil)
  raise NotImplementedError
end

#compile_inline(s) ⇒ Object

def footnote(id, str)

@footnotes.push [id, str]

end

def flush_footnote

footnote_begin
@footnotes.each do |id, str|
  footnote_item(id, str)
end
footnote_end

end



180
181
182
# File 'lib/review/builder.rb', line 180

def compile_inline(s)
  @compiler.text(s)
end

#detab(str, num = nil) ⇒ Object

override TextUtils::detab



430
431
432
433
434
435
436
437
438
# File 'lib/review/builder.rb', line 430

def detab(str, num = nil)
  if num
    super(str, num)
  elsif @tabwidth
    super(str, @tabwidth)
  else
    super(str)
  end
end

#error(msg) ⇒ Object

Raises:



311
312
313
# File 'lib/review/builder.rb', line 311

def error(msg)
  raise ApplicationError, "#{@location}: error: #{msg}"
end

#extract_chapter_id(chap_ref) ⇒ Object



348
349
350
351
352
353
354
355
# File 'lib/review/builder.rb', line 348

def extract_chapter_id(chap_ref)
  m = /\A([\w+-]+)\|(.+)/.match(chap_ref)
  if m
    return [@book.chapters.detect{|chap| chap.id == m[1]}, m[2]]
  else
    return [@chapter, chap_ref]
  end
end

#get_chap(chapter = @chapter) ⇒ Object



341
342
343
344
345
346
# File 'lib/review/builder.rb', line 341

def get_chap(chapter = @chapter)
  if @book.config["secnolevel"] > 0 && !chapter.number.nil? && !chapter.number.to_s.empty?
    return chapter.format_number(nil)
  end
  return nil
end

#graph(lines, id, command, caption = nil) ⇒ Object



369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
# File 'lib/review/builder.rb', line 369

def graph(lines, id, command, caption = nil)
  c = target_name
  dir = File.join(@book.basedir, @book.image_dir, c)
  Dir.mkdir(dir) unless File.exist?(dir)
  file = "#{id}.#{image_ext}"
  file_path = File.join(dir, file)

  line = self.unescape(lines.join("\n"))
  cmds = {
    :graphviz => "echo '#{line}' | dot -T#{image_ext} -o#{file_path}",
    :gnuplot => "echo 'set terminal " +
    "#{(image_ext == "eps") ? "postscript eps" : image_ext}\n" +
    " set output \"#{file_path}\"\n#{line}' | gnuplot",
    :blockdiag => "echo '#{line}' "+
    "| blockdiag -a -T #{image_ext} -o #{file_path} /dev/stdin",
    :aafigure => "echo '#{line}' | aafigure -t#{image_ext} -o#{file_path}",
  }
  cmd = cmds[command.to_sym]
  warn cmd
  system cmd
  @chapter.image_index.image_finder.add_entry(file_path)

  image(lines, id, caption ||= "")
end

#handle_metric(str) ⇒ Object



315
316
317
# File 'lib/review/builder.rb', line 315

def handle_metric(str)
  str
end

#image(lines, id, caption, metric = nil) ⇒ Object



108
109
110
111
112
113
114
115
# File 'lib/review/builder.rb', line 108

def image(lines, id, caption, metric = nil)
  if @chapter.image(id).bound?
    image_image id, caption, metric
  else
    warn "image not bound: #{id}" if @strict
    image_dummy id, caption, lines
  end
end

#image_extObject

Raises:

  • (NotImplementedError)


394
395
396
# File 'lib/review/builder.rb', line 394

def image_ext
  raise NotImplementedError
end

#include(file_name) ⇒ Object



402
403
404
405
406
# File 'lib/review/builder.rb', line 402

def include(file_name)
  File.foreach(file_name) do |line|
    paragraph([line])
  end
end

#inline_bou(str) ⇒ Object



243
244
245
# File 'lib/review/builder.rb', line 243

def inline_bou(str)
  text(str)
end

#inline_chap(id) ⇒ Object



191
192
193
194
195
196
# File 'lib/review/builder.rb', line 191

def inline_chap(id)
  @book.chapter_index.number(id)
rescue KeyError
  error "unknown chapter: #{id}"
  nofunc_text("[UnknownChapter:#{id}]")
end

#inline_chapref(id) ⇒ Object



184
185
186
187
188
189
# File 'lib/review/builder.rb', line 184

def inline_chapref(id)
  compile_inline @book.chapter_index.display_string(id)
rescue KeyError
  error "unknown chapter: #{id}"
  nofunc_text("[UnknownChapter:#{id}]")
end

#inline_column(id) ⇒ Object



286
287
288
289
290
291
# File 'lib/review/builder.rb', line 286

def inline_column(id)
  @chapter.column(id).caption
rescue
  error "unknown column: #{id}"
  nofunc_text("[UnknownColumn:#{id}]")
end

#inline_fn(id) ⇒ Object



236
237
238
239
240
241
# File 'lib/review/builder.rb', line 236

def inline_fn(id)
  @chapter.footnote(id).content
rescue KeyError
  error "unknown footnote: #{id}"
  nofunc_text("[UnknownFootnote:#{id}]")
end

#inline_hd(id) ⇒ Object



279
280
281
282
283
284
# File 'lib/review/builder.rb', line 279

def inline_hd(id)
  m = /\A([^|]+)\|(.+)/.match(id)
  chapter = @book.chapters.detect{|chap| chap.id == m[1]} if m && m[1]
  return inline_hd_chap(chapter, m[2]) if chapter
  return inline_hd_chap(@chapter, id)
end

#inline_href(arg) ⇒ Object



259
260
261
262
263
264
# File 'lib/review/builder.rb', line 259

def inline_href(arg)
  url, label = *arg.scan(/(?:(?:(?:\\\\)*\\,)|[^,\\]+)+/).map(&:lstrip)
  url = url.gsub(/\\,/, ",").strip
  label = label.gsub(/\\,/, ",").strip if label
  compile_href(url, label)
end

#inline_img(id) ⇒ Object



212
213
214
215
216
217
# File 'lib/review/builder.rb', line 212

def inline_img(id)
  "#{I18n.t("image")}#{@chapter.image(id).number}"
rescue KeyError
  error "unknown image: #{id}"
  nofunc_text("[UnknownImage:#{id}]")
end

#inline_imgref(id) ⇒ Object



219
220
221
222
223
224
225
226
227
# File 'lib/review/builder.rb', line 219

def inline_imgref(id)
  img = inline_img(id)

  if @chapter.image(id).caption
    "#{img}#{I18n.t('image_quote', @chapter.image(id).caption)}"
  else
    img
  end
end

#inline_include(file_name) ⇒ Object



398
399
400
# File 'lib/review/builder.rb', line 398

def inline_include(file_name)
  compile_inline File.open(file_name).read
end

#inline_kw(arg) ⇒ Object



254
255
256
257
# File 'lib/review/builder.rb', line 254

def inline_kw(arg)
  word, alt = *arg.split(',', 2)
  compile_kw(word, alt)
end

#inline_list(id) ⇒ Object



205
206
207
208
209
210
# File 'lib/review/builder.rb', line 205

def inline_list(id)
  "#{I18n.t("list")}#{@chapter.list(id).number}"
rescue KeyError
  error "unknown list: #{id}"
  nofunc_text("[UnknownList:#{id}]")
end

#inline_raw(args) ⇒ Object



415
416
417
418
419
420
421
422
423
424
425
426
427
# File 'lib/review/builder.rb', line 415

def inline_raw(args)
  if matched = args.match(/\|(.*?)\|(.*)/)
    builders = matched[1].split(/,/).map{|i| i.gsub(/\s/, '') }
    c = self.class.to_s.gsub(/ReVIEW::/, '').gsub(/Builder/, '').downcase
    if builders.include?(c)
      matched[2].gsub("\\n", "\n")
    else
      ""
    end
  else
    args.gsub("\\n", "\n")
  end
end

#inline_ruby(arg) ⇒ Object



247
248
249
250
251
252
# File 'lib/review/builder.rb', line 247

def inline_ruby(arg)
  base, *ruby = *arg.scan(/(?:(?:(?:\\\\)*\\,)|[^,\\]+)+/)
  base = base.gsub(/\\,/, ",") if base
  ruby = ruby.join(",").gsub(/\\,/, ",") if ruby
  compile_ruby(base, ruby)
end

#inline_table(id) ⇒ Object



229
230
231
232
233
234
# File 'lib/review/builder.rb', line 229

def inline_table(id)
  "#{I18n.t("table")}#{@chapter.table(id).number}"
rescue KeyError
  error "unknown table: #{id}"
  nofunc_text("[UnknownTable:#{id}]")
end

#inline_title(id) ⇒ Object



198
199
200
201
202
203
# File 'lib/review/builder.rb', line 198

def inline_title(id)
  compile_inline @book.chapter_index.title(id)
rescue KeyError
  error "unknown chapter: #{id}"
  nofunc_text("[UnknownChapter:#{id}]")
end

#list(lines, id, caption, lang = nil) ⇒ Object



85
86
87
88
89
90
91
92
# File 'lib/review/builder.rb', line 85

def list(lines, id, caption, lang = nil)
  begin
    list_header id, caption, lang
  rescue KeyError
    error "no such list: #{id}"
  end
  list_body id, lines, lang
end

#listnum(lines, id, caption, lang = nil) ⇒ Object



94
95
96
97
98
99
100
101
# File 'lib/review/builder.rb', line 94

def listnum(lines, id, caption, lang = nil)
  begin
    list_header id, caption, lang
  rescue KeyError
    error "no such list: #{id}"
  end
  listnum_body lines, lang
end

#parse_metric(type, metric) ⇒ Object



323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
# File 'lib/review/builder.rb', line 323

def parse_metric(type, metric)
  return "" if metric.blank?
  params = metric.split(/,\s*/)
  results = []
  params.each do |p|
    if p =~ /\A.+?::/
      if p =~ /\A#{type}::/
          p.sub!(/\A#{type}::/, '')
      else
        next
      end
    end
    p = handle_metric(p)
    results.push(p)
  end
  return result_metric(results)
end

#post_paragraphObject



28
29
30
# File 'lib/review/builder.rb', line 28

def post_paragraph
  nil
end

#pre_paragraphObject



25
26
27
# File 'lib/review/builder.rb', line 25

def pre_paragraph
  nil
end


65
66
67
# File 'lib/review/builder.rb', line 65

def print(*s)
  @output.print(*s)
end

#puts(*s) ⇒ Object



69
70
71
# File 'lib/review/builder.rb', line 69

def puts(*s)
  @output.puts(*s)
end

#raw(str) ⇒ Object



293
294
295
296
297
298
299
300
301
302
303
304
305
# File 'lib/review/builder.rb', line 293

def raw(str)
  if matched = str.match(/\|(.*?)\|(.*)/)
    builders = matched[1].split(/,/).map{|i| i.gsub(/\s/, '') }
    c = target_name
    if builders.include?(c)
      print matched[2].gsub("\\n", "\n")
    else
      ""
    end
  else
    print str.gsub("\\n", "\n")
  end
end

#resultObject Also known as: raw_result



59
60
61
# File 'lib/review/builder.rb', line 59

def result
  @output.string
end

#result_metric(array) ⇒ Object



319
320
321
# File 'lib/review/builder.rb', line 319

def result_metric(array)
  array.join(',')
end

#source(lines, caption, lang = nil) ⇒ Object



103
104
105
106
# File 'lib/review/builder.rb', line 103

def source(lines, caption, lang = nil)
  source_header caption
  source_body lines, lang
end

#table(lines, id = nil, caption = nil) ⇒ Object



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'lib/review/builder.rb', line 117

def table(lines, id = nil, caption = nil)
  rows = []
  sepidx = nil
  lines.each_with_index do |line, idx|
    if /\A[\=\-]{12}/ =~ line
      # just ignore
      #error "too many table separator" if sepidx
      sepidx ||= idx
      next
    end
    rows.push line.strip.split(/\t+/).map {|s| s.sub(/\A\./, '') }
  end
  rows = adjust_n_cols(rows)

  begin
    table_header id, caption unless caption.nil?
  rescue KeyError
    error "no such table: #{id}"
  end
  return if rows.empty?
  table_begin rows.first.size
  if sepidx
    sepidx.times do
      tr rows.shift.map {|s| th(s) }
    end
    rows.each do |cols|
      tr cols.map {|s| td(s) }
    end
  else
    rows.each do |cols|
      h, *cs = *cols
      tr [th(h)] + cs.map {|s| td(s) }
    end
  end
  table_end
end

#target_nameObject



73
74
75
# File 'lib/review/builder.rb', line 73

def target_name
  self.class.to_s.gsub(/ReVIEW::/, '').gsub(/Builder/, '').downcase
end

#text(str) ⇒ Object



266
267
268
# File 'lib/review/builder.rb', line 266

def text(str)
  str
end

#ul_item_begin(lines) ⇒ Object



408
409
410
# File 'lib/review/builder.rb', line 408

def ul_item_begin(lines)
  ul_item(lines)
end

#ul_item_endObject



412
413
# File 'lib/review/builder.rb', line 412

def ul_item_end
end

#warn(msg) ⇒ Object



307
308
309
# File 'lib/review/builder.rb', line 307

def warn(msg)
  $stderr.puts "#{@location}: warning: #{msg}"
end