Code Coverage  | 
     ||||||||||
Classes and Traits  | 
      Functions and Methods  | 
      Lines  | 
     ||||||||
| Total |         | 
      0.00%  | 
      0 / 1  | 
              | 
      75.00%  | 
      3 / 4  | 
      CRAP |         | 
      82.76%  | 
      24 / 29  | 
     
| PregSimple |         | 
      0.00%  | 
      0 / 1  | 
              | 
      75.00%  | 
      3 / 4  | 
      12.74 |         | 
      82.76%  | 
      24 / 29  | 
     
| __construct |         | 
      0.00%  | 
      0 / 1  | 
      5.76 |         | 
      68.75%  | 
      11 / 16  | 
     |||
| setCallback |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      2 / 2  | 
     |||
| getExpression |         | 
      100.00%  | 
      1 / 1  | 
      1 |         | 
      100.00%  | 
      1 / 1  | 
     |||
| hydrateResult |         | 
      100.00%  | 
      1 / 1  | 
      5 |         | 
      100.00%  | 
      10 / 10  | 
     |||
| <?php | |
| namespace Popy\Calendar\Parser\DateLexer; | |
| use InvalidArgumentException; | |
| use Popy\Calendar\Parser\FormatToken; | |
| use Popy\Calendar\Parser\DateLexerResult; | |
| /** | |
| * Simple Preg lexer implementation : will match a single pattern and associate | |
| * it with the input token if it's a symbol. | |
| * | |
| * Litterals and EOF are also handled, but the input pattern is not used. | |
| */ | |
| class PregSimple extends AbstractPreg | |
| { | |
| /** | |
| * Registered symbol. | |
| * | |
| * @var string|null | |
| */ | |
| protected $symbol; | |
| /** | |
| * Expression. | |
| * | |
| * @var string | |
| */ | |
| protected $expression; | |
| /** | |
| * Match processing callback. | |
| * | |
| * @var callable | |
| */ | |
| protected $callback; | |
| /** | |
| * Class constructor. | |
| * | |
| * @param FormatToken $token Token to match. | |
| * @param string|null $pattern Preg pattern. | |
| */ | |
| public function __construct(FormatToken $token, $pattern = null) | |
| { | |
| if ($token->isLitteral()) { | |
| $this->expression = preg_quote($token->getValue(), '/'); | |
| return; | |
| } | |
| if ($token->isType(FormatToken::TYPE_EOF)) { | |
| $this->expression = '$'; | |
| return; | |
| } | |
| if ($token->isSymbol()) { | |
| if ($pattern === null) { | |
| throw new InvalidArgumentException( | |
| 'You must supply a pattern for a Symbol token' | |
| ); | |
| } | |
| $this->symbol = $token->getName(); | |
| $this->expression = '(' . $pattern . ')'; | |
| return; | |
| } | |
| throw new InvalidArgumentException( | |
| 'Unsupported token type : ' . $token->getType() | |
| ); | |
| } | |
| /** | |
| * Match processing callback. | |
| * | |
| * The callback will receive the Lexer and the matched string as input, and | |
| * must return the value to hydrate in the result. | |
| * | |
| * @param callable $callback | |
| */ | |
| public function setCallback($callback) | |
| { | |
| $this->callback = $callback; | |
| } | |
| /** | |
| * @inheritDoc | |
| */ | |
| public function getExpression() | |
| { | |
| return $this->expression; | |
| } | |
| /** | |
| * @inheritDoc | |
| */ | |
| public function hydrateResult(DateLexerResult $result, $match, $offset = 1) | |
| { | |
| if ($this->symbol === null || !isset($match[$offset])) { | |
| return $offset; | |
| } | |
| // Did match | |
| if ($match[$offset][1] !== -1) { | |
| $res = $match[$offset][0]; | |
| if ($this->callback !== null) { | |
| $res = call_user_func($this->callback, $this, $res); | |
| } | |
| $result->set($this->symbol, $res); | |
| } | |
| return $offset + 1; | |
| } | |
| } |