From fa10e0945ecd45bfe78a2c8fb015a43092b4944b Mon Sep 17 00:00:00 2001 From: plegall Date: Thu, 10 Dec 2015 14:02:22 +0100 Subject: bug #385 update to smarty-3.1.28-dev (from Github) --- .../smarty_internal_smartytemplatecompiler.php | 132 ++++++++++++++------- 1 file changed, 87 insertions(+), 45 deletions(-) (limited to 'include/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php') diff --git a/include/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php b/include/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php index 1ec1aa430..116bbea7b 100644 --- a/include/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php +++ b/include/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php @@ -1,27 +1,21 @@ smarty = $smarty; - parent::__construct(); + parent::__construct($smarty); // get required plugins $this->lexer_class = $lexer_class; $this->parser_class = $parser_class; } /** - * Methode to compile a Smarty template + * method to compile a Smarty template * * @param mixed $_content template source + * @param bool $isTemplateSource + * * @return bool true if compiling succeeded, false if it failed + * @throws \SmartyCompilerException */ - protected function doCompile($_content) + protected function doCompile($_content, $isTemplateSource = false) { /* here is where the compiling takes place. Smarty tags in the templates are replaces with PHP code, then written to compiled files. */ // init the lexer/parser to compile the template - $this->lex = new $this->lexer_class($_content, $this); - $this->parser = new $this->parser_class($this->lex, $this); - if ($this->smarty->_parserdebug) + $this->parser = + new $this->parser_class(new $this->lexer_class(str_replace(array("\r\n", "\r"), "\n", $_content), $this), + $this); + if ($isTemplateSource && $this->template->caching) { + $this->parser->insertPhpCode("compiled->nocache_hash = '{$this->nocache_hash}';\n?>\n"); + } + if (function_exists('mb_internal_encoding') && ((int) ini_get('mbstring.func_overload')) & 2) { + $mbEncoding = mb_internal_encoding(); + mb_internal_encoding('ASCII'); + } else { + $mbEncoding = null; + } + + if ($this->smarty->_parserdebug) { $this->parser->PrintTrace(); + $this->parser->lex->PrintTrace(); + } // get tokens from lexer and parse them - while ($this->lex->yylex() && !$this->abort_and_recompile) { + while ($this->parser->lex->yylex()) { if ($this->smarty->_parserdebug) { - echo "
Line {$this->lex->line} Parsing  {$this->parser->yyTokenName[$this->lex->token]} Token " .
-                    htmlentities($this->lex->value) . "
"; + echo "
Line {$this->parser->lex->line} Parsing  {$this->parser->yyTokenName[$this->parser->lex->token]} Token " .
+                    htmlentities($this->parser->lex->value) . "
"; } - $this->parser->doParse($this->lex->token, $this->lex->value); + $this->parser->doParse($this->parser->lex->token, $this->parser->lex->value); } - if ($this->abort_and_recompile) { - // exit here on abort - return false; - } // finish parsing process $this->parser->doParse(0, 0); + if ($mbEncoding) { + mb_internal_encoding($mbEncoding); + } // check for unclosed tags if (count($this->_tag_stack) > 0) { // get stacked info list($openTag, $_data) = array_pop($this->_tag_stack); - $this->trigger_template_error("unclosed {" . $openTag . "} tag"); + $this->trigger_template_error("unclosed {$this->smarty->left_delimiter}" . $openTag . + "{$this->smarty->right_delimiter} tag"); + } + // call post compile callbacks + foreach ($this->postCompileCallbacks as $cb) { + $parameter = $cb; + $parameter[0] = $this; + call_user_func_array($cb[0], $parameter); } // return compiled code - // return str_replace(array("? >\nparser->retvalue); - return $this->parser->retvalue; + return $this->prefixCompiledCode . $this->parser->retvalue . $this->postfixCompiledCode; } -} + /** + * Register a post compile callback + * - when the callback is called after template compiling the compiler object will be inserted as first parameter + * + * @param callback $callback + * @param array $parameter optional parameter array + * @param string $key optional key for callback + * @param bool $replace if true replace existing keyed callback + */ + public function registerPostCompileCallback($callback, $parameter = array(), $key = null, $replace = false) + { + array_unshift($parameter, $callback); + if (isset($key)) { + if ($replace || !isset($this->postCompileCallbacks[$key])) { + $this->postCompileCallbacks[$key] = $parameter; + } + } else { + $this->postCompileCallbacks[] = $parameter; + } + } -?> \ No newline at end of file + /** + * Remove a post compile callback + * + * @param string $key callback key + */ + public function unregisterPostCompileCallback($key) + { + unset($this->postCompileCallbacks[$key]); + } +} -- cgit v1.2.3