2011-10-05 06:22:53 +02: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 .
*/
/**
* Tests a condition .
*
* < pre >
* { % if users % }
* < ul >
* { % for user in users % }
* < li > {{ user . username | e }} </ li >
* { % endfor % }
* </ ul >
* { % endif % }
* </ pre >
*/
class Twig_TokenParser_If 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 ();
$expr = $this -> parser -> getExpressionParser () -> parseExpression ();
2013-08-01 21:20:12 +02:00
$stream = $this -> parser -> getStream ();
$stream -> expect ( Twig_Token :: BLOCK_END_TYPE );
2011-10-05 06:22:53 +02:00
$body = $this -> parser -> subparse ( array ( $this , 'decideIfFork' ));
$tests = array ( $expr , $body );
$else = null ;
$end = false ;
while ( ! $end ) {
2013-08-01 21:20:12 +02:00
switch ( $stream -> next () -> getValue ()) {
2011-10-05 06:22:53 +02:00
case 'else' :
2013-08-01 21:20:12 +02:00
$stream -> expect ( Twig_Token :: BLOCK_END_TYPE );
2011-10-05 06:22:53 +02:00
$else = $this -> parser -> subparse ( array ( $this , 'decideIfEnd' ));
break ;
case 'elseif' :
$expr = $this -> parser -> getExpressionParser () -> parseExpression ();
2013-08-01 21:20:12 +02:00
$stream -> expect ( Twig_Token :: BLOCK_END_TYPE );
2011-10-05 06:22:53 +02:00
$body = $this -> parser -> subparse ( array ( $this , 'decideIfFork' ));
$tests [] = $expr ;
$tests [] = $body ;
break ;
case 'endif' :
$end = true ;
break ;
default :
2013-08-01 21:20:12 +02:00
throw new Twig_Error_Syntax ( sprintf ( 'Unexpected end of template. Twig was looking for the following tags "else", "elseif", or "endif" to close the "if" block started at line %d)' , $lineno ), $stream -> getCurrent () -> getLine (), $stream -> getFilename ());
2011-10-05 06:22:53 +02:00
}
}
2013-08-01 21:20:12 +02:00
$stream -> expect ( Twig_Token :: BLOCK_END_TYPE );
2011-10-05 06:22:53 +02:00
return new Twig_Node_If ( new Twig_Node ( $tests ), $else , $lineno , $this -> getTag ());
}
public function decideIfFork ( Twig_Token $token )
{
return $token -> test ( array ( 'elseif' , 'else' , 'endif' ));
}
public function decideIfEnd ( Twig_Token $token )
{
return $token -> test ( array ( 'endif' ));
}
/**
* 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 'if' ;
}
}