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)