public function 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

Overrides Twig_TokenParserInterface::parse

File

drupal/core/vendor/twig/twig/lib/Twig/TokenParser/If.php, line 35

Class

Twig_TokenParser_If
Tests a condition.

Code

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