add support for fortnights
authorChuck Hagenbuch <chuck@horde.org>
Fri, 22 May 2009 13:48:40 +0000 (09:48 -0400)
committerChuck Hagenbuch <chuck@horde.org>
Fri, 22 May 2009 15:57:32 +0000 (11:57 -0400)
framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater.php
framework/Date_Parser/lib/Horde/Date/Repeater/Fortnight.php [new file with mode: 0644]
framework/Date_Parser/test/Horde/Date/Parser/Locale/BaseTest.php

index 5806193..717a803 100644 (file)
@@ -42,6 +42,7 @@ class Horde_Date_Parser_Locale_Base_Repeater
         '/^years?$/' => 'year',
         '/^seasons?$/' => 'season',
         '/^months?$/' => 'month',
+        '/^fortnights?$/' => 'fortnight',
         '/^weeks?$/' => 'week',
         '/^weekends?$/' => 'weekend',
         '/^days?$/' => 'day',
diff --git a/framework/Date_Parser/lib/Horde/Date/Repeater/Fortnight.php b/framework/Date_Parser/lib/Horde/Date/Repeater/Fortnight.php
new file mode 100644 (file)
index 0000000..00f4ae8
--- /dev/null
@@ -0,0 +1,81 @@
+<?php
+class Horde_Date_Repeater_Fortnight extends Horde_Date_Repeater
+{
+    // (14 * 24 * 60 * 60)
+    const FORTNIGHT_SECONDS = 1209600;
+
+    public $currentFortnightStart;
+
+    public function next($pointer)
+    {
+        parent::next($pointer);
+
+        if (!$this->currentFortnightStart) {
+            switch ($pointer) {
+            case 'future':
+                $sundayRepeater = new Horde_Date_Repeater_DayName('sunday');
+                $sundayRepeater->now = $this->now;
+                $nextSundaySpan = $sundayRepeater->next('future');
+                $this->currentFortnightStart = $nextSundaySpan->begin;
+                break;
+
+            case 'past':
+                $sundayRepeater = new Horde_Date_Repeater_DayName('sunday');
+                $sundayRepeater->now = clone $this->now;
+                $sundayRepeater->now->day++;
+                $sundayRepeater->next('past');
+                $sundayRepeater->next('past');
+                $lastSundaySpan = $sundayRepeater->next('past');
+                $this->currentFortnightStart = $lastSundaySpan->begin;
+                break;
+            }
+        } else {
+            $direction = ($pointer == 'future') ? 1 : -1;
+            $this->currentFortnightStart->add($direction * self::FORTNIGHT_SECONDS);
+        }
+
+        return new Horde_Date_Span($this->currentFortnightStart, $this->currentFortnightStart->add(self::FORTNIGHT_SECONDS));
+    }
+
+    public function this($pointer = 'future')
+    {
+        parent::this($pointer);
+
+        switch ($pointer) {
+        case 'future':
+        case 'none':
+            $thisFortnightStart = new Horde_Date(array('year' => $this->now->year, 'month' => $this->now->month, 'day' => $this->now->day, 'hour' => $this->now->hour + 1));
+            $sundayRepeater = new Horde_Date_Repeater_DayName('sunday');
+            $sundayRepeater->now = $this->now;
+            $sundayRepeater->this('future');
+            $thisSundaySpan = $sundayRepeater->this('future');
+            $thisFortnightEnd = $thisSundaySpan->begin;
+            return new Horde_Date_Span($thisFortnightStart, $thisFortnightEnd);
+
+        case 'past':
+            $thisFortnightEnd = new Horde_Date(array('year' => $this->now->year, 'month' => $this->now->month, 'day' => $this->now->day, 'hour' => $this->now->hour));
+            $sundayRepeater = new Horde_Date_Repeater_DayName('sunday');
+            $sundayRepeater->now = $this->now;
+            $lastSundaySpan = $sundayRepeater->next('past');
+            $thisFortnightStart = $lastSundaySpan->begin;
+            return new Horde_Date_Span($thisFortnightStart, $thisFortnightEnd);
+        }
+    }
+
+    public function offset($span, $amount, $pointer)
+    {
+        $direction = ($pointer == 'future') ? 1 : -1;
+        return $span->add($direction * $amount * self::FORTNIGHT_SECONDS);
+    }
+
+    public function width()
+    {
+        return self::FORTNIGHT_SECONDS;
+    }
+
+    public function __toString()
+    {
+        return parent::__toString() . '-fortnight';
+    }
+
+}
index 90ec13f..7bdca48 100644 (file)
@@ -362,7 +362,6 @@ class Horde_Date_Parser_Locale_BaseTest extends Horde_Test_Case
 
     public function testParseGuess_g_r_Fortnight()
     {
-        $this->fail("No support for fortnights currently");
         $time = $this->parser->parse("this fortnight");
         $this->assertEquals(new Horde_Date(2006, 8, 21, 19, 30), $time);
 
@@ -547,11 +546,9 @@ class Horde_Date_Parser_Locale_BaseTest extends Horde_Test_Case
         $this->assertEquals(new Horde_Date(2006, 7, 16, 14), $time);
 
         $time = $this->parser->parse("1 fortnight ago");
-        $this->markTestSkipped('Fortnights are not yet supported');
         $this->assertEquals(new Horde_Date(2006, 8, 2, 14), $time);
 
         $time = $this->parser->parse("2 fortnights ago");
-        $this->markTestSkipped('Fortnights are not yet supported');
         $this->assertEquals(new Horde_Date(2006, 7, 19, 14), $time);
 
         $time = $this->parser->parse("3 weeks ago");
@@ -575,8 +572,8 @@ class Horde_Date_Parser_Locale_BaseTest extends Horde_Test_Case
         $time = $this->parser->parse("20 seconds before now");
         $this->assertEquals(new Horde_Date(2006, 8, 16, 13, 59, 40), $time);
 
-        $time = $this->parser->parse("1 monday ago");
         $this->markTestSkipped('not yet supported');
+        $time = $this->parser->parse("1 monday ago");
         $this->assertEquals(new Horde_Date(2006, 8, 14, 12), $time);
     }
 
@@ -589,7 +586,6 @@ class Horde_Date_Parser_Locale_BaseTest extends Horde_Test_Case
         $this->assertEquals(new Horde_Date(2007, 2, 16, 14), $time);
 
         $time = $this->parser->parse("3 fortnights hence");
-        $this->markTestSkipped('Fortnights are not yet supported');
         $this->assertEquals(new Horde_Date(2006, 9, 27, 14), $time);
 
         $time = $this->parser->parse("1 week from now");