From fa656f9ff919a79aa3d6299b7dd7b04f145c66e0 Mon Sep 17 00:00:00 2001 From: Chuck Hagenbuch Date: Fri, 30 Jan 2009 17:11:49 -0500 Subject: [PATCH] initial dayname, week, and weekend ports --- .../Date/Parser/Locale/Base/Repeater/DayName.php | 97 +++++++------- .../Date/Parser/Locale/Base/Repeater/Week.php | 139 +++++++++++--------- .../Date/Parser/Locale/Base/Repeater/Weekend.php | 143 ++++++++++++--------- 3 files changed, 218 insertions(+), 161 deletions(-) diff --git a/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/DayName.php b/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/DayName.php index d93399cd7..9ad629159 100644 --- a/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/DayName.php +++ b/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/DayName.php @@ -4,46 +4,57 @@ class Horde_Date_Parser_Locale_Base_Repeater_DayName extends Horde_Date_Parser_L // (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]; + } + +} diff --git a/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/Week.php b/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/Week.php index 6ce5b35da..356c66019 100644 --- a/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/Week.php +++ b/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/Week.php @@ -1,70 +1,91 @@ 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'; + } + +} diff --git a/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/Weekend.php b/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/Weekend.php index 2ddfb1579..17b227e46 100644 --- a/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/Weekend.php +++ b/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/Weekend.php @@ -1,62 +1,87 @@ 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'; + } + +} -- 2.11.0