0
+ def definitions #:nodoc:
0
+ {:time => [Handler.new([:repeater_time, :repeater_day_portion?], nil)],
0
+ :date => [Handler.new([:repeater_month_name, :scalar_day, :scalar_year], :handle_rmn_sd_sy),
0
+ Handler.new([:repeater_month_name, :scalar_day, :scalar_year, :separator_at?, 'time?'], :handle_rmn_sd_sy),
0
+ Handler.new([:repeater_month_name, :scalar_day, :separator_at?, 'time?'], :handle_rmn_sd),
0
+ Handler.new([:repeater_month_name, :ordinal_day, :separator_at?, 'time?'], :handle_rmn_od),
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
+ 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
+ :anchor => [Handler.new([:grabber?, :repeater, :separator_at?, :repeater?, :repeater?], :handle_r),
0
+ Handler.new([:repeater, :grabber, :repeater], :handle_r_g_r)],
0
+ :arrow => [Handler.new([:scalar, :repeater, :pointer], :handle_s_r_p),
0
+ Handler.new([:pointer, :scalar, :repeater], :handle_p_s_r),
0
+ Handler.new([:scalar, :repeater, :pointer, 'anchor'], :handle_s_r_p_a)],
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
+ 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
+ puts handler.handler_method
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
+ 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
+ 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 an narrow
0
+ self.definitions[:narrow].each do |handler|
0
+ if handler.match(tokens, self.definitions)
0
+ #good_tokens = tokens.select { |o| !o.get_tag Separator }
0
+ return self.send(handler.handler_method, tokens, options)
0
+ # I guess you're out of luck!
0
+ def day_or_time(day_start, time_tokens, options)
0
+ outer_span = Span.new(day_start, day_start + (24 * 60 * 60))
0
+ if !time_tokens.empty?
0
+ @now = outer_span.begin
0
+ time = get_anchor(dealias_and_disambiguate_times(time_tokens, options), options)
0
+ def handle_m_d(month, day, time_tokens, options) #:nodoc:
0
+ span = month.next(options[:context])
0
+ day_start = Time.local(span.begin.year, span.begin.month, day)
0
+ day_or_time(day_start, time_tokens, options)
0
+ def handle_rmn_sd(tokens, options) #:nodoc:
0
+ handle_m_d(tokens[0].get_tag(RepeaterMonthName), tokens[1].get_tag(ScalarDay).type, tokens[2..tokens.size], options)
0
+ def handle_rmn_od(tokens, options) #:nodoc:
0
+ handle_m_d(tokens[0].get_tag(RepeaterMonthName), tokens[1].get_tag(OrdinalDay).type, tokens[2..tokens.size], options)
0
+ def handle_rmn_sy(tokens, options) #:nodoc:
0
+ month = tokens[0].get_tag(RepeaterMonthName).index
0
+ year = tokens[1].get_tag(ScalarYear).type
0
+ next_month_year = year + 1
0
+ next_month_year = year
0
+ next_month_month = month + 1
0
+ Span.new(Time.local(year, month), Time.local(next_month_year, next_month_month))
0
+ def handle_rmn_sd_sy(tokens, options) #:nodoc:
0
+ month = tokens[0].get_tag(RepeaterMonthName).index
0
+ day = tokens[1].get_tag(ScalarDay).type
0
+ year = tokens[2].get_tag(ScalarYear).type
0
+ time_tokens = tokens.last(tokens.size - 3)
0
+ day_start = Time.local(year, month, day)
0
+ day_or_time(day_start, time_tokens, options)
0
+ def handle_sd_rmn_sy(tokens, options) #:nodoc:
0
+ new_tokens = [tokens[1], tokens[0], tokens[2]]
0
+ time_tokens = tokens.last(tokens.size - 3)
0
+ self.handle_rmn_sd_sy(new_tokens + time_tokens, options)
0
+ def handle_sm_sd_sy(tokens, options) #:nodoc:
0
+ month = tokens[0].get_tag(ScalarMonth).type
0
+ day = tokens[1].get_tag(ScalarDay).type
0
+ year = tokens[2].get_tag(ScalarYear).type
0
+ time_tokens = tokens.last(tokens.size - 3)
0
+ day_start = Time.local(year, month, day) #:nodoc:
0
+ day_or_time(day_start, time_tokens, options)
0
+ def handle_sd_sm_sy(tokens, options) #:nodoc:
0
+ new_tokens = [tokens[1], tokens[0], tokens[2]]
0
+ time_tokens = tokens.last(tokens.size - 3)
0
+ self.handle_sm_sd_sy(new_tokens + time_tokens, options)
0
+ def handle_sy_sm_sd(tokens, options) #:nodoc:
0
+ new_tokens = [tokens[1], tokens[2], tokens[0]]
0
+ time_tokens = tokens.last(tokens.size - 3)
0
+ self.handle_sm_sd_sy(new_tokens + time_tokens, options)
0
+ def handle_sm_sy(tokens, options) #:nodoc:
0
+ month = tokens[0].get_tag(ScalarMonth).type
0
+ year = tokens[1].get_tag(ScalarYear).type
0
+ next_month_year = year + 1
0
+ next_month_year = year
0
+ next_month_month = month + 1
0
+ Span.new(Time.local(year, month), Time.local(next_month_year, next_month_month))
0
+ def handle_r(tokens, options) #:nodoc:
0
+ dd_tokens = dealias_and_disambiguate_times(tokens, options)
0
+ self.get_anchor(dd_tokens, options)
0
+ def handle_r_g_r(tokens, options) #:nodoc:
0
+ new_tokens = [tokens[1], tokens[0], tokens[2]]
0
+ self.handle_r(new_tokens, options)
0
+ def handle_srp(tokens, span, options) #:nodoc:
0
+ distance = tokens[0].get_tag(Scalar).type
0
+ repeater = tokens[1].get_tag(Repeater)
0
+ pointer = tokens[2].get_tag(Pointer).type
0
+ repeater.offset(span, distance, pointer)
0
+ def handle_s_r_p(tokens, options) #:nodoc:
0
+ repeater = tokens[1].get_tag(Repeater)
0
+ when [RepeaterYear, RepeaterSeason, RepeaterSeasonName, RepeaterMonth, RepeaterMonthName, RepeaterFortnight, RepeaterWeek].include?(repeater.class)
0
+ self.parse("today", :guess => false, :now => @now)
0
+ when [RepeaterWeekend, RepeaterDay, RepeaterDayName, RepeaterDayPortion, RepeaterHour].include?(repeater.class)
0
+ self.parse("this minute", :guess => false, :now => @now)
0
+ when [RepeaterMinute, RepeaterSecond].include?(repeater.class)
0
+ self.parse("this second", :guess => false, :now => @now)
0
+ raise(ChronicPain, "Invalid repeater: #{repeater.class}")
0
+ self.handle_srp(tokens, span, options)