* * 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:----wEegobdA6nwhU++o8vzOxmHepZQMis0Z+8wkZys6rTKaDcd2Mh4eOOmkUXJ6Mr1briVK7nryx2Qxa8iyvvL2OvP/Hxt42QWgjp4JhvSv/f/A8KZVt+28+bvEYI/RQ05euVpK31nQQ2fjnUJ+Zav07MxJ0+qpUJD+tTbTf7hguJH1Fhtg4rY3O1mGHdBjzPiVPRcc3ghvl+Dz4bFp5sf4+nWZIhO5DOS/dKgxcpPItyJcYh/RiCn8BAAJLbtIZeTTLQwgyii9lI7RoKZyOWpVeBz7c40xpzwu3WvLEzBQefqBOtJOu2xv0NzTflK43irfwP8wOMqaz5GDDelK9qJLo2ukMuPIoveTjYWTerapXcbeo3xt/KIyRe1l7Y4qWsWYAmd27+ZRAnmV85jx2aeIVCmTfqRiiDbsVDUk9UgRD/bXzcS6XbOa6W2cttT/SimO9VwVPb66xS5YBifPKDJgWg2N4tKkczpTlpLJlp0vdtOap9ledpLkl6onEJj+3qlHnYiLqpjgQHeH6/HmRu9Kur0b7L7MZnFm7i8zTxP4hfdk6KzBaLW1K2kufaG0noBb845jLOErBcIXmDEn3yXnLBpqaR3BuLHzoFq3izckB11bo1uz4gFokNYAawt2M7GY5dnBxthIe/sgHt9IHWgssqMdbu7GWhYQHdKc8EPrCr0=----ATTACHMENT:----MTY1MTQwMjA4NzMyNTM4IDc2MTMyMjk5OTU5Nzg5MzIgNzIzMzQ3MDAzNDM0NTM4NQ==