Code Coverage  | 
     ||||||||||
Classes and Traits  | 
      Functions and Methods  | 
      Lines  | 
     ||||||||
| Total |         | 
      0.00%  | 
      0 / 1  | 
              | 
      50.00%  | 
      1 / 2  | 
      CRAP |         | 
      83.87%  | 
      26 / 31  | 
     
| PregExtendedNative |         | 
      0.00%  | 
      0 / 1  | 
              | 
      50.00%  | 
      1 / 2  | 
      12.60 |         | 
      83.87%  | 
      26 / 31  | 
     
| __construct |         | 
      100.00%  | 
      1 / 1  | 
      3 |         | 
      100.00%  | 
      3 / 3  | 
     |||
| parseFormat |         | 
      0.00%  | 
      0 / 1  | 
      9.46 |         | 
      82.14%  | 
      23 / 28  | 
     |||
| <?php | |
| namespace Popy\Calendar\Parser\FormatParser; | |
| use Popy\Calendar\Parser\FormatToken; | |
| use Popy\Calendar\Parser\FormatLexerInterface; | |
| use Popy\Calendar\Parser\FormatLexer\MbString; | |
| use Popy\Calendar\Parser\FormatParserInterface; | |
| use Popy\Calendar\Parser\SymbolParserInterface; | |
| use Popy\Calendar\Parser\DateLexer\PregSimple; | |
| use Popy\Calendar\Parser\DateLexer\PregCollection; | |
| use Popy\Calendar\Parser\SymbolParser\PregNative; | |
| /** | |
| * Preg based implementation of the native DateTimeInterface format, with an | |
| * "extension" : | symbols delimits format alternatives. | |
| * | |
| * Uses PregCollection date lexer, so is only compatible with SymbolParsers that | |
| * returns Preg lexers. Otherwise, use another parser, like the basic one. | |
| * | |
| * PregCollection is usually 3x faster than a standard Collection lexer. | |
| */ | |
| class PregExtendedNative implements FormatParserInterface | |
| { | |
| /** | |
| * Format lexer. | |
| * | |
| * @var FormatLexerInterface | |
| */ | |
| protected $lexer; | |
| /** | |
| * Symbol Parser. | |
| * | |
| * @var SymbolParserInterface | |
| */ | |
| protected $symbolParser; | |
| /** | |
| * Class constructor. | |
| * | |
| * @param FormatLexerInterface|null $lexer Format lexer. | |
| * @param SymbolParserInterface|null $symbolParser Symbol Parser | |
| */ | |
| public function __construct(FormatLexerInterface $lexer = null, SymbolParserInterface $symbolParser = null) | |
| { | |
| $this->lexer = $lexer ?: new MbString(); | |
| $this->symbolParser = $symbolParser ?: new PregNative(); | |
| } | |
| /** | |
| * @inheritDoc | |
| */ | |
| public function parseFormat($format, $isRecursiveCall = false) | |
| { | |
| $tokens = $this->lexer->tokenizeFormat($format); | |
| $dateParser = new PregCollection(); | |
| $eofLexer = new PregSimple(new FormatToken(null, FormatToken::TYPE_EOF)); | |
| foreach ($tokens as $token) { | |
| if ($token->is('|')) { | |
| if (!$isRecursiveCall) { | |
| $dateParser->register($eofLexer); | |
| } | |
| $dateParser->close(); | |
| continue; | |
| } | |
| $lexer = null; | |
| if ($isRecursiveCall && $token->isType(FormatToken::TYPE_EOF)) { | |
| // Don't include EOF in recursive calls. | |
| break; | |
| } | |
| if ( | |
| $token->isSymbol() | |
| && null === $lexer = $this->symbolParser->parseSymbol( | |
| $token, | |
| $this | |
| ) | |
| ) { | |
| // finally, token seems litteral | |
| $token = $token->setLitteral(); | |
| } | |
| if ($lexer === null) { | |
| $lexer = new PregSimple($token); | |
| } | |
| $dateParser->register($lexer); | |
| } | |
| $dateParser->close(); | |
| $dateParser->compile(); | |
| return $dateParser; | |
| } | |
| } |