Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
100.00% |
1 / 1 |
|
100.00% |
3 / 3 |
CRAP | |
100.00% |
20 / 20 |
Parser | |
100.00% |
1 / 1 |
|
100.00% |
3 / 3 |
8 | |
100.00% |
20 / 20 |
parseStep | |
100.00% |
1 / 1 |
2 | |
100.00% |
4 / 4 |
|||
__construct | |
100.00% |
1 / 1 |
2 | |
100.00% |
6 / 6 |
|||
parse | |
100.00% |
1 / 1 |
4 | |
100.00% |
10 / 10 |
<?php | |
/** | |
* Copyright (c) Tony Bogdanov <tonybogdanov@gmail.com> | |
* | |
* For the full copyright and license information, please view the LICENSE | |
* file that was distributed with this source code. | |
*/ | |
namespace DataTraveller\Path; | |
use DataTraveller\Path\Step\LiteralStep; | |
use DataTraveller\Path\Step\RegexStep; | |
use DataTraveller\Path\Step\StepInterface; | |
use Nette\Tokenizer\Exception; | |
use Nette\Tokenizer\Stream; | |
use Nette\Tokenizer\Tokenizer; | |
/** | |
* Class Parser | |
* | |
* @package DataTraveller\Path | |
* @author Tony Bogdanov <tonybogdanov@gmail.com> | |
*/ | |
class Parser { | |
const T_DOT = 1; | |
const T_REGEX = 2; | |
const T_LITERAL = 3; | |
/** | |
* @var Tokenizer | |
*/ | |
protected $tokenizer; | |
/** | |
* @param Stream $stream | |
* | |
* @return StepInterface | |
* @throws Exception | |
*/ | |
protected function parseStep( Stream $stream ): StepInterface { | |
$token = $stream->consumeToken( static::T_REGEX, static::T_LITERAL ); | |
return static::T_LITERAL === $token->type ? | |
new LiteralStep( str_replace( '\\.', '.', $token->value ) ) : | |
new RegexStep( $token->value ); | |
} | |
/** | |
* Parser constructor. | |
* | |
* @param bool $disableRegex | |
*/ | |
public function __construct( bool $disableRegex = false ) { | |
$tokens = [ | |
static::T_DOT => '\.', | |
]; | |
if ( ! $disableRegex ) { | |
$tokens[ static::T_REGEX ] = '\/[^\/\\\\]*(?:\\\\.[^\/\\\\]*)*\/[a-z]*'; | |
} | |
$tokens[ static::T_LITERAL ] = '[^\.\\\\]*(?:\\\\.[^\.\\\\]*)*'; | |
$this->tokenizer = new Tokenizer( $tokens ); | |
} | |
/** | |
* @param string $value | |
* | |
* @return StepInterface[] | |
* @throws Exception | |
*/ | |
public function parse( string $value ): array { | |
$stream = $this->tokenizer->tokenize( $value ); | |
$steps = []; | |
while ( ! $stream->isNext( null ) ) { | |
$steps[] = $this->parseStep( $stream ); | |
if ( $stream->isNext( null ) ) { | |
break; | |
} | |
$stream->consumeToken( static::T_DOT ); | |
if ( $stream->isNext( null ) ) { | |
throw new Exception( 'Unexpected end of string' ); | |
} | |
} | |
return $steps; | |
} | |
} |