Chris@0
|
1 <?php
|
Chris@0
|
2
|
Chris@0
|
3 /*
|
Chris@0
|
4 * This file is part of the Symfony package.
|
Chris@0
|
5 *
|
Chris@0
|
6 * (c) Fabien Potencier <fabien@symfony.com>
|
Chris@0
|
7 *
|
Chris@0
|
8 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
9 * file that was distributed with this source code.
|
Chris@0
|
10 */
|
Chris@0
|
11
|
Chris@0
|
12 namespace Symfony\Component\CssSelector\Parser\Tokenizer;
|
Chris@0
|
13
|
Chris@0
|
14 use Symfony\Component\CssSelector\Parser\Handler;
|
Chris@0
|
15 use Symfony\Component\CssSelector\Parser\Reader;
|
Chris@0
|
16 use Symfony\Component\CssSelector\Parser\Token;
|
Chris@0
|
17 use Symfony\Component\CssSelector\Parser\TokenStream;
|
Chris@0
|
18
|
Chris@0
|
19 /**
|
Chris@0
|
20 * CSS selector tokenizer.
|
Chris@0
|
21 *
|
Chris@0
|
22 * This component is a port of the Python cssselect library,
|
Chris@0
|
23 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
|
Chris@0
|
24 *
|
Chris@0
|
25 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
|
Chris@0
|
26 *
|
Chris@0
|
27 * @internal
|
Chris@0
|
28 */
|
Chris@0
|
29 class Tokenizer
|
Chris@0
|
30 {
|
Chris@0
|
31 /**
|
Chris@0
|
32 * @var Handler\HandlerInterface[]
|
Chris@0
|
33 */
|
Chris@0
|
34 private $handlers;
|
Chris@0
|
35
|
Chris@0
|
36 public function __construct()
|
Chris@0
|
37 {
|
Chris@0
|
38 $patterns = new TokenizerPatterns();
|
Chris@0
|
39 $escaping = new TokenizerEscaping($patterns);
|
Chris@0
|
40
|
Chris@17
|
41 $this->handlers = [
|
Chris@0
|
42 new Handler\WhitespaceHandler(),
|
Chris@0
|
43 new Handler\IdentifierHandler($patterns, $escaping),
|
Chris@0
|
44 new Handler\HashHandler($patterns, $escaping),
|
Chris@0
|
45 new Handler\StringHandler($patterns, $escaping),
|
Chris@0
|
46 new Handler\NumberHandler($patterns),
|
Chris@0
|
47 new Handler\CommentHandler(),
|
Chris@17
|
48 ];
|
Chris@0
|
49 }
|
Chris@0
|
50
|
Chris@0
|
51 /**
|
Chris@0
|
52 * Tokenize selector source code.
|
Chris@0
|
53 *
|
Chris@0
|
54 * @return TokenStream
|
Chris@0
|
55 */
|
Chris@0
|
56 public function tokenize(Reader $reader)
|
Chris@0
|
57 {
|
Chris@0
|
58 $stream = new TokenStream();
|
Chris@0
|
59
|
Chris@0
|
60 while (!$reader->isEOF()) {
|
Chris@0
|
61 foreach ($this->handlers as $handler) {
|
Chris@0
|
62 if ($handler->handle($reader, $stream)) {
|
Chris@0
|
63 continue 2;
|
Chris@0
|
64 }
|
Chris@0
|
65 }
|
Chris@0
|
66
|
Chris@0
|
67 $stream->push(new Token(Token::TYPE_DELIMITER, $reader->getSubstring(1), $reader->getPosition()));
|
Chris@0
|
68 $reader->moveForward(1);
|
Chris@0
|
69 }
|
Chris@0
|
70
|
Chris@0
|
71 return $stream
|
Chris@0
|
72 ->push(new Token(Token::TYPE_FILE_END, null, $reader->getPosition()))
|
Chris@0
|
73 ->freeze();
|
Chris@0
|
74 }
|
Chris@0
|
75 }
|