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 ?>