~ubuntu-branches/ubuntu/vivid/rabbit/vivid

« back to all changes in this revision

Viewing changes to lib/rabbit/parser/rd.rb

  • Committer: Bazaar Package Importer
  • Author(s): Youhei SASAKI
  • Date: 2009-07-22 22:15:37 UTC
  • Revision ID: james.westby@ubuntu.com-20090722221537-iy7foj73p2kyuumi
Tags: upstream-0.6.1
ImportĀ upstreamĀ versionĀ 0.6.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
require "rabbit/parser/base"
 
2
 
 
3
module Rabbit
 
4
  module Parser
 
5
    class RD < Base
 
6
 
 
7
      push_loader(self)
 
8
      class << self
 
9
        def match?(source)
 
10
          /^= /.match(source.read)
 
11
        end
 
12
      end
 
13
 
 
14
      def parse
 
15
        source = "=begin\n#{@source.read}\n=end\n"
 
16
        tree = ::RD::RDTree.new(source)
 
17
        visitor = RD2RabbitVisitor.new(@canvas)
 
18
        visitor.visit(tree)
 
19
      rescue Racc::ParseError
 
20
        message = format_parse_error_message($!.message, source)
 
21
        raise ParseError.new, message, $@
 
22
      end
 
23
 
 
24
      private
 
25
      def format_parse_error_message(message, source)
 
26
        if /line (\d+):/.match(message)
 
27
          numbered_source = add_number(source, $1.to_i)
 
28
        else
 
29
          numbered_source = add_number(source)
 
30
        end
 
31
        "#{message}\n--\n#{numbered_source}"
 
32
      end
 
33
 
 
34
      SNIPPET_SIZE = 10
 
35
      def add_number(source, around=nil)
 
36
        i = 1
 
37
        puts source
 
38
        lines = source.to_a[0..-2]
 
39
        if around
 
40
          i = [1, around - SNIPPET_SIZE].max
 
41
          lines = lines[i, 2 * SNIPPET_SIZE]
 
42
        end
 
43
        format = "%#{Math.log10(lines.size).truncate + 1}d %s"
 
44
 
 
45
        lines.collect do |line|
 
46
          i += 1
 
47
          format % [i, line]
 
48
        end.join
 
49
      end
 
50
    end
 
51
  end
 
52
end
 
53
 
 
54
require "rabbit/parser/rd/rd2rabbit-lib"