initial dayname, week, and weekend ports
authorChuck Hagenbuch <chuck@horde.org>
Fri, 30 Jan 2009 22:11:49 +0000 (17:11 -0500)
committerChuck Hagenbuch <chuck@horde.org>
Fri, 30 Jan 2009 22:12:09 +0000 (17:12 -0500)
framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/DayName.php
framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/Week.php
framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater/Weekend.php

index d93399c..9ad6291 100644 (file)
@@ -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];
+    }
+
+}
index 6ce5b35..356c660 100644 (file)
@@ -1,70 +1,91 @@
 <?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';
+    }
+
+}
index 2ddfb15..17b227e 100644 (file)
@@ -1,62 +1,87 @@
 <?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';
+    }
+
+}