xref: /plugin/combo/vendor/carica/phpcss/src/PhpCss/Parser/Attribute.php (revision 04fd306c7c155fa133ebb3669986875d65988276)
1*04fd306cSNickeau<?php
2*04fd306cSNickeau/**
3*04fd306cSNickeau * The attribute parser parses a simple attribute selector.
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   * The attribute parser parses a simple attribute selector.
17*04fd306cSNickeau   *
18*04fd306cSNickeau   * The attribute value can be an string if a string start is found it delegates to a string
19*04fd306cSNickeau   * parser.
20*04fd306cSNickeau   */
21*04fd306cSNickeau  class Attribute extends PhpCss\Parser {
22*04fd306cSNickeau
23*04fd306cSNickeau    private $_operators = [
24*04fd306cSNickeau      '^=' => Ast\Selector\Simple\Attribute::MATCH_PREFIX,
25*04fd306cSNickeau      '$=' => Ast\Selector\Simple\Attribute::MATCH_SUFFIX,
26*04fd306cSNickeau      '*=' => Ast\Selector\Simple\Attribute::MATCH_SUBSTRING,
27*04fd306cSNickeau      '=' => Ast\Selector\Simple\Attribute::MATCH_EQUALS,
28*04fd306cSNickeau      '~=' => Ast\Selector\Simple\Attribute::MATCH_INCLUDES,
29*04fd306cSNickeau      '|=' => Ast\Selector\Simple\Attribute::MATCH_DASHMATCH,
30*04fd306cSNickeau    ];
31*04fd306cSNickeau
32*04fd306cSNickeau    /**
33*04fd306cSNickeau     * @return Ast\Node
34*04fd306cSNickeau     * @throws PhpCss\Exception\ParserException
35*04fd306cSNickeau     */
36*04fd306cSNickeau    public function parse(): Ast\Node {
37*04fd306cSNickeau      $token = $this->read(Scanner\Token::IDENTIFIER);
38*04fd306cSNickeau      $attribute = new Ast\Selector\Simple\Attribute($token->content);
39*04fd306cSNickeau      $token = $this->read(
40*04fd306cSNickeau        [
41*04fd306cSNickeau          Scanner\Token::ATTRIBUTE_OPERATOR,
42*04fd306cSNickeau          Scanner\Token::ATTRIBUTE_SELECTOR_END,
43*04fd306cSNickeau        ]
44*04fd306cSNickeau      );
45*04fd306cSNickeau      if ($token->type === Scanner\Token::ATTRIBUTE_OPERATOR) {
46*04fd306cSNickeau        $attribute->match = $this->_operators[$token->content];
47*04fd306cSNickeau        $token = $this->read(
48*04fd306cSNickeau          [
49*04fd306cSNickeau            Scanner\Token::NUMBER,
50*04fd306cSNickeau            Scanner\Token::IDENTIFIER,
51*04fd306cSNickeau            Scanner\Token::SINGLEQUOTE_STRING_START,
52*04fd306cSNickeau            Scanner\Token::DOUBLEQUOTE_STRING_START,
53*04fd306cSNickeau          ]
54*04fd306cSNickeau        );
55*04fd306cSNickeau        switch ($token->type) {
56*04fd306cSNickeau        case Scanner\Token::NUMBER :
57*04fd306cSNickeau        case Scanner\Token::IDENTIFIER :
58*04fd306cSNickeau          $attribute->literal = new Ast\Value\Literal($token->content);
59*04fd306cSNickeau          break;
60*04fd306cSNickeau        case Scanner\Token::SINGLEQUOTE_STRING_START :
61*04fd306cSNickeau        case Scanner\Token::DOUBLEQUOTE_STRING_START :
62*04fd306cSNickeau          $attribute->literal = $this->delegate(Text::CLASS);
63*04fd306cSNickeau          break;
64*04fd306cSNickeau        }
65*04fd306cSNickeau        $this->read(Scanner\Token::ATTRIBUTE_SELECTOR_END);
66*04fd306cSNickeau      }
67*04fd306cSNickeau      return $attribute;
68*04fd306cSNickeau    }
69*04fd306cSNickeau  }
70*04fd306cSNickeau}
71