2011-10-05 00:22:53 -04:00
< ? php
/*
* This file is part of Twig .
*
* ( c ) 2009 Fabien Potencier
* ( c ) 2009 Armin Ronacher
*
* 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 >
*/
class Twig_TokenParser_Block extends Twig_TokenParser
{
/**
* Parses a token and returns a node .
*
* @ param Twig_Token $token A Twig_Token instance
*
* @ return Twig_NodeInterface A Twig_NodeInterface instance
*/
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 )) {
2013-08-01 15:20:12 -04:00
throw new Twig_Error_Syntax ( sprintf ( " The block ' $name ' has already been defined line %d " , $this -> parser -> getBlock ( $name ) -> getLine ()), $stream -> getCurrent () -> getLine (), $stream -> getFilename ());
2011-10-05 00:22:53 -04:00
}
2013-08-01 15:20:12 -04:00
$this -> parser -> setBlock ( $name , $block = new Twig_Node_Block ( $name , new Twig_Node ( array ()), $lineno ));
2011-10-05 00:22:53 -04:00
$this -> parser -> pushLocalScope ();
$this -> parser -> pushBlockStack ( $name );
if ( $stream -> test ( Twig_Token :: BLOCK_END_TYPE )) {
$stream -> next ();
$body = $this -> parser -> subparse ( array ( $this , 'decideBlockEnd' ), true );
if ( $stream -> test ( Twig_Token :: NAME_TYPE )) {
$value = $stream -> next () -> getValue ();
if ( $value != $name ) {
2013-08-01 15:20:12 -04:00
throw new Twig_Error_Syntax ( sprintf ( " Expected endblock for block ' $name ' (but %s given) " , $value ), $stream -> getCurrent () -> getLine (), $stream -> getFilename ());
2011-10-05 00:22:53 -04: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 15:20:12 -04:00
$block -> setNode ( 'body' , $body );
2011-10-05 00:22:53 -04: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' );
}
/**
* Gets the tag name associated with this token parser .
*
2013-08-01 15:20:12 -04:00
* @ return string The tag name
2011-10-05 00:22:53 -04:00
*/
public function getTag ()
{
return 'block' ;
}
}