1 | <?php |
---|
2 | /** |
---|
3 | * Smarty Internal Plugin Smarty Template Compiler Base |
---|
4 | * |
---|
5 | * This file contains the basic classes and methodes for compiling Smarty templates with lexer/parser |
---|
6 | * |
---|
7 | * @package Smarty |
---|
8 | * @subpackage Compiler |
---|
9 | * @author Uwe Tews |
---|
10 | */ |
---|
11 | |
---|
12 | /** |
---|
13 | * @ignore |
---|
14 | */ |
---|
15 | include ("smarty_internal_parsetree.php"); |
---|
16 | |
---|
17 | /** |
---|
18 | * Class SmartyTemplateCompiler |
---|
19 | * |
---|
20 | * @package Smarty |
---|
21 | * @subpackage Compiler |
---|
22 | */ |
---|
23 | class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCompilerBase { |
---|
24 | |
---|
25 | /** |
---|
26 | * Lexer class name |
---|
27 | * |
---|
28 | * @var string |
---|
29 | */ |
---|
30 | public $lexer_class; |
---|
31 | |
---|
32 | /** |
---|
33 | * Parser class name |
---|
34 | * |
---|
35 | * @var string |
---|
36 | */ |
---|
37 | public $parser_class; |
---|
38 | |
---|
39 | /** |
---|
40 | * Lexer object |
---|
41 | * |
---|
42 | * @var object |
---|
43 | */ |
---|
44 | public $lex; |
---|
45 | |
---|
46 | /** |
---|
47 | * Parser object |
---|
48 | * |
---|
49 | * @var object |
---|
50 | */ |
---|
51 | public $parser; |
---|
52 | |
---|
53 | /** |
---|
54 | * Smarty object |
---|
55 | * |
---|
56 | * @var object |
---|
57 | */ |
---|
58 | public $smarty; |
---|
59 | |
---|
60 | /** |
---|
61 | * array of vars which can be compiled in local scope |
---|
62 | * |
---|
63 | * @var array |
---|
64 | */ |
---|
65 | public $local_var = array(); |
---|
66 | |
---|
67 | /** |
---|
68 | * Initialize compiler |
---|
69 | * |
---|
70 | * @param string $lexer_class class name |
---|
71 | * @param string $parser_class class name |
---|
72 | * @param Smarty $smarty global instance |
---|
73 | */ |
---|
74 | public function __construct($lexer_class, $parser_class, $smarty) |
---|
75 | { |
---|
76 | $this->smarty = $smarty; |
---|
77 | parent::__construct(); |
---|
78 | // get required plugins |
---|
79 | $this->lexer_class = $lexer_class; |
---|
80 | $this->parser_class = $parser_class; |
---|
81 | } |
---|
82 | |
---|
83 | /** |
---|
84 | * Methode to compile a Smarty template |
---|
85 | * |
---|
86 | * @param mixed $_content template source |
---|
87 | * @return bool true if compiling succeeded, false if it failed |
---|
88 | */ |
---|
89 | protected function doCompile($_content) |
---|
90 | { |
---|
91 | /* here is where the compiling takes place. Smarty |
---|
92 | tags in the templates are replaces with PHP code, |
---|
93 | then written to compiled files. */ |
---|
94 | // init the lexer/parser to compile the template |
---|
95 | $this->lex = new $this->lexer_class($_content, $this); |
---|
96 | $this->parser = new $this->parser_class($this->lex, $this); |
---|
97 | if ($this->smarty->_parserdebug) |
---|
98 | $this->parser->PrintTrace(); |
---|
99 | // get tokens from lexer and parse them |
---|
100 | while ($this->lex->yylex() && !$this->abort_and_recompile) { |
---|
101 | if ($this->smarty->_parserdebug) { |
---|
102 | echo "<pre>Line {$this->lex->line} Parsing {$this->parser->yyTokenName[$this->lex->token]} Token " . |
---|
103 | htmlentities($this->lex->value) . "</pre>"; |
---|
104 | } |
---|
105 | $this->parser->doParse($this->lex->token, $this->lex->value); |
---|
106 | } |
---|
107 | |
---|
108 | if ($this->abort_and_recompile) { |
---|
109 | // exit here on abort |
---|
110 | return false; |
---|
111 | } |
---|
112 | // finish parsing process |
---|
113 | $this->parser->doParse(0, 0); |
---|
114 | // check for unclosed tags |
---|
115 | if (count($this->_tag_stack) > 0) { |
---|
116 | // get stacked info |
---|
117 | list($openTag, $_data) = array_pop($this->_tag_stack); |
---|
118 | $this->trigger_template_error("unclosed {" . $openTag . "} tag"); |
---|
119 | } |
---|
120 | // return compiled code |
---|
121 | // return str_replace(array("? >\n<?php","? ><?php"), array('',''), $this->parser->retvalue); |
---|
122 | return $this->parser->retvalue; |
---|
123 | } |
---|
124 | |
---|
125 | } |
---|
126 | |
---|
127 | ?> |
---|