aboutsummaryrefslogtreecommitdiffstats
path: root/include/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php
diff options
context:
space:
mode:
Diffstat (limited to 'include/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php')
-rw-r--r--include/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php144
1 files changed, 144 insertions, 0 deletions
diff --git a/include/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php b/include/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php
new file mode 100644
index 000000000..b16a6940d
--- /dev/null
+++ b/include/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php
@@ -0,0 +1,144 @@
+<?php
+/**
+ * Smarty Internal Plugin Config File Compiler
+ *
+ * This is the config file compiler class. It calls the lexer and parser to
+ * perform the compiling.
+ *
+ * @package Smarty
+ * @subpackage Config
+ * @author Uwe Tews
+ */
+
+/**
+ * Main config file compiler class
+ *
+ * @package Smarty
+ * @subpackage Config
+ */
+class Smarty_Internal_Config_File_Compiler {
+
+ /**
+ * Lexer object
+ *
+ * @var object
+ */
+ public $lex;
+
+ /**
+ * Parser object
+ *
+ * @var object
+ */
+ public $parser;
+
+ /**
+ * Smarty object
+ *
+ * @var Smarty object
+ */
+ public $smarty;
+
+ /**
+ * Smarty object
+ *
+ * @var Smarty_Internal_Config object
+ */
+ public $config;
+
+ /**
+ * Compiled config data sections and variables
+ *
+ * @var array
+ */
+ public $config_data = array();
+
+ /**
+ * Initialize compiler
+ *
+ * @param Smarty $smarty base instance
+ */
+ public function __construct($smarty)
+ {
+ $this->smarty = $smarty;
+ $this->config_data['sections'] = array();
+ $this->config_data['vars'] = array();
+ }
+
+ /**
+ * Method to compile a Smarty template.
+ *
+ * @param Smarty_Internal_Config $config config object
+ * @return bool true if compiling succeeded, false if it failed
+ */
+ public function compileSource(Smarty_Internal_Config $config)
+ {
+ /* here is where the compiling takes place. Smarty
+ tags in the templates are replaces with PHP code,
+ then written to compiled files. */
+ $this->config = $config;
+ // get config file source
+ $_content = $config->source->content . "\n";
+ // on empty template just return
+ if ($_content == '') {
+ return true;
+ }
+ // init the lexer/parser to compile the config file
+ $lex = new Smarty_Internal_Configfilelexer($_content, $this->smarty);
+ $parser = new Smarty_Internal_Configfileparser($lex, $this);
+ if ($this->smarty->_parserdebug) $parser->PrintTrace();
+ // get tokens from lexer and parse them
+ while ($lex->yylex()) {
+ if ($this->smarty->_parserdebug) echo "<br>Parsing {$parser->yyTokenName[$lex->token]} Token {$lex->value} Line {$lex->line} \n";
+ $parser->doParse($lex->token, $lex->value);
+ }
+ // finish parsing process
+ $parser->doParse(0, 0);
+ $config->compiled_config = '<?php $_config_vars = ' . var_export($this->config_data, true) . '; ?>';
+ }
+
+ /**
+ * display compiler error messages without dying
+ *
+ * If parameter $args is empty it is a parser detected syntax error.
+ * In this case the parser is called to obtain information about exspected tokens.
+ *
+ * If parameter $args contains a string this is used as error message
+ *
+ * @param string $args individual error message or null
+ */
+ public function trigger_config_file_error($args = null)
+ {
+ $this->lex = Smarty_Internal_Configfilelexer::instance();
+ $this->parser = Smarty_Internal_Configfileparser::instance();
+ // get template source line which has error
+ $line = $this->lex->line;
+ if (isset($args)) {
+ // $line--;
+ }
+ $match = preg_split("/\n/", $this->lex->data);
+ $error_text = "Syntax error in config file '{$this->config->source->filepath}' on line {$line} '{$match[$line-1]}' ";
+ if (isset($args)) {
+ // individual error message
+ $error_text .= $args;
+ } else {
+ // exspected token from parser
+ foreach ($this->parser->yy_get_expected_tokens($this->parser->yymajor) as $token) {
+ $exp_token = $this->parser->yyTokenName[$token];
+ if (isset($this->lex->smarty_token_names[$exp_token])) {
+ // token type from lexer
+ $expect[] = '"' . $this->lex->smarty_token_names[$exp_token] . '"';
+ } else {
+ // otherwise internal token name
+ $expect[] = $this->parser->yyTokenName[$token];
+ }
+ }
+ // output parser error message
+ $error_text .= ' - Unexpected "' . $this->lex->value . '", expected one of: ' . implode(' , ', $expect);
+ }
+ throw new SmartyCompilerException($error_text);
+ }
+
+}
+
+?> \ No newline at end of file