lib/search_lingo/tokenizer.rb in search_lingo-1.0.1 vs lib/search_lingo/tokenizer.rb in search_lingo-1.0.2
- old
+ new
@@ -6,34 +6,51 @@
module SearchLingo
class Tokenizer
include Enumerable
extend Forwardable
+ ##
+ # Pattern for matching a simple token (a term without a modifier).
SIMPLE_TOKEN = /#{TERM}/
- COMPOUND_TOKEN = /(?:#{OPERATOR}:[[:space:]]*)?#{TERM}/
+
+ ##
+ # Pattern for matching a compound token (a term with an optional modifier).
+ COMPOUND_TOKEN = /(?:#{MODIFIER}:[[:space:]]*)?#{TERM}/
+
+ ##
+ # Pattern for matching the delimiter between tokens.
DELIMITER = /[[:space:]]*/
- def initialize(query)
+ def initialize(query) # :nodoc:
@scanner = StringScanner.new query.strip
end
+ ##
+ # Iterates over the query string. If called with a block, it yields each
+ # token. If called without a block, it returns an +Enumerator+.
def each
return to_enum(__callee__) unless block_given?
until scanner.eos?
yield self.next
end
end
+ ##
+ # Returns a Token for the next token in the query string. When the end of
+ # the query string is reached raises +StopIteration+.
def next
scanner.skip DELIMITER
token = scanner.scan COMPOUND_TOKEN
raise StopIteration unless token
Token.new token
end
def_delegator :scanner, :reset
+ ##
+ # Rewinds the query string from the last returned token and returns a
+ # Token for the next simple token.
def simplify
scanner.unscan
Token.new scanner.scan SIMPLE_TOKEN
end