diff options
author | Mario Vavti <mario@mariovavti.com> | 2015-12-06 21:09:58 +0100 |
---|---|---|
committer | Mario Vavti <mario@mariovavti.com> | 2015-12-06 21:09:58 +0100 |
commit | 26c465ad0c1d5b6801507ed190430f44ac92c672 (patch) | |
tree | 9e80c34da1235e6dd55942c23bf9511fac31344d /library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php | |
parent | f2d70831838b0738e6895296f3e8ce02f86fec2f (diff) | |
download | volse-hubzilla-26c465ad0c1d5b6801507ed190430f44ac92c672.tar.gz volse-hubzilla-26c465ad0c1d5b6801507ed190430f44ac92c672.tar.bz2 volse-hubzilla-26c465ad0c1d5b6801507ed190430f44ac92c672.zip |
update smarty to 3.1.28-dev which fixes a bug where changes in a template are only visible on the second pageload which is annoying for developing
Diffstat (limited to 'library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php')
-rw-r--r-- | library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php | 109 |
1 files changed, 71 insertions, 38 deletions
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php b/library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php index ca9bc669b..116bbea7b 100644 --- a/library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php +++ b/library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php @@ -9,11 +9,6 @@ */ /** - * @ignore - */ -//include 'smarty_internal_parsetree.php'; - -/** * Class SmartyTemplateCompiler * * @package Smarty @@ -36,25 +31,32 @@ class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCom public $parser_class; /** - * Lexer object + * array of vars which can be compiled in local scope * - * @var object + * @var array */ - public $lex; + public $local_var = array(); /** - * Parser object + * array of callbacks called when the normal compile process of template is finished * - * @var object + * @var array */ - public $parser; + public $postCompileCallbacks = array(); /** - * array of vars which can be compiled in local scope + * prefix code * - * @var array + * @var string */ - public $local_var = array(); + public $prefixCompiledCode = ''; + + /** + * postfix code + * + * @var string + */ + public $postfixCompiledCode = ''; /** * Initialize compiler @@ -63,10 +65,9 @@ class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCom * @param string $parser_class class name * @param Smarty $smarty global instance */ - public function __construct($lexer_class, $parser_class, $smarty) + public function __construct($lexer_class, $parser_class, Smarty $smarty) { - $this->smarty = $smarty; - parent::__construct(); + parent::__construct($smarty); // get required plugins $this->lexer_class = $lexer_class; $this->parser_class = $parser_class; @@ -76,8 +77,10 @@ class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCom * method to compile a Smarty template * * @param mixed $_content template source + * @param bool $isTemplateSource * - * @return bool true if compiling succeeded, false if it failed + * @return bool true if compiling succeeded, false if it failed + * @throws \SmartyCompilerException */ protected function doCompile($_content, $isTemplateSource = false) { @@ -85,14 +88,11 @@ class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCom 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(str_replace(array("\r\n", "\r"), "\n", $_content), $this); - $this->parser = new $this->parser_class($this->lex, $this); - if ($isTemplateSource) { - $this->parser->insertPhpCode("<?php\n\$_smarty_tpl->properties['nocache_hash'] = '{$this->nocache_hash}';\n?>\n"); - } - if ($this->inheritance_child) { - // start state on child templates - $this->lex->yypushstate(Smarty_Internal_Templatelexer::CHILDBODY); + $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("<?php\n\$_smarty_tpl->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(); @@ -103,21 +103,17 @@ class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCom if ($this->smarty->_parserdebug) { $this->parser->PrintTrace(); - $this->lex->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 "<pre>Line {$this->lex->line} Parsing {$this->parser->yyTokenName[$this->lex->token]} Token " . - htmlentities($this->lex->value) . "</pre>"; + echo "<pre>Line {$this->parser->lex->line} Parsing {$this->parser->yyTokenName[$this->parser->lex->token]} Token " . + htmlentities($this->parser->lex->value) . "</pre>"; } - $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) { @@ -127,10 +123,47 @@ class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCom if (count($this->_tag_stack) > 0) { // get stacked info list($openTag, $_data) = array_pop($this->_tag_stack); - $this->trigger_template_error("unclosed {$this->smarty->left_delimiter}" . $openTag . "{$this->smarty->right_delimiter} 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("? >\n<?php","? ><?php"), array('',''), $this->parser->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; + } + } + + /** + * Remove a post compile callback + * + * @param string $key callback key + */ + public function unregisterPostCompileCallback($key) + { + unset($this->postCompileCallbacks[$key]); } } |