getLine(); $stream = $this->parser->getStream(); $name = $this->parser->getExpressionParser()->parseExpression(); $stream->expect(\Twig_Token::BLOCK_END_TYPE); // There can be some whitespace between the {% switch %} and first {% case %} tag. while ($stream->getCurrent()->getType() == \Twig_Token::TEXT_TYPE && trim($stream->getCurrent()->getValue()) == '') { $stream->next(); } $stream->expect(\Twig_Token::BLOCK_START_TYPE); $expressionParser = $this->parser->getExpressionParser(); $default = null; $cases = array(); $end = false; while (!$end) { $next = $stream->next(); switch ($next->getValue()) { case 'case': { $values = array(); while (true) { $values[] = $expressionParser->parsePrimaryExpression(); // Multiple allowed values? if ($stream->test(\Twig_Token::OPERATOR_TYPE, 'or')) { $stream->next(); } else { break; } } $stream->expect(\Twig_Token::BLOCK_END_TYPE); $body = $this->parser->subparse(array($this, 'decideIfFork')); $cases[] = new \Twig_Node(array( 'values' => new \Twig_Node($values), 'body' => $body )); break; } case 'default': { $stream->expect(\Twig_Token::BLOCK_END_TYPE); $default = $this->parser->subparse(array($this, 'decideIfEnd')); break; } case 'endswitch': { $end = true; break; } default: { throw new \Twig_Error_Syntax(sprintf('Unexpected end of template. Twig was looking for the following tags "case", "default", or "endswitch" to close the "switch" block started at line %d)', $lineno), -1); } } } $stream->expect(\Twig_Token::BLOCK_END_TYPE); return new TwigNodeSwitch($name, new \Twig_Node($cases), $default, $lineno, $this->getTag()); } /** * Decide if current token marks switch logic. * * @param \Twig_Token $token * @return bool */ public function decideIfFork(\Twig_Token $token) { return $token->test(array('case', 'default', 'endswitch')); } /** * Decide if current token marks end of swtich block. * * @param \Twig_Token $token * @return bool */ public function decideIfEnd(\Twig_Token $token) { return $token->test(array('endswitch')); } /** * {@inheritdoc} */ public function getTag() { return 'switch'; } }