diff options
author | royalterra <royalterra@users.noreply.github.com> | 2015-12-11 09:39:01 +0000 |
---|---|---|
committer | royalterra <royalterra@users.noreply.github.com> | 2015-12-11 09:39:01 +0000 |
commit | 4ff31d0a4140d923cbb8ddbe18ccf578a367375f (patch) | |
tree | 1f63d4b042c3dbf7bfe2c3e74f0a24ef2e5f94ec /library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php | |
parent | b92cc852d142940f0f8dd78ddf7be835dc8b9e07 (diff) | |
parent | f73c82632f213ac7971b54220b4a0c87d354ca1e (diff) | |
download | volse-hubzilla-4ff31d0a4140d923cbb8ddbe18ccf578a367375f.tar.gz volse-hubzilla-4ff31d0a4140d923cbb8ddbe18ccf578a367375f.tar.bz2 volse-hubzilla-4ff31d0a4140d923cbb8ddbe18ccf578a367375f.zip |
Merge pull request #1 from redmatrix/master
merge branches
Diffstat (limited to 'library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php')
-rw-r--r-- | library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php | 107 |
1 files changed, 68 insertions, 39 deletions
diff --git a/library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php b/library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php index 50bd16ef2..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,32 +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(); /** - * Smarty object + * prefix code * - * @var object + * @var string */ - public $smarty; + public $prefixCompiledCode = ''; /** - * array of vars which can be compiled in local scope + * postfix code * - * @var array + * @var string */ - public $local_var = array(); + public $postfixCompiledCode = ''; /** * Initialize compiler @@ -70,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; @@ -83,20 +77,22 @@ 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) + 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->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(); @@ -107,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) { @@ -131,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]); } } |