3 * Smarty Internal Plugin Templateparser Parsetrees
\r
5 * These are classes to build parsetrees in the template parser
\r
8 * @subpackage Compiler
\r
9 * @author Thue Kristensen
\r
15 * @subpackage Compiler
\r
18 abstract class _smarty_parsetree {
\r
34 * @return string buffer content
\r
36 abstract public function to_smarty_php();
\r
41 * A complete smarty tag.
\r
44 * @subpackage Compiler
\r
47 class _smarty_tag extends _smarty_parsetree {
\r
50 * Saved block nesting level
\r
53 public $saved_block_nesting;
\r
56 * Create parse tree buffer for Smarty tag
\r
58 * @param object $parser parser object
\r
59 * @param string $data content
\r
61 public function __construct($parser, $data)
\r
63 $this->parser = $parser;
\r
64 $this->data = $data;
\r
65 $this->saved_block_nesting = $parser->block_nesting_level;
\r
69 * Return buffer content
\r
71 * @return string content
\r
73 public function to_smarty_php()
\r
79 * Return complied code that loads the evaluated outout of buffer content into a temporary variable
\r
81 * @return string template code
\r
83 public function assign_to_var()
\r
85 $var = sprintf('$_tmp%d', ++$this->parser->prefix_number);
\r
86 $this->parser->compiler->prefix_code[] = sprintf('<?php ob_start();?>%s<?php %s=ob_get_clean();?>', $this->data, $var);
\r
93 * Code fragment inside a tag.
\r
96 * @subpackage Compiler
\r
99 class _smarty_code extends _smarty_parsetree {
\r
103 * Create parse tree buffer for code fragment
\r
105 * @param object $parser parser object
\r
106 * @param string $data content
\r
108 public function __construct($parser, $data)
\r
110 $this->parser = $parser;
\r
111 $this->data = $data;
\r
115 * Return buffer content in parentheses
\r
117 * @return string content
\r
119 public function to_smarty_php()
\r
121 return sprintf("(%s)", $this->data);
\r
127 * Double quoted string inside a tag.
\r
130 * @subpackage Compiler
\r
133 class _smarty_doublequoted extends _smarty_parsetree {
\r
136 * Create parse tree buffer for double quoted string subtrees
\r
138 * @param object $parser parser object
\r
139 * @param _smarty_parsetree $subtree parsetree buffer
\r
141 public function __construct($parser, _smarty_parsetree $subtree)
\r
143 $this->parser = $parser;
\r
144 $this->subtrees[] = $subtree;
\r
145 if ($subtree instanceof _smarty_tag) {
\r
146 $this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
\r
151 * Append buffer to subtree
\r
153 * @param _smarty_parsetree $subtree parsetree buffer
\r
155 public function append_subtree(_smarty_parsetree $subtree)
\r
157 $last_subtree = count($this->subtrees) - 1;
\r
158 if ($last_subtree >= 0 && $this->subtrees[$last_subtree] instanceof _smarty_tag && $this->subtrees[$last_subtree]->saved_block_nesting < $this->parser->block_nesting_level) {
\r
159 if ($subtree instanceof _smarty_code) {
\r
160 $this->subtrees[$last_subtree]->data .= '<?php echo ' . $subtree->data . ';?>';
\r
161 } elseif ($subtree instanceof _smarty_dq_content) {
\r
162 $this->subtrees[$last_subtree]->data .= '<?php echo "' . $subtree->data . '";?>';
\r
164 $this->subtrees[$last_subtree]->data .= $subtree->data;
\r
167 $this->subtrees[] = $subtree;
\r
169 if ($subtree instanceof _smarty_tag) {
\r
170 $this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
\r
175 * Merge subtree buffer content together
\r
177 * @return string compiled template code
\r
179 public function to_smarty_php()
\r
182 foreach ($this->subtrees as $subtree) {
\r
183 if ($code !== "") {
\r
186 if ($subtree instanceof _smarty_tag) {
\r
187 $more_php = $subtree->assign_to_var();
\r
189 $more_php = $subtree->to_smarty_php();
\r
192 $code .= $more_php;
\r
194 if (!$subtree instanceof _smarty_dq_content) {
\r
195 $this->parser->compiler->has_variable_string = true;
\r
204 * Raw chars as part of a double quoted string.
\r
207 * @subpackage Compiler
\r
210 class _smarty_dq_content extends _smarty_parsetree {
\r
214 * Create parse tree buffer with string content
\r
216 * @param object $parser parser object
\r
217 * @param string $data string section
\r
219 public function __construct($parser, $data)
\r
221 $this->parser = $parser;
\r
222 $this->data = $data;
\r
226 * Return content as double quoted string
\r
228 * @return string doubled quoted string
\r
230 public function to_smarty_php()
\r
232 return '"' . $this->data . '"';
\r
241 * @subpackage Compiler
\r
244 class _smarty_template_buffer extends _smarty_parsetree {
\r
247 * Array of template elements
\r
251 public $subtrees = Array();
\r
254 * Create root of parse tree for template elements
\r
256 * @param object $parser parse object
\r
258 public function __construct($parser)
\r
260 $this->parser = $parser;
\r
264 * Append buffer to subtree
\r
266 * @param _smarty_parsetree $subtree
\r
268 public function append_subtree(_smarty_parsetree $subtree)
\r
270 $this->subtrees[] = $subtree;
\r
274 * Sanitize and merge subtree buffers together
\r
276 * @return string template code content
\r
278 public function to_smarty_php()
\r
281 for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key++) {
\r
282 if ($key + 2 < $cnt) {
\r
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) {
\r
287 if (substr($this->subtrees[$key]->data, -1) == '<' && $this->subtrees[$key + 1]->data == '' && substr($this->subtrees[$key + 2]->data, -1) == '?') {
\r
292 if (substr($code, -1) == '<') {
\r
293 $subtree = $this->subtrees[$key]->to_smarty_php();
\r
294 if (substr($subtree, 0, 1) == '?') {
\r
295 $code = substr($code, 0, strlen($code) - 1) . '<<?php ?>?' . substr($subtree, 1);
\r
296 } elseif ($this->parser->asp_tags && substr($subtree, 0, 1) == '%') {
\r
297 $code = substr($code, 0, strlen($code) - 1) . '<<?php ?>%' . substr($subtree, 1);
\r
303 if ($this->parser->asp_tags && substr($code, -1) == '%') {
\r
304 $subtree = $this->subtrees[$key]->to_smarty_php();
\r
305 if (substr($subtree, 0, 1) == '>') {
\r
306 $code = substr($code, 0, strlen($code) - 1) . '%<?php ?>>' . substr($subtree, 1);
\r
312 if (substr($code, -1) == '?') {
\r
313 $subtree = $this->subtrees[$key]->to_smarty_php();
\r
314 if (substr($subtree, 0, 1) == '>') {
\r
315 $code = substr($code, 0, strlen($code) - 1) . '?<?php ?>>' . substr($subtree, 1);
\r
321 $code .= $this->subtrees[$key]->to_smarty_php();
\r
332 * @subpackage Compiler
\r
335 class _smarty_text extends _smarty_parsetree {
\r
339 * Create template text buffer
\r
341 * @param object $parser parser object
\r
342 * @param string $data text
\r
344 public function __construct($parser, $data)
\r
346 $this->parser = $parser;
\r
347 $this->data = $data;
\r
351 * Return buffer content
\r
353 * @return strint text
\r
355 public function to_smarty_php()
\r
357 return $this->data;
\r
363 * template linebreaks
\r
366 * @subpackage Compiler
\r
369 class _smarty_linebreak extends _smarty_parsetree {
\r
372 * Create buffer with linebreak content
\r
374 * @param object $parser parser object
\r
375 * @param string $data linebreak string
\r
377 public function __construct($parser, $data)
\r
379 $this->parser = $parser;
\r
380 $this->data = $data;
\r
386 * @return string linebreak
\r
388 public function to_smarty_php()
\r
390 return $this->data;
\r