Project

General

Profile

1
<?php
2

    
3
/*
4
 * This file is part of Twig.
5
 *
6
 * (c) 2010 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 set node.
14
 *
15
 * @author Fabien Potencier <fabien@symfony.com>
16
 */
17
class Twig_Node_Set extends Twig_Node
18
{
19
    public function __construct($capture, Twig_NodeInterface $names, Twig_NodeInterface $values, $lineno, $tag = null)
20
    {
21
        parent::__construct(array('names' => $names, 'values' => $values), array('capture' => $capture, 'safe' => false), $lineno, $tag);
22

    
23
        /*
24
         * Optimizes the node when capture is used for a large block of text.
25
         *
26
         * {% set foo %}foo{% endset %} is compiled to $context['foo'] = new Twig_Markup("foo");
27
         */
28
        if ($this->getAttribute('capture')) {
29
            $this->setAttribute('safe', true);
30

    
31
            $values = $this->getNode('values');
32
            if ($values instanceof Twig_Node_Text) {
33
                $this->setNode('values', new Twig_Node_Expression_Constant($values->getAttribute('data'), $values->getLine()));
34
                $this->setAttribute('capture', false);
35
            }
36
        }
37
    }
38

    
39
    /**
40
     * Compiles the node to PHP.
41
     *
42
     * @param Twig_Compiler A Twig_Compiler instance
43
     */
44
    public function compile(Twig_Compiler $compiler)
45
    {
46
        $compiler->addDebugInfo($this);
47

    
48
        if (count($this->getNode('names')) > 1) {
49
            $compiler->write('list(');
50
            foreach ($this->getNode('names') as $idx => $node) {
51
                if ($idx) {
52
                    $compiler->raw(', ');
53
                }
54

    
55
                $compiler->subcompile($node);
56
            }
57
            $compiler->raw(')');
58
        } else {
59
            if ($this->getAttribute('capture')) {
60
                $compiler
61
                    ->write("ob_start();\n")
62
                    ->subcompile($this->getNode('values'))
63
                ;
64
            }
65

    
66
            $compiler->subcompile($this->getNode('names'), false);
67

    
68
            if ($this->getAttribute('capture')) {
69
                $compiler->raw(" = ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())");
70
            }
71
        }
72

    
73
        if (!$this->getAttribute('capture')) {
74
            $compiler->raw(' = ');
75

    
76
            if (count($this->getNode('names')) > 1) {
77
                $compiler->write('array(');
78
                foreach ($this->getNode('values') as $idx => $value) {
79
                    if ($idx) {
80
                        $compiler->raw(', ');
81
                    }
82

    
83
                    $compiler->subcompile($value);
84
                }
85
                $compiler->raw(')');
86
            } else {
87
                if ($this->getAttribute('safe')) {
88
                    $compiler
89
                        ->raw("('' === \$tmp = ")
90
                        ->subcompile($this->getNode('values'))
91
                        ->raw(") ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())")
92
                    ;
93
                } else {
94
                    $compiler->subcompile($this->getNode('values'));
95
                }
96
            }
97
        }
98

    
99
        $compiler->raw(";\n");
100
    }
101
}
(20-20/23)