Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Symfony\Component\CssSelector\Parser\Tokenizer; Chris@0: Chris@0: /** Chris@0: * CSS selector tokenizer patterns builder. Chris@0: * Chris@0: * This component is a port of the Python cssselect library, Chris@0: * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. Chris@0: * Chris@0: * @author Jean-François Simon Chris@0: * Chris@0: * @internal Chris@0: */ Chris@0: class TokenizerPatterns Chris@0: { Chris@0: private $unicodeEscapePattern; Chris@0: private $simpleEscapePattern; Chris@0: private $newLineEscapePattern; Chris@0: private $escapePattern; Chris@0: private $stringEscapePattern; Chris@0: private $nonAsciiPattern; Chris@0: private $nmCharPattern; Chris@0: private $nmStartPattern; Chris@0: private $identifierPattern; Chris@0: private $hashPattern; Chris@0: private $numberPattern; Chris@0: private $quotedStringPattern; Chris@0: Chris@0: public function __construct() Chris@0: { Chris@0: $this->unicodeEscapePattern = '\\\\([0-9a-f]{1,6})(?:\r\n|[ \n\r\t\f])?'; Chris@0: $this->simpleEscapePattern = '\\\\(.)'; Chris@0: $this->newLineEscapePattern = '\\\\(?:\n|\r\n|\r|\f)'; Chris@0: $this->escapePattern = $this->unicodeEscapePattern.'|\\\\[^\n\r\f0-9a-f]'; Chris@0: $this->stringEscapePattern = $this->newLineEscapePattern.'|'.$this->escapePattern; Chris@0: $this->nonAsciiPattern = '[^\x00-\x7F]'; Chris@0: $this->nmCharPattern = '[_a-z0-9-]|'.$this->escapePattern.'|'.$this->nonAsciiPattern; Chris@0: $this->nmStartPattern = '[_a-z]|'.$this->escapePattern.'|'.$this->nonAsciiPattern; Chris@14: $this->identifierPattern = '-?(?:'.$this->nmStartPattern.')(?:'.$this->nmCharPattern.')*'; Chris@0: $this->hashPattern = '#((?:'.$this->nmCharPattern.')+)'; Chris@0: $this->numberPattern = '[+-]?(?:[0-9]*\.[0-9]+|[0-9]+)'; Chris@0: $this->quotedStringPattern = '([^\n\r\f%s]|'.$this->stringEscapePattern.')*'; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return string Chris@0: */ Chris@0: public function getNewLineEscapePattern() Chris@0: { Chris@0: return '~^'.$this->newLineEscapePattern.'~'; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return string Chris@0: */ Chris@0: public function getSimpleEscapePattern() Chris@0: { Chris@0: return '~^'.$this->simpleEscapePattern.'~'; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return string Chris@0: */ Chris@0: public function getUnicodeEscapePattern() Chris@0: { Chris@0: return '~^'.$this->unicodeEscapePattern.'~i'; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return string Chris@0: */ Chris@0: public function getIdentifierPattern() Chris@0: { Chris@0: return '~^'.$this->identifierPattern.'~i'; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return string Chris@0: */ Chris@0: public function getHashPattern() Chris@0: { Chris@0: return '~^'.$this->hashPattern.'~i'; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @return string Chris@0: */ Chris@0: public function getNumberPattern() Chris@0: { Chris@0: return '~^'.$this->numberPattern.'~'; Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param string $quote Chris@0: * Chris@0: * @return string Chris@0: */ Chris@0: public function getQuotedStringPattern($quote) Chris@0: { Chris@0: return '~^'.sprintf($this->quotedStringPattern, $quote).'~i'; Chris@0: } Chris@0: }