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
 * Represents a macro node.
14
 *
15
 * @author Fabien Potencier <fabien@symfony.com>
16
 */
17
class Twig_Node_Macro extends Twig_Node
18
{
19
    public function __construct($name, Twig_NodeInterface $body, Twig_NodeInterface $arguments, $lineno, $tag = null)
20
    {
21
        parent::__construct(array('body' => $body, 'arguments' => $arguments), array('name' => $name), $lineno, $tag);
22
    }
23

    
24
    /**
25
     * Compiles the node to PHP.
26
     *
27
     * @param Twig_Compiler A Twig_Compiler instance
28
     */
29
    public function compile(Twig_Compiler $compiler)
30
    {
31
        $compiler
32
            ->addDebugInfo($this)
33
            ->write(sprintf("public function get%s(", $this->getAttribute('name')))
34
        ;
35

    
36
        $count = count($this->getNode('arguments'));
37
        $pos = 0;
38
        foreach ($this->getNode('arguments') as $name => $default) {
39
            $compiler
40
                ->raw('$_'.$name.' = ')
41
                ->subcompile($default)
42
            ;
43

    
44
            if (++$pos < $count) {
45
                $compiler->raw(', ');
46
            }
47
        }
48

    
49
        $compiler
50
            ->raw(")\n")
51
            ->write("{\n")
52
            ->indent()
53
        ;
54

    
55
        if (!count($this->getNode('arguments'))) {
56
            $compiler->write("\$context = \$this->env->getGlobals();\n\n");
57
        } else {
58
            $compiler
59
                ->write("\$context = \$this->env->mergeGlobals(array(\n")
60
                ->indent()
61
            ;
62

    
63
            foreach ($this->getNode('arguments') as $name => $default) {
64
                $compiler
65
                    ->write('')
66
                    ->string($name)
67
                    ->raw(' => $_'.$name)
68
                    ->raw(",\n")
69
                ;
70
            }
71

    
72
            $compiler
73
                ->outdent()
74
                ->write("));\n\n")
75
            ;
76
        }
77

    
78
        $compiler
79
            ->write("\$blocks = array();\n\n")
80
            ->write("ob_start();\n")
81
            ->write("try {\n")
82
            ->indent()
83
            ->subcompile($this->getNode('body'))
84
            ->outdent()
85
            ->write("} catch (Exception \$e) {\n")
86
            ->indent()
87
            ->write("ob_end_clean();\n\n")
88
            ->write("throw \$e;\n")
89
            ->outdent()
90
            ->write("}\n\n")
91
            ->write("return ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset());\n")
92
            ->outdent()
93
            ->write("}\n\n")
94
        ;
95
    }
96
}
(14-14/23)