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();
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
        return null;
54
    }
55

    
56
    public function decideBlockEnd(Twig_Token $token)
57
    {
58
        return $token->test('endmacro');
59
    }
60

    
61
    /**
62
     * Gets the tag name associated with this token parser.
63
     *
64
     * @return string The tag name
65
     */
66
    public function getTag()
67
    {
68
        return 'macro';
69
    }
70
}
(13-13/17)