Вход Регистрация
Файл: upload/core/vendor/twig/twig/src/TokenParser/ForTokenParser.php
Строк: 92
<?php

/*
 * This file is part of Twig.
 *
 * (c) Fabien Potencier
 * (c) Armin Ronacher
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace TwigTokenParser;

use 
TwigNodeExpressionVariableAssignContextVariable;
use 
TwigNodeForElseNode;
use 
TwigNodeForNode;
use 
TwigNodeNode;
use 
TwigToken;

/**
 * Loops over each item of a sequence.
 *
 *   <ul>
 *    {% for user in users %}
 *      <li>{{ user.username|e }}</li>
 *    {% endfor %}
 *   </ul>
 *
 * @internal
 */
final class ForTokenParser extends AbstractTokenParser
{
    public function 
parse(Token $token): Node
    
{
        
$lineno $token->getLine();
        
$stream $this->parser->getStream();
        
$targets $this->parseAssignmentExpression();
        
$stream->expect(Token::OPERATOR_TYPE'in');
        
$seq $this->parser->parseExpression();

        
$stream->expect(Token::BLOCK_END_TYPE);
        
$body $this->parser->subparse([$this'decideForFork']);
        if (
'else' == $stream->next()->getValue()) {
            
$elseLineno $stream->getCurrent()->getLine();
            
$stream->expect(Token::BLOCK_END_TYPE);
            
$else = new ForElseNode($this->parser->subparse([$this'decideForEnd'], true), $elseLineno);
        } else {
            
$else null;
        }
        
$stream->expect(Token::BLOCK_END_TYPE);

        if (
count($targets) > 1) {
            
$keyTarget $targets->getNode('0');
            
$keyTarget = new AssignContextVariable($keyTarget->getAttribute('name'), $keyTarget->getTemplateLine());
            
$valueTarget $targets->getNode('1');
        } else {
            
$keyTarget = new AssignContextVariable('_key'$lineno);
            
$valueTarget $targets->getNode('0');
        }
        
$valueTarget = new AssignContextVariable($valueTarget->getAttribute('name'), $valueTarget->getTemplateLine());

        return new 
ForNode($keyTarget$valueTarget$seqnull$body$else$lineno);
    }

    public function 
decideForFork(Token $token): bool
    
{
        return 
$token->test(['else''endfor']);
    }

    public function 
decideForEnd(Token $token): bool
    
{
        return 
$token->test('endfor');
    }

    public function 
getTag(): string
    
{
        return 
'for';
    }
}
Онлайн: 2
Реклама