]>
Commit | Line | Data |
---|---|---|
a4565e88 NL |
1 | <?php |
2 | ||
3 | /* | |
4 | * This file is part of Twig. | |
5 | * | |
6 | * (c) 2009 Fabien Potencier | |
7 | * | |
8 | * For the full copyright and license information, please view the LICENSE | |
9 | * file that was distributed with this source code. | |
10 | */ | |
11 | ||
12 | /** | |
13 | * Defines a macro. | |
14 | * | |
15 | * <pre> | |
16 | * {% macro input(name, value, type, size) %} | |
17 | * <input type="{{ type|default('text') }}" name="{{ name }}" value="{{ value|e }}" size="{{ size|default(20) }}" /> | |
18 | * {% endmacro %} | |
19 | * </pre> | |
20 | */ | |
21 | class Twig_TokenParser_Macro extends Twig_TokenParser | |
22 | { | |
23 | /** | |
24 | * Parses a token and returns a node. | |
25 | * | |
26 | * @param Twig_Token $token A Twig_Token instance | |
27 | * | |
28 | * @return Twig_NodeInterface A Twig_NodeInterface instance | |
29 | */ | |
30 | public function parse(Twig_Token $token) | |
31 | { | |
32 | $lineno = $token->getLine(); | |
33 | $stream = $this->parser->getStream(); | |
34 | $name = $stream->expect(Twig_Token::NAME_TYPE)->getValue(); | |
35 | ||
36 | $arguments = $this->parser->getExpressionParser()->parseArguments(true, true); | |
37 | ||
38 | $stream->expect(Twig_Token::BLOCK_END_TYPE); | |
39 | $this->parser->pushLocalScope(); | |
40 | $body = $this->parser->subparse(array($this, 'decideBlockEnd'), true); | |
41 | if ($stream->test(Twig_Token::NAME_TYPE)) { | |
42 | $value = $stream->next()->getValue(); | |
43 | ||
44 | if ($value != $name) { | |
45 | throw new Twig_Error_Syntax(sprintf("Expected endmacro for macro '$name' (but %s given)", $value), $stream->getCurrent()->getLine(), $stream->getFilename()); | |
46 | } | |
47 | } | |
48 | $this->parser->popLocalScope(); | |
49 | $stream->expect(Twig_Token::BLOCK_END_TYPE); | |
50 | ||
51 | $this->parser->setMacro($name, new Twig_Node_Macro($name, new Twig_Node_Body(array($body)), $arguments, $lineno, $this->getTag())); | |
52 | } | |
53 | ||
54 | public function decideBlockEnd(Twig_Token $token) | |
55 | { | |
56 | return $token->test('endmacro'); | |
57 | } | |
58 | ||
59 | /** | |
60 | * Gets the tag name associated with this token parser. | |
61 | * | |
62 | * @return string The tag name | |
63 | */ | |
64 | public function getTag() | |
65 | { | |
66 | return 'macro'; | |
67 | } | |
68 | } |