Code

Updated smarty to 1.0.9
[gosa.git] / gosa-core / include / smarty / sysplugins / smarty_internal_parsetree.php
1 <?php\r
2 /**\r
3  * Smarty Internal Plugin Templateparser Parsetrees\r
4  * \r
5  * These are classes to build parsetrees in the template parser\r
6  * \r
7  * @package Smarty\r
8  * @subpackage Compiler\r
9  * @author Thue Kristensen \r
10  * @author Uwe Tews \r
11  */\r
12  \r
13 abstract class _smarty_parsetree {\r
14   abstract public function to_smarty_php();\r
15 }\r
16 \r
17 /**\r
18  * A complete smarty tag.\r
19  */\r
20 class _smarty_tag extends _smarty_parsetree\r
21 {\r
22     public $parser;\r
23     public $data;\r
24     public $saved_block_nesting;\r
25     function __construct($parser, $data)\r
26     {\r
27         $this->parser = $parser;\r
28         $this->data = $data;\r
29         $this->saved_block_nesting = $parser->block_nesting_level;\r
30     } \r
31 \r
32     public function to_smarty_php()\r
33     {\r
34         return $this->data;\r
35     } \r
36 \r
37     public function assign_to_var()\r
38     {\r
39         $var = sprintf('$_tmp%d', ++$this->parser->prefix_number);\r
40         $this->parser->compiler->prefix_code[] = sprintf('<?php ob_start();?>%s<?php %s=ob_get_clean();?>',\r
41             $this->data, $var);\r
42         return $var;\r
43     } \r
44\r
45 \r
46 /**\r
47  * Code fragment inside a tag.\r
48  */\r
49 class _smarty_code extends _smarty_parsetree {\r
50     public $parser;\r
51     public $data;\r
52     function __construct($parser, $data)\r
53     {\r
54         $this->parser = $parser;\r
55         $this->data = $data;\r
56     } \r
57 \r
58     public function to_smarty_php()\r
59     {\r
60         return sprintf("(%s)", $this->data);\r
61     } \r
62\r
63 \r
64 /**\r
65  * Double quoted string inside a tag.\r
66  */\r
67 class _smarty_doublequoted extends _smarty_parsetree {\r
68     public $parser;\r
69     public $subtrees = Array();\r
70     function __construct($parser, _smarty_parsetree $subtree)\r
71     {\r
72         $this->parser = $parser;\r
73         $this->subtrees[] = $subtree;\r
74         if ($subtree instanceof _smarty_tag) {\r
75             $this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);\r
76         } \r
77     } \r
78 \r
79     function append_subtree(_smarty_parsetree $subtree)\r
80     {\r
81         $last_subtree = count($this->subtrees)-1;\r
82         if ($last_subtree >= 0 && $this->subtrees[$last_subtree] instanceof _smarty_tag && $this->subtrees[$last_subtree]->saved_block_nesting < $this->parser->block_nesting_level) {\r
83             if ($subtree instanceof _smarty_code) {\r
84                 $this->subtrees[$last_subtree]->data .= '<?php echo ' . $subtree->data . ';?>';\r
85             } elseif ($subtree instanceof _smarty_dq_content) {\r
86                 $this->subtrees[$last_subtree]->data .= '<?php echo "' . $subtree->data . '";?>';\r
87             } else {\r
88                 $this->subtrees[$last_subtree]->data .= $subtree->data;\r
89             } \r
90         } else {\r
91             $this->subtrees[] = $subtree;\r
92         } \r
93         if ($subtree instanceof _smarty_tag) {\r
94             $this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);\r
95         } \r
96     } \r
97 \r
98     public function to_smarty_php()\r
99     {\r
100         $code = '';\r
101         foreach ($this->subtrees as $subtree) {\r
102             if ($code !== "") {\r
103                 $code .= ".";\r
104             } \r
105             if ($subtree instanceof _smarty_tag) {\r
106                 $more_php = $subtree->assign_to_var();\r
107             } else {\r
108                 $more_php = $subtree->to_smarty_php();\r
109             } \r
110 \r
111             $code .= $more_php;\r
112 \r
113             if (!$subtree instanceof _smarty_dq_content) {\r
114                 $this->parser->compiler->has_variable_string = true;\r
115             } \r
116         } \r
117         return $code;\r
118     } \r
119\r
120 \r
121 /**\r
122  * Raw chars as part of a double quoted string.\r
123  */\r
124 class _smarty_dq_content extends _smarty_parsetree {\r
125     public $data;\r
126     function __construct($parser, $data)\r
127     {\r
128         $this->parser = $parser;\r
129         $this->data = $data;\r
130     } \r
131 \r
132     public function to_smarty_php()\r
133     {\r
134         return '"' . $this->data . '"';\r
135     } \r
136\r
137 \r
138 /**\r
139  * Template element\r
140  */\r
141 class _smarty_template_buffer extends _smarty_parsetree {\r
142     public $subtrees = Array();\r
143     function __construct($parser)\r
144     {\r
145         $this->parser = $parser;\r
146     } \r
147 \r
148     function append_subtree(_smarty_parsetree $subtree)\r
149     {\r
150         $this->subtrees[] = $subtree;\r
151     } \r
152 \r
153     public function to_smarty_php()\r
154     {\r
155         $code = '';\r
156         for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key++) {\r
157             if ($key + 2 < $cnt) {\r
158                 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) {\r
159                     $key = $key + 1;\r
160                     continue;\r
161                 } \r
162                 if (substr($this->subtrees[$key]->data, -1) == '<' && $this->subtrees[$key + 1]->data == '' && substr($this->subtrees[$key + 2]->data, -1) == '?') {\r
163                     $key = $key + 2;\r
164                     continue;\r
165                 } \r
166             } \r
167             if (substr($code, -1) == '<') {\r
168                 $subtree = $this->subtrees[$key]->to_smarty_php();\r
169                 if (substr($subtree, 0, 1) == '?') {\r
170                     $code = substr($code, 0, strlen($code)-1) . '<<?php ?>?' . substr($subtree, 1);\r
171                 } elseif ($this->parser->asp_tags && substr($subtree, 0, 1) == '%') {\r
172                     $code = substr($code, 0, strlen($code)-1) . '<<?php ?>%' . substr($subtree, 1);\r
173            } else {\r
174                     $code .= $subtree;\r
175                 } \r
176                 continue;\r
177             } \r
178             if ($this->parser->asp_tags && substr($code, -1) == '%') {\r
179                 $subtree = $this->subtrees[$key]->to_smarty_php();\r
180                 if (substr($subtree, 0, 1) == '>') {\r
181                     $code = substr($code, 0, strlen($code)-1) . '%<?php ?>>' . substr($subtree, 1);\r
182            } else {\r
183                     $code .= $subtree;\r
184                 } \r
185                 continue;\r
186             } \r
187             if (substr($code, -1) == '?') {\r
188                 $subtree = $this->subtrees[$key]->to_smarty_php();\r
189                 if (substr($subtree, 0, 1) == '>') {\r
190                     $code = substr($code, 0, strlen($code)-1) . '?<?php ?>>' . substr($subtree, 1);\r
191            } else {\r
192                     $code .= $subtree;\r
193                 } \r
194                 continue;\r
195             } \r
196             $code .= $this->subtrees[$key]->to_smarty_php();\r
197         } \r
198         return $code;\r
199     } \r
200 }\r
201 \r
202 /**\r
203  * template text\r
204  */\r
205 class _smarty_text extends _smarty_parsetree {\r
206     public $data;\r
207     function __construct($parser, $data)\r
208     {\r
209         $this->parser = $parser;\r
210         $this->data = $data;\r
211     } \r
212 \r
213     public function to_smarty_php()\r
214     {\r
215         return $this->data;\r
216     } \r
217\r
218 \r
219 /**\r
220  * template linebreaks\r
221  */\r
222 class _smarty_linebreak extends _smarty_parsetree {\r
223     public $data;\r
224     function __construct($parser, $data)\r
225     {\r
226         $this->parser = $parser;\r
227         $this->data = $data;\r
228     } \r
229 \r
230     public function to_smarty_php()\r
231     {\r
232         return $this->data;\r
233     } \r
234\r
235 \r
236 ?>