class Mkxms::Mssql::Mkxms::Mssql::Engine

Constants

MissingHandler
ParseItem

Attributes

missing_handlers[R]

Public Class Methods

new(document, initial_context) click to toggle source
# File lib/mkxms/mssql/engine.rb, line 31
def initialize(document, initial_context)
  @initial_context = initial_context
  @parse_items = [ParseItem.new(initial_context, document.root)]
  @missing_handlers = []
end

Public Instance Methods

run() click to toggle source
# File lib/mkxms/mssql/engine.rb, line 39
def run
  until @parse_items.empty?
    parse_item
  end
  
  errors = @missing_handlers
  raise ParseErrors.new(errors) unless errors.empty?
end

Private Instance Methods

element_handler_method_name(node) click to toggle source
# File lib/mkxms/mssql/engine.rb, line 77
def element_handler_method_name(node)
  case node
  when REXML::Element
    "handle_#{Utils.code_sym_for node.name}_element".to_sym
  end
end
parse_item() click to toggle source
# File lib/mkxms/mssql/engine.rb, line 49
def parse_item
  item = @parse_items.shift
  case item.node
  when REXML::Element
    begin
      handler = item.context.method(handler_name = element_handler_method_name(item.node))
    rescue NameError
      record_missing_handler(item.context.class, handler_name)
      return
    end
    result = ParseItem.new(item.context, item.node)
    handler[result]
    @parse_items = item.node.children.select do |node|
      [REXML::Element, REXML::Text].any? {|c| node.kind_of? c}
    end.map do |node|
      ParseItem.new(result.context, node)
    end + @parse_items
  when REXML::Text
    begin
      handler = item.context.method(:handle_text)
    rescue
      record_missing_handler(item.context.class, :handle_text) unless item.node.value =~ /^\s*$/
      return
    end
    handler[item.node.value, item.node.parent]
  end
end
record_missing_handler(context_class, method_name) click to toggle source
# File lib/mkxms/mssql/engine.rb, line 84
def record_missing_handler(context_class, method_name)
  @missing_handlers << MissingHandler.new(context_class, method_name)
end