2011-10-05 06:22:53 +02:00
< ? php
/*
* This file is part of Twig .
*
* ( c ) 2009 Fabien Potencier
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
/**
* Defines a variable .
*
* < pre >
* { % set foo = 'foo' % }
*
* { % set foo = [ 1 , 2 ] % }
*
* { % set foo = { 'foo' : 'bar' } % }
*
* { % set foo = 'foo' ~ 'bar' % }
*
* { % set foo , bar = 'foo' , 'bar' % }
*
* { % set foo % } Some content { % endset % }
* </ pre >
*/
class Twig_TokenParser_Set 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 ();
$names = $this -> parser -> getExpressionParser () -> parseAssignmentExpression ();
$capture = false ;
if ( $stream -> test ( Twig_Token :: OPERATOR_TYPE , '=' )) {
$stream -> next ();
$values = $this -> parser -> getExpressionParser () -> parseMultitargetExpression ();
$stream -> expect ( Twig_Token :: BLOCK_END_TYPE );
if ( count ( $names ) !== count ( $values )) {
2013-08-01 21:20:12 +02:00
throw new Twig_Error_Syntax ( " When using set, you must have the same number of variables and assignments. " , $stream -> getCurrent () -> getLine (), $stream -> getFilename ());
2011-10-05 06:22:53 +02:00
}
} else {
$capture = true ;
if ( count ( $names ) > 1 ) {
2013-08-01 21:20:12 +02:00
throw new Twig_Error_Syntax ( " When using set with a block, you cannot have a multi-target. " , $stream -> getCurrent () -> getLine (), $stream -> getFilename ());
2011-10-05 06:22:53 +02:00
}
$stream -> expect ( Twig_Token :: BLOCK_END_TYPE );
$values = $this -> parser -> subparse ( array ( $this , 'decideBlockEnd' ), true );
$stream -> expect ( Twig_Token :: BLOCK_END_TYPE );
}
return new Twig_Node_Set ( $capture , $names , $values , $lineno , $this -> getTag ());
}
public function decideBlockEnd ( Twig_Token $token )
{
return $token -> test ( 'endset' );
}
/**
* Gets the tag name associated with this token parser .
*
2013-08-01 21:20:12 +02:00
* @ return string The tag name
2011-10-05 06:22:53 +02:00
*/
public function getTag ()
{
return 'set' ;
}
}