Project

General

Profile

1
<?php
2

    
3
/*
4
 * This file is part of Twig.
5
 *
6
 * (c) 2009 Fabien Potencier
7
 * (c) 2009 Armin Ronacher
8
 *
9
 * For the full copyright and license information, please view the LICENSE
10
 * file that was distributed with this source code.
11
 */
12

    
13
/**
14
 * Represents a node in the AST.
15
 *
16
 * @author Fabien Potencier <fabien@symfony.com>
17
 */
18
class Twig_Node implements Twig_NodeInterface
19
{
20
    protected $nodes;
21
    protected $attributes;
22
    protected $lineno;
23
    protected $tag;
24

    
25
    /**
26
     * Constructor.
27
     *
28
     * The nodes are automatically made available as properties ($this->node).
29
     * The attributes are automatically made available as array items ($this['name']).
30
     *
31
     * @param array  $nodes      An array of named nodes
32
     * @param array  $attributes An array of attributes (should not be nodes)
33
     * @param int    $lineno     The line number
34
     * @param string $tag        The tag name associated with the Node
35
     */
36
    public function __construct(array $nodes = array(), array $attributes = array(), $lineno = 0, $tag = null)
37
    {
38
        $this->nodes = $nodes;
39
        $this->attributes = $attributes;
40
        $this->lineno = $lineno;
41
        $this->tag = $tag;
42
    }
43

    
44
    public function __toString()
45
    {
46
        $attributes = array();
47
        foreach ($this->attributes as $name => $value) {
48
            $attributes[] = sprintf('%s: %s', $name, str_replace("\n", '', var_export($value, true)));
49
        }
50

    
51
        $repr = array(get_class($this).'('.implode(', ', $attributes));
52

    
53
        if (count($this->nodes)) {
54
            foreach ($this->nodes as $name => $node) {
55
                $len = strlen($name) + 4;
56
                $noderepr = array();
57
                foreach (explode("\n", (string) $node) as $line) {
58
                    $noderepr[] = str_repeat(' ', $len).$line;
59
                }
60

    
61
                $repr[] = sprintf('  %s: %s', $name, ltrim(implode("\n", $noderepr)));
62
            }
63

    
64
            $repr[] = ')';
65
        } else {
66
            $repr[0] .= ')';
67
        }
68

    
69
        return implode("\n", $repr);
70
    }
71

    
72
    /**
73
     * @deprecated since 1.16.1 (to be removed in 2.0)
74
     */
75
    public function toXml($asDom = false)
76
    {
77
        @trigger_error(sprintf('%s is deprecated since version 1.16.1 and will be removed in 2.0.', __METHOD__), E_USER_DEPRECATED);
78

    
79
        $dom = new DOMDocument('1.0', 'UTF-8');
80
        $dom->formatOutput = true;
81
        $dom->appendChild($xml = $dom->createElement('twig'));
82

    
83
        $xml->appendChild($node = $dom->createElement('node'));
84
        $node->setAttribute('class', get_class($this));
85

    
86
        foreach ($this->attributes as $name => $value) {
87
            $node->appendChild($attribute = $dom->createElement('attribute'));
88
            $attribute->setAttribute('name', $name);
89
            $attribute->appendChild($dom->createTextNode($value));
90
        }
91

    
92
        foreach ($this->nodes as $name => $n) {
93
            if (null === $n) {
94
                continue;
95
            }
96

    
97
            $child = $n->toXml(true)->getElementsByTagName('node')->item(0);
98
            $child = $dom->importNode($child, true);
99
            $child->setAttribute('name', $name);
100

    
101
            $node->appendChild($child);
102
        }
103

    
104
        return $asDom ? $dom : $dom->saveXML();
105
    }
106

    
107
    public function compile(Twig_Compiler $compiler)
108
    {
109
        foreach ($this->nodes as $node) {
110
            $node->compile($compiler);
111
        }
112
    }
113

    
114
    public function getLine()
115
    {
116
        return $this->lineno;
117
    }
118

    
119
    public function getNodeTag()
120
    {
121
        return $this->tag;
122
    }
123

    
124
    /**
125
     * Returns true if the attribute is defined.
126
     *
127
     * @param string $name The attribute name
128
     *
129
     * @return bool true if the attribute is defined, false otherwise
130
     */
131
    public function hasAttribute($name)
132
    {
133
        return array_key_exists($name, $this->attributes);
134
    }
135

    
136
    /**
137
     * Gets an attribute value by name.
138
     *
139
     * @param string $name
140
     *
141
     * @return mixed
142
     */
143
    public function getAttribute($name)
144
    {
145
        if (!array_key_exists($name, $this->attributes)) {
146
            throw new LogicException(sprintf('Attribute "%s" does not exist for Node "%s".', $name, get_class($this)));
147
        }
148

    
149
        return $this->attributes[$name];
150
    }
151

    
152
    /**
153
     * Sets an attribute by name to a value.
154
     *
155
     * @param string $name
156
     * @param mixed  $value
157
     */
158
    public function setAttribute($name, $value)
159
    {
160
        $this->attributes[$name] = $value;
161
    }
162

    
163
    /**
164
     * Removes an attribute by name.
165
     *
166
     * @param string $name
167
     */
168
    public function removeAttribute($name)
169
    {
170
        unset($this->attributes[$name]);
171
    }
172

    
173
    /**
174
     * Returns true if the node with the given name exists.
175
     *
176
     * @param string $name
177
     *
178
     * @return bool
179
     */
180
    public function hasNode($name)
181
    {
182
        return array_key_exists($name, $this->nodes);
183
    }
184

    
185
    /**
186
     * Gets a node by name.
187
     *
188
     * @param string $name
189
     *
190
     * @return Twig_Node
191
     */
192
    public function getNode($name)
193
    {
194
        if (!array_key_exists($name, $this->nodes)) {
195
            throw new LogicException(sprintf('Node "%s" does not exist for Node "%s".', $name, get_class($this)));
196
        }
197

    
198
        return $this->nodes[$name];
199
    }
200

    
201
    /**
202
     * Sets a node.
203
     *
204
     * @param string    $name
205
     * @param Twig_Node $node
206
     */
207
    public function setNode($name, $node = null)
208
    {
209
        $this->nodes[$name] = $node;
210
    }
211

    
212
    /**
213
     * Removes a node by name.
214
     *
215
     * @param string $name
216
     */
217
    public function removeNode($name)
218
    {
219
        unset($this->nodes[$name]);
220
    }
221

    
222
    public function count()
223
    {
224
        return count($this->nodes);
225
    }
226

    
227
    public function getIterator()
228
    {
229
        return new ArrayIterator($this->nodes);
230
    }
231
}
(23-23/43)