1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
|
module Chronic
class RepeaterDayPortion < Repeater #:nodoc:
PORTIONS = {
:am => 0..(12 * 60 * 60 - 1),
:pm => (12 * 60 * 60)..(24 * 60 * 60 - 1),
:morning => (6 * 60 * 60)..(12 * 60 * 60), # 6am-12am,
:afternoon => (13 * 60 * 60)..(17 * 60 * 60), # 1pm-5pm,
:evening => (17 * 60 * 60)..(20 * 60 * 60), # 5pm-8pm,
:night => (20 * 60 * 60)..(24 * 60 * 60), # 8pm-12pm
}
def initialize(type)
super
if type.kind_of? Integer
@range = (@type * 60 * 60)..((@type + 12) * 60 * 60)
else
@range = PORTIONS[type]
@range || raise("Invalid type '#{type}' for RepeaterDayPortion")
end
@range || raise("Range should have been set by now")
end
def next(pointer)
super
full_day = 60 * 60 * 24
if !@current_span
now_seconds = @now - Chronic.construct(@now.year, @now.month, @now.day)
if now_seconds < @range.begin
case pointer
when :future
range_start = Chronic.construct(@now.year, @now.month, @now.day) + @range.begin
when :past
range_start = Chronic.construct(@now.year, @now.month, @now.day) - full_day + @range.begin
end
elsif now_seconds > @range.end
case pointer
when :future
range_start = Chronic.construct(@now.year, @now.month, @now.day) + full_day + @range.begin
when :past
range_start = Chronic.construct(@now.year, @now.month, @now.day) + @range.begin
end
else
case pointer
when :future
range_start = Chronic.construct(@now.year, @now.month, @now.day) + full_day + @range.begin
when :past
range_start = Chronic.construct(@now.year, @now.month, @now.day) - full_day + @range.begin
end
end
@current_span = Span.new(range_start, range_start + (@range.end - @range.begin))
else
case pointer
when :future
@current_span += full_day
when :past
@current_span -= full_day
end
end
end
def this(context = :future)
super
range_start = Chronic.construct(@now.year, @now.month, @now.day) + @range.begin
@current_span = Span.new(range_start, range_start + (@range.end - @range.begin))
end
def offset(span, amount, pointer)
@now = span.begin
portion_span = self.next(pointer)
direction = pointer == :future ? 1 : -1
portion_span + (direction * (amount - 1) * RepeaterDay::DAY_SECONDS)
end
def width
@range || raise("Range has not been set")
return @current_span.width if @current_span
if @type.kind_of? Integer
return (12 * 60 * 60)
else
@range.end - @range.begin
end
end
def to_s
super << '-dayportion-' << @type.to_s
end
end
end
|