SF.net SVN: postfixadmin:[1841] trunk
Brought to you by:
christian_boltz,
gingerdog
From: <gin...@us...> - 2016-05-20 20:27:32
|
Revision: 1841 http://sourceforge.net/p/postfixadmin/code/1841 Author: gingerdog Date: 2016-05-20 20:27:29 +0000 (Fri, 20 May 2016) Log Message: ----------- update Smarty to 3.1.29 Modified Paths: -------------- trunk/smarty/libs/Smarty.class.php trunk/smarty/libs/SmartyBC.class.php trunk/smarty/libs/debug.tpl trunk/smarty/libs/plugins/modifier.date_format.php trunk/smarty/libs/plugins/modifier.debug_print_var.php trunk/smarty/libs/plugins/modifier.regex_replace.php trunk/smarty/libs/plugins/modifiercompiler.escape.php trunk/smarty/libs/plugins/modifiercompiler.strip_tags.php trunk/smarty/libs/plugins/modifiercompiler.wordwrap.php trunk/smarty/libs/plugins/outputfilter.trimwhitespace.php trunk/smarty/libs/plugins/shared.make_timestamp.php trunk/smarty/libs/sysplugins/smarty_cacheresource.php trunk/smarty/libs/sysplugins/smarty_cacheresource_custom.php trunk/smarty/libs/sysplugins/smarty_cacheresource_keyvaluestore.php trunk/smarty/libs/sysplugins/smarty_internal_cacheresource_file.php trunk/smarty/libs/sysplugins/smarty_internal_compile_append.php trunk/smarty/libs/sysplugins/smarty_internal_compile_assign.php trunk/smarty/libs/sysplugins/smarty_internal_compile_block.php trunk/smarty/libs/sysplugins/smarty_internal_compile_break.php trunk/smarty/libs/sysplugins/smarty_internal_compile_call.php trunk/smarty/libs/sysplugins/smarty_internal_compile_capture.php trunk/smarty/libs/sysplugins/smarty_internal_compile_config_load.php trunk/smarty/libs/sysplugins/smarty_internal_compile_continue.php trunk/smarty/libs/sysplugins/smarty_internal_compile_debug.php trunk/smarty/libs/sysplugins/smarty_internal_compile_extends.php trunk/smarty/libs/sysplugins/smarty_internal_compile_for.php trunk/smarty/libs/sysplugins/smarty_internal_compile_foreach.php trunk/smarty/libs/sysplugins/smarty_internal_compile_function.php trunk/smarty/libs/sysplugins/smarty_internal_compile_if.php trunk/smarty/libs/sysplugins/smarty_internal_compile_include.php trunk/smarty/libs/sysplugins/smarty_internal_compile_include_php.php trunk/smarty/libs/sysplugins/smarty_internal_compile_insert.php trunk/smarty/libs/sysplugins/smarty_internal_compile_ldelim.php trunk/smarty/libs/sysplugins/smarty_internal_compile_nocache.php trunk/smarty/libs/sysplugins/smarty_internal_compile_private_block_plugin.php trunk/smarty/libs/sysplugins/smarty_internal_compile_private_function_plugin.php trunk/smarty/libs/sysplugins/smarty_internal_compile_private_modifier.php trunk/smarty/libs/sysplugins/smarty_internal_compile_private_object_block_function.php trunk/smarty/libs/sysplugins/smarty_internal_compile_private_object_function.php trunk/smarty/libs/sysplugins/smarty_internal_compile_private_print_expression.php trunk/smarty/libs/sysplugins/smarty_internal_compile_private_registered_block.php trunk/smarty/libs/sysplugins/smarty_internal_compile_private_registered_function.php trunk/smarty/libs/sysplugins/smarty_internal_compile_private_special_variable.php trunk/smarty/libs/sysplugins/smarty_internal_compile_rdelim.php trunk/smarty/libs/sysplugins/smarty_internal_compile_section.php trunk/smarty/libs/sysplugins/smarty_internal_compile_setfilter.php trunk/smarty/libs/sysplugins/smarty_internal_compile_while.php trunk/smarty/libs/sysplugins/smarty_internal_compilebase.php trunk/smarty/libs/sysplugins/smarty_internal_config_file_compiler.php trunk/smarty/libs/sysplugins/smarty_internal_configfilelexer.php trunk/smarty/libs/sysplugins/smarty_internal_configfileparser.php trunk/smarty/libs/sysplugins/smarty_internal_data.php trunk/smarty/libs/sysplugins/smarty_internal_debug.php trunk/smarty/libs/sysplugins/smarty_internal_nocache_insert.php trunk/smarty/libs/sysplugins/smarty_internal_parsetree.php trunk/smarty/libs/sysplugins/smarty_internal_resource_eval.php trunk/smarty/libs/sysplugins/smarty_internal_resource_extends.php trunk/smarty/libs/sysplugins/smarty_internal_resource_file.php trunk/smarty/libs/sysplugins/smarty_internal_resource_php.php trunk/smarty/libs/sysplugins/smarty_internal_resource_registered.php trunk/smarty/libs/sysplugins/smarty_internal_resource_stream.php trunk/smarty/libs/sysplugins/smarty_internal_resource_string.php trunk/smarty/libs/sysplugins/smarty_internal_smartytemplatecompiler.php trunk/smarty/libs/sysplugins/smarty_internal_template.php trunk/smarty/libs/sysplugins/smarty_internal_templatebase.php trunk/smarty/libs/sysplugins/smarty_internal_templatecompilerbase.php trunk/smarty/libs/sysplugins/smarty_internal_templatelexer.php trunk/smarty/libs/sysplugins/smarty_internal_templateparser.php trunk/smarty/libs/sysplugins/smarty_resource.php trunk/smarty/libs/sysplugins/smarty_resource_custom.php trunk/smarty/libs/sysplugins/smarty_resource_recompiled.php trunk/smarty/libs/sysplugins/smarty_resource_uncompiled.php trunk/smarty/libs/sysplugins/smarty_security.php trunk/smarty/smarty_version trunk/smarty.inc.php Added Paths: ----------- trunk/smarty/libs/Autoloader.php trunk/smarty/libs/plugins/modifier.needle.php trunk/smarty/libs/sysplugins/smarty_data.php trunk/smarty/libs/sysplugins/smarty_internal_compile_private_foreachsection.php trunk/smarty/libs/sysplugins/smarty_internal_compile_private_php.php trunk/smarty/libs/sysplugins/smarty_internal_compile_shared_inheritance.php trunk/smarty/libs/sysplugins/smarty_internal_extension_clear.php trunk/smarty/libs/sysplugins/smarty_internal_extension_handler.php trunk/smarty/libs/sysplugins/smarty_internal_method_addautoloadfilters.php trunk/smarty/libs/sysplugins/smarty_internal_method_adddefaultmodifiers.php trunk/smarty/libs/sysplugins/smarty_internal_method_append.php trunk/smarty/libs/sysplugins/smarty_internal_method_appendbyref.php trunk/smarty/libs/sysplugins/smarty_internal_method_assignbyref.php trunk/smarty/libs/sysplugins/smarty_internal_method_assignglobal.php trunk/smarty/libs/sysplugins/smarty_internal_method_clearallassign.php trunk/smarty/libs/sysplugins/smarty_internal_method_clearallcache.php trunk/smarty/libs/sysplugins/smarty_internal_method_clearassign.php trunk/smarty/libs/sysplugins/smarty_internal_method_clearcache.php trunk/smarty/libs/sysplugins/smarty_internal_method_clearcompiledtemplate.php trunk/smarty/libs/sysplugins/smarty_internal_method_clearconfig.php trunk/smarty/libs/sysplugins/smarty_internal_method_compileallconfig.php trunk/smarty/libs/sysplugins/smarty_internal_method_compilealltemplates.php trunk/smarty/libs/sysplugins/smarty_internal_method_configload.php trunk/smarty/libs/sysplugins/smarty_internal_method_createdata.php trunk/smarty/libs/sysplugins/smarty_internal_method_getautoloadfilters.php trunk/smarty/libs/sysplugins/smarty_internal_method_getconfigvars.php trunk/smarty/libs/sysplugins/smarty_internal_method_getdebugtemplate.php trunk/smarty/libs/sysplugins/smarty_internal_method_getdefaultmodifiers.php trunk/smarty/libs/sysplugins/smarty_internal_method_getregisteredobject.php trunk/smarty/libs/sysplugins/smarty_internal_method_getstreamvariable.php trunk/smarty/libs/sysplugins/smarty_internal_method_gettags.php trunk/smarty/libs/sysplugins/smarty_internal_method_gettemplatevars.php trunk/smarty/libs/sysplugins/smarty_internal_method_loadfilter.php trunk/smarty/libs/sysplugins/smarty_internal_method_loadplugin.php trunk/smarty/libs/sysplugins/smarty_internal_method_mustcompile.php trunk/smarty/libs/sysplugins/smarty_internal_method_registercacheresource.php trunk/smarty/libs/sysplugins/smarty_internal_method_registerclass.php trunk/smarty/libs/sysplugins/smarty_internal_method_registerdefaultconfighandler.php trunk/smarty/libs/sysplugins/smarty_internal_method_registerdefaultpluginhandler.php trunk/smarty/libs/sysplugins/smarty_internal_method_registerdefaulttemplatehandler.php trunk/smarty/libs/sysplugins/smarty_internal_method_registerfilter.php trunk/smarty/libs/sysplugins/smarty_internal_method_registerobject.php trunk/smarty/libs/sysplugins/smarty_internal_method_registerplugin.php trunk/smarty/libs/sysplugins/smarty_internal_method_registerresource.php trunk/smarty/libs/sysplugins/smarty_internal_method_setautoloadfilters.php trunk/smarty/libs/sysplugins/smarty_internal_method_setdebugtemplate.php trunk/smarty/libs/sysplugins/smarty_internal_method_setdefaultmodifiers.php trunk/smarty/libs/sysplugins/smarty_internal_method_unloadfilter.php trunk/smarty/libs/sysplugins/smarty_internal_method_unregistercacheresource.php trunk/smarty/libs/sysplugins/smarty_internal_method_unregisterfilter.php trunk/smarty/libs/sysplugins/smarty_internal_method_unregisterobject.php trunk/smarty/libs/sysplugins/smarty_internal_method_unregisterplugin.php trunk/smarty/libs/sysplugins/smarty_internal_method_unregisterresource.php trunk/smarty/libs/sysplugins/smarty_internal_parsetree_code.php trunk/smarty/libs/sysplugins/smarty_internal_parsetree_dq.php trunk/smarty/libs/sysplugins/smarty_internal_parsetree_dqcontent.php trunk/smarty/libs/sysplugins/smarty_internal_parsetree_tag.php trunk/smarty/libs/sysplugins/smarty_internal_parsetree_template.php trunk/smarty/libs/sysplugins/smarty_internal_parsetree_text.php trunk/smarty/libs/sysplugins/smarty_internal_runtime_cachemodify.php trunk/smarty/libs/sysplugins/smarty_internal_runtime_codeframe.php trunk/smarty/libs/sysplugins/smarty_internal_runtime_filterhandler.php trunk/smarty/libs/sysplugins/smarty_internal_runtime_foreach.php trunk/smarty/libs/sysplugins/smarty_internal_runtime_getincludepath.php trunk/smarty/libs/sysplugins/smarty_internal_runtime_hhvm.php trunk/smarty/libs/sysplugins/smarty_internal_runtime_inheritance.php trunk/smarty/libs/sysplugins/smarty_internal_runtime_subtemplate.php trunk/smarty/libs/sysplugins/smarty_internal_runtime_tplfunction.php trunk/smarty/libs/sysplugins/smarty_internal_runtime_updatecache.php trunk/smarty/libs/sysplugins/smarty_internal_runtime_updatescope.php trunk/smarty/libs/sysplugins/smarty_internal_runtime_validatecompiled.php trunk/smarty/libs/sysplugins/smarty_internal_runtime_var.php trunk/smarty/libs/sysplugins/smarty_internal_runtime_writefile.php trunk/smarty/libs/sysplugins/smarty_internal_testinstall.php trunk/smarty/libs/sysplugins/smarty_internal_undefined.php trunk/smarty/libs/sysplugins/smarty_template_cached.php trunk/smarty/libs/sysplugins/smarty_template_compiled.php trunk/smarty/libs/sysplugins/smarty_template_config.php trunk/smarty/libs/sysplugins/smarty_template_resource_base.php trunk/smarty/libs/sysplugins/smarty_template_source.php trunk/smarty/libs/sysplugins/smarty_undefined_variable.php trunk/smarty/libs/sysplugins/smarty_variable.php trunk/smarty/libs/sysplugins/smartycompilerexception.php trunk/smarty/libs/sysplugins/smartyexception.php Removed Paths: ------------- trunk/smarty/libs/plugins/modifier.needle.php trunk/smarty/libs/sysplugins/smarty_config_source.php trunk/smarty/libs/sysplugins/smarty_internal_config.php trunk/smarty/libs/sysplugins/smarty_internal_filter_handler.php trunk/smarty/libs/sysplugins/smarty_internal_function_call_handler.php trunk/smarty/libs/sysplugins/smarty_internal_get_include_path.php trunk/smarty/libs/sysplugins/smarty_internal_utility.php trunk/smarty/libs/sysplugins/smarty_internal_write_file.php Added: trunk/smarty/libs/Autoloader.php =================================================================== --- trunk/smarty/libs/Autoloader.php (rev 0) +++ trunk/smarty/libs/Autoloader.php 2016-05-20 20:27:29 UTC (rev 1841) @@ -0,0 +1,124 @@ +<?php +/** + * Smarty Autoloader + * + * @package Smarty + */ + +/** + * Smarty Autoloader + * + * @package Smarty + * @author Uwe Tews + * Usage: + * require_once '...path/Autoloader.php'; + * Smarty_Autoloader::register(); + * $smarty = new Smarty(); + * Note: This autoloader is not needed if you use Composer. + * Composer will automatically add the classes of the Smarty package to it common autoloader. + */ +class Smarty_Autoloader +{ + /** + * Filepath to Smarty root + * + * @var string + */ + public static $SMARTY_DIR = ''; + + /** + * Filepath to Smarty internal plugins + * + * @var string + */ + public static $SMARTY_SYSPLUGINS_DIR = ''; + + /** + * Array with Smarty core classes and their filename + * + * @var array + */ + public static $rootClasses = array('smarty' => 'Smarty.class.php', 'smartybc' => 'SmartyBC.class.php',); + + /** + * Registers Smarty_Autoloader backward compatible to older installations. + * + * @param bool $prepend Whether to prepend the autoloader or not. + */ + public static function registerBC($prepend = false) + { + /** + * register the class autoloader + */ + if (!defined('SMARTY_SPL_AUTOLOAD')) { + define('SMARTY_SPL_AUTOLOAD', 0); + } + if (SMARTY_SPL_AUTOLOAD && + set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false + ) { + $registeredAutoLoadFunctions = spl_autoload_functions(); + if (!isset($registeredAutoLoadFunctions['spl_autoload'])) { + spl_autoload_register(); + } + } else { + self::register($prepend); + } + } + + /** + * Registers Smarty_Autoloader as an SPL autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not. + */ + public static function register($prepend = false) + { + self::$SMARTY_DIR = defined('SMARTY_DIR') ? SMARTY_DIR : dirname(__FILE__) . DIRECTORY_SEPARATOR; + self::$SMARTY_SYSPLUGINS_DIR = defined('SMARTY_SYSPLUGINS_DIR') ? SMARTY_SYSPLUGINS_DIR : + self::$SMARTY_DIR . 'sysplugins' . DIRECTORY_SEPARATOR; + if (version_compare(phpversion(), '5.3.0', '>=')) { + spl_autoload_register(array(__CLASS__, 'autoload'), true, $prepend); + } else { + spl_autoload_register(array(__CLASS__, 'autoload')); + } + } + + /** + * Handles auto loading of classes. + * + * @param string $class A class name. + */ + public static function autoload($class) + { + $_class = strtolower($class); + $file = self::$SMARTY_SYSPLUGINS_DIR . $_class . '.php'; + if (strpos($_class, 'smarty_internal_') === 0) { + if (strpos($_class, 'smarty_internal_compile_') === 0) { + if (is_file($file)) { + require $file; + } + return; + } + @include $file; + return; + } + if (preg_match('/^(smarty_(((template_(source|config|cache|compiled|resource_base))|((cached|compiled)?resource)|(variable|security)))|(smarty(bc)?)$)/', + $_class, $match)) { + if (!empty($match[3])) { + @include $file; + return; + } elseif (!empty($match[9]) && isset(self::$rootClasses[$_class])) { + $file = self::$rootClasses[$_class]; + require $file; + return; + } + } + if (0 !== strpos($_class, 'smarty')) { + return; + } + if (is_file($file)) { + require $file; + return; + } + return; + } +} Modified: trunk/smarty/libs/Smarty.class.php =================================================================== --- trunk/smarty/libs/Smarty.class.php 2016-05-20 19:55:55 UTC (rev 1840) +++ trunk/smarty/libs/Smarty.class.php 2016-05-20 20:27:29 UTC (rev 1841) @@ -2,15 +2,17 @@ /** * Project: Smarty: the PHP compiling template engine * File: Smarty.class.php - * SVN: $Id: Smarty.class.php 4897 2014-10-14 22:29:58Z Uwe...@go... $ + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA @@ -19,12 +21,13 @@ * sma...@go... * * @link http://www.smarty.net/ - * @copyright 2008 New Digital Group, Inc. + * @copyright 2015 New Digital Group, Inc. + * @copyright 2015 Uwe Tews * @author Monte Ohrt <monte at ohrt dot com> * @author Uwe Tews * @author Rodney Rehm * @package Smarty - * @version 3.1.21 + * @version 3.1.29 */ /** @@ -53,7 +56,7 @@ define('SMARTY_PLUGINS_DIR', SMARTY_DIR . 'plugins' . DS); } if (!defined('SMARTY_MBSTRING')) { - define('SMARTY_MBSTRING', function_exists('mb_split')); + define('SMARTY_MBSTRING', function_exists('mb_get_info')); } if (!defined('SMARTY_RESOURCE_CHAR_SET')) { // UTF-8 can only be done properly when mbstring is available! @@ -70,36 +73,41 @@ } /** - * register the class autoloader + * Try loading the Smarty_Internal_Data class + * If we fail we must load Smarty's autoloader. + * Otherwise we may have a global autoloader like Composer */ -if (!defined('SMARTY_SPL_AUTOLOAD')) { - define('SMARTY_SPL_AUTOLOAD', 0); -} - -if (SMARTY_SPL_AUTOLOAD && set_include_path(get_include_path() . PATH_SEPARATOR . SMARTY_SYSPLUGINS_DIR) !== false) { - $registeredAutoLoadFunctions = spl_autoload_functions(); - if (!isset($registeredAutoLoadFunctions['spl_autoload'])) { - spl_autoload_register(); +if (!class_exists('Smarty_Autoloader', false)) { + if (!class_exists('Smarty_Internal_Data', true)) { + require_once dirname(__FILE__) . '/Autoloader.php'; + Smarty_Autoloader::registerBC(); } -} else { - spl_autoload_register('smartyAutoload'); } /** * Load always needed external class files */ -include_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_data.php'; -include_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_templatebase.php'; -include_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_template.php'; -include_once SMARTY_SYSPLUGINS_DIR . 'smarty_resource.php'; -include_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_resource_file.php'; -include_once SMARTY_SYSPLUGINS_DIR . 'smarty_cacheresource.php'; -include_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_cacheresource_file.php'; +if (!class_exists('Smarty_Internal_Data', false)) { + require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_data.php'; +} +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_extension_handler.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_templatebase.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_internal_template.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_resource.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_variable.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_template_source.php'; +require_once SMARTY_SYSPLUGINS_DIR . 'smarty_template_resource_base.php'; /** * This is the main Smarty class * * @package Smarty + * + * @method int clearAllCache(int $exp_time = null, string $type = null) + * @method int clearCache(string $template_name, string $cache_id = null, string $compile_id = null, int $exp_time = null, string $type = null) + * @method int compileAllTemplates(Smarty $smarty, string $extension = '.tpl', bool $force_compile = false, int $time_limit = 0, int $max_errors = null) + * @method int compileAllConfig(Smarty $smarty, string $extension = '.conf', bool $force_compile = false, int $time_limit = 0, int $max_errors = null) + * */ class Smarty extends Smarty_Internal_TemplateBase { @@ -110,23 +118,36 @@ /** * smarty version */ - const SMARTY_VERSION = 'Smarty-3.1.21-dev'; + const SMARTY_VERSION = '3.1.29'; /** * define variable scopes */ const SCOPE_LOCAL = 0; - const SCOPE_PARENT = 1; - const SCOPE_ROOT = 2; - const SCOPE_GLOBAL = 3; + + const SCOPE_PARENT = 2; + + const SCOPE_TPL_ROOT = 4; + + const SCOPE_ROOT = 8; + + const SCOPE_SMARTY = 16; + + const SCOPE_GLOBAL = 32; + + const SCOPE_BUBBLE_UP = 64; + /** * define caching modes */ const CACHING_OFF = 0; + const CACHING_LIFETIME_CURRENT = 1; + const CACHING_LIFETIME_SAVED = 2; + /** - * define constant for clearing cache files be saved expiration datees + * define constant for clearing cache files be saved expiration dates */ const CLEAR_EXPIRED = - 1; @@ -134,31 +155,66 @@ * define compile check modes */ const COMPILECHECK_OFF = 0; + const COMPILECHECK_ON = 1; + const COMPILECHECK_CACHEMISS = 2; + /** + * define debug modes + */ + const DEBUG_OFF = 0; + + const DEBUG_ON = 1; + + const DEBUG_INDIVIDUAL = 2; + + /** * modes for handling of "<?php ... ?>" tags in templates. */ const PHP_PASSTHRU = 0; //-> print tags as plain text + const PHP_QUOTE = 1; //-> escape tags as entities + const PHP_REMOVE = 2; //-> escape tags as entities + const PHP_ALLOW = 3; //-> escape tags as entities + /** * filter types */ const FILTER_POST = 'post'; + const FILTER_PRE = 'pre'; + const FILTER_OUTPUT = 'output'; + const FILTER_VARIABLE = 'variable'; + /** * plugin types */ const PLUGIN_FUNCTION = 'function'; + const PLUGIN_BLOCK = 'block'; + const PLUGIN_COMPILER = 'compiler'; + const PLUGIN_MODIFIER = 'modifier'; + const PLUGIN_MODIFIERCOMPILER = 'modifiercompiler'; + /** + * Resource caching modes + */ + const RESOURCE_CACHE_OFF = 0; + + const RESOURCE_CACHE_AUTOMATIC = 1; // cache template objects by rules + + const RESOURCE_CACHE_TEMPLATE = 2; // cache all template objects + + const RESOURCE_CACHE_ON = 4; // cache source and compiled resources + /**#@-*/ /** @@ -167,26 +223,31 @@ public static $global_tpl_vars = array(); /** - * error handler returned by set_error_hanlder() in Smarty::muteExpectedErrors() + * error handler returned by set_error_handler() in Smarty::muteExpectedErrors() */ public static $_previous_error_handler = null; + /** * contains directories outside of SMARTY_DIR that are to be muted by muteExpectedErrors() */ public static $_muted_directories = array(); + /** * Flag denoting if Multibyte String functions are available */ public static $_MBSTRING = SMARTY_MBSTRING; + /** * The character set to adhere to (e.g. "UTF-8") */ public static $_CHARSET = SMARTY_RESOURCE_CHAR_SET; + /** * The date format to be used internally * (accepts date() and strftime()) */ public static $_DATE_FORMAT = SMARTY_RESOURCE_DATE_FORMAT; + /** * Flag denoting if PCRE should run in UTF-8 mode */ @@ -202,163 +263,152 @@ */ /** - * auto literal on delimiters with whitspace + * auto literal on delimiters with whitespace * * @var boolean */ public $auto_literal = true; + /** * display error on not assigned variables * * @var boolean */ public $error_unassigned = false; + /** - * look up relative filepaths in include_path + * look up relative file path in include_path * * @var boolean */ public $use_include_path = false; + /** * template directory * * @var array */ - private $template_dir = array(); + private $template_dir = array('./templates/'); + /** * joined template directory string used in cache keys * * @var string */ - public $joined_template_dir = null; + public $_joined_template_dir = null; + /** * joined config directory string used in cache keys * * @var string */ - public $joined_config_dir = null; + public $_joined_config_dir = null; + /** * default template handler * * @var callable */ public $default_template_handler_func = null; + /** * default config handler * * @var callable */ public $default_config_handler_func = null; + /** * default plugin handler * * @var callable */ public $default_plugin_handler_func = null; + /** * compile directory * * @var string */ - private $compile_dir = null; + private $compile_dir = './templates_c/'; + /** * plugins directory * * @var array */ - private $plugins_dir = array(); + private $plugins_dir = null; + /** * cache directory * * @var string */ - private $cache_dir = null; + private $cache_dir = './cache/'; + /** * config directory * * @var array */ - private $config_dir = array(); + private $config_dir = array('./configs/'); + /** * force template compiling? * * @var boolean */ public $force_compile = false; + /** * check template for modifications? * * @var boolean */ public $compile_check = true; + /** * use sub dirs for compiled/cached files? * * @var boolean */ public $use_sub_dirs = false; + /** * allow ambiguous resources (that are made unique by the resource handler) * * @var boolean */ public $allow_ambiguous_resources = false; + /** - * caching enabled - * - * @var boolean - */ - public $caching = false; - /** * merge compiled includes * * @var boolean */ public $merge_compiled_includes = false; + /** - * template inheritance merge compiled includes - * - * @var boolean - */ - public $inheritance_merge_compiled_includes = true; - /** - * cache lifetime in seconds - * - * @var integer - */ - public $cache_lifetime = 3600; - /** * force cache file creation * * @var boolean */ public $force_cache = false; + /** - * Set this if you want different sets of cache files for the same - * templates. - * - * @var string - */ - public $cache_id = null; - /** - * Set this if you want different sets of compiled files for the same - * templates. - * - * @var string - */ - public $compile_id = null; - /** * template left-delimiter * * @var string */ public $left_delimiter = "{"; + /** * template right-delimiter * * @var string */ public $right_delimiter = "}"; + /**#@+ * security */ @@ -370,33 +420,28 @@ * @see Smarty_Security */ public $security_class = 'Smarty_Security'; + /** * implementation of security class * * @var Smarty_Security */ public $security_policy = null; + /** * controls handling of PHP-blocks * * @var integer */ public $php_handling = self::PHP_PASSTHRU; + /** * controls if the php template file resource is allowed * * @var bool */ public $allow_php_templates = false; - /** - * Should compiled-templates be prevented from being called directly? - * {@internal - * Currently used by Smarty_Internal_Template only. - * }} - * - * @var boolean - */ - public $direct_access_security = true; + /**#@-*/ /** * debug mode @@ -405,6 +450,7 @@ * @var boolean */ public $debugging = false; + /** * This determines if debugging is enable-able from the browser. * <ul> @@ -415,32 +461,29 @@ * @var string */ public $debugging_ctrl = 'NONE'; + /** * Name of debugging URL-param. * Only used when $debugging_ctrl is set to 'URL'. * The name of the URL-parameter that activates debugging. * - * @var type + * @var string */ public $smarty_debug_id = 'SMARTY_DEBUG'; + /** * Path of debug template. * * @var string */ public $debug_tpl = null; + /** * When set, smarty uses this value as error_reporting-level. * * @var int */ public $error_reporting = null; - /** - * Internal flag for getTags() - * - * @var boolean - */ - public $get_used_tags = false; /**#@+ * config var settings @@ -452,12 +495,14 @@ * @var boolean */ public $config_overwrite = true; + /** * Controls whether config values of on/true/yes and off/false/no get converted to boolean. * * @var boolean */ public $config_booleanize = true; + /** * Controls whether hidden config sections/vars are read from the file. * @@ -477,12 +522,14 @@ * @var boolean */ public $compile_locking = true; + /** - * Controls whether cache resources should emply locking mechanism + * Controls whether cache resources should use locking mechanism * * @var boolean */ public $cache_locking = false; + /** * seconds to wait for acquiring a lock before ignoring the write lock * @@ -493,18 +540,13 @@ /**#@-*/ /** - * global template functions - * - * @var array - */ - public $template_functions = array(); - /** * resource type used if none given * Must be an valid key of $registered_resources. * * @var string */ public $default_resource_type = 'file'; + /** * caching type * Must be an element of $cache_resource_types. @@ -512,259 +554,171 @@ * @var string */ public $caching_type = 'file'; + /** - * internal config properties - * - * @var array - */ - public $properties = array(); - /** * config type * * @var string */ public $default_config_type = 'file'; + /** - * cached template objects + * enable resource caching * - * @var array + * @var bool */ - public $template_objects = array(); + public $resource_cache_mode = 1; + /** * check If-Modified-Since headers * * @var boolean */ public $cache_modified_check = false; + /** * registered plugins * * @var array */ public $registered_plugins = array(); + /** - * plugin search order - * - * @var array - */ - public $plugin_search_order = array('function', 'block', 'compiler', 'class'); - /** * registered objects * * @var array */ public $registered_objects = array(); + /** * registered classes * * @var array */ public $registered_classes = array(); + /** * registered filters * * @var array */ public $registered_filters = array(); + /** * registered resources * * @var array */ public $registered_resources = array(); + /** - * resource handler cache - * - * @var array - */ - public $_resource_handlers = array(); - /** * registered cache resources * * @var array */ public $registered_cache_resources = array(); + /** - * cache resource handler cache - * - * @var array - */ - public $_cacheresource_handlers = array(); - /** * autoload filter * * @var array */ public $autoload_filters = array(); + /** * default modifier * * @var array */ public $default_modifiers = array(); + /** * autoescape variable output * * @var boolean */ public $escape_html = false; + /** - * global internal smarty vars - * - * @var array - */ - public static $_smarty_vars = array(); - /** * start time for execution time calculation * * @var int */ public $start_time = 0; + /** - * default file permissions + * required by the compiler for BC * - * @var int + * @var string */ - public $_file_perms = 0644; + public $_current_file = null; + /** - * default dir permissions + * internal flag to enable parser debugging * - * @var int + * @var bool */ - public $_dir_perms = 0771; + public $_parserdebug = false; + /** - * block tag hierarchy + * This object type (Smarty = 1, template = 2, data = 4) * - * @var array + * @var int */ - public $_tag_stack = array(); + public $_objType = 1; + /** - * self pointer to Smarty object + * Debug object * - * @var Smarty + * @var Smarty_Internal_Debug */ - public $smarty; + public $_debug = null; + /** - * required by the compiler for BC + * removed properties * - * @var string + * @var string[] */ - public $_current_file = null; + private static $obsoleteProperties = array('resource_caching', 'template_resource_caching', + 'direct_access_security', '_dir_perms', '_file_perms', + 'plugin_search_order', 'inheritance_merge_compiled_includes'); + /** - * internal flag to enable parser debugging + * List of private properties which will call getter/setter ona direct access * - * @var bool - */ - public $_parserdebug = false; - /** - * Saved parameter of merged templates during compilation - * * @var array */ - public $merged_templates_func = array(); + private static $accessMap = array('template_dir' => 'TemplateDir', 'config_dir' => 'ConfigDir', + 'plugins_dir' => 'PluginsDir', 'compile_dir' => 'CompileDir', + 'cache_dir' => 'CacheDir',); - /** - * Cache of is_file results of loadPlugin() - * - * @var array - */ - public static $_is_file_cache= array(); - /**#@-*/ /** * Initialize new Smarty object - */ public function __construct() { - // selfpointer needed by some other class methods - $this->smarty = $this; + parent::__construct(); if (is_callable('mb_internal_encoding')) { mb_internal_encoding(Smarty::$_CHARSET); } $this->start_time = microtime(true); - // set default dirs - $this->setTemplateDir('.' . DS . 'templates' . DS) - ->setCompileDir('.' . DS . 'templates_c' . DS) - ->setPluginsDir(SMARTY_PLUGINS_DIR) - ->setCacheDir('.' . DS . 'cache' . DS) - ->setConfigDir('.' . DS . 'configs' . DS); - $this->debug_tpl = 'file:' . dirname(__FILE__) . '/debug.tpl'; if (isset($_SERVER['SCRIPT_NAME'])) { - $this->assignGlobal('SCRIPT_NAME', $_SERVER['SCRIPT_NAME']); + Smarty::$global_tpl_vars['SCRIPT_NAME'] = new Smarty_Variable($_SERVER['SCRIPT_NAME']); } - } - /** - * Class destructor - */ - public function __destruct() - { - // intentionally left blank - } + // Check if we're running on windows + Smarty::$_IS_WINDOWS = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; - /** - * <<magic>> set selfpointer on cloned object - */ - public function __clone() - { - $this->smarty = $this; - } - - /** - * <<magic>> Generic getter. - * Calls the appropriate getter function. - * Issues an E_USER_NOTICE if no valid getter is found. - * - * @param string $name property name - * - * @return mixed - */ - public function __get($name) - { - $allowed = array( - 'template_dir' => 'getTemplateDir', - 'config_dir' => 'getConfigDir', - 'plugins_dir' => 'getPluginsDir', - 'compile_dir' => 'getCompileDir', - 'cache_dir' => 'getCacheDir', - ); - - if (isset($allowed[$name])) { - return $this->{$allowed[$name]}(); - } else { - trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE); + // let PCRE (preg_*) treat strings as ISO-8859-1 if we're not dealing with UTF-8 + if (Smarty::$_CHARSET !== 'UTF-8') { + Smarty::$_UTF8_MODIFIER = ''; } } /** - * <<magic>> Generic setter. - * Calls the appropriate setter function. - * Issues an E_USER_NOTICE if no valid setter is found. - * - * @param string $name property name - * @param mixed $value parameter passed to setter - */ - public function __set($name, $value) - { - $allowed = array( - 'template_dir' => 'setTemplateDir', - 'config_dir' => 'setConfigDir', - 'plugins_dir' => 'setPluginsDir', - 'compile_dir' => 'setCompileDir', - 'cache_dir' => 'setCacheDir', - ); - - if (isset($allowed[$name])) { - $this->{$allowed[$name]}($value); - } else { - trigger_error('Undefined property: ' . get_class($this) . '::$' . $name, E_USER_NOTICE); - } - } - - /** * Check if a template resource exists * * @param string $resource_name template name @@ -773,14 +727,9 @@ */ public function templateExists($resource_name) { - // create template object - $save = $this->template_objects; - $tpl = new $this->template_class($resource_name, $this); - // check if it does exists - $result = $tpl->source->exists; - $this->template_objects = $save; - - return $result; + // create source object + $source = Smarty_Template_Source::load(null, $this, $resource_name); + return $source->exists; } /** @@ -809,43 +758,6 @@ } /** - * Empty cache folder - * - * @param integer $exp_time expiration time - * @param string $type resource type - * - * @return integer number of cache files deleted - */ - public function clearAllCache($exp_time = null, $type = null) - { - // load cache resource and call clearAll - $_cache_resource = Smarty_CacheResource::load($this, $type); - Smarty_CacheResource::invalidLoadedCache($this); - - return $_cache_resource->clearAll($this, $exp_time); - } - - /** - * Empty cache for a specific template - * - * @param string $template_name template name - * @param string $cache_id cache id - * @param string $compile_id compile id - * @param integer $exp_time expiration time - * @param string $type resource type - * - * @return integer number of cache files deleted - */ - public function clearCache($template_name, $cache_id = null, $compile_id = null, $exp_time = null, $type = null) - { - // load cache resource and call clear - $_cache_resource = Smarty_CacheResource::load($this, $type); - Smarty_CacheResource::invalidLoadedCache($this); - - return $_cache_resource->clear($this, $template_name, $cache_id, $compile_id, $exp_time); - } - - /** * Loads security class and enables security * * @param string|Smarty_Security $security_class if a string is used, it must be class-name @@ -855,24 +767,7 @@ */ public function enableSecurity($security_class = null) { - if ($security_class instanceof Smarty_Security) { - $this->security_policy = $security_class; - - return $this; - } elseif (is_object($security_class)) { - throw new SmartyException("Class '" . get_class($security_class) . "' must extend Smarty_Security."); - } - if ($security_class == null) { - $security_class = $this->security_class; - } - if (!class_exists($security_class)) { - throw new SmartyException("Security class '$security_class' is not defined"); - } elseif ($security_class !== 'Smarty_Security' && !is_subclass_of($security_class, 'Smarty_Security')) { - throw new SmartyException("Class '$security_class' must extend Smarty_Security."); - } else { - $this->security_policy = new $security_class($this); - } - + Smarty_Security::enableSecurity($this, $security_class); return $this; } @@ -892,18 +787,18 @@ * Set template directory * * @param string|array $template_dir directory(s) of template sources + * @param bool $isConfig true for config_dir * - * @return Smarty current Smarty instance for chaining + * @return \Smarty current Smarty instance for chaining */ - public function setTemplateDir($template_dir) + public function setTemplateDir($template_dir, $isConfig = false) { - $this->template_dir = array(); - foreach ((array) $template_dir as $k => $v) { - $this->template_dir[$k] = preg_replace('#(\w+)(/|\\\\){1,}#', '$1$2', rtrim($v, '/\\')) . DS; - } - - $this->joined_template_dir = join(DIRECTORY_SEPARATOR, $this->template_dir); - + $type = $isConfig ? 'config_dir' : 'template_dir'; + $joined = '_joined_' . $type; + $this->{$type} = (array) $template_dir; + $this->{$joined} = join(' # ', $this->{$type}); + $this->_cache[$type . '_new'] = true; + $this->_cache[$type] = false; return $this; } @@ -912,55 +807,53 @@ * * @param string|array $template_dir directory(s) of template sources * @param string $key of the array element to assign the template dir to + * @param bool $isConfig true for config_dir * * @return Smarty current Smarty instance for chaining - * @throws SmartyException when the given template directory is not valid */ - public function addTemplateDir($template_dir, $key = null) + public function addTemplateDir($template_dir, $key = null, $isConfig = false) { - // make sure we're dealing with an array - $this->template_dir = (array) $this->template_dir; - - if (is_array($template_dir)) { - foreach ($template_dir as $k => $v) { - $v = preg_replace('#(\w+)(/|\\\\){1,}#', '$1$2', rtrim($v, '/\\')) . DS; - if (is_int($k)) { - // indexes are not merged but appended - $this->template_dir[] = $v; - } else { - // string indexes are overridden - $this->template_dir[$k] = $v; - } - } - } else { - $v = preg_replace('#(\w+)(/|\\\\){1,}#', '$1$2', rtrim($template_dir, '/\\')) . DS; - if ($key !== null) { - // override directory at specified index - $this->template_dir[$key] = $v; - } else { - // append new directory - $this->template_dir[] = $v; - } + $type = $isConfig ? 'config_dir' : 'template_dir'; + $joined = '_joined_' . $type; + if (!isset($this->_cache[$type])) { + $this->{$type} = (array) $this->{$type}; + $this->{$joined} = join(' # ', $this->{$type}); + $this->_cache[$type . '_new'] = true; + $this->_cache[$type] = false; } - $this->joined_template_dir = join(DIRECTORY_SEPARATOR, $this->template_dir); - + $this->{$joined} .= ' # ' . join(' # ', (array) $template_dir); + $this->_addDir($type, $template_dir, $key); return $this; } /** * Get template directories * - * @param mixed $index index of directory to get, null to get all + * @param mixed $index index of directory to get, null to get all + * @param bool $isConfig true for config_dir * - * @return array|string list of template directories, or directory of $index + * @return array list of template directories, or directory of $index */ - public function getTemplateDir($index = null) + public function getTemplateDir($index = null, $isConfig = false) { + $type = $isConfig ? 'config_dir' : 'template_dir'; + if (!isset($this->_cache[$type])) { + $joined = '_joined_' . $type; + $this->{$type} = (array) $this->{$type}; + $this->{$joined} = join(' # ', $this->{$type}); + $this->_cache[$type] = false; + } + if ($this->_cache[$type] == false) { + foreach ($this->{$type} as $k => $v) { + $this->{$type}[$k] = $this->_realpath($v . DS, true); + } + $this->_cache[$type . '_new'] = true; + $this->_cache[$type] = true; + } if ($index !== null) { - return isset($this->template_dir[$index]) ? $this->template_dir[$index] : null; + return isset($this->{$type}[$index]) ? $this->{$type}[$index] : null; } - - return (array) $this->template_dir; + return $this->{$type}; } /** @@ -972,54 +865,20 @@ */ public function setConfigDir($config_dir) { - $this->config_dir = array(); - foreach ((array) $config_dir as $k => $v) { - $this->config_dir[$k] = preg_replace('#(\w+)(/|\\\\){1,}#', '$1$2', rtrim($v, '/\\')) . DS; - } - - $this->joined_config_dir = join(DIRECTORY_SEPARATOR, $this->config_dir); - - return $this; + return $this->setTemplateDir($config_dir, true); } /** * Add config directory(s) * - * @param string|array $config_dir directory(s) of config sources - * @param mixed $key key of the array element to assign the config dir to + * @param string|array $config_dir directory(s) of config sources + * @param mixed $key key of the array element to assign the config dir to * * @return Smarty current Smarty instance for chaining */ public function addConfigDir($config_dir, $key = null) { - // make sure we're dealing with an array - $this->config_dir = (array) $this->config_dir; - - if (is_array($config_dir)) { - foreach ($config_dir as $k => $v) { - $v = preg_replace('#(\w+)(/|\\\\){1,}#', '$1$2', rtrim($v, '/\\')) . DS; - if (is_int($k)) { - // indexes are not merged but appended - $this->config_dir[] = $v; - } else { - // string indexes are overridden - $this->config_dir[$k] = $v; - } - } - } else { - $v = preg_replace('#(\w+)(/|\\\\){1,}#', '$1$2', rtrim($config_dir, '/\\')) . DS; - if ($key !== null) { - // override directory at specified index - $this->config_dir[$key] = rtrim($v, '/\\') . DS; - } else { - // append new directory - $this->config_dir[] = rtrim($v, '/\\') . DS; - } - } - - $this->joined_config_dir = join(DIRECTORY_SEPARATOR, $this->config_dir); - - return $this; + return $this->addTemplateDir($config_dir, $key, true); } /** @@ -1027,15 +886,11 @@ * * @param mixed $index index of directory to get, null to get all * - * @return array|string configuration directory + * @return array configuration directory */ public function getConfigDir($index = null) { - if ($index !== null) { - return isset($this->config_dir[$index]) ? $this->config_dir[$index] : null; - } - - return (array) $this->config_dir; + return $this->getTemplateDir($index, true); } /** @@ -1047,11 +902,10 @@ */ public function setPluginsDir($plugins_dir) { - $this->plugins_dir = array(); - foreach ((array) $plugins_dir as $k => $v) { - $this->plugins_dir[$k] = rtrim($v, '/\\') . DS; + $this->plugins_dir = (array) $plugins_dir; + if (isset($this->_cache['plugins_dir'])) { + unset($this->_cache['plugins_dir']); } - return $this; } @@ -1064,26 +918,13 @@ */ public function addPluginsDir($plugins_dir) { - // make sure we're dealing with an array - $this->plugins_dir = (array) $this->plugins_dir; - - if (is_array($plugins_dir)) { - foreach ($plugins_dir as $k => $v) { - if (is_int($k)) { - // indexes are not merged but appended - $this->plugins_dir[] = rtrim($v, '/\\') . DS; - } else { - // string indexes are overridden - $this->plugins_dir[$k] = rtrim($v, '/\\') . DS; - } - } - } else { - // append new directory - $this->plugins_dir[] = rtrim($plugins_dir, '/\\') . DS; + if (!isset($this->plugins_dir)) { + $this->plugins_dir = array(SMARTY_PLUGINS_DIR); } - - $this->plugins_dir = array_unique($this->plugins_dir); - + $this->plugins_dir = array_merge((array) $this->plugins_dir, (array) $plugins_dir); + if (isset($this->_cache['plugins_dir'])) { + unset($this->_cache['plugins_dir']); + } return $this; } @@ -1094,7 +935,21 @@ */ public function getPluginsDir() { - return (array) $this->plugins_dir; + if (!isset($this->_cache['plugins_dir'])) { + if (!isset($this->plugins_dir)) { + $this->plugins_dir = array(SMARTY_PLUGINS_DIR); + } else { + $plugins_dir = (array) $this->plugins_dir; + $this->plugins_dir = array(); + foreach ($plugins_dir as $v) { + $this->plugins_dir[] = $this->_realpath($v . DS, true); + } + $this->plugins_dir = array_unique($this->plugins_dir); + } + $this->_cache['plugin_files'] = array(); + $this->_cache['plugins_dir'] = true; + } + return $this->plugins_dir; } /** @@ -1106,11 +961,11 @@ */ public function setCompileDir($compile_dir) { - $this->compile_dir = rtrim($compile_dir, '/\\') . DS; + $this->compile_dir = $this->_realpath($compile_dir . DS, true); if (!isset(Smarty::$_muted_directories[$this->compile_dir])) { Smarty::$_muted_directories[$this->compile_dir] = null; } - + $this->_cache['compile_dir'] = true; return $this; } @@ -1121,6 +976,13 @@ */ public function getCompileDir() { + if (!isset($this->_cache['compile_dir'])) { + $this->compile_dir = $this->_realpath($this->compile_dir . DS, true); + if (!isset(Smarty::$_muted_directories[$this->compile_dir])) { + Smarty::$_muted_directories[$this->compile_dir] = null; + } + $this->_cache['compile_dir'] = true; + } return $this->compile_dir; } @@ -1133,11 +995,11 @@ */ public function setCacheDir($cache_dir) { - $this->cache_dir = rtrim($cache_dir, '/\\') . DS; + $this->cache_dir = $this->_realpath($cache_dir . DS, true); if (!isset(Smarty::$_muted_directories[$this->cache_dir])) { Smarty::$_muted_directories[$this->cache_dir] = null; } - + $this->_cache['cache_dir'] = true; return $this; } @@ -1148,347 +1010,376 @@ */ public function getCacheDir() { + if (!isset($this->_cache['cache_dir'])) { + $this->cache_dir = $this->_realpath($this->cache_dir . DS, true); + if (!isset(Smarty::$_muted_directories[$this->cache_dir])) { + Smarty::$_muted_directories[$this->cache_dir] = null; + } + $this->_cache['cache_dir'] = true; + } return $this->cache_dir; } /** - * Set default modifiers + * add directories to given property name * - * @param array|string $modifiers modifier or list of modifiers to set - * - * @return Smarty current Smarty instance for chaining + * @param string $dirName directory property name + * @param string|array $dir directory string or array of strings + * @param mixed $key optional key */ - public function setDefaultModifiers($modifiers) + private function _addDir($dirName, $dir, $key = null) { - $this->default_modifiers = (array) $modifiers; - - return $this; + $rp = $this->_cache[$dirName]; + if (is_array($dir)) { + foreach ($dir as $k => $v) { + $path = $rp ? $this->_realpath($v . DS, true) : $v; + if (is_int($k)) { + // indexes are not merged but appended + $this->{$dirName}[] = $path; + } else { + // string indexes are overridden + $this->{$dirName}[$k] = $path; + } + } + } else { + $path = $rp ? $this->_realpath($dir . DS, true) : $dir; + if ($key !== null) { + // override directory at specified index + $this->{$dirName}[$key] = $path; + } else { + // append new directory + $this->{$dirName}[] = $path; + } + } } /** - * Add default modifiers + * creates a template object * - * @param array|string $modifiers modifier or list of modifiers to add + * @param string $template the resource handle of the template file + * @param mixed $cache_id cache id to be used with this template + * @param mixed $compile_id compile id to be used with this template + * @param object $parent next higher level of Smarty variables + * @param boolean $do_clone flag is Smarty object shall be cloned * - * @return Smarty current Smarty instance for chaining + * @return object template object */ - public function addDefaultModifiers($modifiers) + public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true) { - if (is_array($modifiers)) { - $this->default_modifiers = array_merge($this->default_modifiers, $modifiers); + if ($cache_id !== null && (is_object($cache_id) || is_array($cache_id))) { + $parent = $cache_id; + $cache_id = null; + } + if ($parent !== null && is_array($parent)) { + $data = $parent; + $parent = null; } else { - $this->default_modifiers[] = $modifiers; + $data = null; } - - return $this; + if ($this->caching && + isset($this->_cache['isCached'][$_templateId = $this->_getTemplateId($template, $cache_id, $compile_id)]) + ) { + $tpl = $do_clone ? clone $this->_cache['isCached'][$_templateId] : $this->_cache['isCached'][$_templateId]; + $tpl->parent = $parent; + $tpl->tpl_vars = array(); + $tpl->config_vars = array(); + } else { + /* @var Smarty_Internal_Template $tpl */ + $tpl = new $this->template_class($template, $this, $parent, $cache_id, $compile_id, null, null); + } + if ($do_clone) { + $tpl->smarty = clone $tpl->smarty; + } elseif ($parent === null) { + $tpl->parent = $this; + } + // fill data if present + if (!empty($data) && is_array($data)) { + // set up variable values + foreach ($data as $_key => $_val) { + $tpl->tpl_vars[$_key] = new Smarty_Variable($_val); + } + } + if ($this->debugging || $this->debugging_ctrl == 'URL') { + $tpl->smarty->_debug = new Smarty_Internal_Debug(); + // check URL debugging control + if (!$this->debugging && $this->debugging_ctrl == 'URL') { + $tpl->smarty->_debug->debugUrl($tpl->smarty); + } + } + return $tpl; } /** - * Get default modifiers + * Takes unknown classes and loads plugin files for them + * class name format: Smarty_PluginType_PluginName + * plugin filename format: plugintype.pluginname.php * - * @return array list of default modifiers + * @param string $plugin_name class plugin name to load + * @param bool $check check if already loaded + * + * @throws SmartyException + * @return string |boolean filepath of loaded file or false */ - public function getDefaultModifiers() + public function loadPlugin($plugin_name, $check = true) { - return $this->default_modifiers; + return $this->ext->loadPlugin->loadPlugin($this, $plugin_name, $check); } /** - * Set autoload filters + * Get unique template id * - * @param array $filters filters to load automatically - * @param string $type "pre", "output", … specify the filter type to set. Defaults to none treating $filters' keys as the appropriate types + * @param string $template_name + * @param null|mixed $cache_id + * @param null|mixed $compile_id + * @param null $caching * - * @return Smarty current Smarty instance for chaining + * @return string */ - public function setAutoloadFilters($filters, $type = null) + public function _getTemplateId($template_name, $cache_id = null, $compile_id = null, $caching = null) { - if ($type !== null) { - $this->autoload_filters[$type] = (array) $filters; + $cache_id = $cache_id === null ? $this->cache_id : $cache_id; + $compile_id = $compile_id === null ? $this->compile_id : $compile_id; + $caching = (int) ($caching === null ? $this->caching : $caching); + + if ($this->allow_ambiguous_resources) { + $_templateId = + Smarty_Resource::getUniqueTemplateName($this, $template_name) . "#{$cache_id}#{$compile_id}#{$caching}"; } else { - $this->autoload_filters = (array) $filters; + $_templateId = $this->_joined_template_dir . "#{$template_name}#{$cache_id}#{$compile_id}#{$caching}"; } - - return $this; + if (isset($_templateId[150])) { + $_templateId = sha1($_templateId); + } + return $_templateId; } /** - * Add autoload filters + * Normalize path + * - remove /./ and /../ + * - make it absolute if required * - * @param array $filters filters to load automatically - * @param string $type "pre", "output", … specify the filter type to set. Defaults to none treating $filters' keys as the appropriate types + * @param string $path file path + * @param bool $realpath leave $path relative * - * @return Smarty current Smarty instance for chaining + * @return string */ - public function addAutoloadFilters($filters, $type = null) + public function _realpath($path, $realpath = null) { ... [truncated message content] |