diff --git a/smarty/libs/Smarty.class.php b/smarty/libs/Smarty.class.php index 0b7c9597..4411c72d 100644 --- a/smarty/libs/Smarty.class.php +++ b/smarty/libs/Smarty.class.php @@ -1,55 +1,55 @@ -* @author Uwe Tews -* @author Rodney Rehm -* @package Smarty -* @version 3.1.5 -*/ + * Project: Smarty: the PHP compiling template engine + * File: Smarty.class.php + * SVN: $Id: Smarty.class.php 4800 2013-12-15 15:19:01Z Uwe.Tews@googlemail.com $ + * + * 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 + * + * For questions, help, comments, discussion, etc., please join the + * Smarty mailing list. Send a blank e-mail to + * smarty-discussion-subscribe@googlegroups.com + * + * @link http://www.smarty.net/ + * @copyright 2008 New Digital Group, Inc. + * @author Monte Ohrt + * @author Uwe Tews + * @author Rodney Rehm + * @package Smarty + * @version 3.1-DEV + */ /** -* define shorthand directory separator constant -*/ + * define shorthand directory separator constant + */ if (!defined('DS')) { define('DS', DIRECTORY_SEPARATOR); } /** -* set SMARTY_DIR to absolute path to Smarty library files. -* Sets SMARTY_DIR only if user application has not already defined it. -*/ + * set SMARTY_DIR to absolute path to Smarty library files. + * Sets SMARTY_DIR only if user application has not already defined it. + */ if (!defined('SMARTY_DIR')) { define('SMARTY_DIR', dirname(__FILE__) . DS); } /** -* set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins. -* Sets SMARTY_SYSPLUGINS_DIR only if user application has not already defined it. -*/ + * set SMARTY_SYSPLUGINS_DIR to absolute path to Smarty internal plugins. + * Sets SMARTY_SYSPLUGINS_DIR only if user application has not already defined it. + */ if (!defined('SMARTY_SYSPLUGINS_DIR')) { define('SMARTY_SYSPLUGINS_DIR', SMARTY_DIR . 'sysplugins' . DS); } @@ -57,19 +57,25 @@ if (!defined('SMARTY_PLUGINS_DIR')) { define('SMARTY_PLUGINS_DIR', SMARTY_DIR . 'plugins' . DS); } if (!defined('SMARTY_MBSTRING')) { - define('SMARTY_MBSTRING', function_exists('mb_strlen')); + define('SMARTY_MBSTRING', function_exists('mb_split')); } if (!defined('SMARTY_RESOURCE_CHAR_SET')) { // UTF-8 can only be done properly when mbstring is available! + /** + * @deprecated in favor of Smarty::$_CHARSET + */ define('SMARTY_RESOURCE_CHAR_SET', SMARTY_MBSTRING ? 'UTF-8' : 'ISO-8859-1'); } if (!defined('SMARTY_RESOURCE_DATE_FORMAT')) { + /** + * @deprecated in favor of Smarty::$_DATE_FORMAT + */ define('SMARTY_RESOURCE_DATE_FORMAT', '%b %e, %Y'); } /** -* register the class autoloader -*/ + * register the class autoloader + */ if (!defined('SMARTY_SPL_AUTOLOAD')) { define('SMARTY_SPL_AUTOLOAD', 0); } @@ -84,8 +90,8 @@ if (SMARTY_SPL_AUTOLOAD && set_include_path(get_include_path() . PATH_SEPARATOR } /** -* Load always needed external class files -*/ + * 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'; @@ -95,56 +101,61 @@ include_once SMARTY_SYSPLUGINS_DIR.'smarty_cacheresource.php'; include_once SMARTY_SYSPLUGINS_DIR.'smarty_internal_cacheresource_file.php'; /** -* This is the main Smarty class -* @package Smarty -*/ -class Smarty extends Smarty_Internal_TemplateBase { - + * This is the main Smarty class + * @package Smarty + */ +class Smarty extends Smarty_Internal_TemplateBase +{ /**#@+ - * constant definitions - */ + * constant definitions + */ /** - * smarty version - */ - const SMARTY_VERSION = 'Smarty-3.1.5'; + * smarty version + */ + const SMARTY_VERSION = 'Smarty-3.1.16'; /** - * define variable scopes - */ + * define variable scopes + */ const SCOPE_LOCAL = 0; const SCOPE_PARENT = 1; const SCOPE_ROOT = 2; const SCOPE_GLOBAL = 3; /** - * define caching modes - */ + * define caching modes + */ const CACHING_OFF = 0; const CACHING_LIFETIME_CURRENT = 1; const CACHING_LIFETIME_SAVED = 2; /** - * define compile check modes - */ + * define constant for clearing cache files be saved expiration datees + */ + const CLEAR_EXPIRED = -1; + + /** + * define compile check modes + */ const COMPILECHECK_OFF = 0; const COMPILECHECK_ON = 1; const COMPILECHECK_CACHEMISS = 2; /** - * modes for handling of "" tags in templates. - */ + * modes for handling of "" 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 - */ + * filter types + */ const FILTER_POST = 'post'; const FILTER_PRE = 'pre'; const FILTER_OUTPUT = 'output'; const FILTER_VARIABLE = 'variable'; /** - * plugin types - */ + * plugin types + */ const PLUGIN_FUNCTION = 'function'; const PLUGIN_BLOCK = 'block'; const PLUGIN_COMPILER = 'compiler'; @@ -154,10 +165,10 @@ class Smarty extends Smarty_Internal_TemplateBase { /**#@-*/ /** - * assigned global tpl vars - */ + * assigned global tpl vars + */ public static $global_tpl_vars = array(); - + /** * error handler returned by set_error_hanlder() in Smarty::muteExpectedErrors() */ @@ -166,90 +177,112 @@ class Smarty extends Smarty_Internal_TemplateBase { * 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 + */ + public static $_UTF8_MODIFIER = 'u'; + + /** + * Flag denoting if operating system is windows + */ + public static $_IS_WINDOWS = false; /**#@+ - * variables - */ + * variables + */ /** - * auto literal on delimiters with whitspace - * @var boolean - */ + * auto literal on delimiters with whitspace + * @var boolean + */ public $auto_literal = true; /** - * display error on not assigned variables - * @var boolean - */ + * display error on not assigned variables + * @var boolean + */ public $error_unassigned = false; /** - * look up relative filepaths in include_path - * @var boolean - */ + * look up relative filepaths in include_path + * @var boolean + */ public $use_include_path = false; /** - * template directory - * @var array - */ - protected $template_dir = array(); + * template directory + * @var array + */ + private $template_dir = array(); /** - * joined template directory string used in cache keys - * @var string - */ + * joined template directory string used in cache keys + * @var string + */ public $joined_template_dir = null; /** - * joined config directory string used in cache keys - * @var string - */ + * joined config directory string used in cache keys + * @var string + */ public $joined_config_dir = null; /** - * default template handler - * @var callable - */ + * default template handler + * @var callable + */ public $default_template_handler_func = null; /** - * default config handler - * @var callable - */ + * default config handler + * @var callable + */ public $default_config_handler_func = null; /** - * default plugin handler - * @var callable - */ + * default plugin handler + * @var callable + */ public $default_plugin_handler_func = null; /** - * compile directory - * @var string - */ - protected $compile_dir = null; - /** - * plugins directory - * @var array - */ - protected $plugins_dir = array(); - /** - * cache directory - * @var string - */ - protected $cache_dir = null; - /** - * config directory - * @var array - */ - protected $config_dir = array(); - /** - * force template compiling? - * @var boolean - */ + * compile directory + * @var string + */ + private $compile_dir = null; + /** + * plugins directory + * @var array + */ + private $plugins_dir = array(); + /** + * cache directory + * @var string + */ + private $cache_dir = null; + /** + * config directory + * @var array + */ + private $config_dir = array(); + /** + * force template compiling? + * @var boolean + */ public $force_compile = false; /** - * check template for modifications? - * @var boolean - */ + * check template for modifications? + * @var boolean + */ public $compile_check = true; /** - * use sub dirs for compiled/cached files? - * @var boolean - */ + * 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) @@ -257,24 +290,29 @@ class Smarty extends Smarty_Internal_TemplateBase { */ public $allow_ambiguous_resources = false; /** - * caching enabled - * @var boolean - */ + * caching enabled + * @var boolean + */ public $caching = false; /** - * merge compiled includes - * @var boolean - */ + * merge compiled includes + * @var boolean + */ public $merge_compiled_includes = false; /** - * cache lifetime in seconds - * @var integer - */ + * 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 - */ + * force cache file creation + * @var boolean + */ public $force_cache = false; /** * Set this if you want different sets of cache files for the same @@ -291,63 +329,63 @@ class Smarty extends Smarty_Internal_TemplateBase { */ public $compile_id = null; /** - * template left-delimiter - * @var string - */ + * template left-delimiter + * @var string + */ public $left_delimiter = "{"; /** - * template right-delimiter - * @var string - */ + * template right-delimiter + * @var string + */ public $right_delimiter = "}"; /**#@+ - * security - */ - /** - * class name - * - * This should be instance of Smarty_Security. - * - * @var string - * @see Smarty_Security - */ + * security + */ + /** + * class name + * + * This should be instance of Smarty_Security. + * + * @var string + * @see Smarty_Security + */ public $security_class = 'Smarty_Security'; /** - * implementation of security class - * - * @var Smarty_Security - */ + * implementation of security class + * + * @var Smarty_Security + */ public $security_policy = null; /** - * controls handling of PHP-blocks - * - * @var integer - */ + * controls handling of PHP-blocks + * + * @var integer + */ public $php_handling = self::PHP_PASSTHRU; /** - * controls if the php template file resource is allowed - * - * @var bool - */ + * 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 - */ + * 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 - * - * Setting this to true enables the debug-console. - * - * @var boolean - */ + * debug mode + * + * Setting this to true enables the debug-console. + * + * @var boolean + */ public $debugging = false; /** * This determines if debugging is enable-able from the browser. @@ -355,64 +393,64 @@ class Smarty extends Smarty_Internal_TemplateBase { *
  • NONE => no debugging control allowed
  • *
  • URL => enable debugging when SMARTY_DEBUG is found in the URL.
  • * - * @var string - */ + * @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 - */ + * 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 + */ public $smarty_debug_id = 'SMARTY_DEBUG'; /** - * Path of debug template. - * @var string - */ + * Path of debug template. + * @var string + */ public $debug_tpl = null; /** - * When set, smarty uses this value as error_reporting-level. - * @var int - */ + * When set, smarty uses this value as error_reporting-level. + * @var int + */ public $error_reporting = null; /** - * Internal flag for getTags() - * @var boolean - */ + * Internal flag for getTags() + * @var boolean + */ public $get_used_tags = false; /**#@+ - * config var settings - */ + * config var settings + */ /** - * Controls whether variables with the same name overwrite each other. - * @var boolean - */ + * Controls whether variables with the same name overwrite each other. + * @var boolean + */ public $config_overwrite = true; /** - * Controls whether config values of on/true/yes and off/false/no get converted to boolean. - * @var boolean - */ + * 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. - * @var boolean - */ + * Controls whether hidden config sections/vars are read from the file. + * @var boolean + */ public $config_read_hidden = false; /**#@-*/ /**#@+ - * resource locking - */ + * resource locking + */ /** - * locking concurrent compiles - * @var boolean - */ + * locking concurrent compiles + * @var boolean + */ public $compile_locking = true; /** * Controls whether cache resources should emply locking mechanism @@ -428,163 +466,163 @@ class Smarty extends Smarty_Internal_TemplateBase { /**#@-*/ /** - * global template functions - * @var array - */ + * 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 - */ + * 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. - * - * @var string - */ + * caching type + * + * Must be an element of $cache_resource_types. + * + * @var string + */ public $caching_type = 'file'; /** - * internal config properties - * @var array - */ + * internal config properties + * @var array + */ public $properties = array(); /** - * config type - * @var string - */ + * config type + * @var string + */ public $default_config_type = 'file'; /** - * cached template objects - * @var array - */ + * cached template objects + * @var array + */ public $template_objects = array(); /** - * check If-Modified-Since headers - * @var boolean - */ + * check If-Modified-Since headers + * @var boolean + */ public $cache_modified_check = false; /** - * registered plugins - * @var array - */ + * registered plugins + * @var array + */ public $registered_plugins = array(); /** - * plugin search order - * @var array - */ + * plugin search order + * @var array + */ public $plugin_search_order = array('function', 'block', 'compiler', 'class'); /** - * registered objects - * @var array - */ + * registered objects + * @var array + */ public $registered_objects = array(); /** - * registered classes - * @var array - */ + * registered classes + * @var array + */ public $registered_classes = array(); /** - * registered filters - * @var array - */ + * registered filters + * @var array + */ public $registered_filters = array(); /** - * registered resources - * @var array - */ + * registered resources + * @var array + */ public $registered_resources = array(); /** - * resource handler cache - * @var array - */ + * resource handler cache + * @var array + */ public $_resource_handlers = array(); /** - * registered cache resources - * @var array - */ + * registered cache resources + * @var array + */ public $registered_cache_resources = array(); /** - * cache resource handler cache - * @var array - */ + * cache resource handler cache + * @var array + */ public $_cacheresource_handlers = array(); /** - * autoload filter - * @var array - */ + * autoload filter + * @var array + */ public $autoload_filters = array(); /** - * default modifier - * @var array - */ + * default modifier + * @var array + */ public $default_modifiers = array(); /** - * autoescape variable output - * @var boolean - */ + * autoescape variable output + * @var boolean + */ public $escape_html = false; /** - * global internal smarty vars - * @var array - */ + * global internal smarty vars + * @var array + */ public static $_smarty_vars = array(); /** - * start time for execution time calculation - * @var int - */ + * start time for execution time calculation + * @var int + */ public $start_time = 0; /** - * default file permissions - * @var int - */ + * default file permissions + * @var int + */ public $_file_perms = 0644; /** - * default dir permissions - * @var int - */ + * default dir permissions + * @var int + */ public $_dir_perms = 0771; /** - * block tag hierarchy - * @var array - */ + * block tag hierarchy + * @var array + */ public $_tag_stack = array(); /** - * self pointer to Smarty object - * @var Smarty - */ + * self pointer to Smarty object + * @var Smarty + */ public $smarty; /** - * required by the compiler for BC - * @var string - */ + * required by the compiler for BC + * @var string + */ public $_current_file = null; /** - * internal flag to enable parser debugging - * @var bool - */ + * internal flag to enable parser debugging + * @var bool + */ public $_parserdebug = false; /** - * Saved parameter of merged templates during compilation - * - * @var array - */ + * Saved parameter of merged templates during compilation + * + * @var array + */ public $merged_templates_func = array(); /**#@-*/ /** - * Initialize new Smarty object - * - */ + * Initialize new Smarty object + * + */ public function __construct() { // selfpointer needed by some other class methods $this->smarty = $this; if (is_callable('mb_internal_encoding')) { - mb_internal_encoding(SMARTY_RESOURCE_CHAR_SET); + mb_internal_encoding(Smarty::$_CHARSET); } $this->start_time = microtime(true); // set default dirs @@ -593,40 +631,38 @@ class Smarty extends Smarty_Internal_TemplateBase { ->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']); } } - /** - * Class destructor - */ + * Class destructor + */ public function __destruct() { // intentionally left blank } /** - * <> set selfpointer on cloned object - */ + * <> set selfpointer on cloned object + */ public function __clone() { $this->smarty = $this; } - /** - * <> 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 - */ + * <> 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( @@ -645,14 +681,14 @@ class Smarty extends Smarty_Internal_TemplateBase { } /** - * <> 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 - */ + * <> 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( @@ -671,11 +707,11 @@ class Smarty extends Smarty_Internal_TemplateBase { } /** - * Check if a template resource exists - * - * @param string $resource_name template name - * @return boolean status - */ + * Check if a template resource exists + * + * @param string $resource_name template name + * @return boolean status + */ public function templateExists($resource_name) { // create template object @@ -684,16 +720,17 @@ class Smarty extends Smarty_Internal_TemplateBase { // check if it does exists $result = $tpl->source->exists; $this->template_objects = $save; + return $result; } /** - * Returns a single or all global variables - * - * @param object $smarty - * @param string $varname variable name or null - * @return string variable value or or array of variables - */ + * Returns a single or all global variables + * + * @param object $smarty + * @param string $varname variable name or null + * @return string variable value or or array of variables + */ public function getGlobal($varname = null) { if (isset($varname)) { @@ -707,54 +744,58 @@ class Smarty extends Smarty_Internal_TemplateBase { foreach (self::$global_tpl_vars AS $key => $var) { $_result[$key] = $var->value; } + return $_result; } } /** - * Empty cache folder - * - * @param integer $exp_time expiration time - * @param string $type resource type - * @return integer number of cache files deleted - */ - function clearAllCache($exp_time = null, $type = null) + * 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 - */ + * 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 - * @return Smarty current Smarty instance for chaining - * @throws SmartyException when an invalid class name is provided - */ + * Loads security class and enables security + * + * @param string|Smarty_Security $security_class if a string is used, it must be class-name + * @return Smarty current Smarty instance for chaining + * @throws SmartyException when an invalid class name is provided + */ 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."); @@ -774,9 +815,9 @@ class Smarty extends Smarty_Internal_TemplateBase { } /** - * Disable security - * @return Smarty current Smarty instance for chaining - */ + * Disable security + * @return Smarty current Smarty instance for chaining + */ public function disableSecurity() { $this->security_policy = null; @@ -785,11 +826,11 @@ class Smarty extends Smarty_Internal_TemplateBase { } /** - * Set template directory - * - * @param string|array $template_dir directory(s) of template sources - * @return Smarty current Smarty instance for chaining - */ + * Set template directory + * + * @param string|array $template_dir directory(s) of template sources + * @return Smarty current Smarty instance for chaining + */ public function setTemplateDir($template_dir) { $this->template_dir = array(); @@ -798,17 +839,18 @@ class Smarty extends Smarty_Internal_TemplateBase { } $this->joined_template_dir = join(DIRECTORY_SEPARATOR, $this->template_dir); + return $this; } /** - * Add template directory(s) - * - * @param string|array $template_dir directory(s) of template sources - * @param string $key of the array element to assign the template dir to - * @return Smarty current Smarty instance for chaining - * @throws SmartyException when the given template directory is not valid - */ + * Add template directory(s) + * + * @param string|array $template_dir directory(s) of template sources + * @param string $key of the array element to assign the template dir to + * @return Smarty current Smarty instance for chaining + * @throws SmartyException when the given template directory is not valid + */ public function addTemplateDir($template_dir, $key=null) { // make sure we're dealing with an array @@ -832,48 +874,50 @@ class Smarty extends Smarty_Internal_TemplateBase { $this->template_dir[] = rtrim($template_dir, '/\\') . DS; } $this->joined_template_dir = join(DIRECTORY_SEPARATOR, $this->template_dir); + return $this; } /** - * Get template directories - * - * @param mixed index of directory to get, null to get all - * @return array|string list of template directories, or directory of $index - */ + * Get template directories + * + * @param mixed index of directory to get, null to get all + * @return array|string list of template directories, or directory of $index + */ public function getTemplateDir($index=null) { if ($index !== null) { return isset($this->template_dir[$index]) ? $this->template_dir[$index] : null; } - return (array)$this->template_dir; + return (array) $this->template_dir; } /** - * Set config directory - * - * @param string|array $template_dir directory(s) of configuration sources - * @return Smarty current Smarty instance for chaining - */ + * Set config directory + * + * @param string|array $template_dir directory(s) of configuration sources + * @return Smarty current Smarty instance for chaining + */ public function setConfigDir($config_dir) { $this->config_dir = array(); foreach ((array) $config_dir as $k => $v) { $this->config_dir[$k] = rtrim($v, '/\\') . DS; } - + $this->joined_config_dir = join(DIRECTORY_SEPARATOR, $this->config_dir); + return $this; } /** - * Add config directory(s) - * - * @param string|array $config_dir directory(s) of config sources - * @param string key of the array element to assign the config dir to - * @return Smarty current Smarty instance for chaining - */ + * Add config directory(s) + * + * @param string|array $config_dir directory(s) of config sources + * @param string 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 @@ -889,43 +933,44 @@ class Smarty extends Smarty_Internal_TemplateBase { $this->config_dir[$k] = rtrim($v, '/\\') . DS; } } - } elseif( $key !== null ) { + } elseif ($key !== null) { // override directory at specified index $this->config_dir[$key] = rtrim($config_dir, '/\\') . DS; } else { // append new directory $this->config_dir[] = rtrim($config_dir, '/\\') . DS; } - + $this->joined_config_dir = join(DIRECTORY_SEPARATOR, $this->config_dir); + return $this; } /** - * Get config directory - * - * @param mixed index of directory to get, null to get all - * @return array|string configuration directory - */ + * Get config directory + * + * @param mixed index of directory to get, null to get all + * @return array|string 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 (array) $this->config_dir; } /** - * Set plugins directory - * - * @param string|array $plugins_dir directory(s) of plugins - * @return Smarty current Smarty instance for chaining - */ + * Set plugins directory + * + * @param string|array $plugins_dir directory(s) of plugins + * @return Smarty current Smarty instance for chaining + */ public function setPluginsDir($plugins_dir) { $this->plugins_dir = array(); - foreach ((array)$plugins_dir as $k => $v) { + foreach ((array) $plugins_dir as $k => $v) { $this->plugins_dir[$k] = rtrim($v, '/\\') . DS; } @@ -933,12 +978,12 @@ class Smarty extends Smarty_Internal_TemplateBase { } /** - * Adds directory of plugin files - * - * @param object $smarty - * @param string $ |array $ plugins folder - * @return Smarty current Smarty instance for chaining - */ + * Adds directory of plugin files + * + * @param object $smarty + * @param string $ |array $ plugins folder + * @return Smarty current Smarty instance for chaining + */ public function addPluginsDir($plugins_dir) { // make sure we're dealing with an array @@ -960,87 +1005,91 @@ class Smarty extends Smarty_Internal_TemplateBase { } $this->plugins_dir = array_unique($this->plugins_dir); + return $this; } /** - * Get plugin directories - * - * @return array list of plugin directories - */ + * Get plugin directories + * + * @return array list of plugin directories + */ public function getPluginsDir() { - return (array)$this->plugins_dir; + return (array) $this->plugins_dir; } /** - * Set compile directory - * - * @param string $compile_dir directory to store compiled templates in - * @return Smarty current Smarty instance for chaining - */ + * Set compile directory + * + * @param string $compile_dir directory to store compiled templates in + * @return Smarty current Smarty instance for chaining + */ public function setCompileDir($compile_dir) { $this->compile_dir = rtrim($compile_dir, '/\\') . DS; if (!isset(Smarty::$_muted_directories[$this->compile_dir])) { Smarty::$_muted_directories[$this->compile_dir] = null; } + return $this; } /** - * Get compiled directory - * - * @return string path to compiled templates - */ + * Get compiled directory + * + * @return string path to compiled templates + */ public function getCompileDir() { return $this->compile_dir; } /** - * Set cache directory - * - * @param string $cache_dir directory to store cached templates in - * @return Smarty current Smarty instance for chaining - */ + * Set cache directory + * + * @param string $cache_dir directory to store cached templates in + * @return Smarty current Smarty instance for chaining + */ public function setCacheDir($cache_dir) { $this->cache_dir = rtrim($cache_dir, '/\\') . DS; if (!isset(Smarty::$_muted_directories[$this->cache_dir])) { Smarty::$_muted_directories[$this->cache_dir] = null; } + return $this; } /** - * Get cache directory - * - * @return string path of cache directory - */ + * Get cache directory + * + * @return string path of cache directory + */ public function getCacheDir() { return $this->cache_dir; } /** - * Set default modifiers - * - * @param array|string $modifiers modifier or list of modifiers to set - * @return Smarty current Smarty instance for chaining - */ + * Set default modifiers + * + * @param array|string $modifiers modifier or list of modifiers to set + * @return Smarty current Smarty instance for chaining + */ public function setDefaultModifiers($modifiers) { $this->default_modifiers = (array) $modifiers; + return $this; } /** - * Add default modifiers - * - * @param array|string $modifiers modifier or list of modifiers to add - * @return Smarty current Smarty instance for chaining - */ + * Add default modifiers + * + * @param array|string $modifiers modifier or list of modifiers to add + * @return Smarty current Smarty instance for chaining + */ public function addDefaultModifiers($modifiers) { if (is_array($modifiers)) { @@ -1053,10 +1102,10 @@ class Smarty extends Smarty_Internal_TemplateBase { } /** - * Get default modifiers - * - * @return array list of default modifiers - */ + * Get default modifiers + * + * @return array list of default modifiers + */ public function getDefaultModifiers() { return $this->default_modifiers; @@ -1064,12 +1113,12 @@ class Smarty extends Smarty_Internal_TemplateBase { /** - * Set autoload filters - * - * @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 - * @return Smarty current Smarty instance for chaining - */ + * Set autoload filters + * + * @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 + * @return Smarty current Smarty instance for chaining + */ public function setAutoloadFilters($filters, $type=null) { if ($type !== null) { @@ -1082,12 +1131,12 @@ class Smarty extends Smarty_Internal_TemplateBase { } /** - * Add autoload filters - * - * @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 - * @return Smarty current Smarty instance for chaining - */ + * Add autoload filters + * + * @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 + * @return Smarty current Smarty instance for chaining + */ public function addAutoloadFilters($filters, $type=null) { if ($type !== null) { @@ -1110,11 +1159,11 @@ class Smarty extends Smarty_Internal_TemplateBase { } /** - * Get autoload filters - * - * @param string $type type of filter to get autoloads for. Defaults to all autoload filters - * @return array array( 'type1' => array( 'filter1', 'filter2', … ) ) or array( 'filter1', 'filter2', …) if $type was specified - */ + * Get autoload filters + * + * @param string $type type of filter to get autoloads for. Defaults to all autoload filters + * @return array array( 'type1' => array( 'filter1', 'filter2', … ) ) or array( 'filter1', 'filter2', …) if $type was specified + */ public function getAutoloadFilters($type=null) { if ($type !== null) { @@ -1125,22 +1174,22 @@ class Smarty extends Smarty_Internal_TemplateBase { } /** - * return name of debugging template - * - * @return string - */ + * return name of debugging template + * + * @return string + */ public function getDebugTemplate() { return $this->debug_tpl; } /** - * set the debug template - * - * @param string $tpl_name - * @return Smarty current Smarty instance for chaining - * @throws SmartyException if file is not readable - */ + * set the debug template + * + * @param string $tpl_name + * @return Smarty current Smarty instance for chaining + * @throws SmartyException if file is not readable + */ public function setDebugTemplate($tpl_name) { if (!is_readable($tpl_name)) { @@ -1152,15 +1201,15 @@ class Smarty extends Smarty_Internal_TemplateBase { } /** - * creates a template object - * - * @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 object template object - */ + * creates a template object + * + * @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 object template object + */ public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true) { if (!empty($cache_id) && (is_object($cache_id) || is_array($cache_id))) { @@ -1191,6 +1240,8 @@ class Smarty extends Smarty_Internal_TemplateBase { $tpl = clone $this->template_objects[$_templateId]; $tpl->smarty = clone $tpl->smarty; $tpl->parent = $parent; + $tpl->tpl_vars = array(); + $tpl->config_vars = array(); } else { $tpl = new $this->template_class($template, clone $this, $parent, $cache_id, $compile_id); } @@ -1198,6 +1249,9 @@ class Smarty extends Smarty_Internal_TemplateBase { if (isset($this->template_objects[$_templateId])) { // return cached template object $tpl = $this->template_objects[$_templateId]; + $tpl->parent = $parent; + $tpl->tpl_vars = array(); + $tpl->config_vars = array(); } else { $tpl = new $this->template_class($template, $this, $parent, $cache_id, $compile_id); } @@ -1209,19 +1263,20 @@ class Smarty extends Smarty_Internal_TemplateBase { $tpl->tpl_vars[$_key] = new Smarty_variable($_val); } } + return $tpl; } /** - * Takes unknown classes and loads plugin files for them - * class name format: Smarty_PluginType_PluginName - * plugin filename format: plugintype.pluginname.php - * - * @param string $plugin_name class plugin name to load - * @param bool $check check if already loaded - * @return string |boolean filepath of loaded file or false - */ + * Takes unknown classes and loads plugin files for them + * class name format: Smarty_PluginType_PluginName + * plugin filename format: plugintype.pluginname.php + * + * @param string $plugin_name class plugin name to load + * @param bool $check check if already loaded + * @return string |boolean filepath of loaded file or false + */ public function loadPlugin($plugin_name, $check = true) { // if function or class exists, exit silently (already loaded) @@ -1234,6 +1289,7 @@ class Smarty extends Smarty_Internal_TemplateBase { // count($_name_parts) < 3 === !isset($_name_parts[2]) if (!isset($_name_parts[2]) || strtolower($_name_parts[0]) !== 'smarty') { throw new SmartyException("plugin {$plugin_name} is not a valid name format"); + return false; } // if type is "internal", get plugin from sysplugins @@ -1241,6 +1297,7 @@ class Smarty extends Smarty_Internal_TemplateBase { $file = SMARTY_SYSPLUGINS_DIR . strtolower($plugin_name) . '.php'; if (file_exists($file)) { require_once($file); + return $file; } else { return false; @@ -1249,8 +1306,10 @@ class Smarty extends Smarty_Internal_TemplateBase { // plugin filename is expected to be: [type].[name].php $_plugin_filename = "{$_name_parts[1]}.{$_name_parts[2]}.php"; + $_stream_resolve_include_path = function_exists('stream_resolve_include_path'); + // loop through plugin dirs and find the plugin - foreach($this->getPluginsDir() as $_plugin_dir) { + foreach ($this->getPluginsDir() as $_plugin_dir) { $names = array( $_plugin_dir . $_plugin_filename, $_plugin_dir . strtolower($_plugin_filename), @@ -1258,12 +1317,20 @@ class Smarty extends Smarty_Internal_TemplateBase { foreach ($names as $file) { if (file_exists($file)) { require_once($file); + return $file; } if ($this->use_include_path && !preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', $_plugin_dir)) { // try PHP include_path - if (($file = Smarty_Internal_Get_Include_Path::getIncludePath($file)) !== false) { + if ($_stream_resolve_include_path) { + $file = stream_resolve_include_path($file); + } else { + $file = Smarty_Internal_Get_Include_Path::getIncludePath($file); + } + + if ($file !== false) { require_once($file); + return $file; } } @@ -1274,41 +1341,41 @@ class Smarty extends Smarty_Internal_TemplateBase { } /** - * Compile all template files - * - * @param string $extension file extension - * @param bool $force_compile force all to recompile - * @param int $time_limit - * @param int $max_errors - * @return integer number of template files recompiled - */ - public function compileAllTemplates($extention = '.tpl', $force_compile = false, $time_limit = 0, $max_errors = null) + * Compile all template files + * + * @param string $extension file extension + * @param bool $force_compile force all to recompile + * @param int $time_limit + * @param int $max_errors + * @return integer number of template files recompiled + */ + public function compileAllTemplates($extension = '.tpl', $force_compile = false, $time_limit = 0, $max_errors = null) { - return Smarty_Internal_Utility::compileAllTemplates($extention, $force_compile, $time_limit, $max_errors, $this); + return Smarty_Internal_Utility::compileAllTemplates($extension, $force_compile, $time_limit, $max_errors, $this); } /** - * Compile all config files - * - * @param string $extension file extension - * @param bool $force_compile force all to recompile - * @param int $time_limit - * @param int $max_errors - * @return integer number of template files recompiled - */ - public function compileAllConfig($extention = '.conf', $force_compile = false, $time_limit = 0, $max_errors = null) + * Compile all config files + * + * @param string $extension file extension + * @param bool $force_compile force all to recompile + * @param int $time_limit + * @param int $max_errors + * @return integer number of template files recompiled + */ + public function compileAllConfig($extension = '.conf', $force_compile = false, $time_limit = 0, $max_errors = null) { - return Smarty_Internal_Utility::compileAllConfig($extention, $force_compile, $time_limit, $max_errors, $this); + return Smarty_Internal_Utility::compileAllConfig($extension, $force_compile, $time_limit, $max_errors, $this); } /** - * Delete compiled template file - * - * @param string $resource_name template name - * @param string $compile_id compile id - * @param integer $exp_time expiration time - * @return integer number of template files deleted - */ + * Delete compiled template file + * + * @param string $resource_name template name + * @param string $compile_id compile id + * @param integer $exp_time expiration time + * @return integer number of template files deleted + */ public function clearCompiledTemplate($resource_name = null, $compile_id = null, $exp_time = null) { return Smarty_Internal_Utility::clearCompiledTemplate($resource_name, $compile_id, $exp_time, $this); @@ -1316,11 +1383,11 @@ class Smarty extends Smarty_Internal_TemplateBase { /** - * Return array of tag/attributes of all tags used by an template - * - * @param object $templae template object - * @return array of tag/attributes - */ + * Return array of tag/attributes of all tags used by an template + * + * @param object $templae template object + * @return array of tag/attributes + */ public function getTags(Smarty_Internal_Template $template) { return Smarty_Internal_Utility::getTags($template); @@ -1329,7 +1396,7 @@ class Smarty extends Smarty_Internal_TemplateBase { /** * Run installation test * - * @param array $errors Array to write errors into, rather than outputting them + * @param array $errors Array to write errors into, rather than outputting them * @return boolean true if setup is fine, false if something is wrong */ public function testInstall(&$errors=null) @@ -1341,27 +1408,34 @@ class Smarty extends Smarty_Internal_TemplateBase { * Error Handler to mute expected messages * * @link http://php.net/set_error_handler - * @param integer $errno Error level + * @param integer $errno Error level * @return boolean */ public static function mutingErrorHandler($errno, $errstr, $errfile, $errline, $errcontext) { $_is_muted_directory = false; - + // add the SMARTY_DIR to the list of muted directories if (!isset(Smarty::$_muted_directories[SMARTY_DIR])) { $smarty_dir = realpath(SMARTY_DIR); - Smarty::$_muted_directories[SMARTY_DIR] = array( - 'file' => $smarty_dir, - 'length' => strlen($smarty_dir), - ); + if ($smarty_dir !== false) { + Smarty::$_muted_directories[SMARTY_DIR] = array( + 'file' => $smarty_dir, + 'length' => strlen($smarty_dir), + ); + } } - + // walk the muted directories and test against $errfile foreach (Smarty::$_muted_directories as $key => &$dir) { if (!$dir) { // resolve directory and length for speedy comparisons $file = realpath($key); + if ($file === false) { + // this directory does not exist, remove and skip it + unset(Smarty::$_muted_directories[$key]); + continue; + } $dir = array( 'file' => $file, 'length' => strlen($file), @@ -1427,27 +1501,67 @@ class Smarty extends Smarty_Internal_TemplateBase { } } +// Check if we're running on windows +Smarty::$_IS_WINDOWS = strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; + +// 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 = ''; +} + /** -* Smarty exception class -* @package Smarty -*/ -class SmartyException extends Exception { + * Smarty exception class + * @package Smarty + */ +class SmartyException extends Exception +{ + public static $escape = false; + + public function __toString() + { + return ' --> Smarty: ' . (self::$escape ? htmlentities($this->message) : $this->message) . ' <-- '; + } } /** -* Smarty compiler exception class -* @package Smarty -*/ -class SmartyCompilerException extends SmartyException { + * Smarty compiler exception class + * @package Smarty + */ +class SmartyCompilerException extends SmartyException +{ + public function __toString() + { + return ' --> Smarty Compiler: ' . $this->message . ' <-- '; + } + /** + * The line number of the template error + * @type int|null + */ + public $line = null; + /** + * The template source snippet relating to the error + * @type string|null + */ + public $source = null; + /** + * The raw text of the error message + * @type string|null + */ + public $desc = null; + /** + * The resource identifier or template name + * @type string|null + */ + public $template = null; } /** -* Autoloader -*/ + * Autoloader + */ function smartyAutoload($class) { $_class = strtolower($class); - $_classes = array( + static $_classes = array( 'smarty_config_source' => true, 'smarty_config_compiled' => true, 'smarty_security' => true, @@ -1464,5 +1578,3 @@ function smartyAutoload($class) include SMARTY_SYSPLUGINS_DIR . $_class . '.php'; } } - -?> diff --git a/smarty/libs/SmartyBC.class.php b/smarty/libs/SmartyBC.class.php index 8573af72..b1cd8d01 100644 --- a/smarty/libs/SmartyBC.class.php +++ b/smarty/libs/SmartyBC.class.php @@ -39,8 +39,8 @@ require(dirname(__FILE__) . '/Smarty.class.php'); * * @package Smarty */ -class SmartyBC extends Smarty { - +class SmartyBC extends Smarty +{ /** * Smarty 2 BC * @var string @@ -118,10 +118,10 @@ class SmartyBC extends Smarty { /** * Registers object to be used in templates * - * @param string $object name of template object - * @param object $object_impl the referenced PHP object to register - * @param array $allowed list of allowed methods (empty = all) - * @param boolean $smarty_args smarty argument format, else traditional + * @param string $object name of template object + * @param object $object_impl the referenced PHP object to register + * @param array $allowed list of allowed methods (empty = all) + * @param boolean $smarty_args smarty argument format, else traditional * @param array $block_functs list of methods that are block format */ public function register_object($object, $object_impl, $allowed = array(), $smarty_args = true, $block_methods = array()) @@ -144,8 +144,8 @@ class SmartyBC extends Smarty { /** * Registers block function to be used in templates * - * @param string $block name of template block - * @param string $block_impl PHP function to register + * @param string $block name of template block + * @param string $block_impl PHP function to register * @param bool $cacheable * @param mixed $cache_attrs */ @@ -189,7 +189,7 @@ class SmartyBC extends Smarty { /** * Registers modifier to be used in templates * - * @param string $modifier name of template modifier + * @param string $modifier name of template modifier * @param string $modifier_impl name of PHP function to register */ public function register_modifier($modifier, $modifier_impl) @@ -305,10 +305,10 @@ class SmartyBC extends Smarty { /** * clear cached content for the given template and cache id * - * @param string $tpl_file name of template file - * @param string $cache_id name of cache_id - * @param string $compile_id name of compile_id - * @param string $exp_time expiration time + * @param string $tpl_file name of template file + * @param string $cache_id name of cache_id + * @param string $compile_id name of compile_id + * @param string $exp_time expiration time * @return boolean */ public function clear_cache($tpl_file = null, $cache_id = null, $compile_id = null, $exp_time = null) @@ -319,7 +319,7 @@ class SmartyBC extends Smarty { /** * clear the entire contents of cache (all templates) * - * @param string $exp_time expire time + * @param string $exp_time expire time * @return boolean */ public function clear_all_cache($exp_time = null) @@ -330,9 +330,9 @@ class SmartyBC extends Smarty { /** * test to see if valid cache exists for this template * - * @param string $tpl_file name of template file - * @param string $cache_id - * @param string $compile_id + * @param string $tpl_file name of template file + * @param string $cache_id + * @param string $compile_id * @return boolean */ public function is_cached($tpl_file, $cache_id = null, $compile_id = null) @@ -353,9 +353,9 @@ class SmartyBC extends Smarty { * or all compiled template files if one is not specified. * This function is for advanced use only, not normally needed. * - * @param string $tpl_file - * @param string $compile_id - * @param string $exp_time + * @param string $tpl_file + * @param string $compile_id + * @param string $exp_time * @return boolean results of {@link smarty_core_rm_auto()} */ public function clear_compiled_tpl($tpl_file = null, $compile_id = null, $exp_time = null) @@ -366,7 +366,7 @@ class SmartyBC extends Smarty { /** * Checks whether requested template exists. * - * @param string $tpl_file + * @param string $tpl_file * @return boolean */ public function template_exists($tpl_file) @@ -377,7 +377,7 @@ class SmartyBC extends Smarty { /** * Returns an array containing template variables * - * @param string $name + * @param string $name * @return array */ public function get_template_vars($name=null) @@ -388,7 +388,7 @@ class SmartyBC extends Smarty { /** * Returns an array containing config variables * - * @param string $name + * @param string $name * @return array */ public function get_config_vars($name=null) @@ -411,7 +411,7 @@ class SmartyBC extends Smarty { /** * return a reference to a registered object * - * @param string $name + * @param string $name * @return object */ public function get_registered_object($name) @@ -432,7 +432,7 @@ class SmartyBC extends Smarty { /** * trigger Smarty error * - * @param string $error_msg + * @param string $error_msg * @param integer $error_type */ public function trigger_error($error_msg, $error_type = E_USER_WARNING) @@ -454,7 +454,6 @@ class SmartyBC extends Smarty { function smarty_php_tag($params, $content, $template, &$repeat) { eval($content); + return ''; } - -?> \ No newline at end of file diff --git a/smarty/libs/plugins/block.textformat.php b/smarty/libs/plugins/block.textformat.php index bdd80673..b62a4f8e 100644 --- a/smarty/libs/plugins/block.textformat.php +++ b/smarty/libs/plugins/block.textformat.php @@ -53,17 +53,17 @@ function smarty_block_textformat($params, $content, $template, &$repeat) case 'indent_char': case 'wrap_char': case 'assign': - $$_key = (string)$_val; + $$_key = (string) $_val; break; case 'indent': case 'indent_first': case 'wrap': - $$_key = (int)$_val; + $$_key = (int) $_val; break; case 'wrap_cut': - $$_key = (bool)$_val; + $$_key = (bool) $_val; break; default: @@ -78,19 +78,18 @@ function smarty_block_textformat($params, $content, $template, &$repeat) $_paragraphs = preg_split('![\r\n]{2}!', $content); $_output = ''; - foreach ($_paragraphs as &$_paragraph) { if (!$_paragraph) { continue; } // convert mult. spaces & special chars to single space - $_paragraph = preg_replace(array('!\s+!u', '!(^\s+)|(\s+$)!u'), array(' ', ''), $_paragraph); + $_paragraph = preg_replace(array('!\s+!' . Smarty::$_UTF8_MODIFIER, '!(^\s+)|(\s+$)!' . Smarty::$_UTF8_MODIFIER), array(' ', ''), $_paragraph); // indent first line if ($indent_first > 0) { $_paragraph = str_repeat($indent_char, $indent_first) . $_paragraph; } // wordwrap sentences - if (SMARTY_MBSTRING /* ^phpunit */&&empty($_SERVER['SMARTY_PHPUNIT_DISABLE_MBSTRING'])/* phpunit$ */) { + if (Smarty::$_MBSTRING) { require_once(SMARTY_PLUGINS_DIR . 'shared.mb_wordwrap.php'); $_paragraph = smarty_mb_wordwrap($_paragraph, $wrap - $indent, $wrap_char, $wrap_cut); } else { @@ -102,12 +101,10 @@ function smarty_block_textformat($params, $content, $template, &$repeat) } } $_output = implode($wrap_char . $wrap_char, $_paragraphs); - + if ($assign) { $template->assign($assign, $_output); } else { return $_output; } } - -?> \ No newline at end of file diff --git a/smarty/libs/plugins/function.counter.php b/smarty/libs/plugins/function.counter.php index 3906badf..cd147634 100644 --- a/smarty/libs/plugins/function.counter.php +++ b/smarty/libs/plugins/function.counter.php @@ -35,7 +35,7 @@ function smarty_function_counter($params, $template) $counter =& $counters[$name]; if (isset($params['start'])) { - $counter['start'] = $counter['count'] = (int)$params['start']; + $counter['start'] = $counter['count'] = (int) $params['start']; } if (!empty($params['assign'])) { @@ -45,9 +45,9 @@ function smarty_function_counter($params, $template) if (isset($counter['assign'])) { $template->assign($counter['assign'], $counter['count']); } - + if (isset($params['print'])) { - $print = (bool)$params['print']; + $print = (bool) $params['print']; } else { $print = empty($counter['assign']); } @@ -61,7 +61,7 @@ function smarty_function_counter($params, $template) if (isset($params['skip'])) { $counter['skip'] = $params['skip']; } - + if (isset($params['direction'])) { $counter['direction'] = $params['direction']; } @@ -70,9 +70,7 @@ function smarty_function_counter($params, $template) $counter['count'] -= $counter['skip']; else $counter['count'] += $counter['skip']; - + return $retval; - -} -?> \ No newline at end of file +} diff --git a/smarty/libs/plugins/function.cycle.php b/smarty/libs/plugins/function.cycle.php index 1778ffb5..9bf26f8c 100644 --- a/smarty/libs/plugins/function.cycle.php +++ b/smarty/libs/plugins/function.cycle.php @@ -48,13 +48,14 @@ function smarty_function_cycle($params, $template) static $cycle_vars; $name = (empty($params['name'])) ? 'default' : $params['name']; - $print = (isset($params['print'])) ? (bool)$params['print'] : true; - $advance = (isset($params['advance'])) ? (bool)$params['advance'] : true; - $reset = (isset($params['reset'])) ? (bool)$params['reset'] : false; + $print = (isset($params['print'])) ? (bool) $params['print'] : true; + $advance = (isset($params['advance'])) ? (bool) $params['advance'] : true; + $reset = (isset($params['reset'])) ? (bool) $params['reset'] : false; if (!isset($params['values'])) { - if(!isset($cycle_vars[$name]['values'])) { + if (!isset($cycle_vars[$name]['values'])) { trigger_error("cycle: missing 'values' parameter"); + return; } } else { @@ -71,13 +72,13 @@ function smarty_function_cycle($params, $template) $cycle_vars[$name]['delimiter'] = ','; } - if(is_array($cycle_vars[$name]['values'])) { + if (is_array($cycle_vars[$name]['values'])) { $cycle_array = $cycle_vars[$name]['values']; } else { $cycle_array = explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']); } - if(!isset($cycle_vars[$name]['index']) || $reset ) { + if (!isset($cycle_vars[$name]['index']) || $reset ) { $cycle_vars[$name]['index'] = 0; } @@ -86,13 +87,13 @@ function smarty_function_cycle($params, $template) $template->assign($params['assign'], $cycle_array[$cycle_vars[$name]['index']]); } - if($print) { + if ($print) { $retval = $cycle_array[$cycle_vars[$name]['index']]; } else { $retval = null; } - if($advance) { + if ($advance) { if ( $cycle_vars[$name]['index'] >= count($cycle_array) -1 ) { $cycle_vars[$name]['index'] = 0; } else { @@ -102,5 +103,3 @@ function smarty_function_cycle($params, $template) return $retval; } - -?> \ No newline at end of file diff --git a/smarty/libs/plugins/function.fetch.php b/smarty/libs/plugins/function.fetch.php index cde98d2e..a4eaef37 100644 --- a/smarty/libs/plugins/function.fetch.php +++ b/smarty/libs/plugins/function.fetch.php @@ -24,193 +24,196 @@ function smarty_function_fetch($params, $template) { if (empty($params['file'])) { trigger_error("[plugin] fetch parameter 'file' cannot be empty",E_USER_NOTICE); + return; } - $content = ''; - if (isset($template->smarty->security_policy) && !preg_match('!^(http|ftp)://!i', $params['file'])) { - if(!$template->smarty->security_policy->isTrustedResourceDir($params['file'])) { - return; - } + // strip file protocol + if (stripos($params['file'], 'file://') === 0) { + $params['file'] = substr($params['file'], 7); + } - // fetch the file - if($fp = @fopen($params['file'],'r')) { - while(!feof($fp)) { - $content .= fgets ($fp,4096); + $protocol = strpos($params['file'], '://'); + if ($protocol !== false) { + $protocol = strtolower(substr($params['file'], 0, $protocol)); + } + + if (isset($template->smarty->security_policy)) { + if ($protocol) { + // remote resource (or php stream, …) + if (!$template->smarty->security_policy->isTrustedUri($params['file'])) { + return; } - fclose($fp); } else { - trigger_error('[plugin] fetch cannot read file \'' . $params['file'] . '\'',E_USER_NOTICE); - return; + // local file + if (!$template->smarty->security_policy->isTrustedResourceDir($params['file'])) { + return; + } } - } else { - // not a local file - if(preg_match('!^http://!i',$params['file'])) { - // http fetch - if($uri_parts = parse_url($params['file'])) { - // set defaults - $host = $server_name = $uri_parts['host']; - $timeout = 30; - $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; - $agent = "Smarty Template Engine ". Smarty::SMARTY_VERSION; - $referer = ""; - $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/'; - $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : ''; - $_is_proxy = false; - if(empty($uri_parts['port'])) { - $port = 80; - } else { - $port = $uri_parts['port']; - } - if(!empty($uri_parts['user'])) { - $user = $uri_parts['user']; - } - if(!empty($uri_parts['pass'])) { - $pass = $uri_parts['pass']; - } - // loop through parameters, setup headers - foreach($params as $param_key => $param_value) { - switch($param_key) { - case "file": - case "assign": - case "assign_headers": - break; - case "user": - if(!empty($param_value)) { - $user = $param_value; - } - break; - case "pass": - if(!empty($param_value)) { - $pass = $param_value; - } - break; - case "accept": - if(!empty($param_value)) { - $accept = $param_value; - } - break; - case "header": - if(!empty($param_value)) { - if(!preg_match('![\w\d-]+: .+!',$param_value)) { - trigger_error("[plugin] invalid header format '".$param_value."'",E_USER_NOTICE); - return; - } else { - $extra_headers[] = $param_value; - } - } - break; - case "proxy_host": - if(!empty($param_value)) { - $proxy_host = $param_value; - } - break; - case "proxy_port": - if(!preg_match('!\D!', $param_value)) { - $proxy_port = (int) $param_value; - } else { - trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE); + } + + $content = ''; + if ($protocol == 'http') { + // http fetch + if ($uri_parts = parse_url($params['file'])) { + // set defaults + $host = $server_name = $uri_parts['host']; + $timeout = 30; + $accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*"; + $agent = "Smarty Template Engine ". Smarty::SMARTY_VERSION; + $referer = ""; + $uri = !empty($uri_parts['path']) ? $uri_parts['path'] : '/'; + $uri .= !empty($uri_parts['query']) ? '?' . $uri_parts['query'] : ''; + $_is_proxy = false; + if (empty($uri_parts['port'])) { + $port = 80; + } else { + $port = $uri_parts['port']; + } + if (!empty($uri_parts['user'])) { + $user = $uri_parts['user']; + } + if (!empty($uri_parts['pass'])) { + $pass = $uri_parts['pass']; + } + // loop through parameters, setup headers + foreach ($params as $param_key => $param_value) { + switch ($param_key) { + case "file": + case "assign": + case "assign_headers": + break; + case "user": + if (!empty($param_value)) { + $user = $param_value; + } + break; + case "pass": + if (!empty($param_value)) { + $pass = $param_value; + } + break; + case "accept": + if (!empty($param_value)) { + $accept = $param_value; + } + break; + case "header": + if (!empty($param_value)) { + if (!preg_match('![\w\d-]+: .+!',$param_value)) { + trigger_error("[plugin] invalid header format '".$param_value."'",E_USER_NOTICE); + return; - } - break; - case "agent": - if(!empty($param_value)) { - $agent = $param_value; - } - break; - case "referer": - if(!empty($param_value)) { - $referer = $param_value; - } - break; - case "timeout": - if(!preg_match('!\D!', $param_value)) { - $timeout = (int) $param_value; } else { - trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE); - return; + $extra_headers[] = $param_value; } - break; - default: - trigger_error("[plugin] unrecognized attribute '".$param_key."'",E_USER_NOTICE); + } + break; + case "proxy_host": + if (!empty($param_value)) { + $proxy_host = $param_value; + } + break; + case "proxy_port": + if (!preg_match('!\D!', $param_value)) { + $proxy_port = (int) $param_value; + } else { + trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE); + return; - } - } - if(!empty($proxy_host) && !empty($proxy_port)) { - $_is_proxy = true; - $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout); - } else { - $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout); - } + } + break; + case "agent": + if (!empty($param_value)) { + $agent = $param_value; + } + break; + case "referer": + if (!empty($param_value)) { + $referer = $param_value; + } + break; + case "timeout": + if (!preg_match('!\D!', $param_value)) { + $timeout = (int) $param_value; + } else { + trigger_error("[plugin] invalid value for attribute '".$param_key."'",E_USER_NOTICE); - if(!$fp) { - trigger_error("[plugin] unable to fetch: $errstr ($errno)",E_USER_NOTICE); - return; - } else { - if($_is_proxy) { - fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n"); - } else { - fputs($fp, "GET $uri HTTP/1.0\r\n"); - } - if(!empty($host)) { - fputs($fp, "Host: $host\r\n"); - } - if(!empty($accept)) { - fputs($fp, "Accept: $accept\r\n"); - } - if(!empty($agent)) { - fputs($fp, "User-Agent: $agent\r\n"); - } - if(!empty($referer)) { - fputs($fp, "Referer: $referer\r\n"); - } - if(isset($extra_headers) && is_array($extra_headers)) { - foreach($extra_headers as $curr_header) { - fputs($fp, $curr_header."\r\n"); + return; } - } - if(!empty($user) && !empty($pass)) { - fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n"); - } + break; + default: + trigger_error("[plugin] unrecognized attribute '".$param_key."'",E_USER_NOTICE); - fputs($fp, "\r\n"); - while(!feof($fp)) { - $content .= fgets($fp,4096); - } - fclose($fp); - $csplit = preg_split("!\r\n\r\n!",$content,2); + return; + } + } + if (!empty($proxy_host) && !empty($proxy_port)) { + $_is_proxy = true; + $fp = fsockopen($proxy_host,$proxy_port,$errno,$errstr,$timeout); + } else { + $fp = fsockopen($server_name,$port,$errno,$errstr,$timeout); + } - $content = $csplit[1]; + if (!$fp) { + trigger_error("[plugin] unable to fetch: $errstr ($errno)",E_USER_NOTICE); - if(!empty($params['assign_headers'])) { - $template->assign($params['assign_headers'],preg_split("!\r\n!",$csplit[0])); + return; + } else { + if ($_is_proxy) { + fputs($fp, 'GET ' . $params['file'] . " HTTP/1.0\r\n"); + } else { + fputs($fp, "GET $uri HTTP/1.0\r\n"); + } + if (!empty($host)) { + fputs($fp, "Host: $host\r\n"); + } + if (!empty($accept)) { + fputs($fp, "Accept: $accept\r\n"); + } + if (!empty($agent)) { + fputs($fp, "User-Agent: $agent\r\n"); + } + if (!empty($referer)) { + fputs($fp, "Referer: $referer\r\n"); + } + if (isset($extra_headers) && is_array($extra_headers)) { + foreach ($extra_headers as $curr_header) { + fputs($fp, $curr_header."\r\n"); } } - } else { - trigger_error("[plugin fetch] unable to parse URL, check syntax",E_USER_NOTICE); - return; - } - } else { - // ftp fetch - if($fp = @fopen($params['file'],'r')) { - while(!feof($fp)) { - $content .= fgets ($fp,4096); + if (!empty($user) && !empty($pass)) { + fputs($fp, "Authorization: BASIC ".base64_encode("$user:$pass")."\r\n"); + } + + fputs($fp, "\r\n"); + while (!feof($fp)) { + $content .= fgets($fp,4096); } fclose($fp); - } else { - trigger_error('[plugin] fetch cannot read file \'' . $params['file'] .'\'',E_USER_NOTICE); - return; + $csplit = preg_split("!\r\n\r\n!",$content,2); + + $content = $csplit[1]; + + if (!empty($params['assign_headers'])) { + $template->assign($params['assign_headers'],preg_split("!\r\n!",$csplit[0])); + } } - } + } else { + trigger_error("[plugin fetch] unable to parse URL, check syntax",E_USER_NOTICE); + return; + } + } else { + $content = @file_get_contents($params['file']); + if ($content === false) { + throw new SmartyException("{fetch} cannot read resource '" . $params['file'] ."'"); + } } - if (!empty($params['assign'])) { - $template->assign($params['assign'],$content); + $template->assign($params['assign'], $content); } else { return $content; } } - -?> \ No newline at end of file diff --git a/smarty/libs/plugins/function.html_checkboxes.php b/smarty/libs/plugins/function.html_checkboxes.php index 1e8beb48..ad0e9cd4 100644 --- a/smarty/libs/plugins/function.html_checkboxes.php +++ b/smarty/libs/plugins/function.html_checkboxes.php @@ -29,6 +29,7 @@ * - separator (optional) - ie
    or   * - output (optional) - the output next to each checkbox * - assign (optional) - assign the output as an array to this variable + * - escape (optional) - escape the content (not value), defaults to true * * * @link http://www.smarty.net/manual/en/language.function.html.checkboxes.php {html_checkboxes} @@ -50,19 +51,21 @@ function smarty_function_html_checkboxes($params, $template) $options = null; $selected = array(); $separator = ''; + $escape = true; $labels = true; $label_ids = false; $output = null; $extra = ''; - foreach($params as $_key => $_val) { - switch($_key) { + foreach ($params as $_key => $_val) { + switch ($_key) { case 'name': case 'separator': $$_key = (string) $_val; break; + case 'escape': case 'labels': case 'label_ids': $$_key = (bool) $_val; @@ -113,8 +116,25 @@ function smarty_function_html_checkboxes($params, $template) case 'assign': break; + case 'strict': break; + + case 'disabled': + case 'readonly': + if (!empty($params['strict'])) { + if (!is_scalar($_val)) { + trigger_error("html_options: $_key attribute must be a scalar, only boolean true or string '$_key' will actually add the attribute", E_USER_NOTICE); + } + + if ($_val === true || $_val === $_key) { + $extra .= ' ' . $_key . '="' . smarty_function_escape_special_chars($_key) . '"'; + } + + break; + } + // omit break; to fall through! + default: - if(!is_array($_val)) { + if (!is_array($_val)) { $extra .= ' '.$_key.'="'.smarty_function_escape_special_chars($_val).'"'; } else { trigger_error("html_checkboxes: extra attribute '$_key' cannot be an array", E_USER_NOTICE); @@ -130,16 +150,16 @@ function smarty_function_html_checkboxes($params, $template) if (isset($options)) { foreach ($options as $_key=>$_val) { - $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids); + $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); } } else { foreach ($values as $_i=>$_key) { $_val = isset($output[$_i]) ? $output[$_i] : ''; - $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids); + $_html_result[] = smarty_function_html_checkboxes_output($name, $_key, $_val, $selected, $extra, $separator, $labels, $label_ids, $escape); } } - if(!empty($params['assign'])) { + if (!empty($params['assign'])) { $template->assign($params['assign'], $_html_result); } else { return implode("\n", $_html_result); @@ -147,50 +167,55 @@ function smarty_function_html_checkboxes($params, $template) } -function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids) { +function smarty_function_html_checkboxes_output($name, $value, $output, $selected, $extra, $separator, $labels, $label_ids, $escape=true) +{ $_output = ''; - + if (is_object($value)) { if (method_exists($value, "__toString")) { $value = (string) $value->__toString(); } else { trigger_error("html_options: value is an object of class '". get_class($value) ."' without __toString() method", E_USER_NOTICE); + return ''; } } else { $value = (string) $value; } - + if (is_object($output)) { if (method_exists($output, "__toString")) { $output = (string) $output->__toString(); } else { trigger_error("html_options: output is an object of class '". get_class($output) ."' without __toString() method", E_USER_NOTICE); + return ''; } } else { $output = (string) $output; } - + if ($labels) { if ($label_ids) { - $_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!u', '_', $name . '_' . $value)); + $_id = smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!' . Smarty::$_UTF8_MODIFIER, '_', $name . '_' . $value)); $_output .= '