0
- def definitions #:nodoc:
0
+ def definitions(options={}) #:nodoc:
0
+ options[:endian_precedence] = [:middle, :little] if options[:endian_precedence].nil?
0
+ # ensure the endian precedence is exactly two elements long
0
+ raise ChronicPain, "More than two elements specified for endian precedence array" unless options[:endian_precedence].length == 2
0
+ # handler for dd/mm/yyyy
0
+ @little_endian_handler ||= Handler.new([:scalar_day, :separator_slash_or_dash, :scalar_month, :separator_slash_or_dash, :scalar_year, :separator_at?, 'time?'], :handle_sd_sm_sy)
0
+ # handler for mm/dd/yyyy
0
+ @middle_endian_handler ||= Handler.new([:scalar_month, :separator_slash_or_dash, :scalar_day, :separator_slash_or_dash, :scalar_year, :separator_at?, 'time?'], :handle_sm_sd_sy)
0
+ # ensure we have valid endian values
0
+ options[:endian_precedence].each do |e|
0
+ raise ChronicPain, "Unknown endian type: #{e.to_s}" unless instance_variable_defined?(endian_variable_name_for(e))
0
{:time => [Handler.new([:repeater_time, :repeater_day_portion?], nil)],
0
Handler.new([:repeater_time, :repeater_day_portion?, :separator_on?, :repeater_month_name, :ordinal_day], :handle_rmn_od_on),
0
Handler.new([:repeater_month_name, :scalar_year], :handle_rmn_sy),
0
Handler.new([:scalar_day, :repeater_month_name, :scalar_year, :separator_at?, 'time?'], :handle_sd_rmn_sy),
0
- Handler.new([:scalar_month, :separator_slash_or_dash, :scalar_day, :separator_slash_or_dash, :scalar_year, :separator_at?, 'time?'], :handle_sm_sd_sy),
0
- Handler.new([:scalar_day, :separator_slash_or_dash, :scalar_month, :separator_slash_or_dash, :scalar_year, :separator_at?, 'time?'], :handle_sd_sm_sy),
0
+ @middle_endian_handler,
0
+ @little_endian_handler,
0
Handler.new([:scalar_year, :separator_slash_or_dash, :scalar_month, :separator_slash_or_dash, :scalar_day, :separator_at?, 'time?'], :handle_sy_sm_sd),
0
Handler.new([:scalar_month, :separator_slash_or_dash, :scalar_year], :handle_sm_sy)],
0
:narrow => [Handler.new([:ordinal, :repeater, :separator_in, :repeater], :handle_o_r_s_r),
0
Handler.new([:ordinal, :repeater, :grabber, :repeater], :handle_o_r_g_r)]
0
+ apply_endian_precedences(options[:endian_precedence])
0
def tokens_to_span(tokens, options) #:nodoc:
0
# maybe it's a specific date
0
- self.definitions[:date].each do |handler|
0
- if handler.match(tokens, self.definitions)
0
+ definitions = self.definitions(options)
0
+ definitions[:date].each do |handler|
0
+ if handler.match(tokens, definitions)
0
puts "-date" if Chronic.debug
0
good_tokens = tokens.select { |o| !o.get_tag Separator }
0
return self.send(handler.handler_method, good_tokens, options)
0
# I guess it's not a specific date, maybe it's just an anchor
0
- self.definitions[:anchor].each do |handler|
0
- if handler.match(tokens, self.definitions)
0
+ definitions[:anchor].each do |handler|
0
+ if handler.match(tokens, definitions)
0
puts "-anchor" if Chronic.debug
0
good_tokens = tokens.select { |o| !o.get_tag Separator }
0
return self.send(handler.handler_method, good_tokens, options)
0
# not an anchor, perhaps it's an arrow
0
- self.definitions[:arrow].each do |handler|
0
- if handler.match(tokens, self.definitions)
0
+ definitions[:arrow].each do |handler|
0
+ if handler.match(tokens, definitions)
0
puts "-arrow" if Chronic.debug
0
good_tokens = tokens.reject { |o| o.get_tag(SeparatorAt) || o.get_tag(SeparatorSlashOrDash) || o.get_tag(SeparatorComma) }
0
return self.send(handler.handler_method, good_tokens, options)
0
# not an arrow, let's hope it's a narrow
0
- self.definitions[:narrow].each do |handler|
0
- if handler.match(tokens, self.definitions)
0
+ definitions[:narrow].each do |handler|
0
+ if handler.match(tokens, definitions)
0
puts "-narrow" if Chronic.debug
0
#good_tokens = tokens.select { |o| !o.get_tag Separator }
0
return self.send(handler.handler_method, tokens, options)
0
+ def apply_endian_precedences(precedences)
0
+ date_defs = @definitions[:date]
0
+ # map the precedence array to indices on @definitions[:date]
0
+ indices = precedences.map { |e|
0
+ handler = instance_variable_get(endian_variable_name_for(e))
0
+ date_defs.index(handler)
0
+ # swap the handlers if we discover they are at odds with the desired preferences
0
+ swap(date_defs, indices.first, indices.last) if indices.first > indices.last
0
+ def endian_variable_name_for(e)
0
+ "@#{e.to_s}_endian_handler".to_sym
0
+ # exchange two elements in an array
0
+ def swap(arr, a, b); arr[a], arr[b] = arr[b], arr[a]; end
0
def day_or_time(day_start, time_tokens, options)
0
outer_span = Span.new(day_start, day_start + (24 * 60 * 60))
0
return false if token_index != tokens.size
0
+ self.pattern == other.pattern
Comments
No one has commented yet.