You are here

public function Twig_TokenParser_If::parse in Zircon Profile 8.0

Same name and namespace in other branches
  1. 8 vendor/twig/twig/lib/Twig/TokenParser/If.php \Twig_TokenParser_If::parse()

Parses a token and returns a node.

Parameters

Twig_Token $token A Twig_Token instance:

Return value

Twig_NodeInterface A Twig_NodeInterface instance

Throws

Twig_Error_Syntax

Overrides Twig_TokenParserInterface::parse

File

vendor/twig/twig/lib/Twig/TokenParser/If.php, line 28

Class

Twig_TokenParser_If
Tests a condition.

Code

public function parse(Twig_Token $token) {
  $lineno = $token
    ->getLine();
  $expr = $this->parser
    ->getExpressionParser()
    ->parseExpression();
  $stream = $this->parser
    ->getStream();
  $stream
    ->expect(Twig_Token::BLOCK_END_TYPE);
  $body = $this->parser
    ->subparse(array(
    $this,
    'decideIfFork',
  ));
  $tests = array(
    $expr,
    $body,
  );
  $else = null;
  $end = false;
  while (!$end) {
    switch ($stream
      ->next()
      ->getValue()) {
      case 'else':
        $stream
          ->expect(Twig_Token::BLOCK_END_TYPE);
        $else = $this->parser
          ->subparse(array(
          $this,
          'decideIfEnd',
        ));
        break;
      case 'elseif':
        $expr = $this->parser
          ->getExpressionParser()
          ->parseExpression();
        $stream
          ->expect(Twig_Token::BLOCK_END_TYPE);
        $body = $this->parser
          ->subparse(array(
          $this,
          'decideIfFork',
        ));
        $tests[] = $expr;
        $tests[] = $body;
        break;
      case 'endif':
        $end = true;
        break;
      default:
        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());
    }
  }
  $stream
    ->expect(Twig_Token::BLOCK_END_TYPE);
  return new Twig_Node_If(new Twig_Node($tests), $else, $lineno, $this
    ->getTag());
}