]> git.mxchange.org Git - friendica.git/blobdiff - library/Smarty/libs/sysplugins/smarty_internal_template.php
reverting tinymce changes, updating smarty to 3.1.19
[friendica.git] / library / Smarty / libs / sysplugins / smarty_internal_template.php
index de9d54cf640546c9e25bed9186471cdd49efbaf7..e905c1e450df8b8c5b9ce1f3f31e97b2aa7e9449 100644 (file)
@@ -1,28 +1,27 @@
 <?php
 /**
  * Smarty Internal Plugin Template
- *
  * This file contains the Smarty template engine
  *
- * @package Smarty
+ * @package    Smarty
  * @subpackage Template
- * @author Uwe Tews
+ * @author     Uwe Tews
  */
 
 /**
  * Main class with template data structures and methods
  *
- * @package Smarty
+ * @package    Smarty
  * @subpackage Template
- *
  * @property Smarty_Template_Source   $source
  * @property Smarty_Template_Compiled $compiled
  * @property Smarty_Template_Cached   $cached
  */
-class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
-
+class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
+{
     /**
      * cache_id
+     *
      * @var string
      */
     public $cache_id = null;
@@ -33,95 +32,108 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
     public $compile_id = null;
     /**
      * caching enabled
+     *
      * @var boolean
      */
     public $caching = null;
     /**
      * cache lifetime in seconds
+     *
      * @var integer
      */
     public $cache_lifetime = null;
     /**
      * Template resource
+     *
      * @var string
      */
     public $template_resource = null;
     /**
      * flag if compiled template is invalid and must be (re)compiled
+     *
      * @var bool
      */
     public $mustCompile = null;
     /**
      * flag if template does contain nocache code sections
+     *
      * @var bool
      */
     public $has_nocache_code = false;
     /**
      * special compiled and cached template properties
+     *
      * @var array
      */
     public $properties = array('file_dependency' => array(),
-        'nocache_hash' => '',
-        'function' => array());
+                               'nocache_hash'    => '',
+                               'function'        => array());
     /**
      * required plugins
+     *
      * @var array
      */
     public $required_plugins = array('compiled' => array(), 'nocache' => array());
     /**
      * Global smarty instance
+     *
      * @var Smarty
      */
     public $smarty = null;
     /**
      * blocks for template inheritance
+     *
      * @var array
      */
     public $block_data = array();
     /**
      * variable filters
+     *
      * @var array
      */
     public $variable_filters = array();
     /**
      * optional log of tag/attributes
+     *
      * @var array
      */
     public $used_tags = array();
     /**
      * internal flag to allow relative path in child template blocks
+     *
      * @var bool
      */
     public $allow_relative_path = false;
     /**
      * internal capture runtime stack
+     *
      * @var array
      */
     public $_capture_stack = array(0 => array());
 
     /**
      * Create template data object
-     *
      * Some of the global Smarty settings copied to template scope
      * It load the required template resources and cacher plugins
      *
      * @param string                   $template_resource template resource string
      * @param Smarty                   $smarty            Smarty instance
      * @param Smarty_Internal_Template $_parent           back pointer to parent object with variables or null
-     * @param mixed                    $_cache_id cache   id or null
+     * @param mixed                    $_cache_id         cache   id or null
      * @param mixed                    $_compile_id       compile id or null
      * @param bool                     $_caching          use caching?
      * @param int                      $_cache_lifetime   cache life-time in seconds
      */
     public function __construct($template_resource, $smarty, $_parent = null, $_cache_id = null, $_compile_id = null, $_caching = null, $_cache_lifetime = null)
     {
-        $this->smarty = &$smarty;
+        $this->smarty = & $smarty;
         // Smarty parameter
         $this->cache_id = $_cache_id === null ? $this->smarty->cache_id : $_cache_id;
         $this->compile_id = $_compile_id === null ? $this->smarty->compile_id : $_compile_id;
         $this->caching = $_caching === null ? $this->smarty->caching : $_caching;
-        if ($this->caching === true)
+        if ($this->caching === true) {
             $this->caching = Smarty::CACHING_LIFETIME_CURRENT;
+        }
         $this->cache_lifetime = $_cache_lifetime === null ? $this->smarty->cache_lifetime : $_cache_lifetime;
         $this->parent = $_parent;
         // Template resource
@@ -134,9 +146,9 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
 
     /**
      * Returns if the current template must be compiled by the Smarty compiler
-     *
      * It does compare the timestamps of template source and the compiled templates and checks the force compile configuration
      *
+     * @throws SmartyException
      * @return boolean true if the template must be compiled
      */
     public function mustCompile()
@@ -153,12 +165,12 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
             $this->mustCompile = (!$this->source->uncompiled && ($this->smarty->force_compile || $this->source->recompiled || $this->compiled->timestamp === false ||
                     ($this->smarty->compile_check && $this->compiled->timestamp < $this->source->timestamp)));
         }
+
         return $this->mustCompile;
     }
 
     /**
      * Compiles the template
-     *
      * If the template is not evaluated the compiled template is saved on disk
      */
     public function compileTemplateSource()
@@ -166,16 +178,14 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
         if (!$this->source->recompiled) {
             $this->properties['file_dependency'] = array();
             if ($this->source->components) {
+                // for the extends resource the compiler will fill it
                 // uses real resource for file dependency
-                $source = end($this->source->components);
-                $this->properties['file_dependency'][$this->source->uid] = array($this->source->filepath, $this->source->timestamp, $source->type);
+                // $source = end($this->source->components);
+                // $this->properties['file_dependency'][$this->source->uid] = array($this->source->filepath, $this->source->timestamp, $source->type);
             } else {
                 $this->properties['file_dependency'][$this->source->uid] = array($this->source->filepath, $this->source->timestamp, $this->source->type);
             }
         }
-        if ($this->smarty->debugging) {
-            Smarty_Internal_Debug::start_compile($this);
-        }
         // compile locking
         if ($this->smarty->compile_locking && !$this->source->recompiled) {
             if ($saved_timestamp = $this->compiled->timestamp) {
@@ -185,7 +195,8 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
         // call compiler
         try {
             $code = $this->compiler->compileTemplate($this);
-        } catch (Exception $e) {
+        }
+        catch (Exception $e) {
             // restore old timestamp in case of error
             if ($this->smarty->compile_locking && !$this->source->recompiled && $saved_timestamp) {
                 touch($this->compiled->filepath, $saved_timestamp);
@@ -196,15 +207,13 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
         if (!$this->source->recompiled && $this->compiler->write_compiled_code) {
             // write compiled template
             $_filepath = $this->compiled->filepath;
-            if ($_filepath === false)
+            if ($_filepath === false) {
                 throw new SmartyException('getCompiledFilepath() did not return a destination to save the compiled template to');
+            }
             Smarty_Internal_Write_File::writeFile($_filepath, $code, $this->smarty);
             $this->compiled->exists = true;
             $this->compiled->isCompiled = true;
         }
-        if ($this->smarty->debugging) {
-            Smarty_Internal_Debug::end_compile($this);
-        }
         // release compiler object to free memory
         unset($this->compiler);
     }
@@ -212,6 +221,8 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
     /**
      * Writes the cached template output
      *
+     * @param string $content
+     *
      * @return bool
      */
     public function writeCachedContent($content)
@@ -221,12 +232,16 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
             return false;
         }
         $this->properties['cache_lifetime'] = $this->cache_lifetime;
-        $this->properties['unifunc'] = 'content_' . str_replace('.', '_', uniqid('', true));
+        $this->properties['unifunc'] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true));
         $content = $this->createTemplateCodeFrame($content, true);
+        /** @var Smarty_Internal_Template $_smarty_tpl
+         * used in evaluated code
+         */
         $_smarty_tpl = $this;
         eval("?>" . $content);
         $this->cached->valid = true;
         $this->cached->processed = true;
+
         return $this->cached->write($this, $content);
     }
 
@@ -238,15 +253,16 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
      * @param mixed   $compile_id     compile id to be used with this template
      * @param integer $caching        cache mode
      * @param integer $cache_lifetime life time of cache data
-     * @param array   $vars optional  variables to assign
+     * @param         $data
      * @param int     $parent_scope   scope in which {include} should execute
+     *
      * @returns string template content
      */
     public function getSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope)
     {
         // already in template cache?
         if ($this->smarty->allow_ambiguous_resources) {
-            $_templateId = Smarty_Resource::getUniqueTemplateName($this->smarty, $template) . $cache_id . $compile_id;
+            $_templateId = Smarty_Resource::getUniqueTemplateName($this, $template) . $cache_id . $compile_id;
         } else {
             $_templateId = $this->smarty->joined_template_dir . '#' . $template . $cache_id . $compile_id;
         }
@@ -268,13 +284,13 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
             $tpl->tpl_vars = $this->tpl_vars;
             $tpl->tpl_vars['smarty'] = clone $this->tpl_vars['smarty'];
         } elseif ($parent_scope == Smarty::SCOPE_PARENT) {
-            $tpl->tpl_vars = &$this->tpl_vars;
+            $tpl->tpl_vars = & $this->tpl_vars;
         } elseif ($parent_scope == Smarty::SCOPE_GLOBAL) {
-            $tpl->tpl_vars = &Smarty::$global_tpl_vars;
+            $tpl->tpl_vars = & Smarty::$global_tpl_vars;
         } elseif (($scope_ptr = $this->getScopePointer($parent_scope)) == null) {
-            $tpl->tpl_vars = &$this->tpl_vars;
+            $tpl->tpl_vars = & $this->tpl_vars;
         } else {
-            $tpl->tpl_vars = &$scope_ptr->tpl_vars;
+            $tpl->tpl_vars = & $scope_ptr->tpl_vars;
         }
         $tpl->config_vars = $this->config_vars;
         if (!empty($data)) {
@@ -283,6 +299,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
                 $tpl->tpl_vars[$_key] = new Smarty_variable($_val);
             }
         }
+
         return $tpl->fetch(null, null, null, null, false, false, true);
     }
 
@@ -294,27 +311,28 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
      * @param mixed   $compile_id     compile id to be used with this template
      * @param integer $caching        cache mode
      * @param integer $cache_lifetime life time of cache data
-     * @param array   $vars optional  variables to assign
+     * @param         $data
      * @param int     $parent_scope   scope in which {include} should execute
      * @param string  $hash           nocache hash code
+     *
      * @returns string template content
      */
     public function setupInlineSubTemplate($template, $cache_id, $compile_id, $caching, $cache_lifetime, $data, $parent_scope, $hash)
     {
         $tpl = new $this->smarty->template_class($template, $this->smarty, $this, $cache_id, $compile_id, $caching, $cache_lifetime);
-        $tpl->properties['nocache_hash']  = $hash;
+        $tpl->properties['nocache_hash'] = $hash;
         // get variables from calling scope
-        if ($parent_scope == Smarty::SCOPE_LOCAL ) {
+        if ($parent_scope == Smarty::SCOPE_LOCAL) {
             $tpl->tpl_vars = $this->tpl_vars;
             $tpl->tpl_vars['smarty'] = clone $this->tpl_vars['smarty'];
         } elseif ($parent_scope == Smarty::SCOPE_PARENT) {
-            $tpl->tpl_vars = &$this->tpl_vars;
+            $tpl->tpl_vars = & $this->tpl_vars;
         } elseif ($parent_scope == Smarty::SCOPE_GLOBAL) {
-            $tpl->tpl_vars = &Smarty::$global_tpl_vars;
+            $tpl->tpl_vars = & Smarty::$global_tpl_vars;
         } elseif (($scope_ptr = $this->getScopePointer($parent_scope)) == null) {
-            $tpl->tpl_vars = &$this->tpl_vars;
+            $tpl->tpl_vars = & $this->tpl_vars;
         } else {
-            $tpl->tpl_vars = &$scope_ptr->tpl_vars;
+            $tpl->tpl_vars = & $scope_ptr->tpl_vars;
         }
         $tpl->config_vars = $this->config_vars;
         if (!empty($data)) {
@@ -323,15 +341,16 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
                 $tpl->tpl_vars[$_key] = new Smarty_variable($_val);
             }
         }
+
         return $tpl;
     }
 
-
     /**
      * Create code frame for compiled and cached templates
      *
-     * @param string $content   optional template content
-     * @param bool   $cache     flag for cache file
+     * @param  string $content optional template content
+     * @param  bool   $cache   flag for cache file
+     *
      * @return string
      */
     public function createTemplateCodeFrame($content = '', $cache = false)
@@ -344,7 +363,11 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
                 foreach ($this->required_plugins['compiled'] as $tmp) {
                     foreach ($tmp as $data) {
                         $file = addslashes($data['file']);
-                        $plugins_string .= "if (!is_callable('{$data['function']}')) include '{$file}';\n";
+                        if (is_Array($data['function'])) {
+                            $plugins_string .= "if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) include '{$file}';\n";
+                        } else {
+                            $plugins_string .= "if (!is_callable('{$data['function']}')) include '{$file}';\n";
+                        }
                     }
                 }
                 $plugins_string .= '?>';
@@ -355,7 +378,11 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
                 foreach ($this->required_plugins['nocache'] as $tmp) {
                     foreach ($tmp as $data) {
                         $file = addslashes($data['file']);
-                        $plugins_string .= addslashes("if (!is_callable('{$data['function']}')) include '{$file}';\n");
+                        if (is_Array($data['function'])) {
+                            $plugins_string .= addslashes("if (!is_callable(array('{$data['function'][0]}','{$data['function'][1]}'))) include '{$file}';\n");
+                        } else {
+                            $plugins_string .= addslashes("if (!is_callable('{$data['function']}')) include '{$file}';\n");
+                        }
                     }
                 }
                 $plugins_string .= "?>/*/%%SmartyNocache:{$this->properties['nocache_hash']}%%*/';?>\n";
@@ -382,7 +409,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
                         }
                     }
                 }
-                 foreach ($this->smarty->template_functions as $name => $function_data) {
+                foreach ($this->smarty->template_functions as $name => $function_data) {
                     if (isset($function_data['called_nocache'])) {
                         unset($function_data['called_nocache'], $function_data['called_functions'], $this->smarty->template_functions[$name]['called_nocache']);
                         $this->properties['function'][$name] = $function_data;
@@ -392,7 +419,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
         }
         $this->properties['version'] = Smarty::SMARTY_VERSION;
         if (!isset($this->properties['unifunc'])) {
-            $this->properties['unifunc'] = 'content_' . str_replace('.', '_', uniqid('', true));
+            $this->properties['unifunc'] = 'content_' . str_replace(array('.', ','), '_', uniqid('', true));
         }
         if (!$this->source->recompiled) {
             $output .= "\$_valid = \$_smarty_tpl->decodeProperties(" . var_export($this->properties, true) . ',' . ($cache ? 'true' : 'false') . "); /*/%%SmartyHeaderCode%%*/?>\n";
@@ -401,20 +428,21 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
         $output .= $plugins_string;
         $output .= $content;
         if (!$this->source->recompiled) {
-            $output .= '<?php }} ?>';
+            $output .= "<?php }} ?>\n";
         }
+
         return $output;
     }
 
     /**
      * This function is executed automatically when a compiled or cached template file is included
-     *
      * - Decode saved properties from compiled template and cache files
      * - Check if compiled or cache file is valid
      *
-     * @param array $properties     special template properties
-     * @param bool  $cache          flag if called from cache file
-     * @return bool                 flag if compiled or cache file is valid
+     * @param  array $properties special template properties
+     * @param  bool  $cache      flag if called from cache file
+     *
+     * @return bool  flag if compiled or cache file is valid
      */
     public function decodeProperties($properties, $cache = false)
     {
@@ -436,7 +464,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
         $is_valid = true;
         if ($this->properties['version'] != Smarty::SMARTY_VERSION) {
             $is_valid = false;
-        } else if (((!$cache && $this->smarty->compile_check && empty($this->compiled->_properties) && !$this->compiled->isCompiled) || $cache && ($this->smarty->compile_check === true || $this->smarty->compile_check === Smarty::COMPILECHECK_ON)) && !empty($this->properties['file_dependency'])) {
+        } elseif (((!$cache && $this->smarty->compile_check && empty($this->compiled->_properties) && !$this->compiled->isCompiled) || $cache && ($this->smarty->compile_check === true || $this->smarty->compile_check === Smarty::COMPILECHECK_ON)) && !empty($this->properties['file_dependency'])) {
             foreach ($this->properties['file_dependency'] as $_file_to_check) {
                 if ($_file_to_check[2] == 'file' || $_file_to_check[2] == 'php') {
                     if ($this->source->filepath == $_file_to_check[0] && isset($this->source->timestamp)) {
@@ -459,6 +487,13 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
             }
         }
         if ($cache) {
+            // CACHING_LIFETIME_SAVED cache expiry has to be validated here since otherwise we'd define the unifunc
+            if ($this->caching === Smarty::CACHING_LIFETIME_SAVED &&
+                $this->properties['cache_lifetime'] >= 0 &&
+                (time() > ($this->cached->timestamp + $this->properties['cache_lifetime']))
+            ) {
+                $is_valid = false;
+            }
             $this->cached->valid = $is_valid;
         } else {
             $this->mustCompile = !$is_valid;
@@ -467,15 +502,16 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
         if (!$cache) {
             $this->compiled->_properties = $properties;
         }
+
         return $is_valid;
     }
 
     /**
      * Template code runtime function to create a local Smarty variable for array assignments
      *
-     * @param string $tpl_var   tempate variable name
-     * @param bool   $nocache   cache mode of variable
-     * @param int    $scope     scope of variable
+     * @param string $tpl_var tempate variable name
+     * @param bool   $nocache cache mode of variable
+     * @param int    $scope   scope of variable
      */
     public function createLocalArrayVariable($tpl_var, $nocache = false, $scope = Smarty::SCOPE_LOCAL)
     {
@@ -495,8 +531,9 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
     /**
      * Template code runtime function to get pointer to template variable array of requested scope
      *
-     * @param int $scope    requested variable scope
-     * @return array        array of template variables
+     * @param  int $scope requested variable scope
+     *
+     * @return array array of template variables
      */
     public function &getScope($scope)
     {
@@ -507,18 +544,21 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
             while (!empty($ptr->parent)) {
                 $ptr = $ptr->parent;
             }
+
             return $ptr->tpl_vars;
         } elseif ($scope == Smarty::SCOPE_GLOBAL) {
             return Smarty::$global_tpl_vars;
         }
         $null = null;
+
         return $null;
     }
 
     /**
      * Get parent or root of template parent chain
      *
-     * @param int $scope    pqrent or root scope
+     * @param  int $scope pqrent or root scope
+     *
      * @return mixed object
      */
     public function getScopePointer($scope)
@@ -530,16 +570,19 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
             while (!empty($ptr->parent)) {
                 $ptr = $ptr->parent;
             }
+
             return $ptr;
         }
+
         return null;
     }
 
     /**
      * [util function] counts an array, arrayaccess/traversable or PDOStatement object
      *
-     * @param mixed $value
-     * @return int the count for arrays and objects that implement countable, 1 for other objects that don't, and 0 for empty elements
+     * @param  mixed $value
+     *
+     * @return int   the count for arrays and objects that implement countable, 1 for other objects that don't, and 0 for empty elements
      */
     public function _count($value)
     {
@@ -562,12 +605,13 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
         } elseif (is_object($value)) {
             return count($value);
         }
+
         return 0;
     }
 
     /**
      * runtime error not matching capture tags
-     *
+
      */
     public function capture_error()
     {
@@ -575,22 +619,26 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
     }
 
     /**
-    * Empty cache for this template
-    *
-    * @param integer $exp_time      expiration time
-    * @return integer number of cache files deleted
-    */
-    public function clearCache($exp_time=null)
+     * Empty cache for this template
+     *
+     * @param integer $exp_time expiration time
+     *
+     * @return integer number of cache files deleted
+     */
+    public function clearCache($exp_time = null)
     {
         Smarty_CacheResource::invalidLoadedCache($this->smarty);
+
         return $this->cached->handler->clear($this->smarty, $this->template_name, $this->cache_id, $this->compile_id, $exp_time);
     }
 
-     /**
+    /**
      * set Smarty property in template context
      *
      * @param string $property_name property name
      * @param mixed  $value         value
+     *
+     * @throws SmartyException
      */
     public function __set($property_name, $value)
     {
@@ -600,12 +648,14 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
             case 'cached':
             case 'compiler':
                 $this->$property_name = $value;
+
                 return;
 
             // FIXME: routing of template -> smarty attributes
             default:
                 if (property_exists($this->smarty, $property_name)) {
                     $this->smarty->$property_name = $value;
+
                     return;
                 }
         }
@@ -617,6 +667,8 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
      * get Smarty property in template context
      *
      * @param string $property_name property name
+     *
+     * @throws SmartyException
      */
     public function __get($property_name)
     {
@@ -640,10 +692,12 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
                     }
                     $this->smarty->template_objects[$_templateId] = $this;
                 }
+
                 return $this->source;
 
             case 'compiled':
                 $this->compiled = $this->source->getCompiled($this);
+
                 return $this->compiled;
 
             case 'cached':
@@ -651,11 +705,13 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
                     include SMARTY_SYSPLUGINS_DIR . 'smarty_cacheresource.php';
                 }
                 $this->cached = new Smarty_Template_Cached($this);
+
                 return $this->cached;
 
             case 'compiler':
                 $this->smarty->loadPlugin($this->source->compiler_class);
                 $this->compiler = new $this->source->compiler_class($this->source->template_lexer_class, $this->source->template_parser_class, $this->smarty);
+
                 return $this->compiler;
 
             // FIXME: routing of template -> smarty attributes
@@ -669,8 +725,8 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
     }
 
     /**
-     * Template data object destrutor
-     *
+     * Template data object destructor
+
      */
     public function __destruct()
     {
@@ -678,7 +734,4 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase {
             $this->cached->handler->releaseLock($this->smarty, $this->cached);
         }
     }
-
 }
-
-?>
\ No newline at end of file