parser; $stream = $parser->getStream(); $default = null; $cases = array(); $end = false; $name = $parser->getExpressionParser()->parseExpression(); $stream->expect(Twig_Token::BLOCK_END_TYPE); $stream->expect(Twig_Token::TEXT_TYPE); $stream->expect(Twig_Token::BLOCK_START_TYPE); while (!$end) { $v = $stream->next(); switch ($v->getValue()) { case 'default': $stream->expect(Twig_Token::BLOCK_END_TYPE); $default = $parser->subparse(array($this, 'decideIfEnd')); break; case 'case': $expr = $parser->getExpressionParser()->parseExpression(); $stream->expect(Twig_Token::BLOCK_END_TYPE); $body = $parser->subparse(array($this, 'decideIfFork')); $cases[] = $expr; $cases[] = $body; 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 Twig_Node_Switch($name,new Twig_Node($cases), $default, $token->getLine(), $this->getTag()); } public function decideIfFork($token) { return $token->test(array('case', 'default', 'endswitch')); } public function decideIfEnd($token) { return $token->test(array('endswitch')); } /** * Gets the tag name associated with this token parser. * * @param string The tag name */ public function getTag() { return 'switch'; } }