You are here

class StringHandler in Zircon Profile 8

Same name and namespace in other branches
  1. 8.0 vendor/symfony/css-selector/Parser/Handler/StringHandler.php \Symfony\Component\CssSelector\Parser\Handler\StringHandler

CSS selector comment handler.

This component is a port of the Python cssselect library, which is copyright Ian Bicking, @author Jean-François Simon <jeanfrancois.simon@sensiolabs.com>

Hierarchy

Expanded class hierarchy of StringHandler

See also

https://github.com/SimonSapin/cssselect.

1 file declares its use of StringHandler
StringHandlerTest.php in vendor/symfony/css-selector/Tests/Parser/Handler/StringHandlerTest.php

File

vendor/symfony/css-selector/Parser/Handler/StringHandler.php, line 30

Namespace

Symfony\Component\CssSelector\Parser\Handler
View source
class StringHandler implements HandlerInterface {

  /**
   * @var TokenizerPatterns
   */
  private $patterns;

  /**
   * @var TokenizerEscaping
   */
  private $escaping;

  /**
   * @param TokenizerPatterns $patterns
   * @param TokenizerEscaping $escaping
   */
  public function __construct(TokenizerPatterns $patterns, TokenizerEscaping $escaping) {
    $this->patterns = $patterns;
    $this->escaping = $escaping;
  }

  /**
   * {@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;
  }

}

Members