class Glaemscribe::API::CharsetParser

Public Class Methods

new() click to toggle source
# File lib/api/charset_parser.rb, line 28
def initialize()
  @charset = nil
end

Public Instance Methods

parse(file_path) click to toggle source
# File lib/api/charset_parser.rb, line 32
def parse(file_path)
  @charset = Charset.new(ResourceManager::charset_name_from_file_path(file_path))  
  
  raw = File.open(file_path,"rb:utf-8").read
  doc = Glaeml::Parser.new.parse(raw)

  if(doc.errors.any?)
    @charset.errors = doc.errors
    return @charset
  end
  
  # TODO : verify charset glaeml like we do with modes
  
  doc.root_node.gpath("char").each { |char_element|
    code   = char_element.args[0].hex
    names  = char_element.args[1..-1].map{|cname| cname.strip }.reject{ |cname| cname.empty? }
    @charset.add_char(char_element.line,code,names)
  }
         
  doc.root_node.gpath("seq").each{ |seq_elemnt| 
    names       = seq_elemnt.args
    child_node  = seq_elemnt.children.first
    seq         = (child_node && child_node.text?)?(child_node.args.first):("")
    @charset.add_sequence_char(seq_elemnt.line,names,seq)
  }
  
  doc.root_node.gpath("virtual").each { |virtual_element|
    names     = virtual_element.args
    reversed  = false        
    default   = nil
    classes   = []
    
    virtual_element.gpath("class").each { |class_element|
      vc =  Charset::VirtualChar::VirtualClass.new
      vc.target    = class_element.args[0]
      vc.triggers  = class_element.args[1..-1].map{|cname| cname.strip }.reject{ |cname| cname.empty? }     
      classes << vc
    }
    virtual_element.gpath("reversed").each { |reversed_element| 
      reversed = true
    }
    virtual_element.gpath("default").each { |default_element| 
      default  = default_element.args[0]
    }
    
    @charset.add_virtual_char(virtual_element.line,classes,names,reversed,default)
  }
  
  @charset.finalize
       
  @charset 
end