1<?php
2
3/**
4 * Double quoted string inside a tag.
5 *
6 * @package    Smarty
7 * @subpackage Compiler
8 * @ignore
9 */
10
11/**
12 * Double quoted string inside a tag.
13 *
14 * @package    Smarty
15 * @subpackage Compiler
16 * @ignore
17 */
18class Smarty_Internal_ParseTree_Dq extends Smarty_Internal_ParseTree
19{
20    /**
21     * Create parse tree buffer for double quoted string subtrees
22     *
23     * @param object                    $parser  parser object
24     * @param Smarty_Internal_ParseTree $subtree parse tree buffer
25     */
26    public function __construct($parser, Smarty_Internal_ParseTree $subtree)
27    {
28        $this->subtrees[] = $subtree;
29        if ($subtree instanceof Smarty_Internal_ParseTree_Tag) {
30            $parser->block_nesting_level = count($parser->compiler->_tag_stack);
31        }
32    }
33
34    /**
35     * Append buffer to subtree
36     *
37     * @param \Smarty_Internal_Templateparser $parser
38     * @param Smarty_Internal_ParseTree       $subtree parse tree buffer
39     */
40    public function append_subtree(Smarty_Internal_Templateparser $parser, Smarty_Internal_ParseTree $subtree)
41    {
42        $last_subtree = count($this->subtrees) - 1;
43        if ($last_subtree >= 0 && $this->subtrees[ $last_subtree ] instanceof Smarty_Internal_ParseTree_Tag &&
44            $this->subtrees[ $last_subtree ]->saved_block_nesting < $parser->block_nesting_level
45        ) {
46            if ($subtree instanceof Smarty_Internal_ParseTree_Code) {
47                $this->subtrees[ $last_subtree ]->data =
48                    $parser->compiler->appendCode($this->subtrees[ $last_subtree ]->data,
49                                                  '<?php echo ' . $subtree->data . ';?>');
50            } elseif ($subtree instanceof Smarty_Internal_ParseTree_DqContent) {
51                $this->subtrees[ $last_subtree ]->data =
52                    $parser->compiler->appendCode($this->subtrees[ $last_subtree ]->data,
53                                                  '<?php echo "' . $subtree->data . '";?>');
54            } else {
55                $this->subtrees[ $last_subtree ]->data =
56                    $parser->compiler->appendCode($this->subtrees[ $last_subtree ]->data, $subtree->data);
57            }
58        } else {
59            $this->subtrees[] = $subtree;
60        }
61        if ($subtree instanceof Smarty_Internal_ParseTree_Tag) {
62            $parser->block_nesting_level = count($parser->compiler->_tag_stack);
63        }
64    }
65
66    /**
67     * Merge subtree buffer content together
68     *
69     * @param \Smarty_Internal_Templateparser $parser
70     *
71     * @return string compiled template code
72     */
73    public function to_smarty_php(Smarty_Internal_Templateparser $parser)
74    {
75        $code = '';
76        foreach ($this->subtrees as $subtree) {
77            if ($code !== "") {
78                $code .= ".";
79            }
80            if ($subtree instanceof Smarty_Internal_ParseTree_Tag) {
81                $more_php = $subtree->assign_to_var($parser);
82            } else {
83                $more_php = $subtree->to_smarty_php($parser);
84            }
85
86            $code .= $more_php;
87
88            if (!$subtree instanceof Smarty_Internal_ParseTree_DqContent) {
89                $parser->compiler->has_variable_string = true;
90            }
91        }
92
93        return $code;
94    }
95}
96