1*04fd306cSNickeau<?php 2*04fd306cSNickeau/** 3*04fd306cSNickeau* Default parsing status, expecting a group of selector sequences 4*04fd306cSNickeau* 5*04fd306cSNickeau* @license http://www.opensource.org/licenses/mit-license.php The MIT License 6*04fd306cSNickeau* @copyright Copyright 2010-2014 PhpCss Team 7*04fd306cSNickeau*/ 8*04fd306cSNickeau 9*04fd306cSNickeaunamespace PhpCss\Parser { 10*04fd306cSNickeau 11*04fd306cSNickeau use PhpCss; 12*04fd306cSNickeau use PhpCss\Ast; 13*04fd306cSNickeau use PhpCss\Scanner; 14*04fd306cSNickeau 15*04fd306cSNickeau /** 16*04fd306cSNickeau * Default parsing status, expecting a group of selector sequences 17*04fd306cSNickeau * 18*04fd306cSNickeau * @package PhpCss 19*04fd306cSNickeau * @subpackage Parser 20*04fd306cSNickeau */ 21*04fd306cSNickeau class Standard extends PhpCss\Parser { 22*04fd306cSNickeau 23*04fd306cSNickeau public const ALLOW_RELATIVE_SELECTORS = 1; 24*04fd306cSNickeau 25*04fd306cSNickeau private $_options; 26*04fd306cSNickeau 27*04fd306cSNickeau public function __construct(array &$tokens, $options = 0) { 28*04fd306cSNickeau parent::__construct($tokens); 29*04fd306cSNickeau $this->_options = $options; 30*04fd306cSNickeau } 31*04fd306cSNickeau 32*04fd306cSNickeau /** 33*04fd306cSNickeau * Tokens that start a sequence, if anything except whitespaces 34*04fd306cSNickeau * is found it delegates to the sequence parser 35*04fd306cSNickeau * 36*04fd306cSNickeau * @var array 37*04fd306cSNickeau */ 38*04fd306cSNickeau private $_expectedTokens = array( 39*04fd306cSNickeau Scanner\Token::WHITESPACE, 40*04fd306cSNickeau Scanner\Token::IDENTIFIER, 41*04fd306cSNickeau Scanner\Token::ID_SELECTOR, 42*04fd306cSNickeau Scanner\Token::CLASS_SELECTOR, 43*04fd306cSNickeau Scanner\Token::PSEUDO_CLASS, 44*04fd306cSNickeau Scanner\Token::PSEUDO_ELEMENT, 45*04fd306cSNickeau Scanner\Token::ATTRIBUTE_SELECTOR_START 46*04fd306cSNickeau ); 47*04fd306cSNickeau 48*04fd306cSNickeau /** 49*04fd306cSNickeau * Start parsing looking for anything valid except whitespaces, add 50*04fd306cSNickeau * returned sequences to the group 51*04fd306cSNickeau * 52*04fd306cSNickeau * @return Ast\Selector\Group 53*04fd306cSNickeau * @throws PhpCss\Exception\ParserException 54*04fd306cSNickeau * @see PhpCss\Parser::parse() 55*04fd306cSNickeau */ 56*04fd306cSNickeau public function parse(): Ast\Node { 57*04fd306cSNickeau $expectedTokens = $this->_expectedTokens; 58*04fd306cSNickeau if (($this->_options & self::ALLOW_RELATIVE_SELECTORS) === self::ALLOW_RELATIVE_SELECTORS) { 59*04fd306cSNickeau $expectedTokens[] = Scanner\Token::COMBINATOR; 60*04fd306cSNickeau } 61*04fd306cSNickeau $group = new Ast\Selector\Group(); 62*04fd306cSNickeau $this->ignore(Scanner\Token::WHITESPACE); 63*04fd306cSNickeau while (!$this->endOfTokens()) { 64*04fd306cSNickeau if ($currentToken = $this->lookahead($expectedTokens)) { 65*04fd306cSNickeau if ($currentToken->type === Scanner\Token::WHITESPACE) { 66*04fd306cSNickeau $this->read(Scanner\Token::WHITESPACE); 67*04fd306cSNickeau continue; 68*04fd306cSNickeau } 69*04fd306cSNickeau $group[] = $this->delegate(Sequence::CLASS); 70*04fd306cSNickeau } 71*04fd306cSNickeau } 72*04fd306cSNickeau return $group; 73*04fd306cSNickeau } 74*04fd306cSNickeau } 75*04fd306cSNickeau} 76