lib/jsonpath.rb in jsonpath-0.1.0 vs lib/jsonpath.rb in jsonpath-0.1.2
- old
+ new
@@ -1,10 +1,8 @@
require 'strscan'
-require 'load_path_find'
+$LOAD_PATH << File.expand_path(File.basename(__FILE__))
-$LOAD_PATH.add_current
-
require File.join('jsonpath', 'enumerable')
class JsonPath
attr_reader :path
@@ -12,18 +10,38 @@
def initialize(path)
scanner = StringScanner.new(path)
@path = []
bracket_count = 0
while not scanner.eos?
- token = scanner.scan_until(/($|\$|@|[a-zA-Z]+|\[.*?\]|\.\.|\.(?!\.))/)
- case token
- when '.'
- # do nothing
- when /^[a-zA-Z]+$/
+ if token = scanner.scan(/\$/)
+ @path << token
+ elsif token = scanner.scan(/@/)
+ @path << token
+ elsif token = scanner.scan(/[a-zA-Z]+/)
@path << "['#{token}']"
- else
- bracket_count == 0 && @path << token or @path[-1] += token
- bracket_count += token.count('[') - token.count(']')
+ elsif token = scanner.scan(/'(.*?)'/)
+ @path << "[#{token}]"
+ elsif token = scanner.scan(/\[/)
+ count = 1
+ while !count.zero?
+ if t = scanner.scan(/\[/)
+ token << t
+ count += 1
+ elsif t = scanner.scan(/\]/)
+ token << t
+ count -= 1
+ elsif t = scanner.scan(/[^\[\]]*/)
+ token << t
+ end
+ end
+ @path << token
+ elsif token = scanner.scan(/\.\./)
+ @path << token
+ elsif scanner.scan(/\./)
+ elsif token = scanner.scan(/\*/)
+ @path << token
+ elsif token = scanner.scan(/./)
+ @path.last << token
end
end
end
def on(object)