module AttParser
¶ ↑
AttParser
Constants
- VERSION
version
Public Class Methods
infer(infer, val)
click to toggle source
# File lib/attparser.rb, line 92 def self.infer(infer, val) # $tm.hrm # early exit: don't infer infer or return val # true if val.downcase == 'true' return true # false elsif val.downcase == 'false' return false # null or nil elsif (val.downcase == 'null') or (val.downcase == 'nil') return nil # integer elsif rv = Integer(val) rescue false return rv # float elsif rv = Float(val) rescue false return rv # else return value as is else return val end end
parse(raw, opts={})
click to toggle source
# File lib/attparser.rb, line 11 def self.parse(raw, opts={}) # $tm.hrm raw = raw.strip state = 'none' name = nil val = nil atts = {} infer = opts['infer'] # split tokens = raw.split(/(\\")|(")|(\=)|(\s+)/mu) tokens = tokens.grep(/./mu) # loop through tokens tokens.each do |token| # state: none if state == 'none' if token.match(/\S/mu) name = token.downcase val = nil state = 'after-name' end # state: after-name elsif state == 'after-name' if token.match(/./mu) if token == '=' state = 'after-equals' elsif token.match(/\S/mu) atts[name] = nil name = token val = nil state = 'after-name' end end # state: after-equals elsif state == 'after-equals' if token == '"' val = '' state = 'in-quote' elsif token.match(/\S/mu) atts[name] = self.infer(infer, token) name = val = nil state = 'none' end # state: in-quote elsif state == 'in-quote' if token == '"' atts[name] = val name = val = nil state = 'none' elsif token == '\\"' val += '"' else val += token end # else unknown state else raise 'uknown-state: ' + state end end # if name, add to atts if name atts[name] = nil end # return return atts end