From 915cd6b976f51a8f2b3745c5fb76f18ccbe003b9 Mon Sep 17 00:00:00 2001 From: Chuck Hagenbuch Date: Fri, 22 May 2009 09:48:40 -0400 Subject: [PATCH] add support for fortnights --- .../lib/Horde/Date/Parser/Locale/Base/Repeater.php | 1 + .../lib/Horde/Date/Repeater/Fortnight.php | 81 ++++++++++++++++++++++ .../test/Horde/Date/Parser/Locale/BaseTest.php | 6 +- 3 files changed, 83 insertions(+), 5 deletions(-) create mode 100644 framework/Date_Parser/lib/Horde/Date/Repeater/Fortnight.php diff --git a/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater.php b/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater.php index 5806193b6..717a8034a 100644 --- a/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater.php +++ b/framework/Date_Parser/lib/Horde/Date/Parser/Locale/Base/Repeater.php @@ -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 index 000000000..00f4ae8ea --- /dev/null +++ b/framework/Date_Parser/lib/Horde/Date/Repeater/Fortnight.php @@ -0,0 +1,81 @@ +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'; + } + +} diff --git a/framework/Date_Parser/test/Horde/Date/Parser/Locale/BaseTest.php b/framework/Date_Parser/test/Horde/Date/Parser/Locale/BaseTest.php index 90ec13f07..7bdca4804 100644 --- a/framework/Date_Parser/test/Horde/Date/Parser/Locale/BaseTest.php +++ b/framework/Date_Parser/test/Horde/Date/Parser/Locale/BaseTest.php @@ -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"); -- 2.11.0