// (24 * 60 * 60)
const DAY_SECONDS = 86400;
- def next(pointer)
- super
-
- direction = pointer == :future ? 1 : -1
-
- if !@current_day_start
- @current_day_start = Time.construct(@now.year, @now.month, @now.day)
- @current_day_start += direction * DAY_SECONDS
-
- day_num = symbol_to_number(@type)
-
- while @current_day_start.wday != day_num
- @current_day_start += direction * DAY_SECONDS
- end
- else
- @current_day_start += direction * 7 * DAY_SECONDS
- end
-
- Chronic::Span.new(@current_day_start, @current_day_start + DAY_SECONDS)
- end
-
- def this(pointer = :future)
- super
-
- pointer = :future if pointer == :none
- self.next(pointer)
- end
-
- def width
- DAY_SECONDS
- end
-
- def to_s
- super << '-dayname-' << @type.to_s
- end
-
- private
-
- def symbol_to_number(sym)
- lookup = {:sunday => 0, :monday => 1, :tuesday => 2, :wednesday => 3, :thursday => 4, :friday => 5, :saturday => 6}
- lookup[sym] || raise("Invalid symbol specified")
- end
-end
\ No newline at end of file
+ public $currentDayStart;
+
+ public function next($pointer)
+ {
+ parent::next($pointer);
+
+ $direction = ($pointer == 'future') ? 1 : -1;
+
+ if (!$this->currentDayStart) {
+ $this->currentDayStart = new Horde_Date(array('year' => $this->now->year, 'month' => $this->now->month, 'day' => $this->now->day + $direction));
+
+ $dayNum = $this->type;
+ while ($this->currentDayStart->dayOfWeek() != $dayNum) {
+ $this->currentDayStart->day += $direction;
+ }
+ } else {
+ $this->currentDayStart->day += $direction * 7;
+ }
+
+ $end = clone($this->currentDayStart);
+ $end->day++;
+ return new Horde_Date_Span($this->currentDayStart, $end);
+ }
+
+ public function this($pointer = 'future')
+ {
+ parent::next($pointer);
+
+ if ($pointer == 'none') {
+ $pointer = 'future';
+ }
+ return $this->next($pointer);
+ }
+
+ public function width()
+ {
+ return self::DAY_SECONDS;
+ }
+
+ public function __toString()
+ {
+ $dayStrings = array(
+ Horde_Date::DATE_MONDAY => 'monday',
+ Horde_Date::DATE_TUESDAY => 'tuesday',
+ Horde_Date::DATE_WEDNESDAY => 'wednesday',
+ Horde_Date::DATE_THURSDAY => 'thursday',
+ Horde_Date::DATE_FRIDAY => 'friday',
+ Horde_Date::DATE_SATURDAY => 'saturday',
+ Horde_Date::DATE_SUNDAY => 'sunday',
+ );
+ return parent::__toString() . '-dayname-' . $dayStrings[$this->type];
+ }
+
+}
<?php
class Horde_Date_Parser_Locale_Base_Repeater_Week extends Horde_Date_Parser_Locale_Base_Repeater
{
- WEEK_SECONDS = 604800 # (7 * 24 * 60 * 60)
+ /**
+ * (7 * 24 * 60 * 60)
+ */
+ const WEEK_SECONDS = 604800;
- def next(pointer)
- super
+ public $currentWeekStart;
- if !@current_week_start
- case pointer
- when :future
- sunday_repeater = Chronic::RepeaterDayName.new(:sunday)
- sunday_repeater.start = @now
- next_sunday_span = sunday_repeater.next(:future)
- @current_week_start = next_sunday_span.begin
- when :past
- sunday_repeater = Chronic::RepeaterDayName.new(:sunday)
- sunday_repeater.start = (@now + Chronic::RepeaterDay::DAY_SECONDS)
- sunday_repeater.next(:past)
- last_sunday_span = sunday_repeater.next(:past)
- @current_week_start = last_sunday_span.begin
- end
- else
- direction = pointer == :future ? 1 : -1
- @current_week_start += direction * WEEK_SECONDS
- end
+ public function next($pointer)
+ {
+ parent::next($pointer);
- Chronic::Span.new(@current_week_start, @current_week_start + WEEK_SECONDS)
- end
+ if (!$this->currentWeekStart) {
+ switch ($pointer) {
+ case 'future':
+ $sundayRepeater = new Horde_Date_Parser_Locale_Base_Repeater_DayName(Horde_Date::DATE_SUNDAY);
+ $sundayRepeater->start = $this->now;
+ $nextSundaySpan = $sundayRepeater->next('future');
+ $this->currentWeekStart = $nextSundaySpan->begin;
+ break;
- def this(pointer = :future)
- super
+ case 'past':
+ $sundayRepeater = new Horde_Date_Parser_Locale_Base_Repeater_DayName(Horde_Date::DATE_SUNDAY);
+ $sundayRepeater->start = clone($this->now);
+ $sundayRepeater->start->day++;
+ $sundayRepeater->next('past');
+ $lastSundaySpan = $sundayRepeater->next('past');
+ $currentWeekStart = $lastSundaySpan->begin;
+ break;
+ }
+ } else {
+ $direction = ($pointer == 'future') ? 1 : -1;
+ $this->currentWeekStart->day += $direction * 7;
+ }
- case pointer
- when :future
- this_week_start = Time.local(@now.year, @now.month, @now.day, @now.hour) + Chronic::RepeaterHour::HOUR_SECONDS
- sunday_repeater = Chronic::RepeaterDayName.new(:sunday)
- sunday_repeater.start = @now
- this_sunday_span = sunday_repeater.this(:future)
- this_week_end = this_sunday_span.begin
- Chronic::Span.new(this_week_start, this_week_end)
- when :past
- this_week_end = Time.local(@now.year, @now.month, @now.day, @now.hour)
- sunday_repeater = Chronic::RepeaterDayName.new(:sunday)
- sunday_repeater.start = @now
- last_sunday_span = sunday_repeater.next(:past)
- this_week_start = last_sunday_span.begin
- Chronic::Span.new(this_week_start, this_week_end)
- when :none
- sunday_repeater = Chronic::RepeaterDayName.new(:sunday)
- sunday_repeater.start = @now
- last_sunday_span = sunday_repeater.next(:past)
- this_week_start = last_sunday_span.begin
- Chronic::Span.new(this_week_start, this_week_start + WEEK_SECONDS)
- end
- end
+ $end = clone($this->currentWeekStart);
+ $end->day += 7;
+ return new Horde_Date_Span($this->currentWeekStart, $end);
+ }
- def offset(span, amount, pointer)
- direction = pointer == :future ? 1 : -1
- span + direction * amount * WEEK_SECONDS
- end
+ public function this($pointer = 'future')
+ {
+ parent::this($pointer);
- def width
- WEEK_SECONDS
- end
+ switch ($pointer) {
+ case 'future':
+ $thisWeekStart = new Horde_Date(array('year' => $now->year, 'month' => $now->month, 'day' => $now->day, 'hour' => $now->hour + 1));
+ $sundayRepeater = new Horde_Date_Parser_Locale_Base_Repeater_DayName(Horde_Date::DATE_SUNDAY);
+ $sundayRepeater->start = $this->now;
+ $thisSundaySpan = $sundayRepeater->this('future');
+ $thisWeekEnd = $thisSundaySpan->begin;
+ return new Horde_Date_Span($thisWeekStart, $thisWeekEnd);
- def to_s
- super << '-week'
- end
-end
\ No newline at end of file
+ case 'past':
+ $thisWeekEnd = new Horde_Date(array('year' => $now->year, 'month' => $now->month, 'day' => $now->day, 'hour' => $now->hour));
+ $sundayRepeater = new Horde_Date_Parser_Locale_Base_Repeater_DayName(Horde_Date::DATE_SUNDAY);
+ $sundayRepeater->start = $this->now;
+ $lastSundaySpan = $sundayRepeater->next('past');
+ $thisWeekStart = $lastSundaySpan->begin;
+ return new Horde_Date_Span($thisWeekStart, $thisWeekEnd);
+
+ case 'none':
+ $sundayRepeater = new Horde_Date_Parser_Locale_Base_Repeater_DayName(Horde_Date::DATE_SUNDAY);
+ $sundayRepeater->start = $this->now;
+ $lastSundaySpan = $sundayRepeater->next('past');
+ $thisWeekStart = $lastSundaySpan->begin;
+ $thisWeekEnd = clone($thisWeekStart);
+ $thisWeekEnd->day += 7;
+ return new Horde_Date_Span($thisWeekStart, $thisWeekEnd);
+ }
+ }
+
+ public function offset($span, $amount, $pointer)
+ {
+ $direction = ($pointer == 'future') ? 1 : -1;
+ return $span->add($direction * $amount * self::WEEK_SECONDS);
+ }
+
+ public function width()
+ {
+ return self::WEEK_SECONDS;
+ }
+
+ public function __toString()
+ {
+ return parent::__toString() . '-week';
+ }
+
+}
<?php
class Horde_Date_Parser_Locale_Base_Repeater_Weekend extends Horde_Date_Parser_Locale_Base_Repeater
{
- WEEKEND_SECONDS = 172_800 # (2 * 24 * 60 * 60)
-
- def next(pointer)
- super
-
- if !@current_week_start
- case pointer
- when :future
- saturday_repeater = Chronic::RepeaterDayName.new(:saturday)
- saturday_repeater.start = @now
- next_saturday_span = saturday_repeater.next(:future)
- @current_week_start = next_saturday_span.begin
- when :past
- saturday_repeater = Chronic::RepeaterDayName.new(:saturday)
- saturday_repeater.start = (@now + Chronic::RepeaterDay::DAY_SECONDS)
- last_saturday_span = saturday_repeater.next(:past)
- @current_week_start = last_saturday_span.begin
- end
- else
- direction = pointer == :future ? 1 : -1
- @current_week_start += direction * Chronic::RepeaterWeek::WEEK_SECONDS
- end
-
- Chronic::Span.new(@current_week_start, @current_week_start + WEEKEND_SECONDS)
- end
-
- def this(pointer = :future)
- super
-
- case pointer
- when :future, :none
- saturday_repeater = Chronic::RepeaterDayName.new(:saturday)
- saturday_repeater.start = @now
- this_saturday_span = saturday_repeater.this(:future)
- Chronic::Span.new(this_saturday_span.begin, this_saturday_span.begin + WEEKEND_SECONDS)
- when :past
- saturday_repeater = Chronic::RepeaterDayName.new(:saturday)
- saturday_repeater.start = @now
- last_saturday_span = saturday_repeater.this(:past)
- Chronic::Span.new(last_saturday_span.begin, last_saturday_span.begin + WEEKEND_SECONDS)
- end
- end
-
- def offset(span, amount, pointer)
- direction = pointer == :future ? 1 : -1
- weekend = Chronic::RepeaterWeekend.new(:weekend)
- weekend.start = span.begin
- start = weekend.next(pointer).begin + (amount - 1) * direction * Chronic::RepeaterWeek::WEEK_SECONDS
- Chronic::Span.new(start, start + (span.end - span.begin))
- end
-
- def width
- WEEKEND_SECONDS
- end
-
- def to_s
- super << '-weekend'
- end
-end
\ No newline at end of file
+ /**
+ * (2 * 24 * 60 * 60)
+ */
+ const WEEKEND_SECONDS = 172800;
+
+ public $currentWeekStart;
+
+ public function next($pointer)
+ {
+ parent::next($pointer);
+
+ if ($this->currentWeekStart) {
+ switch ($pointer) {
+ case 'future':
+ $saturdayRepeater = new Horde_Date_Locale_Base_Repeater_DayName(Horde_Date::DATE_SATURDAY);
+ $saturdayRepeater->start = $this->now;
+ $nextSaturdaySpan = $saturdayRepeater->next('future');
+ $this->currentWeekStart = $nextSaturdaySpan->begin;
+ break;
+
+ case 'past':
+ $saturdayRepeater = new Horde_Date_Locale_Base_Repeater_DayName(Horde_Date::DATE_SATURDAY);
+ $saturdayRepeater->start = $this->now;
+ $saturdayRepeater->start->day++;
+ $lastSaturdaySpan = $saturdayRepeater->next('past');
+ $this->currentWeekStart = $lastSaturdaySpan->begin;
+ break;
+ }
+ } else {
+ $direction = ($pointer == 'future') ? 1 : -1;
+ $this->currentWeekStart->day += $direction * 7;
+ }
+
+ $currentWeekEnd = clone($this->currentWeekStart);
+ $currentWeekEnd->day += 2;
+ return new Horde_Date_Span($this->currentWeekStart, $currentWeekEnd);
+ }
+
+ public function this($pointer = 'future')
+ {
+ parent::this($pointer);
+
+ switch ($pointer) {
+ case 'future':
+ case 'none':
+ $saturdayRepeater = new Horde_Date_Locale_Base_Repeater_DayName(Horde_Date::DATE_SATURDAY);
+ $saturdayRepeater->start = $this->now;
+ $thisSaturdaySpan = $saturdayRepeater->this('future');
+ $thisSaturdaySpanEnd = $thisSaturdaySpan->begin;
+ $thisSaturdaySpanEnd->day += 2;
+ return new Horde_Date_Span($thisSaturdaySpan->begin, $thisSaturdaySpanEnd);
+
+ case 'past':
+ $saturdayRepeater = new Horde_Date_Locale_Base_Repeater_DayName(Horde_Date::DATE_SATURDAY);
+ $saturdayRepeater->start = $this->now;
+ $lastSaturdaySpan = $saturdayRepeater->this('past');
+ $lastSaturdaySpanEnd = $lastSaturdaySpan->begin;
+ $lastSaturdaySpanEnd->day += 2;
+ return new Horde_Date_Span($lastSaturdaySpan->begin, $lastSaturdaySpanEnd);
+ }
+ }
+
+ public function offset($span, $amount, $pointer)
+ {
+ $direction = ($pointer == 'future') ? 1 : -1;
+ $weekend = new Horde_Date_Parser_Locale_Base_Repeater_Weekend('weekend');
+ $weekend->start = $span->begin;
+ $start = $weekend->next($pointer)->begin;
+ $start->day += ($amount - 1) * $direction * 7;
+ // @FIXME
+ return new Horde_Date_Span($start, $start + ($span->end - $span->begin));
+ }
+
+ public function width()
+ {
+ return self::WEEKEND_SECONDS;
+ }
+
+ public function __toString()
+ {
+ return parent::__toString() . '-weekend';
+ }
+
+}