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
12namespace Symfony\Component\CssSelector\Parser\Tokenizer;
13
14/**
15 * CSS selector tokenizer patterns builder.
16 *
17 * This component is a port of the Python cssselect library,
18 * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect.
19 *
20 * @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>
21 *
22 * @internal
23 */
24class TokenizerPatterns
25{
26    private $unicodeEscapePattern;
27    private $simpleEscapePattern;
28    private $newLineEscapePattern;
29    private $escapePattern;
30    private $stringEscapePattern;
31    private $nonAsciiPattern;
32    private $nmCharPattern;
33    private $nmStartPattern;
34    private $identifierPattern;
35    private $hashPattern;
36    private $numberPattern;
37    private $quotedStringPattern;
38
39    public function __construct()
40    {
41        $this->unicodeEscapePattern = '\\\\([0-9a-f]{1,6})(?:\r\n|[ \n\r\t\f])?';
42        $this->simpleEscapePattern = '\\\\(.)';
43        $this->newLineEscapePattern = '\\\\(?:\n|\r\n|\r|\f)';
44        $this->escapePattern = $this->unicodeEscapePattern.'|\\\\[^\n\r\f0-9a-f]';
45        $this->stringEscapePattern = $this->newLineEscapePattern.'|'.$this->escapePattern;
46        $this->nonAsciiPattern = '[^\x00-\x7F]';
47        $this->nmCharPattern = '[_a-z0-9-]|'.$this->escapePattern.'|'.$this->nonAsciiPattern;
48        $this->nmStartPattern = '[_a-z]|'.$this->escapePattern.'|'.$this->nonAsciiPattern;
49        $this->identifierPattern = '-?(?:'.$this->nmStartPattern.')(?:'.$this->nmCharPattern.')*';
50        $this->hashPattern = '#((?:'.$this->nmCharPattern.')+)';
51        $this->numberPattern = '[+-]?(?:[0-9]*\.[0-9]+|[0-9]+)';
52        $this->quotedStringPattern = '([^\n\r\f\\\\%s]|'.$this->stringEscapePattern.')*';
53    }
54
55    public function getNewLineEscapePattern(): string
56    {
57        return '~'.$this->newLineEscapePattern.'~';
58    }
59
60    public function getSimpleEscapePattern(): string
61    {
62        return '~'.$this->simpleEscapePattern.'~';
63    }
64
65    public function getUnicodeEscapePattern(): string
66    {
67        return '~'.$this->unicodeEscapePattern.'~i';
68    }
69
70    public function getIdentifierPattern(): string
71    {
72        return '~^'.$this->identifierPattern.'~i';
73    }
74
75    public function getHashPattern(): string
76    {
77        return '~^'.$this->hashPattern.'~i';
78    }
79
80    public function getNumberPattern(): string
81    {
82        return '~^'.$this->numberPattern.'~';
83    }
84
85    public function getQuotedStringPattern(string $quote): string
86    {
87        return '~^'.sprintf($this->quotedStringPattern, $quote).'~i';
88    }
89}
90