class ReVIEW::Builder

Constants

CAPTION_TITLES

Public Class Methods

new(strict = false, *args) click to toggle source
# File lib/review/builder.rb, line 31
def initialize(strict = false, *args)
  @strict = strict
  @output = nil
  builder_init(*args)
end

Public Instance Methods

bibpaper(lines, id, caption) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# File lib/review/builder.rb, line 379
def captionblock(type, lines, caption, specialstyle = nil)
  raise NotImplementedError
end
compile_inline(s) click to toggle source

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

# File lib/review/builder.rb, line 180
def compile_inline(s)
  @compiler.text(s)
end
detab(str, num = nil) click to toggle source

override TextUtils::detab

Calls superclass method ReVIEW::TextUtils#detab
# File lib/review/builder.rb, line 452
def detab(str, num = nil)
  if num
    super(str, num)
  elsif @tabwidth
    super(str, @tabwidth)
  else
    super(str)
  end
end
error(msg) click to toggle source
# File lib/review/builder.rb, line 333
def error(msg)
  raise ApplicationError, "#{@location}: error: #{msg}"
end
extract_chapter_id(chap_ref) click to toggle source
# File lib/review/builder.rb, line 370
def extract_chapter_id(chap_ref)
  m = /\A([\w+-]+)\|(.+)/.match(chap_ref)
  if m
    return [@book.contents.detect{|chap| chap.id == m[1]}, m[2]]
  else
    return [@chapter, chap_ref]
  end
end
get_chap(chapter = @chapter) click to toggle source
# File lib/review/builder.rb, line 363
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) click to toggle source
# File lib/review/builder.rb, line 391
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) click to toggle source
# File lib/review/builder.rb, line 337
def handle_metric(str)
  str
end
image(lines, id, caption, metric = nil) click to toggle source
# 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_ext() click to toggle source
# File lib/review/builder.rb, line 416
def image_ext
  raise NotImplementedError
end
include(file_name) click to toggle source
# File lib/review/builder.rb, line 424
def include(file_name)
  File.foreach(file_name) do |line|
    paragraph([line])
  end
end
inline_bou(str) click to toggle source
# File lib/review/builder.rb, line 243
def inline_bou(str)
  text(str)
end
inline_chap(id) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# File lib/review/builder.rb, line 294
def inline_column(id)
  m = /\A([^|]+)\|(.+)/.match(id)
  chapter = @book.chapters.detect{|chap| chap.id == m[1]} if m && m[1]
  if chapter
    inline_column_chap(chapter, m[2])
  else
    inline_column_chap(@chapter, id)
  end
rescue KeyError
  error "unknown column: #{id}"
  nofunc_text("[UnknownColumn:#{id}]")
end
inline_column_chap(chapter, id) click to toggle source
# File lib/review/builder.rb, line 307
def inline_column_chap(chapter, id)
  chapter.column(id).caption
end
inline_fn(id) click to toggle source
# 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) click to toggle source
# File lib/review/builder.rb, line 279
def inline_hd(id)
  m = /\A([^|]+)\|(.+)/.match(id)
  if m && m[1]
    chapter = @book.contents.detect{|chap| chap.id == m[1]}
  end
  if chapter
    inline_hd_chap(chapter, m[2])
  else
    inline_hd_chap(@chapter, id)
  end
rescue KeyError
  error "unknown hd: #{id}"
  nofunc_text("[UnknownHeader:#{id}]")
end
inline_href(arg) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# File lib/review/builder.rb, line 420
def inline_include(file_name)
  compile_inline File.read(file_name)
end
inline_kw(arg) click to toggle source
# File lib/review/builder.rb, line 254
def inline_kw(arg)
  word, alt = *arg.split(',', 2)
  compile_kw(word, alt)
end
inline_list(id) click to toggle source
# 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) click to toggle source
# File lib/review/builder.rb, line 437
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) click to toggle source
# 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) click to toggle source
# 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_tcy(arg) click to toggle source
# File lib/review/builder.rb, line 311
def inline_tcy(arg)
  "#{arg}[rotate 90 degree]"
end
inline_title(id) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# 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) click to toggle source
# File lib/review/builder.rb, line 345
def parse_metric(type, metric)
  return "" if metric.blank?
  params = metric.split(/,\s*/)
  results = []
  params.each do |param|
    if param =~ /\A.+?::/
      if param =~ /\A#{type}::/
          param.sub!(/\A#{type}::/, '')
      else
        next
      end
    end
    param2 = handle_metric(param)
    results.push(param2)
  end
  return result_metric(results)
end
post_paragraph() click to toggle source
# File lib/review/builder.rb, line 27
def post_paragraph
  nil
end
pre_paragraph() click to toggle source
# File lib/review/builder.rb, line 24
def pre_paragraph
  nil
end
raw(str) click to toggle source
# File lib/review/builder.rb, line 315
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
raw_result()
Alias for: result
result() click to toggle source
# File lib/review/builder.rb, line 59
def result
  @output.string
end
Also aliased as: raw_result
result_metric(array) click to toggle source
# File lib/review/builder.rb, line 341
def result_metric(array)
  array.join(',')
end
source(lines, caption, lang = nil) click to toggle source
# 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) click to toggle source
# 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_name() click to toggle source
# File lib/review/builder.rb, line 73
def target_name
  self.class.to_s.gsub(/ReVIEW::/, '').gsub(/Builder/, '').downcase
end
text(str) click to toggle source
# File lib/review/builder.rb, line 266
def text(str)
  str
end
ul_item_begin(lines) click to toggle source
# File lib/review/builder.rb, line 430
def ul_item_begin(lines)
  ul_item(lines)
end
ul_item_end() click to toggle source
# File lib/review/builder.rb, line 434
def ul_item_end
end
warn(msg) click to toggle source
# File lib/review/builder.rb, line 329
def warn(msg)
  $stderr.puts "#{@location}: warning: #{msg}"
end

Private Instance Methods

adjust_n_cols(rows) click to toggle source
# File lib/review/builder.rb, line 154
def adjust_n_cols(rows)
  rows.each do |cols|
    while cols.last and cols.last.strip.empty?
      cols.pop
    end
  end
  n_maxcols = rows.map {|cols| cols.size }.max
  rows.each do |cols|
    cols.concat [''] * (n_maxcols - cols.size)
  end
  rows
end
builder_init(*args) click to toggle source
# File lib/review/builder.rb, line 37
def builder_init(*args)
end
builder_init_file() click to toggle source
# File lib/review/builder.rb, line 54
def builder_init_file
  @sec_counter = SecCounter.new(5, @chapter)
end
headline_prefix(level) click to toggle source
# File lib/review/builder.rb, line 77
def headline_prefix(level)
  @sec_counter.inc(level)
  anchor = @sec_counter.anchor(level)
  prefix = @sec_counter.prefix(level, @book.config["secnolevel"])
  [prefix, anchor]
end
print(*s) click to toggle source
puts(*s) click to toggle source
# File lib/review/builder.rb, line 69
def puts(*s)
  @output.puts(*s)
end