mirror of
https://github.com/twigphp/Twig.git
synced 2026-10-11 06:15:43 +00:00
0c6bd47d6b
* 3.x: Deprecate using Node directly, introduce EmptyNode and Nodes Add support for inline comments Update plural.rst: Fixing(?) broken links Fix CS Add support for accessing class constants with the dot operator Fix getting a property on an object casted to an array Replace strtr() by strtolower() Improve escape deprecation message Remove useless assign in compiled code Add fixture filename as key Be more precise about double-escaping Fix template name in error for an unknown dynamic extends called from an include
78 lines
2.2 KiB
PHP
78 lines
2.2 KiB
PHP
<?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 Twig\TokenParser;
|
|
|
|
use Twig\Error\SyntaxError;
|
|
use Twig\Node\BlockNode;
|
|
use Twig\Node\BlockReferenceNode;
|
|
use Twig\Node\EmptyNode;
|
|
use Twig\Node\Node;
|
|
use Twig\Node\Nodes;
|
|
use Twig\Node\PrintNode;
|
|
use Twig\Token;
|
|
|
|
/**
|
|
* Marks a section of a template as being reusable.
|
|
*
|
|
* {% block head %}
|
|
* <link rel="stylesheet" href="style.css" />
|
|
* <title>{% block title %}{% endblock %} - My Webpage</title>
|
|
* {% endblock %}
|
|
*
|
|
* @internal
|
|
*/
|
|
final class BlockTokenParser extends AbstractTokenParser
|
|
{
|
|
public function parse(Token $token): Node
|
|
{
|
|
$lineno = $token->getLine();
|
|
$stream = $this->parser->getStream();
|
|
$name = $stream->expect(Token::NAME_TYPE)->getValue();
|
|
$this->parser->setBlock($name, $block = new BlockNode($name, new EmptyNode(), $lineno));
|
|
$this->parser->pushLocalScope();
|
|
$this->parser->pushBlockStack($name);
|
|
|
|
if ($stream->nextIf(Token::BLOCK_END_TYPE)) {
|
|
$body = $this->parser->subparse($this->decideBlockEnd(...), true);
|
|
if ($token = $stream->nextIf(Token::NAME_TYPE)) {
|
|
$value = $token->getValue();
|
|
|
|
if ($value != $name) {
|
|
throw new SyntaxError(\sprintf('Expected endblock for block "%s" (but "%s" given).', $name, $value), $stream->getCurrent()->getLine(), $stream->getSourceContext());
|
|
}
|
|
}
|
|
} else {
|
|
$body = new Nodes([
|
|
new PrintNode($this->parser->getExpressionParser()->parseExpression(), $lineno),
|
|
]);
|
|
}
|
|
$stream->expect(Token::BLOCK_END_TYPE);
|
|
|
|
$block->setNode('body', $body);
|
|
$this->parser->popBlockStack();
|
|
$this->parser->popLocalScope();
|
|
|
|
return new BlockReferenceNode($name, $lineno);
|
|
}
|
|
|
|
public function decideBlockEnd(Token $token): bool
|
|
{
|
|
return $token->test('endblock');
|
|
}
|
|
|
|
public function getTag(): string
|
|
{
|
|
return 'block';
|
|
}
|
|
}
|