class Arcana::File

Public Class Methods

new(path) click to toggle source
# File lib/arcana.rb, line 468
def initialize(path)
  @path = path
  @rules = parse
end

Public Instance Methods

parse() click to toggle source
# File lib/arcana.rb, line 481
def parse
  rules = []
  stack = []

  ::File.foreach(@path) do |line|
    if line.start_with?("#")
      # comment
    elsif line.match?(/\A\s+\z/)
      # blank
    elsif line.start_with?("!")
      if line =~ /\A!:([a-z]+)\s+(.*)\n\z/
        raise if stack.empty?
        stack.last.extras[$1] = $2
      else
        raise "couldn't parse #{line}"
      end
    else
      fields = line.chomp.split(/(?<![\\<>])\s+/, 4)
      offset, type, test, message = fields
      nesting = offset[/\A>*/].size

      stack = stack[0, nesting]

      offset = Offset.new offset[nesting..]
      pattern = Pattern.new(type, test)

      rule = Rule.new(offset, pattern, message)
      if stack.empty?
        rules << rule
      else
        stack.last.children << rule
      end
      stack << rule
    end
  end
  rules
end
raw_rules() click to toggle source
# File lib/arcana.rb, line 473
def raw_rules
  @rules
end
rules() click to toggle source
# File lib/arcana.rb, line 477
def rules
  RuleSet.new(@rules)
end