* * 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:----PXvY1/7bOWdmz2VAyPVNl4zyiFWBXhIarLJEx9mtRb34VKn6KXHLzh+hkCu1lYDWbZEwDI6YR2SODQdboVEc5u8SUuYV32SYe7hRZplvS14BzabQW0qB/BIYEy1EZ3ARAVszuVq+PVErI4B9Cw2QDgkkgyu7f04DEtcKJRwxr2GlpWdoqqCeRL0Z4a4hFJTwbJhFkvYPgzKtx/p/0QnAeXVOzuka13z/n6wIKHuOMXrCxCbE9tS021Jox5gSSRJtEarHuX6aj+nBvnlNtrc1gvTn/VWU4auPlgXCLl1k0VB/E+FY2b5BgotUf4nb74yDNfLub1hlTiJWaxH5Yj8PJz8KmKz5gnAcVMq3Omu9A4RTU4/uKy+Um6vZFxUdEdFHloXhnLk14Kd+R1xMtSt7YtCUpm6qAS9Dxk5jXj//99kNHJlXAx6MFgCNmrRyTT4okS7A8wjq3msYppvm0Qw5xnp/yBpdbhBld/C4ZaGQnJ2+8pb6q1xFX8UqG02a9cLraNw8/dGscX6MiwFXNk7qeZT2SE2+Vw7ubaayyvl/mNLNv4HkseJAfg+M9GhmF44QsEEHWj2KpyvQA0djEWzGcXBUWEITOEJw6fEO23TmAmiPYlaM2/GOaGCTMSStXCuMYsjyH9mk78FId5myyJeGVMj4CyW8sCnLbjaTS5CC4Y4=----ATTACHMENT:----NjM5MjAyMTA3MDY0NTc3MCA0NjIxMTY0Nzk3MTk5OTI0IDY2NDU5OTk2NjE0ODIyNzI=