source: trunk/include/smarty/libs/sysplugins/smarty_internal_parsetree.php @ 23384

Last change on this file since 23384 was 23384, checked in by rvelices, 11 years ago

smarty 3 - first pass for tests

File size: 9.8 KB
Line 
1<?php
2/**
3 * Smarty Internal Plugin Templateparser Parsetrees
4 *
5 * These are classes to build parsetrees in the template parser
6 *
7 * @package Smarty
8 * @subpackage Compiler
9 * @author Thue Kristensen
10 * @author Uwe Tews
11 */
12
13/**
14 * @package Smarty
15 * @subpackage Compiler
16 * @ignore
17 */
18abstract class _smarty_parsetree {
19
20    /**
21     * Parser object
22     * @var object
23     */
24    public $parser;
25    /**
26     * Buffer content
27     * @var mixed
28     */
29    public $data;
30
31    /**
32     * Return buffer
33     *
34     * @return string  buffer content
35     */
36    abstract public function to_smarty_php();
37
38}
39
40/**
41 * A complete smarty tag.
42 *
43 * @package Smarty
44 * @subpackage Compiler
45 * @ignore
46 */
47class _smarty_tag extends _smarty_parsetree {
48
49    /**
50     * Saved block nesting level
51     * @var int
52     */
53    public $saved_block_nesting;
54
55    /**
56     * Create parse tree buffer for Smarty tag
57     *
58     * @param object $parser    parser object
59     * @param string $data      content
60     */
61    public function __construct($parser, $data)
62    {
63        $this->parser = $parser;
64        $this->data = $data;
65        $this->saved_block_nesting = $parser->block_nesting_level;
66    }
67
68    /**
69     * Return buffer content
70     *
71     * @return string  content
72     */
73    public function to_smarty_php()
74    {
75        return $this->data;
76    }
77
78    /**
79     * Return complied code that loads the evaluated outout of buffer content into a temporary variable
80     *
81     * @return string template code
82     */
83    public function assign_to_var()
84    {
85        $var = sprintf('$_tmp%d', ++$this->parser->prefix_number);
86        $this->parser->compiler->prefix_code[] = sprintf('<?php ob_start();?>%s<?php %s=ob_get_clean();?>', $this->data, $var);
87        return $var;
88    }
89
90}
91
92/**
93 * Code fragment inside a tag.
94 *
95 * @package Smarty
96 * @subpackage Compiler
97 * @ignore
98 */
99class _smarty_code extends _smarty_parsetree {
100
101
102    /**
103     * Create parse tree buffer for code fragment
104     *
105     * @param object $parser    parser object
106     * @param string $data      content
107     */
108    public function __construct($parser, $data)
109    {
110        $this->parser = $parser;
111        $this->data = $data;
112    }
113
114    /**
115     * Return buffer content in parentheses
116     *
117     * @return string  content
118     */
119    public function to_smarty_php()
120    {
121        return sprintf("(%s)", $this->data);
122    }
123
124}
125
126/**
127 * Double quoted string inside a tag.
128 *
129 * @package Smarty
130 * @subpackage Compiler
131 * @ignore
132 */
133class _smarty_doublequoted extends _smarty_parsetree {
134
135    /**
136     * Create parse tree buffer for double quoted string subtrees
137     *
138     * @param object $parser    parser object
139     * @param _smarty_parsetree $subtree    parsetree buffer
140     */
141    public function __construct($parser, _smarty_parsetree $subtree)
142    {
143        $this->parser = $parser;
144        $this->subtrees[] = $subtree;
145        if ($subtree instanceof _smarty_tag) {
146            $this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
147        }
148    }
149
150    /**
151     * Append buffer to subtree
152     *
153     * @param _smarty_parsetree $subtree  parsetree buffer
154     */
155    public function append_subtree(_smarty_parsetree $subtree)
156    {
157        $last_subtree = count($this->subtrees) - 1;
158        if ($last_subtree >= 0 && $this->subtrees[$last_subtree] instanceof _smarty_tag && $this->subtrees[$last_subtree]->saved_block_nesting < $this->parser->block_nesting_level) {
159            if ($subtree instanceof _smarty_code) {
160                $this->subtrees[$last_subtree]->data .= '<?php echo ' . $subtree->data . ';?>';
161            } elseif ($subtree instanceof _smarty_dq_content) {
162                $this->subtrees[$last_subtree]->data .= '<?php echo "' . $subtree->data . '";?>';
163            } else {
164                $this->subtrees[$last_subtree]->data .= $subtree->data;
165            }
166        } else {
167            $this->subtrees[] = $subtree;
168        }
169        if ($subtree instanceof _smarty_tag) {
170            $this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
171        }
172    }
173
174    /**
175     * Merge subtree buffer content together
176     *
177     * @return string  compiled template code
178     */
179    public function to_smarty_php()
180    {
181        $code = '';
182        foreach ($this->subtrees as $subtree) {
183            if ($code !== "") {
184                $code .= ".";
185            }
186            if ($subtree instanceof _smarty_tag) {
187                $more_php = $subtree->assign_to_var();
188            } else {
189                $more_php = $subtree->to_smarty_php();
190            }
191
192            $code .= $more_php;
193
194            if (!$subtree instanceof _smarty_dq_content) {
195                $this->parser->compiler->has_variable_string = true;
196            }
197        }
198        return $code;
199    }
200
201}
202
203/**
204 * Raw chars as part of a double quoted string.
205 *
206 * @package Smarty
207 * @subpackage Compiler
208 * @ignore
209 */
210class _smarty_dq_content extends _smarty_parsetree {
211
212
213    /**
214     * Create parse tree buffer with string content
215     *
216     * @param object $parser  parser object
217     * @param string $data    string section
218     */
219    public function __construct($parser, $data)
220    {
221        $this->parser = $parser;
222        $this->data = $data;
223    }
224
225    /**
226     * Return content as double quoted string
227     *
228     * @return string doubled quoted string
229     */
230    public function to_smarty_php()
231    {
232        return '"' . $this->data . '"';
233    }
234
235}
236
237/**
238 * Template element
239 *
240 * @package Smarty
241 * @subpackage Compiler
242 * @ignore
243 */
244class _smarty_template_buffer extends _smarty_parsetree {
245
246    /**
247     * Array of template elements
248     *
249     * @var array
250     */
251    public $subtrees = Array();
252
253    /**
254     * Create root of parse tree for template elements
255     *
256     * @param object $parser    parse object
257     */
258    public function __construct($parser)
259    {
260        $this->parser = $parser;
261    }
262
263    /**
264     * Append buffer to subtree
265     *
266     * @param _smarty_parsetree $subtree
267     */
268    public function append_subtree(_smarty_parsetree $subtree)
269    {
270        $this->subtrees[] = $subtree;
271    }
272
273    /**
274     * Sanitize and merge subtree buffers together
275     *
276     * @return string template code content
277     */
278    public function to_smarty_php()
279    {
280        $code = '';
281        for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key++) {
282            if ($key + 2 < $cnt) {
283                if ($this->subtrees[$key] instanceof _smarty_linebreak && $this->subtrees[$key + 1] instanceof _smarty_tag && $this->subtrees[$key + 1]->data == '' && $this->subtrees[$key + 2] instanceof _smarty_linebreak) {
284                    $key = $key + 1;
285                    continue;
286                }
287                if (substr($this->subtrees[$key]->data, -1) == '<' && $this->subtrees[$key + 1]->data == '' && substr($this->subtrees[$key + 2]->data, -1) == '?') {
288                    $key = $key + 2;
289                    continue;
290                }
291            }
292            if (substr($code, -1) == '<') {
293                $subtree = $this->subtrees[$key]->to_smarty_php();
294                if (substr($subtree, 0, 1) == '?') {
295                    $code = substr($code, 0, strlen($code) - 1) . '<<?php ?>?' . substr($subtree, 1);
296                } elseif ($this->parser->asp_tags && substr($subtree, 0, 1) == '%') {
297                    $code = substr($code, 0, strlen($code) - 1) . '<<?php ?>%' . substr($subtree, 1);
298                } else {
299                    $code .= $subtree;
300                }
301                continue;
302            }
303            if ($this->parser->asp_tags && substr($code, -1) == '%') {
304                $subtree = $this->subtrees[$key]->to_smarty_php();
305                if (substr($subtree, 0, 1) == '>') {
306                    $code = substr($code, 0, strlen($code) - 1) . '%<?php ?>>' . substr($subtree, 1);
307                } else {
308                    $code .= $subtree;
309                }
310                continue;
311            }
312            if (substr($code, -1) == '?') {
313                $subtree = $this->subtrees[$key]->to_smarty_php();
314                if (substr($subtree, 0, 1) == '>') {
315                    $code = substr($code, 0, strlen($code) - 1) . '?<?php ?>>' . substr($subtree, 1);
316                } else {
317                    $code .= $subtree;
318                }
319                continue;
320            }
321            $code .= $this->subtrees[$key]->to_smarty_php();
322        }
323        return $code;
324    }
325
326}
327
328/**
329 * template text
330 *
331 * @package Smarty
332 * @subpackage Compiler
333 * @ignore
334 */
335class _smarty_text extends _smarty_parsetree {
336
337
338    /**
339     * Create template text buffer
340     *
341     * @param object $parser    parser object
342     * @param string $data      text
343     */
344    public function __construct($parser, $data)
345    {
346        $this->parser = $parser;
347        $this->data = $data;
348    }
349
350    /**
351     * Return buffer content
352     *
353     * @return strint text
354     */
355    public function to_smarty_php()
356    {
357        return $this->data;
358    }
359
360}
361
362/**
363 * template linebreaks
364 *
365 * @package Smarty
366 * @subpackage Compiler
367 * @ignore
368 */
369class _smarty_linebreak extends _smarty_parsetree {
370
371    /**
372     * Create buffer with linebreak content
373     *
374     * @param object $parser    parser object
375     * @param string  $data     linebreak string
376     */
377    public function __construct($parser, $data)
378    {
379        $this->parser = $parser;
380        $this->data = $data;
381    }
382
383    /**
384     * Return linebrak
385     *
386     * @return string linebreak
387     */
388    public function to_smarty_php()
389    {
390        return $this->data;
391    }
392
393}
394
395?>
Note: See TracBrowser for help on using the repository browser.