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
    public function compile(Twig_Compiler $compiler)
40
    {
41
        $compiler->addDebugInfo($this);
42

    
43
        if (count($this->getNode('names')) > 1) {
44
            $compiler->write('list(');
45
            foreach ($this->getNode('names') as $idx => $node) {
46
                if ($idx) {
47
                    $compiler->raw(', ');
48
                }
49

    
50
                $compiler->subcompile($node);
51
            }
52
            $compiler->raw(')');
53
        } else {
54
            if ($this->getAttribute('capture')) {
55
                $compiler
56
                    ->write("ob_start();\n")
57
                    ->subcompile($this->getNode('values'))
58
                ;
59
            }
60

    
61
            $compiler->subcompile($this->getNode('names'), false);
62

    
63
            if ($this->getAttribute('capture')) {
64
                $compiler->raw(" = ('' === \$tmp = ob_get_clean()) ? '' : new Twig_Markup(\$tmp, \$this->env->getCharset())");
65
            }
66
        }
67

    
68
        if (!$this->getAttribute('capture')) {
69
            $compiler->raw(' = ');
70

    
71
            if (count($this->getNode('names')) > 1) {
72
                $compiler->write('array(');
73
                foreach ($this->getNode('values') as $idx => $value) {
74
                    if ($idx) {
75
                        $compiler->raw(', ');
76
                    }
77

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

    
94
        $compiler->raw(";\n");
95
    }
96
}
(20-20/23)