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