tokenize(string)
public
Tokenize string returning the ruby object
Show source
def tokenize string
return nil if string.empty?
return string if @string_cache.key?(string)
case string
when /^[A-Za-z~]/
if string.length > 5
@string_cache[string] = true
return string
end
case string
when /^[^ytonf~]/
@string_cache[string] = true
string
when '~', /^null$/
nil
when /^(yes|true|on)$/
true
when /^(no|false|off)$/
false
else
@string_cache[string] = true
string
end
when TIME
parse_time string
when /^\d{4}-(?:1[012]|0\d|\d)-(?:[12]\d|3[01]|0\d|\d)$/
require 'date'
begin
Date.strptime(string, '%Y-%m-%d')
rescue ArgumentError
string
end
when /^\.inf$/
1 / 0.0
when /^-\.inf$/
-1 / 0.0
when /^\.nan$/
0.0 / 0.0
when /^:./
if string =~ /^:(["'])(.*)\11//
$2.sub(/^:/, '').to_sym
else
string.sub(/^:/, '').to_sym
end
when /^[-+]?[0-9][0-9_]*(:[0-5]?[0-9])+$/
i = 0
string.split(':').each_with_index do |n,e|
i += (n.to_i * 60 ** (e - 2).abs)
end
i
when /^[-+]?[0-9][0-9_]*(:[0-5]?[0-9])+\.[0-9_]*$/
i = 0
string.split(':').each_with_index do |n,e|
i += (n.to_f * 60 ** (e - 2).abs)
end
i
when FLOAT
begin
return Float(string.gsub(/[,_]/, ''))
rescue ArgumentError
end
@string_cache[string] = true
string
else
if string.count('.') < 2
begin
return Integer(string.gsub(/[,_]/, ''))
rescue ArgumentError
end
end
@string_cache[string] = true
string
end
end