Project

General

Profile

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 ($token = $stream->nextIf(Twig_Token::NAME_TYPE)) {
42
            $value = $token->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
}
(13-13/17)