lib/chronic/handlers.rb in chronic-0.8.0 vs lib/chronic/handlers.rb in chronic-0.9.0

- old
+ new

@@ -2,11 +2,11 @@ module Handlers module_function # Handle month/day def handle_m_d(month, day, time_tokens, options) - month.start = Chronic.now + month.start = self.now span = month.this(options[:context]) year, month = span.begin.year, span.begin.month day_start = Chronic.time_class.local(year, month, day) day_or_time(day_start, time_tokens, options) @@ -15,11 +15,11 @@ # Handle repeater-month-name/scalar-day def handle_rmn_sd(tokens, options) month = tokens[0].get_tag(RepeaterMonthName) day = tokens[1].get_tag(ScalarDay).type - return if month_overflow?(Chronic.now.year, month.index, day) + return if month_overflow?(self.now.year, month.index, day) handle_m_d(month, day, tokens[2..tokens.size], options) end # Handle repeater-month-name/scalar-day with separator-on @@ -32,21 +32,21 @@ month = tokens[1].get_tag(RepeaterMonthName) day = tokens[2].get_tag(ScalarDay).type token_range = 0..0 end - return if month_overflow?(Chronic.now.year, month.index, day) + return if month_overflow?(self.now.year, month.index, day) handle_m_d(month, day, tokens[token_range], options) end # Handle repeater-month-name/ordinal-day def handle_rmn_od(tokens, options) month = tokens[0].get_tag(RepeaterMonthName) day = tokens[1].get_tag(OrdinalDay).type - return if month_overflow?(Chronic.now.year, month.index, day) + return if month_overflow?(self.now.year, month.index, day) handle_m_d(month, day, tokens[2..tokens.size], options) end # Handle ordinal this month @@ -59,11 +59,11 @@ # Handle ordinal-day/repeater-month-name def handle_od_rmn(tokens, options) month = tokens[1].get_tag(RepeaterMonthName) day = tokens[0].get_tag(OrdinalDay).type - return if month_overflow?(Chronic.now.year, month.index, day) + return if month_overflow?(self.now.year, month.index, day) handle_m_d(month, day, tokens[2..tokens.size], options) end def handle_sy_rmn_od(tokens, options) @@ -85,11 +85,11 @@ # Handle scalar-day/repeater-month-name def handle_sd_rmn(tokens, options) month = tokens[1].get_tag(RepeaterMonthName) day = tokens[0].get_tag(ScalarDay).type - return if month_overflow?(Chronic.now.year, month.index, day) + return if month_overflow?(self.now.year, month.index, day) handle_m_d(month, day, tokens[2..tokens.size], options) end # Handle repeater-month-name/ordinal-day with separator-on @@ -102,11 +102,11 @@ month = tokens[1].get_tag(RepeaterMonthName) day = tokens[2].get_tag(OrdinalDay).type token_range = 0..0 end - return if month_overflow?(Chronic.now.year, month.index, day) + return if month_overflow?(self.now.year, month.index, day) handle_m_d(month, day, tokens[token_range], options) end # Handle repeater-month-name/scalar-year @@ -227,17 +227,18 @@ # Handle scalar-month/scalar-day def handle_sm_sd(tokens, options) month = tokens[0].get_tag(ScalarMonth).type day = tokens[1].get_tag(ScalarDay).type - year = Chronic.now.year + year = self.now.year time_tokens = tokens.last(tokens.size - 2) return if month_overflow?(year, month, day) begin day_start = Chronic.time_class.local(year, month, day) + day_start = Chronic.time_class.local(year + 1, month, day) if options[:context] == :future && day_start < now day_or_time(day_start, time_tokens, options) rescue ArgumentError nil end end @@ -272,35 +273,73 @@ # Handle RepeaterDayName RepeaterMonthName OrdinalDay def handle_rdn_rmn_od(tokens, options) month = tokens[1].get_tag(RepeaterMonthName) day = tokens[2].get_tag(OrdinalDay).type - year = Chronic.now.year + time_tokens = tokens.last(tokens.size - 3) + year = self.now.year return if month_overflow?(year, month.index, day) begin - start_time = Chronic.time_class.local(year, month.index, day) - end_time = time_with_rollover(year, month.index, day + 1) - Span.new(start_time, end_time) + if time_tokens.empty? + start_time = Chronic.time_class.local(year, month.index, day) + end_time = time_with_rollover(year, month.index, day + 1) + Span.new(start_time, end_time) + else + day_start = Chronic.time_class.local(year, month.index, day) + day_or_time(day_start, time_tokens, options) + end rescue ArgumentError nil end end + # Handle RepeaterDayName OrdinalDay + def handle_rdn_od(tokens, options) + day = tokens[1].get_tag(OrdinalDay).type + time_tokens = tokens.last(tokens.size - 2) + year = self.now.year + month = self.now.month + if options[:context] == :future + self.now.day > day ? month += 1 : month + end + + return if month_overflow?(year, month, day) + + begin + if time_tokens.empty? + start_time = Chronic.time_class.local(year, month, day) + end_time = time_with_rollover(year, month, day + 1) + Span.new(start_time, end_time) + else + day_start = Chronic.time_class.local(year, month, day) + day_or_time(day_start, time_tokens, options) + end + rescue ArgumentError + nil + end + end + # Handle RepeaterDayName RepeaterMonthName ScalarDay def handle_rdn_rmn_sd(tokens, options) month = tokens[1].get_tag(RepeaterMonthName) day = tokens[2].get_tag(ScalarDay).type - year = Chronic.now.year + time_tokens = tokens.last(tokens.size - 3) + year = self.now.year return if month_overflow?(year, month.index, day) begin - start_time = Chronic.time_class.local(year, month.index, day) - end_time = time_with_rollover(year, month.index, day + 1) - Span.new(start_time, end_time) + if time_tokens.empty? + start_time = Chronic.time_class.local(year, month.index, day) + end_time = time_with_rollover(year, month.index, day + 1) + Span.new(start_time, end_time) + else + day_start = Chronic.time_class.local(year, month.index, day) + day_or_time(day_start, time_tokens, options) + end rescue ArgumentError nil end end @@ -330,11 +369,12 @@ h, m, s = time.hour, time.min, time.sec time = Chronic.time_class.local(year, month, day, h, m, s) end_time = Chronic.time_class.local(year, month, day + 1, h, m, s) else time = Chronic.time_class.local(year, month, day) - end_time = Chronic.time_class.local(year, month, day + 1) + day += 1 unless day >= 31 + end_time = Chronic.time_class.local(year, month, day) end Span.new(time, end_time) end # anchors @@ -363,11 +403,11 @@ end # Handle scalar/repeater/pointer def handle_s_r_p(tokens, options) repeater = tokens[1].get_tag(Repeater) - span = Span.new(Chronic.now, Chronic.now + 1) + span = Span.new(self.now, self.now + 1) handle_srp(tokens, span, options) end # Handle pointer/scalar/repeater @@ -380,10 +420,17 @@ def handle_s_r_p_a(tokens, options) anchor_span = get_anchor(tokens[3..tokens.size - 1], options) handle_srp(tokens, anchor_span, options) end + def handle_s_r_a_s_r_p_a(tokens, options) + anchor_span = get_anchor(tokens[4..tokens.size - 1], options) + + span = handle_srp(tokens[0..1]+tokens[4..6], anchor_span, options) + handle_srp(tokens[2..3]+tokens[4..6], span, options) + end + # narrows # Handle oridinal repeaters def handle_orr(tokens, outer_span, options) repeater = tokens[1].get_tag(Repeater) @@ -419,11 +466,11 @@ def day_or_time(day_start, time_tokens, options) outer_span = Span.new(day_start, day_start + (24 * 60 * 60)) if !time_tokens.empty? - Chronic.now = outer_span.begin + self.now = outer_span.begin get_anchor(dealias_and_disambiguate_times(time_tokens, options), options) else outer_span end end @@ -437,11 +484,11 @@ if tokens.first && tokens.first.get_tag(Grabber) grabber = tokens.shift.get_tag(Grabber) end head = repeaters.shift - head.start = Chronic.now + head.start = self.now case grabber.type when :last outer_span = head.next(:past) when :this @@ -451,10 +498,10 @@ outer_span = head.this(options[:context]) end when :next outer_span = head.next(:future) else - raise ChronicPain, "Invalid grabber" + raise "Invalid grabber" end if Chronic.debug puts "Handler-class: #{head.class}" puts "--#{outer_span}"