|
1 <?php |
|
2 /** |
|
3 * Smarty Internal Plugin Config File Compiler |
|
4 * |
|
5 * This is the config file compiler class. It calls the lexer and parser to |
|
6 * perform the compiling. |
|
7 * |
|
8 * @package Smarty |
|
9 * @subpackage Config |
|
10 * @author Uwe Tews |
|
11 */ |
|
12 |
|
13 /** |
|
14 * Main config file compiler class |
|
15 * |
|
16 * @package Smarty |
|
17 * @subpackage Config |
|
18 */ |
|
19 class Smarty_Internal_Config_File_Compiler { |
|
20 |
|
21 /** |
|
22 * Lexer object |
|
23 * |
|
24 * @var object |
|
25 */ |
|
26 public $lex; |
|
27 |
|
28 /** |
|
29 * Parser object |
|
30 * |
|
31 * @var object |
|
32 */ |
|
33 public $parser; |
|
34 |
|
35 /** |
|
36 * Smarty object |
|
37 * |
|
38 * @var Smarty object |
|
39 */ |
|
40 public $smarty; |
|
41 |
|
42 /** |
|
43 * Smarty object |
|
44 * |
|
45 * @var Smarty_Internal_Config object |
|
46 */ |
|
47 public $config; |
|
48 |
|
49 /** |
|
50 * Compiled config data sections and variables |
|
51 * |
|
52 * @var array |
|
53 */ |
|
54 public $config_data = array(); |
|
55 |
|
56 /** |
|
57 * Initialize compiler |
|
58 * |
|
59 * @param Smarty $smarty base instance |
|
60 */ |
|
61 public function __construct($smarty) |
|
62 { |
|
63 $this->smarty = $smarty; |
|
64 $this->config_data['sections'] = array(); |
|
65 $this->config_data['vars'] = array(); |
|
66 } |
|
67 |
|
68 /** |
|
69 * Method to compile a Smarty template. |
|
70 * |
|
71 * @param Smarty_Internal_Config $config config object |
|
72 * @return bool true if compiling succeeded, false if it failed |
|
73 */ |
|
74 public function compileSource(Smarty_Internal_Config $config) |
|
75 { |
|
76 /* here is where the compiling takes place. Smarty |
|
77 tags in the templates are replaces with PHP code, |
|
78 then written to compiled files. */ |
|
79 $this->config = $config; |
|
80 // get config file source |
|
81 $_content = $config->source->content . "\n"; |
|
82 // on empty template just return |
|
83 if ($_content == '') { |
|
84 return true; |
|
85 } |
|
86 // init the lexer/parser to compile the config file |
|
87 $lex = new Smarty_Internal_Configfilelexer($_content, $this->smarty); |
|
88 $parser = new Smarty_Internal_Configfileparser($lex, $this); |
|
89 if ($this->smarty->_parserdebug) $parser->PrintTrace(); |
|
90 // get tokens from lexer and parse them |
|
91 while ($lex->yylex()) { |
|
92 if ($this->smarty->_parserdebug) echo "<br>Parsing {$parser->yyTokenName[$lex->token]} Token {$lex->value} Line {$lex->line} \n"; |
|
93 $parser->doParse($lex->token, $lex->value); |
|
94 } |
|
95 // finish parsing process |
|
96 $parser->doParse(0, 0); |
|
97 $config->compiled_config = '<?php $_config_vars = ' . var_export($this->config_data, true) . '; ?>'; |
|
98 } |
|
99 |
|
100 /** |
|
101 * display compiler error messages without dying |
|
102 * |
|
103 * If parameter $args is empty it is a parser detected syntax error. |
|
104 * In this case the parser is called to obtain information about exspected tokens. |
|
105 * |
|
106 * If parameter $args contains a string this is used as error message |
|
107 * |
|
108 * @param string $args individual error message or null |
|
109 */ |
|
110 public function trigger_config_file_error($args = null) |
|
111 { |
|
112 $this->lex = Smarty_Internal_Configfilelexer::instance(); |
|
113 $this->parser = Smarty_Internal_Configfileparser::instance(); |
|
114 // get template source line which has error |
|
115 $line = $this->lex->line; |
|
116 if (isset($args)) { |
|
117 // $line--; |
|
118 } |
|
119 $match = preg_split("/\n/", $this->lex->data); |
|
120 $error_text = "Syntax error in config file '{$this->config->source->filepath}' on line {$line} '{$match[$line-1]}' "; |
|
121 if (isset($args)) { |
|
122 // individual error message |
|
123 $error_text .= $args; |
|
124 } else { |
|
125 // exspected token from parser |
|
126 foreach ($this->parser->yy_get_expected_tokens($this->parser->yymajor) as $token) { |
|
127 $exp_token = $this->parser->yyTokenName[$token]; |
|
128 if (isset($this->lex->smarty_token_names[$exp_token])) { |
|
129 // token type from lexer |
|
130 $expect[] = '"' . $this->lex->smarty_token_names[$exp_token] . '"'; |
|
131 } else { |
|
132 // otherwise internal token name |
|
133 $expect[] = $this->parser->yyTokenName[$token]; |
|
134 } |
|
135 } |
|
136 // output parser error message |
|
137 $error_text .= ' - Unexpected "' . $this->lex->value . '", expected one of: ' . implode(' , ', $expect); |
|
138 } |
|
139 throw new SmartyCompilerException($error_text); |
|
140 } |
|
141 |
|
142 } |
|
143 |
|
144 ?> |