2011-10-05 06:22:53 +02:00
< ? php
/*
* This file is part of Twig .
*
2018-05-10 12:24:53 +02:00
* ( c ) Fabien Potencier
* ( c ) Armin Ronacher
2011-10-05 06:22:53 +02:00
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
/**
* Marks a section of a template as being reusable .
*
* < pre >
* { % block head % }
* < link rel = " stylesheet " href = " style.css " />
* < title > { % block title % }{ % endblock % } - My Webpage </ title >
* { % endblock % }
* </ pre >
2018-05-10 12:24:53 +02:00
*
* @ final
2011-10-05 06:22:53 +02:00
*/
class Twig_TokenParser_Block extends Twig_TokenParser
{
public function parse ( Twig_Token $token )
{
$lineno = $token -> getLine ();
$stream = $this -> parser -> getStream ();
$name = $stream -> expect ( Twig_Token :: NAME_TYPE ) -> getValue ();
if ( $this -> parser -> hasBlock ( $name )) {
2018-05-10 12:24:53 +02:00
throw new Twig_Error_Syntax ( sprintf ( " The block '%s' has already been defined line %d. " , $name , $this -> parser -> getBlock ( $name ) -> getTemplateLine ()), $stream -> getCurrent () -> getLine (), $stream -> getSourceContext ());
2011-10-05 06:22:53 +02:00
}
2013-08-01 21:20:12 +02:00
$this -> parser -> setBlock ( $name , $block = new Twig_Node_Block ( $name , new Twig_Node ( array ()), $lineno ));
2011-10-05 06:22:53 +02:00
$this -> parser -> pushLocalScope ();
$this -> parser -> pushBlockStack ( $name );
2018-05-10 12:24:53 +02:00
if ( $stream -> nextIf ( Twig_Token :: BLOCK_END_TYPE )) {
2011-10-05 06:22:53 +02:00
$body = $this -> parser -> subparse ( array ( $this , 'decideBlockEnd' ), true );
2018-05-10 12:24:53 +02:00
if ( $token = $stream -> nextIf ( Twig_Token :: NAME_TYPE )) {
$value = $token -> getValue ();
2011-10-05 06:22:53 +02:00
if ( $value != $name ) {
2018-05-10 12:24:53 +02:00
throw new Twig_Error_Syntax ( sprintf ( 'Expected endblock for block "%s" (but "%s" given).' , $name , $value ), $stream -> getCurrent () -> getLine (), $stream -> getSourceContext ());
2011-10-05 06:22:53 +02:00
}
}
} else {
$body = new Twig_Node ( array (
new Twig_Node_Print ( $this -> parser -> getExpressionParser () -> parseExpression (), $lineno ),
));
}
$stream -> expect ( Twig_Token :: BLOCK_END_TYPE );
2013-08-01 21:20:12 +02:00
$block -> setNode ( 'body' , $body );
2011-10-05 06:22:53 +02:00
$this -> parser -> popBlockStack ();
$this -> parser -> popLocalScope ();
return new Twig_Node_BlockReference ( $name , $lineno , $this -> getTag ());
}
public function decideBlockEnd ( Twig_Token $token )
{
return $token -> test ( 'endblock' );
}
public function getTag ()
{
return 'block' ;
}
}
2018-05-10 12:24:53 +02:00
class_alias ( 'Twig_TokenParser_Block' , 'Twig\TokenParser\BlockTokenParser' , false );