xref: /plugin/combo/vendor/carica/phpcss/src/PhpCss/Parser/Standard.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
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