vendor/twig/twig/src/TokenParser/ForTokenParser.php line 61

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of Twig.
  4.  *
  5.  * (c) Fabien Potencier
  6.  * (c) Armin Ronacher
  7.  *
  8.  * For the full copyright and license information, please view the LICENSE
  9.  * file that was distributed with this source code.
  10.  */
  11. namespace Twig\TokenParser;
  12. use Twig\Node\Expression\AssignNameExpression;
  13. use Twig\Node\ForNode;
  14. use Twig\Node\Node;
  15. use Twig\Token;
  16. /**
  17.  * Loops over each item of a sequence.
  18.  *
  19.  *   <ul>
  20.  *    {% for user in users %}
  21.  *      <li>{{ user.username|e }}</li>
  22.  *    {% endfor %}
  23.  *   </ul>
  24.  *
  25.  * @internal
  26.  */
  27. final class ForTokenParser extends AbstractTokenParser
  28. {
  29.     public function parse(Token $token): Node
  30.     {
  31.         $lineno $token->getLine();
  32.         $stream $this->parser->getStream();
  33.         $targets $this->parser->getExpressionParser()->parseAssignmentExpression();
  34.         $stream->expect(/* Token::OPERATOR_TYPE */ 8'in');
  35.         $seq $this->parser->getExpressionParser()->parseExpression();
  36.         $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
  37.         $body $this->parser->subparse([$this'decideForFork']);
  38.         if ('else' == $stream->next()->getValue()) {
  39.             $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
  40.             $else $this->parser->subparse([$this'decideForEnd'], true);
  41.         } else {
  42.             $else null;
  43.         }
  44.         $stream->expect(/* Token::BLOCK_END_TYPE */ 3);
  45.         if (\count($targets) > 1) {
  46.             $keyTarget $targets->getNode(0);
  47.             $keyTarget = new AssignNameExpression($keyTarget->getAttribute('name'), $keyTarget->getTemplateLine());
  48.             $valueTarget $targets->getNode(1);
  49.         } else {
  50.             $keyTarget = new AssignNameExpression('_key'$lineno);
  51.             $valueTarget $targets->getNode(0);
  52.         }
  53.         $valueTarget = new AssignNameExpression($valueTarget->getAttribute('name'), $valueTarget->getTemplateLine());
  54.         return new ForNode($keyTarget$valueTarget$seqnull$body$else$lineno$this->getTag());
  55.     }
  56.     public function decideForFork(Token $token): bool
  57.     {
  58.         return $token->test(['else''endfor']);
  59.     }
  60.     public function decideForEnd(Token $token): bool
  61.     {
  62.         return $token->test('endfor');
  63.     }
  64.     public function getTag(): string
  65.     {
  66.         return 'for';
  67.     }
  68. }