Yaffs site version 1.1
[yaffs-website] / vendor / symfony / css-selector / Parser / Handler / StringHandler.php
1 <?php
2
3 /*
4  * This file is part of the Symfony package.
5  *
6  * (c) Fabien Potencier <fabien@symfony.com>
7  *
8  * For the full copyright and license information, please view the LICENSE
9  * file that was distributed with this source code.
10  */
11
12 namespace Symfony\Component\CssSelector\Parser\Handler;
13
14 use Symfony\Component\CssSelector\Exception\InternalErrorException;
15 use Symfony\Component\CssSelector\Exception\SyntaxErrorException;
16 use Symfony\Component\CssSelector\Parser\Reader;
17 use Symfony\Component\CssSelector\Parser\Token;
18 use Symfony\Component\CssSelector\Parser\TokenStream;
19 use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerEscaping;
20 use Symfony\Component\CssSelector\Parser\Tokenizer\TokenizerPatterns;
21
22 /**
23  * CSS selector comment handler.
24  *
25  * This component is a port of the Python cssselect library,
26  * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
27  *
28  * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
29  *
30  * @internal
31  */
32 class StringHandler implements HandlerInterface
33 {
34     /**
35      * @var TokenizerPatterns
36      */
37     private $patterns;
38
39     /**
40      * @var TokenizerEscaping
41      */
42     private $escaping;
43
44     /**
45      * @param TokenizerPatterns $patterns
46      * @param TokenizerEscaping $escaping
47      */
48     public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping)
49     {
50         $this->patterns = $patterns;
51         $this->escaping = $escaping;
52     }
53
54     /**
55      * {@inheritdoc}
56      */
57     public function handle(Reader $reader, TokenStream $stream)
58     {
59         $quote = $reader->getSubstring(1);
60
61         if (!in_array($quote, array("'", '"'))) {
62             return false;
63         }
64
65         $reader->moveForward(1);
66         $match = $reader->findPattern($this->patterns->getQuotedStringPattern($quote));
67
68         if (!$match) {
69             throw new InternalErrorException(sprintf('Should have found at least an empty match at %s.', $reader->getPosition()));
70         }
71
72         // check unclosed strings
73         if (strlen($match[0]) === $reader->getRemainingLength()) {
74             throw SyntaxErrorException::unclosedString($reader->getPosition() - 1);
75         }
76
77         // check quotes pairs validity
78         if ($quote !== $reader->getSubstring(1, strlen($match[0]))) {
79             throw SyntaxErrorException::unclosedString($reader->getPosition() - 1);
80         }
81
82         $string = $this->escaping->escapeUnicodeAndNewLine($match[0]);
83         $stream->push(new Token(Token::TYPE_STRING, $string, $reader->getPosition()));
84         $reader->moveForward(strlen($match[0]) + 1);
85
86         return true;
87     }
88 }