class Chronic::Handler
def ==(other)
-
(Boolean)
- True if these handlers match
Parameters:
-
The
(Handler
) -- handler to compare
def ==(other) @pattern == other.pattern end
def constantize(name)
-
(NameError)
- Raises if this constant could not be found
Returns:
-
(Class)
- The class represented by `name`
Parameters:
-
The
(#to_s
) -- snake_case name representing a Chronic constant
def constantize(name) Chronic.const_get name.to_s.gsub(/(^|_)(.)/) { $2.upcase } end
def initialize(pattern, handler_method)
-
handler_method
(Symbol
) -- The method to be invoked when patterns -
pattern
(Array
) -- A list of patterns to match tokens against
def initialize(pattern, handler_method) @pattern = pattern @handler_method = handler_method end
def match(tokens, definitions)
- See: Chronic.tokens_to_span -
Returns:
-
(Boolean)
-
Parameters:
-
definitions
(Hash
) -- -
tokens
(Array
) --
def match(tokens, definitions) token_index = 0 @pattern.each do |element| name = element.to_s optional = name[-1, 1] == '?' name = name.chop if optional if element.instance_of? Symbol klass = constantize(name) match = tokens[token_index] && !tokens[token_index].tags.select { |o| o.kind_of?(klass) }.empty? return false if !match && !optional (token_index += 1; next) if match next if !match && optional elsif element.instance_of? String return true if optional && token_index == tokens.size sub_handlers = definitions[name.intern] || raise(ChronicPain, "Invalid subset #{name} specified") sub_handlers.each do |sub_handler| return true if sub_handler.match(tokens[token_index..tokens.size], definitions) end return false else raise(ChronicPain, "Invalid match type: #{element.class}") end end return false if token_index != tokens.size return true end