class Rabbit::Parser::RD

Constants

SNIPPET_SIZE

Public Class Methods

format_name() click to toggle source
# File lib/rabbit/parser/rd.rb, line 19
def format_name
  "RD"
end
match?(source) click to toggle source
# File lib/rabbit/parser/rd.rb, line 23
def match?(source)
  extension = source.extension
  if extension.nil?
    head = source.read[0, 500]
    if head.respond_to?(:force_encoding)
      head.force_encoding("ASCII-8BIT")
    end
    /^=(?:\s+\S|[^=])/ === head
  else
    /\A(?:rd|rab|rbt)\z/i =~ extension
  end
end

Public Instance Methods

parse() click to toggle source
# File lib/rabbit/parser/rd.rb, line 37
def parse
  source = @source.read.gsub(/\r\n/, "\n")
  source = "=begin\n#{source}\n=end\n"
  tree = ::RD::RDTree.new(source)
  visitor = RD2RabbitVisitor.new(@canvas)
  visitor.visit(tree)
rescue Racc::ParseError
  message = format_parse_error_message($!.message, source)
  raise ParseError.new, message, $@
end

Private Instance Methods

add_number(source, around=nil) click to toggle source
# File lib/rabbit/parser/rd.rb, line 59
def add_number(source, around=nil)
  i = 1
  puts source
  lines = source.lines.to_a[0..-2]
  if around
    i = [1, around - SNIPPET_SIZE].max
    lines = lines[i, 2 * SNIPPET_SIZE]
  end
  format = "%#{Math.log10(lines.size).truncate + 1}d %s"

  lines.collect do |line|
    i += 1
    format % [i, line]
  end.join
end
format_parse_error_message(message, source) click to toggle source
# File lib/rabbit/parser/rd.rb, line 49
def format_parse_error_message(message, source)
  if /line (\d+):/.match(message)
    numbered_source = add_number(source, $1.to_i)
  else
    numbered_source = add_number(source)
  end
  "#{message}\n--\n#{numbered_source}"
end