/**
  * {@inheritdoc}
  */
 public function handle(Reader $reader, TokenStream $stream)
 {
     $match = $reader->findPattern($this->patterns->getNumberPattern());
     if (!$match) {
         return false;
     }
     $stream->push(new Token(Token::TYPE_NUMBER, $match[0], $reader->getPosition()));
     $reader->moveForward(strlen($match[0]));
     return true;
 }
 /**
  *
  * {@inheritdoc}
  *
  */
 public function handle(Reader $reader, TokenStream $stream)
 {
     $match = $reader->findPattern('~^[ \\t\\r\\n\\f]+~');
     if (false === $match) {
         return false;
     }
     $stream->push(new Token(Token::TYPE_WHITESPACE, $match[0], $reader->getPosition()));
     $reader->moveForward(strlen($match[0]));
     return true;
 }
Exemple #3
0
 /**
  * {@inheritdoc}
  */
 public function handle(Reader $reader, TokenStream $stream)
 {
     $match = $reader->findPattern($this->patterns->getIdentifierPattern());
     if (!$match) {
         return false;
     }
     $value = $this->escaping->escapeUnicode($match[0]);
     $stream->push(new Token(Token::TYPE_IDENTIFIER, $value, $reader->getPosition()));
     $reader->moveForward(strlen($match[0]));
     return true;
 }
 public function testSkipWhitespace()
 {
     $stream = new TokenStream();
     $stream->push($t1 = new Token(Token::TYPE_IDENTIFIER, 'h1', 0));
     $stream->push($t2 = new Token(Token::TYPE_WHITESPACE, ' ', 2));
     $stream->push($t3 = new Token(Token::TYPE_IDENTIFIER, 'h1', 3));
     $stream->skipWhitespace();
     $this->assertSame($t1, $stream->getNext());
     $stream->skipWhitespace();
     $this->assertSame($t3, $stream->getNext());
 }
Exemple #5
0
 /**
  * {@inheritdoc}
  */
 public function handle(Reader $reader, TokenStream $stream)
 {
     $quote = $reader->getSubstring(1);
     if (!in_array($quote, array("'", '"'))) {
         return false;
     }
     $reader->moveForward(1);
     $match = $reader->findPattern($this->patterns->getQuotedStringPattern($quote));
     if (!$match) {
         throw new InternalErrorException(sprintf('Should have found at least an empty match at %s.', $reader->getPosition()));
     }
     // check unclosed strings
     if (strlen($match[0]) === $reader->getRemainingLength()) {
         throw SyntaxErrorException::unclosedString($reader->getPosition() - 1);
     }
     // check quotes pairs validity
     if ($quote !== $reader->getSubstring(1, strlen($match[0]))) {
         throw SyntaxErrorException::unclosedString($reader->getPosition() - 1);
     }
     $string = $this->escaping->escapeUnicodeAndNewLine($match[0]);
     $stream->push(new Token(Token::TYPE_STRING, $string, $reader->getPosition()));
     $reader->moveForward(strlen($match[0]) + 1);
     return true;
 }
 /**
  * Parses next attribute node.
  *
  * @param Node\NodeInterface $selector
  * @param TokenStream        $stream
  *
  * @throws SyntaxErrorException
  *
  * @return Node\AttributeNode
  */
 private function parseAttributeNode(Node\NodeInterface $selector, TokenStream $stream)
 {
     $stream->skipWhitespace();
     $attribute = $stream->getNextIdentifierOrStar();
     if (null === $attribute && !$stream->getPeek()->isDelimiter(array('|'))) {
         throw SyntaxErrorException::unexpectedToken('"|"', $stream->getPeek());
     }
     if ($stream->getPeek()->isDelimiter(array('|'))) {
         $stream->getNext();
         if ($stream->getPeek()->isDelimiter(array('='))) {
             $namespace = null;
             $stream->getNext();
             $operator = '|=';
         } else {
             $namespace = $attribute;
             $attribute = $stream->getNextIdentifier();
             $operator = null;
         }
     } else {
         $namespace = $operator = null;
     }
     if (null === $operator) {
         $stream->skipWhitespace();
         $next = $stream->getNext();
         if ($next->isDelimiter(array(']'))) {
             return new Node\AttributeNode($selector, $namespace, $attribute, 'exists', null);
         } elseif ($next->isDelimiter(array('='))) {
             $operator = '=';
         } elseif ($next->isDelimiter(array('^', '$', '*', '~', '|', '!')) && $stream->getPeek()->isDelimiter(array('='))) {
             $operator = $next->getValue() . '=';
             $stream->getNext();
         } else {
             throw SyntaxErrorException::unexpectedToken('operator', $next);
         }
     }
     $stream->skipWhitespace();
     $value = $stream->getNext();
     if ($value->isNumber()) {
         // if the value is a number, it's casted into a string
         $value = new Token(Token::TYPE_STRING, (string) $value->getValue(), $value->getPosition());
     }
     if (!($value->isIdentifier() || $value->isString())) {
         throw SyntaxErrorException::unexpectedToken('string or identifier', $value);
     }
     $stream->skipWhitespace();
     $next = $stream->getNext();
     if (!$next->isDelimiter(array(']'))) {
         throw SyntaxErrorException::unexpectedToken('"]"', $next);
     }
     return new Node\AttributeNode($selector, $namespace, $attribute, $operator, $value->getValue());
 }