lib/chronic/handlers.rb in chronic-0.3.0 vs lib/chronic/handlers.rb in chronic-0.4.0

- old
+ new

@@ -1,12 +1,11 @@ module Chronic class << self def definitions(options={}) #:nodoc: - options[:endian_precedence] = [:middle, :little] if options[:endian_precedence].nil? - + options[:endian_precedence] ||= [:middle, :little] # ensure the endian precedence is exactly two elements long raise ChronicPain, "More than two elements specified for endian precedence array" unless options[:endian_precedence].length == 2 # handler for dd/mm/yyyy @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) @@ -17,40 +16,52 @@ # ensure we have valid endian values options[:endian_precedence].each do |e| raise ChronicPain, "Unknown endian type: #{e.to_s}" unless instance_variable_defined?(endian_variable_name_for(e)) end - @definitions ||= - {:time => [Handler.new([:repeater_time, :repeater_day_portion?], nil)], + @definitions ||= { + :time => [ + Handler.new([:repeater_time, :repeater_day_portion?], nil) + ], - :date => [Handler.new([:repeater_day_name, :repeater_month_name, :scalar_day, :repeater_time, :separator_slash_or_dash?, :time_zone, :scalar_year], :handle_rdn_rmn_sd_t_tz_sy), - Handler.new([:repeater_month_name, :scalar_day, :scalar_year], :handle_rmn_sd_sy), - Handler.new([:repeater_month_name, :scalar_day, :scalar_year, :separator_at?, 'time?'], :handle_rmn_sd_sy), - Handler.new([:repeater_month_name, :scalar_day, :separator_at?, 'time?'], :handle_rmn_sd), - Handler.new([:repeater_time, :repeater_day_portion?, :separator_on?, :repeater_month_name, :scalar_day], :handle_rmn_sd_on), - Handler.new([:repeater_month_name, :ordinal_day, :separator_at?, 'time?'], :handle_rmn_od), - Handler.new([:repeater_time, :repeater_day_portion?, :separator_on?, :repeater_month_name, :ordinal_day], :handle_rmn_od_on), - Handler.new([:repeater_month_name, :scalar_year], :handle_rmn_sy), - Handler.new([:scalar_day, :repeater_month_name, :scalar_year, :separator_at?, 'time?'], :handle_sd_rmn_sy), - @middle_endian_handler, - @little_endian_handler, - Handler.new([:scalar_year, :separator_slash_or_dash, :scalar_month, :separator_slash_or_dash, :scalar_day, :separator_at?, 'time?'], :handle_sy_sm_sd), - Handler.new([:scalar_month, :separator_slash_or_dash, :scalar_year], :handle_sm_sy)], + :date => [ + Handler.new([:repeater_day_name, :repeater_month_name, :scalar_day, :repeater_time, :separator_slash_or_dash?, :time_zone, :scalar_year], :handle_rdn_rmn_sd_t_tz_sy), + Handler.new([:repeater_month_name, :scalar_day, :scalar_year], :handle_rmn_sd_sy), + Handler.new([:repeater_month_name, :ordinal_day, :scalar_year], :handle_rmn_od_sy), + Handler.new([:repeater_month_name, :scalar_day, :scalar_year, :separator_at?, 'time?'], :handle_rmn_sd_sy), + Handler.new([:repeater_month_name, :ordinal_day, :scalar_year, :separator_at?, 'time?'], :handle_rmn_od_sy), + Handler.new([:repeater_month_name, :scalar_day, :separator_at?, 'time?'], :handle_rmn_sd), + Handler.new([:repeater_time, :repeater_day_portion?, :separator_on?, :repeater_month_name, :scalar_day], :handle_rmn_sd_on), + Handler.new([:repeater_month_name, :ordinal_day, :separator_at?, 'time?'], :handle_rmn_od), + Handler.new([:repeater_time, :repeater_day_portion?, :separator_on?, :repeater_month_name, :ordinal_day], :handle_rmn_od_on), + Handler.new([:repeater_month_name, :scalar_year], :handle_rmn_sy), + Handler.new([:scalar_day, :repeater_month_name, :scalar_year, :separator_at?, 'time?'], :handle_sd_rmn_sy), + @middle_endian_handler, + @little_endian_handler, + Handler.new([:scalar_year, :separator_slash_or_dash, :scalar_month, :separator_slash_or_dash, :scalar_day, :separator_at?, 'time?'], :handle_sy_sm_sd), + Handler.new([:scalar_month, :separator_slash_or_dash, :scalar_year], :handle_sm_sy) + ], - # tonight at 7pm - :anchor => [Handler.new([:grabber?, :repeater, :separator_at?, :repeater?, :repeater?], :handle_r), - Handler.new([:grabber?, :repeater, :repeater, :separator_at?, :repeater?, :repeater?], :handle_r), - Handler.new([:repeater, :grabber, :repeater], :handle_r_g_r)], + # tonight at 7pm + :anchor => [ + Handler.new([:grabber?, :repeater, :separator_at?, :repeater?, :repeater?], :handle_r), + Handler.new([:grabber?, :repeater, :repeater, :separator_at?, :repeater?, :repeater?], :handle_r), + Handler.new([:repeater, :grabber, :repeater], :handle_r_g_r) + ], - # 3 weeks from now, in 2 months - :arrow => [Handler.new([:scalar, :repeater, :pointer], :handle_s_r_p), - Handler.new([:pointer, :scalar, :repeater], :handle_p_s_r), - Handler.new([:scalar, :repeater, :pointer, 'anchor'], :handle_s_r_p_a)], + # 3 weeks from now, in 2 months + :arrow => [ + Handler.new([:scalar, :repeater, :pointer], :handle_s_r_p), + Handler.new([:pointer, :scalar, :repeater], :handle_p_s_r), + Handler.new([:scalar, :repeater, :pointer, 'anchor'], :handle_s_r_p_a) + ], - # 3rd week in march - :narrow => [Handler.new([:ordinal, :repeater, :separator_in, :repeater], :handle_o_r_s_r), - Handler.new([:ordinal, :repeater, :grabber, :repeater], :handle_o_r_g_r)] + # 3rd week in march + :narrow => [ + Handler.new([:ordinal, :repeater, :separator_in, :repeater], :handle_o_r_s_r), + Handler.new([:ordinal, :repeater, :grabber, :repeater], :handle_o_r_g_r) + ] } apply_endian_precedences(options[:endian_precedence]) @definitions @@ -128,14 +139,13 @@ def day_or_time(day_start, time_tokens, options) outer_span = Span.new(day_start, day_start + (24 * 60 * 60)) if !time_tokens.empty? @now = outer_span.begin - time = get_anchor(dealias_and_disambiguate_times(time_tokens, options), options) - return time + get_anchor(dealias_and_disambiguate_times(time_tokens, options), options) else - return outer_span + outer_span end end #-------------- @@ -209,10 +219,25 @@ rescue ArgumentError nil end end + def handle_rmn_od_sy(tokens, options) #:nodoc: + month = tokens[0].get_tag(RepeaterMonthName).index + day = tokens[1].get_tag(OrdinalDay).type + year = tokens[2].get_tag(ScalarYear).type + + time_tokens = tokens.last(tokens.size - 3) + + begin + day_start = Chronic.time_class.local(year, month, day) + day_or_time(day_start, time_tokens, options) + rescue ArgumentError + nil + end + end + def handle_sd_rmn_sy(tokens, options) #:nodoc: new_tokens = [tokens[1], tokens[0], tokens[2]] time_tokens = tokens.last(tokens.size - 3) self.handle_rmn_sd_sy(new_tokens + time_tokens, options) end @@ -361,11 +386,11 @@ case grabber.type when :last outer_span = head.next(:past) when :this - if repeaters.size > 0 + if options[:context] != :past and repeaters.size > 0 outer_span = head.this(:none) else outer_span = head.this(options[:context]) end when :next @@ -396,13 +421,11 @@ head, *rest = tags head.start = pointer == :future ? span.begin : span.end h = head.this(:none) - if span.include?(h.begin) || span.include?(h.end) - return find_within(rest, h, pointer) - else - return nil + if span.cover?(h.begin) || span.cover?(h.end) + find_within(rest, h, pointer) end end def dealias_and_disambiguate_times(tokens, options) #:nodoc: # handle aliases of am/pm