aboutsummaryrefslogtreecommitdiffstats
path: root/library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php
diff options
context:
space:
mode:
authorroyalterra <royalterra@users.noreply.github.com>2015-12-11 09:39:01 +0000
committerroyalterra <royalterra@users.noreply.github.com>2015-12-11 09:39:01 +0000
commit4ff31d0a4140d923cbb8ddbe18ccf578a367375f (patch)
tree1f63d4b042c3dbf7bfe2c3e74f0a24ef2e5f94ec /library/Smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php
parentb92cc852d142940f0f8dd78ddf7be835dc8b9e07 (diff)
parentf73c82632f213ac7971b54220b4a0c87d354ca1e (diff)
downloadvolse-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.php107
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]);
}
}