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}"