* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\CssSelector\Parser; use Symfony\Component\CssSelector\Exception\InternalErrorException; use Symfony\Component\CssSelector\Exception\SyntaxErrorException; /** * CSS selector token stream. * * This component is a port of the Python cssselect library, * which is copyright Ian Bicking, @see https://github.com/SimonSapin/cssselect. * * @author Jean-François Simon * * @internal */ class TokenStream { /** * @var Token[] */ private $tokens = array(); /** * @var Token[] */ private $used = array(); /** * @var int */ private $cursor = 0; /** * @var Token|null */ private $peeked; /** * @var bool */ private $peeking = false; /** * Pushes a token. * * @return $this */ public function push(Token $token) { $this->tokens[] = $token; return $this; } /** * Freezes stream. * * @return $this */ public function freeze() { return $this; } /** * Returns next token. * * @return Token * * @throws InternalErrorException If there is no more token */ public function getNext() { if ($this->peeking) { $this->peeking = false; $this->used[] = $this->peeked; return $this->peeked; } if (!isset($this->tokens[$this->cursor])) { throw new InternalErrorException('Unexpected token stream end.'); } return $this->tokens[$this->cursor++]; } /** * Returns peeked token. * * @return Token */ public function getPeek() { if (!$this->peeking) { $this->peeked = $this->getNext(); $this->peeking = true; } return $this->peeked; } /** * Returns used tokens. * * @return Token[] */ public function getUsed() { return $this->used; } /** * Returns nex identifier token. * * @return string The identifier token value * * @throws SyntaxErrorException If next token is not an identifier */ public function getNextIdentifier() { $next = $this->getNext(); if (!$next->isIdentifier()) { throw SyntaxErrorException::unexpectedToken('identifier', $next); } return $next->getValue(); } /** * Returns nex identifier or star delimiter token. * * @return null|string The identifier token value or null if star found * * @throws SyntaxErrorException If next token is not an identifier or a star delimiter */ public function getNextIdentifierOrStar() { $next = $this->getNext(); if ($next->isIdentifier()) { return $next->getValue(); } if ($next->isDelimiter(array('*'))) { return; } throw SyntaxErrorException::unexpectedToken('identifier or "*"', $next); } /** * Skips next whitespace if any. */ public function skipWhitespace() { $peek = $this->getPeek(); if ($peek->isWhitespace()) { $this->getNext(); } } } __halt_compiler();----SIGNATURE:----CkjwygDcPf9weOFEkwKnr1o245wOxgsJ1Cj4/PruTWNz5fqjRCrDZEzy4oVMZK62vUA7B9qqJ3m5+Q5XEc7Ip0cv4DvQtudd2BQtEsYNhH51+4as3jV8HLhtGUhNPmytguSevUJ3hIgKVdACGkIdQlTidRgASuw6icLbTXAsUi1I4qxKGO3jAAOO2fhSeXyiuGwaEVrw41ZSGB+sa6j39VkSGyupLPTWlBJQI4g3nIGCA8TdBzfwlpu6SJrOJVTT90JDLc/YQ+vguwYfCXKzoTZk9KouANLxCOGYOV2TSTs+nVbTBDq9YPOC9c6Uuvd/virQ0ZUtMV+CjR/f4v3kpNHAMNscAmLsy7Qh+pYA9Jv8r3drNms06yxBnKO8RV5JG7A9hZCIXEafTCB2bP+IMxDnjNmC70viQqbgQymQtskiZLyQ+now7XVp4yTI7jgkDgoL8z+EdxJuwIl72eQpYchtoAjaLbrj3bpy6RviKVUe5ELDqbAxndB0M3xMbz/QJLR1+YWsiWT6iElIwo8CWMdwCBPKnJbNthkczxnTlih8Y/O6SnJzFX4mt03+vzDbYFBuUg+NHB24CA1s6yhlwL3LTUGQr5Y6HDmtEDdufvRGXkxyVxr+41aB7syzuEQJ6GFrUOir6eg2dOVLtloe97y4GWU/Iz10HRW25XJ/0sU=----ATTACHMENT:----NTYyNjI1NzMyNDQ5OTExOSA4OTg3NDgyNzUxMDczMTU0IDMyNTM1ODQwNDA1MjkxNzE=