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

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\Variable\AssignContextVariable;
  13. use Twig\Node\ForElseNode;
  14. use Twig\Node\ForNode;
  15. use Twig\Node\Node;
  16. use Twig\Token;
  17. /**
  18. * Loops over each item of a sequence.
  19. *
  20. * <ul>
  21. * {% for user in users %}
  22. * <li>{{ user.username|e }}</li>
  23. * {% endfor %}
  24. * </ul>
  25. *
  26. * @internal
  27. */
  28. final class ForTokenParser extends AbstractTokenParser
  29. {
  30. public function parse(Token $token): Node
  31. {
  32. $lineno = $token->getLine();
  33. $stream = $this->parser->getStream();
  34. $targets = $this->parseAssignmentExpression();
  35. $stream->expect(Token::OPERATOR_TYPE, 'in');
  36. $seq = $this->parser->parseExpression();
  37. $stream->expect(Token::BLOCK_END_TYPE);
  38. $body = $this->parser->subparse([$this, 'decideForFork']);
  39. if ('else' == $stream->next()->getValue()) {
  40. $elseLineno = $stream->getCurrent()->getLine();
  41. $stream->expect(Token::BLOCK_END_TYPE);
  42. $else = new ForElseNode($this->parser->subparse([$this, 'decideForEnd'], true), $elseLineno);
  43. } else {
  44. $else = null;
  45. }
  46. $stream->expect(Token::BLOCK_END_TYPE);
  47. if (\count($targets) > 1) {
  48. $keyTarget = $targets->getNode('0');
  49. $keyTarget = new AssignContextVariable($keyTarget->getAttribute('name'), $keyTarget->getTemplateLine());
  50. $valueTarget = $targets->getNode('1');
  51. } else {
  52. $keyTarget = new AssignContextVariable('_key', $lineno);
  53. $valueTarget = $targets->getNode('0');
  54. }
  55. $valueTarget = new AssignContextVariable($valueTarget->getAttribute('name'), $valueTarget->getTemplateLine());
  56. return new ForNode($keyTarget, $valueTarget, $seq, null, $body, $else, $lineno);
  57. }
  58. public function decideForFork(Token $token): bool
  59. {
  60. return $token->test(['else', 'endfor']);
  61. }
  62. public function decideForEnd(Token $token): bool
  63. {
  64. return $token->test('endfor');
  65. }
  66. public function getTag(): string
  67. {
  68. return 'for';
  69. }
  70. }