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

Breadcrumb

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

function Lexer::lexData

1 call to Lexer::lexData()
Lexer::tokenize in vendor/twig/twig/src/Lexer.php

File

vendor/twig/twig/src/Lexer.php, line 229

Class

Lexer
@author Fabien Potencier <fabien@symfony.com>

Namespace

Twig

Code

private function lexData() : void {
    // if no matches are left we return the rest of the template as simple text token
    if ($this->position == \count($this->positions[0]) - 1) {
        $this->pushToken(Token::TEXT_TYPE, substr($this->code, $this->cursor));
        $this->cursor = $this->end;
        return;
    }
    // Find the first token after the current cursor
    $position = $this->positions[0][++$this->position];
    while ($position[1] < $this->cursor) {
        if ($this->position == \count($this->positions[0]) - 1) {
            return;
        }
        $position = $this->positions[0][++$this->position];
    }
    // push the template text first
    $text = $textContent = substr($this->code, $this->cursor, $position[1] - $this->cursor);
    // trim?
    if (isset($this->positions[2][$this->position][0])) {
        if ($this->options['whitespace_trim'] === $this->positions[2][$this->position][0]) {
            // whitespace_trim detected ({%-, {{- or {#-)
            $text = rtrim($text);
        }
        elseif ($this->options['whitespace_line_trim'] === $this->positions[2][$this->position][0]) {
            // whitespace_line_trim detected ({%~, {{~ or {#~)
            // don't trim \r and \n
            $text = rtrim($text, " \t\x00\v");
        }
    }
    $this->pushToken(Token::TEXT_TYPE, $text);
    $this->moveCursor($textContent . $position[0]);
    switch ($this->positions[1][$this->position][0]) {
        case $this->options['tag_comment'][0]:
            $this->lexComment();
            break;
        case $this->options['tag_block'][0]:
            // raw data?
            if (preg_match($this->regexes['lex_block_raw'], $this->code, $match, 0, $this->cursor)) {
                $this->moveCursor($match[0]);
                $this->lexRawData();
                // {% line \d+ %}
            }
            elseif (preg_match($this->regexes['lex_block_line'], $this->code, $match, 0, $this->cursor)) {
                $this->moveCursor($match[0]);
                $this->lineno = (int) $match[1];
            }
            else {
                $this->pushToken(Token::BLOCK_START_TYPE);
                $this->pushState(self::STATE_BLOCK);
                $this->currentVarBlockLine = $this->lineno;
            }
            break;
        case $this->options['tag_variable'][0]:
            $this->pushToken(Token::VAR_START_TYPE);
            $this->pushState(self::STATE_VAR);
            $this->currentVarBlockLine = $this->lineno;
            break;
    }
}
RSS feed
Powered by Drupal