public function parse()
{
$token = $this->read(Scanner\Token::PSEUDO_CLASS);
$name = substr($token->content, 1);
if ($mode = $this->getParameterMode($name)) {
if ($mode == self::PARAMETER_NONE) {
return new Ast\Selector\Simple\PseudoClass($name);
}
$this->read(Scanner\Token::PARENTHESES_START);
$this->ignore(Scanner\Token::WHITESPACE);
switch ($mode) {
case self::PARAMETER_IDENTIFIER:
$parameterToken = $this->read(Scanner\Token::IDENTIFIER);
$class = new Ast\Selector\Simple\PseudoClass\Language($parameterToken->content);
break;
case self::PARAMETER_POSITION:
$parameterToken = $this->read(array(Scanner\Token::IDENTIFIER, Scanner\Token::NUMBER, Scanner\Token::PSEUDO_CLASS_POSITION));
$class = new Ast\Selector\Simple\PseudoClass($name, $this->createPseudoClassPosition($parameterToken->content));
break;
case self::PARAMETER_SIMPLE_SELECTOR:
$parameterToken = $this->lookahead(array(Scanner\Token::IDENTIFIER, Scanner\Token::ID_SELECTOR, Scanner\Token::CLASS_SELECTOR, Scanner\Token::PSEUDO_CLASS, Scanner\Token::PSEUDO_ELEMENT, Scanner\Token::ATTRIBUTE_SELECTOR_START));
switch ($parameterToken->type) {
case Scanner\Token::IDENTIFIER:
case Scanner\Token::ID_SELECTOR:
case Scanner\Token::CLASS_SELECTOR:
$this->read($parameterToken->type);
$parameter = $this->createSelector($parameterToken);
break;
case Scanner\Token::PSEUDO_CLASS:
if ($parameterToken->content == ':not') {
throw new \LogicException('not not allowed in not - @todo implement exception');
}
$parameter = $this->delegate(PseudoClass::CLASS);
break;
case Scanner\Token::PSEUDO_ELEMENT:
$this->read($parameterToken->type);
$parameter = $this->createPseudoElement($parameterToken);
break;
case Scanner\Token::ATTRIBUTE_SELECTOR_START:
$this->read($parameterToken->type);
$parameter = $this->delegate(Attribute::CLASS);
break;
default:
$parameter = NULL;
}
$class = new Ast\Selector\Simple\PseudoClass($name, $parameter);
break;
default:
$class = NULL;
}
$this->ignore(Scanner\Token::WHITESPACE);
$this->read(Scanner\Token::PARENTHESES_END);
return $class;
}
throw new PhpCss\Exception\UnknownPseudoClass($token);
}