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