Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x
  2. StringInputStream.php

class StringInputStream

Hierarchy

  • class \Masterminds\HTML5\Parser\StringInputStream implements \Masterminds\HTML5\Parser\InputStream

Expanded class hierarchy of StringInputStream

Deprecated

since 2.4, to remove in 3.0. Use a string in the scanner instead.

File

vendor/masterminds/html5/src/HTML5/Parser/StringInputStream.php, line 46

Namespace

Masterminds\HTML5\Parser
View source
class StringInputStream implements InputStream {
    
    /**
     * The string data we're parsing.
     */
    private $data;
    
    /**
     * The current integer byte position we are in $data.
     */
    private $char;
    
    /**
     * Length of $data; when $char === $data, we are at the end-of-file.
     */
    private $EOF;
    
    /**
     * Parse errors.
     */
    public $errors = array();
    
    /**
     * Create a new InputStream wrapper.
     *
     * @param string $data     Data to parse.
     * @param string $encoding The encoding to use for the data.
     * @param string $debug    A fprintf format to use to echo the data on stdout.
     */
    public function __construct($data, $encoding = 'UTF-8', $debug = '') {
        $data = UTF8Utils::convertToUTF8($data, $encoding);
        if ($debug) {
            fprintf(STDOUT, $debug, $data, strlen($data));
        }
        // There is good reason to question whether it makes sense to
        // do this here, since most of these checks are done during
        // parsing, and since this check doesn't actually *do* anything.
        $this->errors = UTF8Utils::checkForIllegalCodepoints($data);
        $data = $this->replaceLinefeeds($data);
        $this->data = $data;
        $this->char = 0;
        $this->EOF = strlen($data);
    }
    public function __toString() {
        return $this->data;
    }
    
    /**
     * Replace linefeed characters according to the spec.
     */
    protected function replaceLinefeeds($data) {
        
        /*
         * U+000D CARRIAGE RETURN (CR) characters and U+000A LINE FEED (LF) characters are treated specially.
         * Any CR characters that are followed by LF characters must be removed, and any CR characters not
         * followed by LF characters must be converted to LF characters. Thus, newlines in HTML DOMs are
         * represented by LF characters, and there are never any CR characters in the input to the tokenization
         * stage.
         */
        $crlfTable = array(
            "\x00" => "�",
            "\r\n" => "\n",
            "\r" => "\n",
        );
        return strtr($data, $crlfTable);
    }
    
    /**
     * Returns the current line that the tokenizer is at.
     */
    public function currentLine() {
        if (empty($this->EOF) || 0 === $this->char) {
            return 1;
        }
        // Add one to $this->char because we want the number for the next
        // byte to be processed.
        return substr_count($this->data, "\n", 0, min($this->char, $this->EOF)) + 1;
    }
    
    /**
     * @deprecated
     */
    public function getCurrentLine() {
        return $this->currentLine();
    }
    
    /**
     * Returns the current column of the current line that the tokenizer is at.
     * Newlines are column 0. The first char after a newline is column 1.
     *
     * @return int The column number.
     */
    public function columnOffset() {
        // Short circuit for the first char.
        if (0 === $this->char) {
            return 0;
        }
        // strrpos is weird, and the offset needs to be negative for what we
        // want (i.e., the last \n before $this->char). This needs to not have
        // one (to make it point to the next character, the one we want the
        // position of) added to it because strrpos's behaviour includes the
        // final offset byte.
        $backwardFrom = $this->char - 1 - strlen($this->data);
        $lastLine = strrpos($this->data, "\n", $backwardFrom);
        // However, for here we want the length up until the next byte to be
        // processed, so add one to the current byte ($this->char).
        if (false !== $lastLine) {
            $findLengthOf = substr($this->data, $lastLine + 1, $this->char - 1 - $lastLine);
        }
        else {
            // After a newline.
            $findLengthOf = substr($this->data, 0, $this->char);
        }
        return UTF8Utils::countChars($findLengthOf);
    }
    
    /**
     * @deprecated
     */
    public function getColumnOffset() {
        return $this->columnOffset();
    }
    
    /**
     * Get the current character.
     *
     * @return string The current character.
     */
    public function current() {
        return $this->data[$this->char];
    }
    
    /**
     * Advance the pointer.
     * This is part of the Iterator interface.
     */
    public function next() {
        ++$this->char;
    }
    
    /**
     * Rewind to the start of the string.
     */
    public function rewind() {
        $this->char = 0;
    }
    
    /**
     * Is the current pointer location valid.
     *
     * @return bool Whether the current pointer location is valid.
     */
    public function valid() {
        return $this->char < $this->EOF;
    }
    
    /**
     * Get all characters until EOF.
     *
     * This reads to the end of the file, and sets the read marker at the
     * end of the file.
     *
     * Note this performs bounds checking.
     *
     * @return string Returns the remaining text. If called when the InputStream is
     *                already exhausted, it returns an empty string.
     */
    public function remainingChars() {
        if ($this->char < $this->EOF) {
            $data = substr($this->data, $this->char);
            $this->char = $this->EOF;
            return $data;
        }
        return '';
        // false;
    }
    
    /**
     * Read to a particular match (or until $max bytes are consumed).
     *
     * This operates on byte sequences, not characters.
     *
     * Matches as far as possible until we reach a certain set of bytes
     * and returns the matched substring.
     *
     * @param string $bytes Bytes to match.
     * @param int    $max   Maximum number of bytes to scan.
     *
     * @return mixed Index or false if no match is found. You should use strong
     *               equality when checking the result, since index could be 0.
     */
    public function charsUntil($bytes, $max = null) {
        if ($this->char >= $this->EOF) {
            return false;
        }
        if (0 === $max || $max) {
            $len = strcspn($this->data, $bytes, $this->char, $max);
        }
        else {
            $len = strcspn($this->data, $bytes, $this->char);
        }
        $string = (string) substr($this->data, $this->char, $len);
        $this->char += $len;
        return $string;
    }
    
    /**
     * Returns the string so long as $bytes matches.
     *
     * Matches as far as possible with a certain set of bytes
     * and returns the matched substring.
     *
     * @param string $bytes A mask of bytes to match. If ANY byte in this mask matches the
     *                      current char, the pointer advances and the char is part of the
     *                      substring.
     * @param int    $max   The max number of chars to read.
     *
     * @return string
     */
    public function charsWhile($bytes, $max = null) {
        if ($this->char >= $this->EOF) {
            return false;
        }
        if (0 === $max || $max) {
            $len = strspn($this->data, $bytes, $this->char, $max);
        }
        else {
            $len = strspn($this->data, $bytes, $this->char);
        }
        $string = (string) substr($this->data, $this->char, $len);
        $this->char += $len;
        return $string;
    }
    
    /**
     * Unconsume characters.
     *
     * @param int $howMany The number of characters to unconsume.
     */
    public function unconsume($howMany = 1) {
        if ($this->char - $howMany >= 0) {
            $this->char -= $howMany;
        }
    }
    
    /**
     * Look ahead without moving cursor.
     */
    public function peek() {
        if ($this->char + 1 <= $this->EOF) {
            return $this->data[$this->char + 1];
        }
        return false;
    }
    public function key() {
        return $this->char;
    }

}

Members

Title Sort descending Modifiers Object type Summary Overriden Title Overrides
StringInputStream::$char private property The current integer byte position we are in $data.
StringInputStream::$data private property The string data we&#039;re parsing.
StringInputStream::$EOF private property Length of $data; when $char === $data, we are at the end-of-file.
StringInputStream::$errors public property Parse errors.
StringInputStream::charsUntil public function Read to a particular match (or until $max bytes are consumed). Overrides InputStream::charsUntil
StringInputStream::charsWhile public function Returns the string so long as $bytes matches. Overrides InputStream::charsWhile
StringInputStream::columnOffset public function Returns the current column of the current line that the tokenizer is at.
Newlines are column 0. The first char after a newline is column 1.
Overrides InputStream::columnOffset
StringInputStream::current public function Get the current character.
StringInputStream::currentLine public function Returns the current line that the tokenizer is at. Overrides InputStream::currentLine
StringInputStream::getColumnOffset public function
StringInputStream::getCurrentLine public function
StringInputStream::key public function
StringInputStream::next public function Advance the pointer.
This is part of the Iterator interface.
StringInputStream::peek public function Look ahead without moving cursor. Overrides InputStream::peek
StringInputStream::remainingChars public function Get all characters until EOF. Overrides InputStream::remainingChars
StringInputStream::replaceLinefeeds protected function Replace linefeed characters according to the spec.
StringInputStream::rewind public function Rewind to the start of the string.
StringInputStream::unconsume public function Unconsume characters. Overrides InputStream::unconsume
StringInputStream::valid public function Is the current pointer location valid.
StringInputStream::__construct public function Create a new InputStream wrapper. 1
StringInputStream::__toString public function

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal