[pLog-svn] r2879 - in plog/trunk/class/template/smarty: . coreplugins

Mark Wu markplace at gmail.com
Wed Feb 1 16:24:46 GMT 2006


When I commit the code, I just found you did the same things .... Hee hee

Mark 

> -----Original Message-----
> From: plog-svn-bounces at devel.lifetype.net 
> [mailto:plog-svn-bounces at devel.lifetype.net] On Behalf Of 
> oscar at devel.lifetype.net
> Sent: Wednesday, February 01, 2006 11:28 PM
> To: plog-svn at devel.lifetype.net
> Subject: [pLog-svn] r2879 - in 
> plog/trunk/class/template/smarty: . coreplugins
> 
> Author: oscar
> Date: 2006-02-01 15:27:58 +0000 (Wed, 01 Feb 2006)
> New Revision: 2879
> 
> Modified:
>    plog/trunk/class/template/smarty/Config_File.class.php
>    plog/trunk/class/template/smarty/Smarty.class.php
>    plog/trunk/class/template/smarty/Smarty_Compiler.class.php
>    
> plog/trunk/class/template/smarty/core/core.assemble_plugin_fil
> epath.php
>    plog/trunk/class/template/smarty/core/core.create_dir_structure.php
>    
> plog/trunk/class/template/smarty/core/core.display_debug_console.php
>    plog/trunk/class/template/smarty/core/core.get_php_resource.php
>    plog/trunk/class/template/smarty/core/core.is_secure.php
>    plog/trunk/class/template/smarty/core/core.is_trusted.php
>    
> plog/trunk/class/template/smarty/core/core.process_cached_inserts.php
>    
> plog/trunk/class/template/smarty/core/core.process_compiled_in
> clude.php
>    plog/trunk/class/template/smarty/core/core.read_cache_file.php
>    plog/trunk/class/template/smarty/core/core.rm_auto.php
>    plog/trunk/class/template/smarty/core/core.rmdir.php
>    plog/trunk/class/template/smarty/core/core.run_insert_handler.php
>    plog/trunk/class/template/smarty/core/core.smarty_include_php.php
>    plog/trunk/class/template/smarty/core/core.write_cache_file.php
>    
> plog/trunk/class/template/smarty/core/core.write_compiled_include.php
>    
> plog/trunk/class/template/smarty/core/core.write_compiled_resource.php
>    plog/trunk/class/template/smarty/core/core.write_file.php
>    plog/trunk/class/template/smarty/debug.tpl
>    plog/trunk/class/template/smarty/plugins/block.textformat.php
>    plog/trunk/class/template/smarty/plugins/compiler.assign.php
>    
> plog/trunk/class/template/smarty/plugins/function.assign_debug
> _info.php
>    plog/trunk/class/template/smarty/plugins/function.config_load.php
>    plog/trunk/class/template/smarty/plugins/function.counter.php
>    plog/trunk/class/template/smarty/plugins/function.cycle.php
>    plog/trunk/class/template/smarty/plugins/function.debug.php
>    plog/trunk/class/template/smarty/plugins/function.eval.php
>    plog/trunk/class/template/smarty/plugins/function.fetch.php
>    
> plog/trunk/class/template/smarty/plugins/function.html_checkboxes.php
>    plog/trunk/class/template/smarty/plugins/function.html_image.php
>    plog/trunk/class/template/smarty/plugins/function.html_options.php
>    plog/trunk/class/template/smarty/plugins/function.html_radios.php
>    
> plog/trunk/class/template/smarty/plugins/function.html_select_date.php
>    
> plog/trunk/class/template/smarty/plugins/function.html_select_time.php
>    plog/trunk/class/template/smarty/plugins/function.html_table.php
>    plog/trunk/class/template/smarty/plugins/function.mailto.php
>    plog/trunk/class/template/smarty/plugins/function.math.php
>    plog/trunk/class/template/smarty/plugins/function.popup.php
>    plog/trunk/class/template/smarty/plugins/function.popup_init.php
>    plog/trunk/class/template/smarty/plugins/modifier.capitalize.php
>    plog/trunk/class/template/smarty/plugins/modifier.cat.php
>    
> plog/trunk/class/template/smarty/plugins/modifier.count_characters.php
>    
> plog/trunk/class/template/smarty/plugins/modifier.count_paragraphs.php
>    
> plog/trunk/class/template/smarty/plugins/modifier.count_sentences.php
>    plog/trunk/class/template/smarty/plugins/modifier.count_words.php
>    plog/trunk/class/template/smarty/plugins/modifier.date_format.php
>    
> plog/trunk/class/template/smarty/plugins/modifier.debug_print_var.php
>    plog/trunk/class/template/smarty/plugins/modifier.default.php
>    plog/trunk/class/template/smarty/plugins/modifier.escape.php
>    plog/trunk/class/template/smarty/plugins/modifier.indent.php
>    plog/trunk/class/template/smarty/plugins/modifier.lower.php
>    plog/trunk/class/template/smarty/plugins/modifier.nl2br.php
>    plog/trunk/class/template/smarty/plugins/modifier.regex_replace.php
>    plog/trunk/class/template/smarty/plugins/modifier.replace.php
>    plog/trunk/class/template/smarty/plugins/modifier.spacify.php
>    plog/trunk/class/template/smarty/plugins/modifier.string_format.php
>    plog/trunk/class/template/smarty/plugins/modifier.strip.php
>    plog/trunk/class/template/smarty/plugins/modifier.strip_tags.php
>    plog/trunk/class/template/smarty/plugins/modifier.truncate.php
>    plog/trunk/class/template/smarty/plugins/modifier.upper.php
>    plog/trunk/class/template/smarty/plugins/modifier.wordwrap.php
>    
> plog/trunk/class/template/smarty/plugins/outputfilter.trimwhit
> espace.php
>    
> plog/trunk/class/template/smarty/plugins/shared.escape_special
> _chars.php
>    plog/trunk/class/template/smarty/plugins/shared.make_timestamp.php
> Log:
> upgraded to smarty 2.6.12
> 
> 
> Modified: plog/trunk/class/template/smarty/Config_File.class.php
> ===================================================================
> --- plog/trunk/class/template/smarty/Config_File.class.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ plog/trunk/class/template/smarty/Config_File.class.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -18,14 +18,14 @@
>   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  
> 02111-1307  USA
>   *
>   * @link http://smarty.php.net/
> - * @version 2.6.2
> - * @copyright Copyright: 2001-2004 ispi of Lincoln, Inc.
> + * @version 2.6.12
> + * @copyright Copyright: 2001-2005 New Digital Group, Inc.
>   * @author Andrei Zmievski <andrei at php.net>
>   * @access public
>   * @package Smarty
>   */
>  
> -/* $Id: Config_File.class.php,v 1.2 2004/02/20 15:52:24 
> phunkphorce Exp $ */
> +/* $Id: Config_File.class.php,v 1.83 2005/12/14 14:53:55 
> mohrt Exp $ */
>  
>  /**
>   * Config file reading class
> @@ -105,7 +105,7 @@
>       * @param string $var_name (optional) variable to get info for
>       * @return string|array a value or array of values
>       */
> -    function &get($file_name, $section_name = NULL, $var_name = NULL)
> +    function get($file_name, $section_name = NULL, $var_name = NULL)
>      {
>          if (empty($file_name)) {
>              $this->_trigger_error_msg('Empty config file name');
> @@ -240,7 +240,7 @@
>              return false;
>          }
>  
> -        $contents = fread($fp, filesize($config_file));
> +        $contents = ($size = filesize($config_file)) ? 
> fread($fp, $size) : '';
>          fclose($fp);
>  
>          $this->_config_data[$config_file] = 
> $this->parse_contents($contents);
> @@ -285,9 +285,9 @@
>              $line = $lines[$i];
>              if (empty($line)) continue;
>  
> -            if ( $line{0} == '[' && 
> preg_match('!^\[(.*?)\]!', $line, $match) ) {
> +            if ( substr($line, 0, 1) == '[' && 
> preg_match('!^\[(.*?)\]!', $line, $match) ) {
>                  /* section found */
> -                if ($match[1]{0} == '.') {
> +                if (substr($match[1], 0, 1) == '.') {
>                      /* hidden section */
>                      if ($this->read_hidden) {
>                          $section_name = substr($match[1], 1);
> @@ -347,7 +347,7 @@
>       */
>      function _set_config_var(&$container, $var_name, 
> $var_value, $booleanize)
>      {
> -        if ($var_name{0} == '.') {
> +        if (substr($var_name, 0, 1) == '.') {
>              if (!$this->read_hidden)
>                  return;
>              else
> 
> Modified: plog/trunk/class/template/smarty/Smarty.class.php
> ===================================================================
> --- plog/trunk/class/template/smarty/Smarty.class.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ plog/trunk/class/template/smarty/Smarty.class.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -1,12 +1,6 @@
>  <?php
>  
>  /**
> - * WARNING: This smarty class has been modified by me to 
> improve a couple of things so that
> - * they would work better in plog. Do not just update them 
> like that!!!
> - * look in lines 1247 and 1248
> - */
> -
> -/**
>   * Project:     Smarty: the PHP compiling template engine
>   * File:        Smarty.class.php
>   *
> @@ -29,14 +23,14 @@
>   * smarty-general-subscribe at lists.php.net
>   *
>   * @link http://smarty.php.net/
> - * @copyright 2001-2004 ispi of Lincoln, Inc.
> - * @author Monte Ohrt <monte at ispi.net>
> + * @copyright 2001-2005 New Digital Group, Inc.
> + * @author Monte Ohrt <monte at ohrt dot com>
>   * @author Andrei Zmievski <andrei at php.net>
>   * @package Smarty
> - * @version 2.6.2
> + * @version 2.6.12
>   */
>  
> -/* $Id: Smarty.class.php,v 1.2 2004/02/20 15:52:24 
> phunkphorce Exp $ */
> +/* $Id: Smarty.class.php,v 1.523 2005/12/31 19:17:04 messju Exp $ */
>  
>  /**
>   * DIR_SEP isn't used anymore, but third party apps might
> @@ -55,13 +49,17 @@
>      define('SMARTY_DIR', dirname(__FILE__) . DIRECTORY_SEPARATOR);
>  }
>  
> +if (!defined('SMARTY_CORE_DIR')) {
> +    define('SMARTY_CORE_DIR', SMARTY_DIR . 'internals' . 
> DIRECTORY_SEPARATOR);
> +}
> +
>  define('SMARTY_PHP_PASSTHRU',   0);
>  define('SMARTY_PHP_QUOTE',      1);
>  define('SMARTY_PHP_REMOVE',     2);
>  define('SMARTY_PHP_ALLOW',      3);
>  
>  /**
> - * \ingroup Template
> + * @package Smarty
>   */
>  class Smarty
>  {
> @@ -187,7 +185,7 @@
>       *
>       * @var boolean
>       */
> -    var $cache_modified_check = true;
> +    var $cache_modified_check = false;
>  
>      /**
>       * This determines how Smarty handles "<?php ... ?>" 
> tags in templates.
> @@ -234,11 +232,11 @@
>                                                               
>   'isset', 'empty',
>                                                               
>   'count', 'sizeof',
>                                                               
>   'in_array', 'is_array',
> -                                                             
>   'true','false'),
> +                                                             
>   'true', 'false', 'null'),
>                                      'INCLUDE_ANY'     => false,
>                                      'PHP_TAGS'        => false,
>                                      'MODIFIER_FUNCS'  => 
> array('count'),
> -                                    'ALLOW_CONSTANTS' => false
> +                                    'ALLOW_CONSTANTS'  => false
>                                     );
>  
>      /**
> @@ -270,7 +268,7 @@
>       *
>       * @var string
>       */
> -    var $request_vars_order    = "EGPCS";
> +    var $request_vars_order    = 'EGPCS';
>  
>      /**
>       * Indicates wether $HTTP_*_VARS[] 
> (request_use_auto_globals=false)
> @@ -406,13 +404,6 @@
>   * @access private
>   */
>      /**
> -     * error messages. true/false
> -     *
> -     * @var boolean
> -     */
> -    var $_error_msg            = false;
> -
> -    /**
>       * where assigned template vars are kept
>       *
>       * @var array
> @@ -473,7 +464,7 @@
>       *
>       * @var string
>       */
> -    var $_version              = '2.6.2';
> +    var $_version              = '2.6.12';
>  
>      /**
>       * current template inclusion depth
> @@ -923,7 +914,7 @@
>          switch ($type) {
>              case 'output':
>                  $_params = array('plugins' => 
> array(array($type . 'filter', $name, null, null, false)));
> -                require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.load_plugins.php');
> +                require_once(SMARTY_CORE_DIR . 
> 'core.load_plugins.php');
>                  smarty_core_load_plugins($_params, $this);
>                  break;
>  
> @@ -950,10 +941,10 @@
>          if (!isset($compile_id))
>              $compile_id = $this->compile_id;
>  
> -    if (!isset($tpl_file))
> -        $compile_id = null;
> +        if (!isset($tpl_file))
> +            $compile_id = null;
>  
> -    $_auto_id = $this->_get_auto_id($cache_id, $compile_id);
> +        $_auto_id = $this->_get_auto_id($cache_id, $compile_id);
>  
>          if (!empty($this->cache_handler_func)) {
>              return call_user_func_array($this->cache_handler_func,
> @@ -963,7 +954,7 @@
>                              'auto_source' => $tpl_file,
>                              'auto_id' => $_auto_id,
>                              'exp_time' => $exp_time);
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.rm_auto.php');
> +            require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
>              return smarty_core_rm_auto($_params, $this);
>          }
>  
> @@ -978,18 +969,7 @@
>       */
>      function clear_all_cache($exp_time = null)
>      {
> -        if (!empty($this->cache_handler_func)) {
> -            $dummy = null;
> -            call_user_func_array($this->cache_handler_func,
> -                           array('clear', &$this, &$dummy, 
> null, null, null, $exp_time));
> -        } else {
> -            $_params = array('auto_base' => $this->cache_dir,
> -                            'auto_source' => null,
> -                            'auto_id' => null,
> -                            'exp_time' => $exp_time);
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.rm_auto.php');
> -            return smarty_core_rm_auto($_params, $this);
> -        }
> +        return $this->clear_cache(null, null, null, $exp_time);
>      }
>  
>  
> @@ -1014,7 +994,7 @@
>              'cache_id' => $cache_id,
>              'compile_id' => $compile_id
>          );
> -        require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.read_cache_file.php');
> +        require_once(SMARTY_CORE_DIR . 'core.read_cache_file.php');
>          return smarty_core_read_cache_file($_params, $this);
>      }
>  
> @@ -1048,7 +1028,7 @@
>                          'auto_id' => $compile_id,
>                          'exp_time' => $exp_time,
>                          'extensions' => array('.inc', '.php'));
> -        require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.rm_auto.php');
> +        require_once(SMARTY_CORE_DIR . 'core.rm_auto.php');
>          return smarty_core_rm_auto($_params, $this);
>      }
>  
> @@ -1075,9 +1055,12 @@
>      {
>          if(!isset($name)) {
>              return $this->_tpl_vars;
> -        }
> -        if(isset($this->_tpl_vars[$name])) {
> +        } elseif(isset($this->_tpl_vars[$name])) {
>              return $this->_tpl_vars[$name];
> +        } else {
> +            // var non-existant, return valid reference
> +            $_tmp = null;
> +            return $_tmp;   
>          }
>      }
>  
> @@ -1094,6 +1077,10 @@
>              return $this->_config[0]['vars'];
>          } else if(isset($this->_config[0]['vars'][$name])) {
>              return $this->_config[0]['vars'][$name];
> +        } else {
> +            // var non-existant, return valid reference
> +            $_tmp = null;
> +            return $_tmp;
>          }
>      }
>  
> @@ -1152,15 +1139,14 @@
>                      $this->debugging = true;
>                  }
>              } else {
> -                $_cookie_var = 
> $this->request_use_auto_globals ? $_COOKIE['SMARTY_DEBUG'] : 
> $GLOBALS['HTTP_COOKIE_VARS']['SMARTY_DEBUG'];
> -                $this->debugging = $_cookie_var ? true : false;
> +                $this->debugging = 
> (bool)($this->request_use_auto_globals ? 
> @$_COOKIE['SMARTY_DEBUG'] : 
> @$GLOBALS['HTTP_COOKIE_VARS']['SMARTY_DEBUG']);
>              }
>          }
>  
>          if ($this->debugging) {
>              // capture time for debugging info
>              $_params = array();
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_microtime.php');
> +            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
>              $_debug_start_time = 
> smarty_core_get_microtime($_params, $this);
>              $this->_smarty_debug_info[] = array('type'      
> => 'template',
>                                                  'filename'  
> => $resource_name,
> @@ -1185,20 +1171,20 @@
>                  'compile_id' => $compile_id,
>                  'results' => null
>              );
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.read_cache_file.php');
> +            require_once(SMARTY_CORE_DIR . 
> 'core.read_cache_file.php');
>              if (smarty_core_read_cache_file($_params, $this)) {
>                  $_smarty_results = $_params['results'];
> -                if (@count($this->_cache_info['insert_tags'])) {
> +                if (!empty($this->_cache_info['insert_tags'])) {
>                      $_params = array('plugins' => 
> $this->_cache_info['insert_tags']);
> -                    require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.load_plugins.php');
> +                    require_once(SMARTY_CORE_DIR . 
> 'core.load_plugins.php');
>                      smarty_core_load_plugins($_params, $this);
>                      $_params = array('results' => $_smarty_results);
> -                    require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.process_cached_inserts.php');
> +                    require_once(SMARTY_CORE_DIR . 
> 'core.process_cached_inserts.php');
>                      $_smarty_results = 
> smarty_core_process_cached_inserts($_params, $this);
>                  }
> -                if (@count($this->_cache_info['cache_serials'])) {
> +                if (!empty($this->_cache_info['cache_serials'])) {
>                      $_params = array('results' => $_smarty_results);
> -                    require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.process_compiled_include.php');
> +                    require_once(SMARTY_CORE_DIR . 
> 'core.process_compiled_include.php');
>                      $_smarty_results = 
> smarty_core_process_compiled_include($_params, $this);
>                  }
>  
> @@ -1208,9 +1194,9 @@
>                      {
>                          // capture time for debugging info
>                          $_params = array();
> -                        require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_microtime.php');
> +                        require_once(SMARTY_CORE_DIR . 
> 'core.get_microtime.php');
>                          
> $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = 
> smarty_core_get_microtime($_params, $this) - $_debug_start_time;
> -                        require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.display_debug_console.php');
> +                        require_once(SMARTY_CORE_DIR . 
> 'core.display_debug_console.php');
>                          $_smarty_results .= 
> smarty_core_display_debug_console($_params, $this);
>                      }
>                      if ($this->cache_modified_check) {
> @@ -1221,12 +1207,12 @@
>                              && !$this->_cache_serials
>                              && $_gmt_mtime == $_last_modified_date) {
>                              if (php_sapi_name()=='cgi')
> -                                header("Status: 304 Not Modified");
> +                                header('Status: 304 Not Modified');
>                              else
> -                                header("HTTP/1.1 304 Not Modified");
> +                                header('HTTP/1.1 304 Not Modified');
>  
>                          } else {
> -                            header("Last-Modified: ".$_gmt_mtime);
> +                            header('Last-Modified: '.$_gmt_mtime);
>                              echo $_smarty_results;
>                          }
>                      } else {
> @@ -1244,10 +1230,8 @@
>                  }
>              } else {
>                  
> $this->_cache_info['template'][$resource_name] = true;
> -				$timestamp = time();
> -				$this->_cache_info['timestamp'] 
> = $timestamp;					
>                  if ($this->cache_modified_check && $display) {
> -                    header("Last-Modified: ".gmdate('D, d M 
> Y H:i:s', $timestamp).' GMT');
> +                    header('Last-Modified: '.gmdate('D, d M 
> Y H:i:s', time()).' GMT');
>                  }
>              }
>          }
> @@ -1293,9 +1277,9 @@
>                          'cache_id' => $cache_id,
>                          'compile_id' => $compile_id,
>                          'results' => $_smarty_results);
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.write_cache_file.php');
> +            require_once(SMARTY_CORE_DIR . 
> 'core.write_cache_file.php');
>              smarty_core_write_cache_file($_params, $this);
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.process_cached_inserts.php');
> +            require_once(SMARTY_CORE_DIR . 
> 'core.process_cached_inserts.php');
>              $_smarty_results = 
> smarty_core_process_cached_inserts($_params, $this);
>  
>              if ($this->_cache_serials) {
> @@ -1314,9 +1298,9 @@
>              if ($this->debugging) {
>                  // capture time for debugging info
>                  $_params = array();
> -                require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_microtime.php');
> +                require_once(SMARTY_CORE_DIR . 
> 'core.get_microtime.php');
>                  
> $this->_smarty_debug_info[$_included_tpls_idx]['exec_time'] = 
> (smarty_core_get_microtime($_params, $this) - $_debug_start_time);
> -                require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.display_debug_console.php');
> +                require_once(SMARTY_CORE_DIR . 
> 'core.display_debug_console.php');
>                  echo 
> smarty_core_display_debug_console($_params, $this);
>              }
>              error_reporting($_smarty_old_error_level);
> @@ -1382,7 +1366,7 @@
>      function _get_plugin_filepath($type, $name)
>      {
>          $_params = array('type' => $type, 'name' => $name);
> -        require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.assemble_plugin_filepath.php');
> +        require_once(SMARTY_CORE_DIR . 
> 'core.assemble_plugin_filepath.php');
>          return smarty_core_assemble_plugin_filepath($_params, $this);
>      }
>  
> @@ -1435,23 +1419,21 @@
>          }
>  
>          $_source_content = $_params['source_content'];
> -        $_resource_timestamp = $_params['resource_timestamp'];
>          $_cache_include    = substr($compile_path, 0, -4).'.inc';
>  
>          if ($this->_compile_source($resource_name, 
> $_source_content, $_compiled_content, $_cache_include)) {
>              // if a _cache_serial was set, we also have to 
> write an include-file:
>              if ($this->_cache_include_info) {
> -                require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.write_compiled_include.php');
> -                
> smarty_core_write_compiled_include(array_merge($this->_cache_i
> nclude_info, array('compiled_content'=>$_compiled_content)),  $this);
> +                require_once(SMARTY_CORE_DIR . 
> 'core.write_compiled_include.php');
> +                
> smarty_core_write_compiled_include(array_merge($this->_cache_i
> nclude_info, array('compiled_content'=>$_compiled_content, 
> 'resource_name'=>$resource_name)),  $this);
>              }
>  
> -            $_params = array('compile_path'=>$compile_path, 
> 'compiled_content' => $_compiled_content, 
> 'resource_timestamp' => $_resource_timestamp);
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.write_compiled_resource.php');
> +            $_params = array('compile_path'=>$compile_path, 
> 'compiled_content' => $_compiled_content);
> +            require_once(SMARTY_CORE_DIR . 
> 'core.write_compiled_resource.php');
>              smarty_core_write_compiled_resource($_params, $this);
>  
>              return true;
>          } else {
> -            $this->trigger_error($smarty_compiler->_error_msg);
>              return false;
>          }
>  
> @@ -1491,6 +1473,7 @@
>          $smarty_compiler->secure_dir        = $this->secure_dir;
>          $smarty_compiler->security_settings = 
> $this->security_settings;
>          $smarty_compiler->trusted_dir       = $this->trusted_dir;
> +        $smarty_compiler->use_sub_dirs      = $this->use_sub_dirs;
>          $smarty_compiler->_reg_objects      = &$this->_reg_objects;
>          $smarty_compiler->_plugins          = &$this->_plugins;
>          $smarty_compiler->_tpl_vars         = &$this->_tpl_vars;
> @@ -1499,7 +1482,9 @@
>          $smarty_compiler->_config            = $this->_config;
>          $smarty_compiler->request_use_auto_globals  = 
> $this->request_use_auto_globals;
>  
> -        $smarty_compiler->_cache_serial = null;
> +        if (isset($cache_include_path) && 
> isset($this->_cache_serials[$cache_include_path])) {
> +            $smarty_compiler->_cache_serial = 
> $this->_cache_serials[$cache_include_path];
> +        }
>          $smarty_compiler->_cache_include = $cache_include_path;
>  
>  
> @@ -1554,6 +1539,8 @@
>          $_params = array('resource_name' => 
> $params['resource_name']) ;
>          if (isset($params['resource_base_path']))
>              $_params['resource_base_path'] = 
> $params['resource_base_path'];
> +        else
> +            $_params['resource_base_path'] = $this->template_dir;
>  
>          if ($this->_parse_resource_name($_params)) {
>              $_resource_type = $_params['resource_type'];
> @@ -1604,7 +1591,7 @@
>                  $this->trigger_error('unable to read 
> resource: "' . $params['resource_name'] . '"');
>              }
>          } else if ($_return && $this->security) {
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.is_secure.php');
> +            require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
>              if (!smarty_core_is_secure($_params, $this)) {
>                  if (!$params['quiet'])
>                      $this->trigger_error('(secure mode) 
> accessing "' . $params['resource_name'] . '" is not allowed');
> @@ -1649,16 +1636,10 @@
>          }
>  
>          if ($params['resource_type'] == 'file') {
> -            if 
> (!preg_match("/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/", 
> $params['resource_name'])) {
> +            if 
> (!preg_match('/^([\/\\\\]|[a-zA-Z]:[\/\\\\])/', 
> $params['resource_name'])) {
>                  // relative pathname to $params['resource_base_path']
>                  // use the first directory where the file is found
> -                if (isset($params['resource_base_path'])) {
> -                    $_resource_base_path = 
> (array)$params['resource_base_path'];
> -                } else {
> -                    $_resource_base_path = 
> (array)$this->template_dir;
> -                    $_resource_base_path[] = '.';
> -                }
> -                foreach ($_resource_base_path as $_curr_path) {
> +                foreach 
> ((array)$params['resource_base_path'] as $_curr_path) {
>                      $_fullpath = $_curr_path . 
> DIRECTORY_SEPARATOR . $params['resource_name'];
>                      if (file_exists($_fullpath) && 
> is_file($_fullpath)) {
>                          $params['resource_name'] = $_fullpath;
> @@ -1666,17 +1647,20 @@
>                      }
>                      // didn't find the file, try include_path
>                      $_params = array('file_path' => $_fullpath);
> -                    require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_include_path.php');
> +                    require_once(SMARTY_CORE_DIR . 
> 'core.get_include_path.php');
>                      
> if(smarty_core_get_include_path($_params, $this)) {
>                          $params['resource_name'] = 
> $_params['new_file_path'];
>                          return true;
>                      }
>                  }
>                  return false;
> +            } else {
> +                /* absolute path */
> +                return file_exists($params['resource_name']);
>              }
>          } elseif 
> (empty($this->_plugins['resource'][$params['resource_type']])) {
>              $_params = array('type' => $params['resource_type']);
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.load_resource_plugin.php');
> +            require_once(SMARTY_CORE_DIR . 
> 'core.load_resource_plugin.php');
>              smarty_core_load_resource_plugin($_params, $this);
>          }
>  
> @@ -1714,8 +1698,8 @@
>       */
>      function _dequote($string)
>      {
> -        if (($string{0} == "'" || $string{0} == '"') &&
> -            $string{strlen($string)-1} == $string{0})
> +        if ((substr($string, 0, 1) == "'" || substr($string, 
> 0, 1) == '"') &&
> +            substr($string, -1) == substr($string, 0, 1))
>              return substr($string, 1, -1);
>          else
>              return $string;
> @@ -1723,50 +1707,23 @@
>  
>  
>      /**
> -     * read in a file from line $start for $lines.
> -     * read the entire file if $start and $lines are null.
> +     * read in a file
>       *
>       * @param string $filename
> -     * @param integer $start
> -     * @param integer $lines
>       * @return string
>       */
> -    function _read_file($filename, $start=null, $lines=null)
> +    function _read_file($filename)
>      {
> -	if( !is_readable($filename))
> -		return false;
> -
> -        if (!($fd = @fopen($filename, 'r'))) {
> +        if ( file_exists($filename) && ($fd = 
> @fopen($filename, 'rb')) ) {
> +            $contents = '';
> +            while (!feof($fd)) {
> +                $contents .= fread($fd, 8192);
> +            }
> +            fclose($fd);
> +            return $contents;
> +        } else {
>              return false;
>          }
> -        flock($fd, LOCK_SH);
> -        if ($start == null && $lines == null) {
> -            // read the entire file
> -            $contents = fread($fd, filesize($filename));
> -        } else {
> -            if ( $start > 1 ) {
> -                // skip the first lines before $start
> -                for ($loop=1; $loop < $start; $loop++) {
> -                    fgets($fd, 65536);
> -                }
> -            }
> -            if ( $lines == null ) {
> -                // read the rest of the file
> -                while (!feof($fd)) {
> -                    $contents .= fgets($fd, 65536);
> -                }
> -            } else {
> -                // read up to $lines lines
> -                for ($loop=0; $loop < $lines; $loop++) {
> -                    $contents .= fgets($fd, 65536);
> -                    if (feof($fd)) {
> -                        break;
> -                    }
> -                }
> -            }
> -        }
> -        fclose($fd);
> -        return $contents;
>      }
>  
>      /**
> @@ -1782,17 +1739,8 @@
>      function _get_auto_filename($auto_base, $auto_source = 
> null, $auto_id = null)
>      {
>          $_compile_dir_sep =  $this->use_sub_dirs ? 
> DIRECTORY_SEPARATOR : '^';
> +        $_return = $auto_base . DIRECTORY_SEPARATOR;
>  
> -        if(@is_dir($auto_base)) {
> -            $_return = $auto_base . DIRECTORY_SEPARATOR;
> -        } else {
> -            // auto_base not found, try include_path
> -            $_params = array('file_path' => $auto_base);
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_include_path.php');
> -            smarty_core_get_include_path($_params, $this);
> -            $_return = isset($_params['new_file_path']) ? 
> $_params['new_file_path'] . DIRECTORY_SEPARATOR : null;
> -        }
> -
>          if(isset($auto_id)) {
>              // make auto_id safe for directory names
>              $auto_id = 
> str_replace('%7C',$_compile_dir_sep,(urlencode($auto_id)));
> @@ -1803,11 +1751,12 @@
>          if(isset($auto_source)) {
>              // make source name safe for filename
>              $_filename = urlencode(basename($auto_source));
> -            $_crc32 = crc32($auto_source) . $_compile_dir_sep;
> +            $_crc32 = sprintf('%08X', crc32($auto_source));
>              // prepend %% to avoid name conflicts with
>              // with $params['auto_id'] names
> -            $_crc32 = '%%' . substr($_crc32,0,3) . 
> $_compile_dir_sep . '%%' . $_crc32;
> -            $_return .= $_crc32 . $_filename;
> +            $_crc32 = substr($_crc32, 0, 2) . $_compile_dir_sep .
> +                      substr($_crc32, 0, 3) . 
> $_compile_dir_sep . $_crc32;
> +            $_return .= '%%' . $_crc32 . '%%' . $_filename;
>          }
>  
>          return $_return;
> @@ -1823,11 +1772,9 @@
>      {
>          if(isset($exp_time)) {
>              if(time() - @filemtime($resource) >= $exp_time) {
> -	            if( is_readable($resource)) return false;
>                  return @unlink($resource);
>              }
>          } else {
> -	        if( is_readable($resource)) return false;
>              return @unlink($resource);
>          }
>      }
> @@ -1901,7 +1848,7 @@
>      {
>          if ($this->debugging) {
>              $_params = array();
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_microtime.php');
> +            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
>              $debug_start_time = 
> smarty_core_get_microtime($_params, $this);
>              $this->_smarty_debug_info[] = array('type'      
> => 'template',
>                                                    'filename' 
>  => $params['smarty_include_tpl_file'],
> @@ -1932,7 +1879,7 @@
>          if ($this->debugging) {
>              // capture time for debugging info
>              $_params = array();
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_microtime.php');
> +            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
>              
> $this->_smarty_debug_info[$included_tpls_idx]['exec_time'] = 
> smarty_core_get_microtime($_params, $this) - $debug_start_time;
>          }
>  
> @@ -1952,7 +1899,7 @@
>  
>          if ($this->_cache_including) {
>              /* return next set of cache_attrs */
> -            $_return =& current($_cache_attrs);
> +            $_return = current($_cache_attrs);
>              next($_cache_attrs);
>              return $_return;
>  
> 
> Modified: plog/trunk/class/template/smarty/Smarty_Compiler.class.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/Smarty_Compiler.class.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/Smarty_Compiler.class.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -19,18 +19,18 @@
>   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  
> 02111-1307  USA
>   *
>   * @link http://smarty.php.net/
> - * @author Monte Ohrt <monte at ispi.net>
> + * @author Monte Ohrt <monte at ohrt dot com>
>   * @author Andrei Zmievski <andrei at php.net>
> - * @version 2.6.2
> - * @copyright 2001-2004 ispi of Lincoln, Inc.
> + * @version 2.6.12
> + * @copyright 2001-2005 New Digital Group, Inc.
>   * @package Smarty
>   */
>  
> -/* $Id: Smarty_Compiler.class.php,v 1.2 2004/02/20 15:52:24 
> phunkphorce Exp $ */
> +/* $Id: Smarty_Compiler.class.php,v 1.376 2006/01/15 
> 19:29:45 messju Exp $ */
>  
>  /**
>   * Template compiling class
> - * \ingroup Template
> + * @package Smarty
>   */
>  class Smarty_Compiler extends Smarty {
>  
> @@ -49,7 +49,9 @@
>      var $_si_qstr_regexp        =   null;
>      var $_qstr_regexp           =   null;
>      var $_func_regexp           =   null;
> +    var $_reg_obj_regexp        =   null;
>      var $_var_bracket_regexp    =   null;
> +    var $_num_const_regexp      =   null;
>      var $_dvar_guts_regexp      =   null;
>      var $_dvar_regexp           =   null;
>      var $_cvar_regexp           =   null;
> @@ -97,6 +99,12 @@
>          // [$bar]
>          $this->_var_bracket_regexp = '\[\$?[\w\.]+\]';
>  
> +        // matches numerical constants
> +        // 30
> +        // -12
> +        // 13.22
> +        $this->_num_const_regexp = '(?:\-?\d+(?:\.\d+)?)';
> +
>          // matches $ vars (not objects):
>          // $foo
>          // $foo.bar
> @@ -105,11 +113,10 @@
>          // $foo[$bar]
>          // $foo[5][blah]
>          // $foo[5].bar[$foobar][4]
> -        $this->_dvar_math_regexp = '[\+\-\*\/\%]';
> +        $this->_dvar_math_regexp = '(?:[\+\*\/\%]|(?:-(?!>)))';
>          $this->_dvar_math_var_regexp = '[\$\w\.\+\-\*\/\%\d\>\[\]]';
> -        $this->_dvar_num_var_regexp = '\-?\d+(?:\.\d+)?' . 
> $this->_dvar_math_var_regexp;
>          $this->_dvar_guts_regexp = '\w+(?:' . 
> $this->_var_bracket_regexp
> -                . ')*(?:\.\$?\w+(?:' . 
> $this->_var_bracket_regexp . ')*)*(?:' . 
> $this->_dvar_math_regexp . '(?:\-?\d+(?:\.\d+)?|' . 
> $this->_dvar_math_var_regexp . ')*)?';
> +                . ')*(?:\.\$?\w+(?:' . 
> $this->_var_bracket_regexp . ')*)*(?:' . 
> $this->_dvar_math_regexp . '(?:' . $this->_num_const_regexp . 
> '|' . $this->_dvar_math_var_regexp . ')*)?';
>          $this->_dvar_regexp = '\$' . $this->_dvar_guts_regexp;
>  
>          // matches config vars:
> @@ -134,7 +141,7 @@
>          // "text"
>          $this->_var_regexp = '(?:' . $this->_avar_regexp . 
> '|' . $this->_qstr_regexp . ')';
>  
> -        // matches valid object call (no objects allowed in 
> parameters):
> +        // matches valid object call (one level of object 
> nesting allowed in parameters):
>          // $foo->bar
>          // $foo->bar()
>          // $foo->bar("text")
> @@ -142,13 +149,20 @@
>          // $foo->bar($foo, "foo")
>          // $foo->bar->foo()
>          // $foo->bar->foo->bar()
> +        // $foo->bar($foo->bar)
> +        // $foo->bar($foo->bar())
> +        // $foo->bar($foo->bar($blah,$foo,44,"foo",$foo[0].bar))
>          $this->_obj_ext_regexp = '\->(?:\$?' . 
> $this->_dvar_guts_regexp . ')';
> -        $this->_obj_params_regexp = '\((?:\w+|'
> -                . $this->_var_regexp . '(?:\s*,\s*(?:(?:\w+|'
> -                . $this->_var_regexp . ')))*)?\)';
> +        $this->_obj_restricted_param_regexp = '(?:'
> +                . '(?:' . $this->_var_regexp . '|' . 
> $this->_num_const_regexp . ')(?:' . $this->_obj_ext_regexp . 
> '(?:\((?:(?:' . $this->_var_regexp . '|' . 
> $this->_num_const_regexp . ')'
> +                . '(?:\s*,\s*(?:' . $this->_var_regexp . '|' 
> . $this->_num_const_regexp . '))*)?\))?)*)';
> +        $this->_obj_single_param_regexp = '(?:\w+|' . 
> $this->_obj_restricted_param_regexp . '(?:\s*,\s*(?:(?:\w+|'
> +                . $this->_var_regexp . 
> $this->_obj_restricted_param_regexp . ')))*)';
> +        $this->_obj_params_regexp = '\((?:' . 
> $this->_obj_single_param_regexp
> +                . '(?:\s*,\s*' . 
> $this->_obj_single_param_regexp . ')*)?\)';
>          $this->_obj_start_regexp = '(?:' . 
> $this->_dvar_regexp . '(?:' . $this->_obj_ext_regexp . ')+)';
> -        $this->_obj_call_regexp = '(?:' . 
> $this->_obj_start_regexp . '(?:' . $this->_obj_params_regexp . ')?)';
> -
> +        $this->_obj_call_regexp = '(?:' . 
> $this->_obj_start_regexp . '(?:' . $this->_obj_params_regexp 
> . ')?(?:' . $this->_dvar_math_regexp . '(?:' . 
> $this->_num_const_regexp . '|' . $this->_dvar_math_var_regexp 
> . ')*)?)';
> +        
>          // matches valid modifier syntax:
>          // |foo
>          // |@foo
> @@ -157,7 +171,7 @@
>          // |foo:"bar":$foobar
>          // |foo|bar
>          // |foo:$foo->bar
> -        $this->_mod_regexp = '(?:\|@?\w+(?::(?>-?\w+|'
> +        $this->_mod_regexp = '(?:\|@?\w+(?::(?:\w+|' . 
> $this->_num_const_regexp . '|'
>             . $this->_obj_call_regexp . '|' . 
> $this->_avar_regexp . '|' . $this->_qstr_regexp .'))*)';
>  
>          // matches valid function name:
> @@ -179,7 +193,7 @@
>          // "text"|bar
>          // $foo->bar
>          $this->_param_regexp = '(?:\s*(?:' . 
> $this->_obj_call_regexp . '|'
> -           . $this->_var_regexp  . '|\w+)(?>' . 
> $this->_mod_regexp . '*)\s*)';
> +           . $this->_var_regexp . '|' . 
> $this->_num_const_regexp  . '|\w+)(?>' . $this->_mod_regexp . 
> '*)\s*)';
>  
>          // matches valid parenthesised function parameters:
>          //
> @@ -223,8 +237,8 @@
>  
>          $this->_current_file = $resource_name;
>          $this->_current_line_no = 1;
> -        $ldq = preg_quote($this->left_delimiter, '!');
> -        $rdq = preg_quote($this->right_delimiter, '!');
> +        $ldq = preg_quote($this->left_delimiter, '~');
> +        $rdq = preg_quote($this->right_delimiter, '~');
>  
>          // run template source through prefilter functions
>          if (count($this->_plugins['prefilter']) > 0) {
> @@ -241,7 +255,7 @@
>          }
>  
>          /* fetch all special blocks */
> -        $search = 
> "!{$ldq}\*(.*?)\*{$rdq}|{$ldq}\s*literal\s*{$rdq}(.*?){$ldq}\s
> */literal\s*{$rdq}|{$ldq}\s*php\s*{$rdq}(.*?){$ldq}\s*/php\s*{
> $rdq}!s";
> +        $search = 
> "~{$ldq}\*(.*?)\*{$rdq}|{$ldq}\s*literal\s*{$rdq}(.*?){$ldq}\s
> */literal\s*{$rdq}|{$ldq}\s*php\s*{$rdq}(.*?){$ldq}\s*/php\s*{
> $rdq}~s";
>  
>          preg_match_all($search, $source_content, $match,  
> PREG_SET_ORDER);
>          $this->_folded_blocks = $match;
> @@ -256,15 +270,15 @@
>                                         , $source_content);
>  
>          /* Gather all template tags. */
> -        preg_match_all("!{$ldq}\s*(.*?)\s*{$rdq}!s", 
> $source_content, $_match);
> +        preg_match_all("~{$ldq}\s*(.*?)\s*{$rdq}~s", 
> $source_content, $_match);
>          $template_tags = $_match[1];
>          /* Split content by template tags to obtain 
> non-template content. */
> -        $text_blocks = preg_split("!{$ldq}.*?{$rdq}!s", 
> $source_content);
> +        $text_blocks = preg_split("~{$ldq}.*?{$rdq}~s", 
> $source_content);
>  
>          /* loop through text blocks */
>          for ($curr_tb = 0, $for_max = count($text_blocks); 
> $curr_tb < $for_max; $curr_tb++) {
>              /* match anything resembling php tags */
> -            if 
> (preg_match_all('!(<\?(?:\w+|=)?|\?>|language\s*=\s*[\"\']?php
> [\"\']?)!is', $text_blocks[$curr_tb], $sp_match)) {
> +            if 
> (preg_match_all('~(<\?(?:\w+|=)?|\?>|language\s*=\s*[\"\']?php
> [\"\']?)~is', $text_blocks[$curr_tb], $sp_match)) {
>                  /* replace tags with placeholders to prevent 
> recursive replacements */
>                  $sp_match[1] = array_unique($sp_match[1]);
>                  usort($sp_match[1], '_smarty_sort_length');
> @@ -284,7 +298,7 @@
>                          $text_blocks[$curr_tb] = 
> str_replace('%%%SMARTYSP'.$curr_sp.'%%%', '', $text_blocks[$curr_tb]);
>                      } else {
>                          /* SMARTY_PHP_ALLOW, but echo non 
> php starting tags */
> -                        $sp_match[1][$curr_sp] = 
> preg_replace('%(<\?(?!php|=|$))%i', '<?php echo 
> \'\\1\'?>'."\n", $sp_match[1][$curr_sp]);
> +                        $sp_match[1][$curr_sp] = 
> preg_replace('~(<\?(?!php|=|$))~i', '<?php echo 
> \'\\1\'?>'."\n", $sp_match[1][$curr_sp]);
>                          $text_blocks[$curr_tb] = 
> str_replace('%%%SMARTYSP'.$curr_sp.'%%%', 
> $sp_match[1][$curr_sp], $text_blocks[$curr_tb]);
>                      }
>                  }
> @@ -304,31 +318,50 @@
>              return;
>          }
>  
> +        /* Reformat $text_blocks between 'strip' and '/strip' tags,
> +           removing spaces, tabs and newlines. */
> +        $strip = false;
> +        for ($i = 0, $for_max = count($compiled_tags); $i < 
> $for_max; $i++) {
> +            if ($compiled_tags[$i] == '{strip}') {
> +                $compiled_tags[$i] = '';
> +                $strip = true;
> +                /* remove leading whitespaces */
> +                $text_blocks[$i + 1] = ltrim($text_blocks[$i + 1]);
> +            }
> +            if ($strip) {
> +                /* strip all $text_blocks before the next '/strip' */
> +                for ($j = $i + 1; $j < $for_max; $j++) {
> +                    /* remove leading and trailing 
> whitespaces of each line */
> +                    $text_blocks[$j] = preg_replace('![\t 
> ]*[\r\n]+[\t ]*!', '', $text_blocks[$j]);
> +                    if ($compiled_tags[$j] == '{/strip}') {  
>                      
> +                        /* remove trailing whitespaces from 
> the last text_block */
> +                        $text_blocks[$j] = rtrim($text_blocks[$j]);
> +                    }
> +                    $text_blocks[$j] = "<?php echo '" . 
> strtr($text_blocks[$j], array("'"=>"\'", "\\"=>"\\\\")) . "'; ?>";
> +                    if ($compiled_tags[$j] == '{/strip}') {
> +                        $compiled_tags[$j] = "\n"; /* 
> slurped by php, but necessary
> +                                    if a newline is 
> following the closing strip-tag */
> +                        $strip = false;
> +                        $i = $j;
> +                        break;
> +                    }
> +                }
> +            }
> +        }
>          $compiled_content = '';
>  
>          /* Interleave the compiled contents and text blocks 
> to get the final result. */
>          for ($i = 0, $for_max = count($compiled_tags); $i < 
> $for_max; $i++) {
>              if ($compiled_tags[$i] == '') {
>                  // tag result empty, remove first newline 
> from following text block
> -                $text_blocks[$i+1] = 
> preg_replace('!^(\r\n|\r|\n)!', '', $text_blocks[$i+1]);
> +                $text_blocks[$i+1] = 
> preg_replace('~^(\r\n|\r|\n)~', '', $text_blocks[$i+1]);
>              }
>              $compiled_content .= $text_blocks[$i].$compiled_tags[$i];
>          }
>          $compiled_content .= $text_blocks[$i];
>  
> -        /* Reformat data between 'strip' and '/strip' tags, 
> removing spaces, tabs and newlines. */
> -        if 
> (preg_match_all("!{$ldq}strip{$rdq}.*?{$ldq}/strip{$rdq}!s", 
> $compiled_content, $_match)) {
> -            $strip_tags = $_match[0];
> -            $strip_tags_modified = 
> preg_replace("!{$ldq}/?strip{$rdq}|[\t ]+$|^[\t ]+!m", '', 
> $strip_tags);
> -            $strip_tags_modified = 
> preg_replace('![\r\n]+!m', '', $strip_tags_modified);
> -            for ($i = 0, $for_max = count($strip_tags); $i < 
> $for_max; $i++)
> -                $compiled_content = 
> preg_replace("!{$ldq}strip{$rdq}.*?{$ldq}/strip{$rdq}!s",
> -                                                  
> $this->_quote_replace($strip_tags_modified[$i]),
> -                                                  
> $compiled_content, 1);
> -        }
> -
>          // remove \n from the end of the file, if any
> -        if (($_len=strlen($compiled_content)) && 
> ($compiled_content{$_len - 1} == "\n" )) {
> +        if (strlen($compiled_content) && 
> (substr($compiled_content, -1) == "\n") ) {
>              $compiled_content = substr($compiled_content, 0, -1);
>          }
>  
> @@ -337,7 +370,7 @@
>          }
>  
>          // remove unnecessary close/open tags
> -        $compiled_content = preg_replace('!\?>\n?<\?php!', 
> '', $compiled_content);
> +        $compiled_content = preg_replace('~\?>\n?<\?php~', 
> '', $compiled_content);
>  
>          // run compiled template through postfilter functions
>          if (count($this->_plugins['postfilter']) > 0) {
> @@ -363,19 +396,19 @@
>              $_plugins_params = "array('plugins' => array(";
>              foreach ($this->_plugin_info as $plugin_type => 
> $plugins) {
>                  foreach ($plugins as $plugin_name => $plugin_info) {
> -                    $_plugins_params .= 
> "array('$plugin_type', '$plugin_name', '$plugin_info[0]', 
> $plugin_info[1], ";
> +                    $_plugins_params .= 
> "array('$plugin_type', '$plugin_name', '" . 
> strtr($plugin_info[0], array("'" => "\\'", "\\" => "\\\\")) . 
> "', $plugin_info[1], ";
>                      $_plugins_params .= $plugin_info[2] ? 
> 'true),' : 'false),';
>                  }
>              }
>              $_plugins_params .= '))';
> -            $plugins_code = "<?php require_once(SMARTY_DIR . 
> 'core' . DIRECTORY_SEPARATOR . 
> 'core.load_plugins.php');\nsmarty_core_load_plugins($_plugins_
> params, \$this); ?>\n";
> +            $plugins_code = "<?php 
> require_once(SMARTY_CORE_DIR . 
> 'core.load_plugins.php');\nsmarty_core_load_plugins($_plugins_
> params, \$this); ?>\n";
>              $template_header .= $plugins_code;
>              $this->_plugin_info = array();
>              $this->_plugins_code = $plugins_code;
>          }
>  
>          if ($this->_init_smarty_vars) {
> -            $template_header .= "<?php 
> require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 
> 'core.assign_smarty_interface.php');\nsmarty_core_assign_smart
> y_interface(null, \$this); ?>\n";
> +            $template_header .= "<?php 
> require_once(SMARTY_CORE_DIR . 
> 'core.assign_smarty_interface.php');\nsmarty_core_assign_smart
> y_interface(null, \$this); ?>\n";
>              $this->_init_smarty_vars = false;
>          }
>  
> @@ -392,33 +425,29 @@
>      function _compile_tag($template_tag)
>      {
>          /* Matched comment. */
> -        if ($template_tag{0} == '*' && 
> $template_tag{strlen($template_tag) - 1} == '*')
> +        if (substr($template_tag, 0, 1) == '*' && 
> substr($template_tag, -1) == '*')
>              return '';
> -
> +        
>          /* Split tag into two three parts: command, command 
> modifiers and the arguments. */
> -        if(! preg_match('/^(?:(' . $this->_obj_call_regexp . 
> '|' . $this->_var_regexp
> +        if(! preg_match('~^(?:(' . $this->_num_const_regexp 
> . '|' . $this->_obj_call_regexp . '|' . $this->_var_regexp
>                  . '|\/?' . $this->_reg_obj_regexp . '|\/?' . 
> $this->_func_regexp . ')(' . $this->_mod_regexp . '*))
>                        (?:\s+(.*))?$
> -                    /xs', $template_tag, $match)) {
> +                    ~xs', $template_tag, $match)) {
>              $this->_syntax_error("unrecognized tag: 
> $template_tag", E_USER_ERROR, __FILE__, __LINE__);
>          }
> -
> +        
>          $tag_command = $match[1];
>          $tag_modifier = isset($match[2]) ? $match[2] : null;
>          $tag_args = isset($match[3]) ? $match[3] : null;
>  
> -        if (preg_match('!^' . $this->_obj_call_regexp . '|' 
> . $this->_var_regexp . '$!', $tag_command)) {
> +        if (preg_match('~^' . $this->_num_const_regexp . '|' 
> . $this->_obj_call_regexp . '|' . $this->_var_regexp . '$~', 
> $tag_command)) {
>              /* tag name is a variable or object */
> -            $_return = $this->_parse_var_props($tag_command 
> . $tag_modifier, $this->_parse_attrs($tag_args));
> -            if(isset($_tag_attrs['assign'])) {
> -                return "<?php \$this->assign('" . 
> $this->_dequote($_tag_attrs['assign']) . "', $_return ); ?>\n";
> -            } else {
> -                return "<?php echo $_return; ?>" . 
> $this->_additional_newline;
> -            }
> +            $_return = $this->_parse_var_props($tag_command 
> . $tag_modifier);
> +            return "<?php echo $_return; ?>" . 
> $this->_additional_newline;
>          }
>  
>          /* If the tag name is a registered object, we process it. */
> -        if (preg_match('!^\/?' . $this->_reg_obj_regexp . 
> '$!', $tag_command)) {
> +        if (preg_match('~^\/?' . $this->_reg_obj_regexp . 
> '$~', $tag_command)) {
>              return 
> $this->_compile_registered_object_tag($tag_command, 
> $this->_parse_attrs($tag_args), $tag_modifier);
>          }
>  
> @@ -436,7 +465,7 @@
>              case 'else':
>                  list($_open_tag) = end($this->_tag_stack);
>                  if ($_open_tag != 'if' && $_open_tag != 'elseif')
> -                    $this->_syntax_error('unxepected 
> {else}', E_USER_ERROR, __FILE__, __LINE__);
> +                    $this->_syntax_error('unexpected 
> {else}', E_USER_ERROR, __FILE__, __LINE__);
>                  else
>                      $this->_push_tag('else');
>                  return '<?php else: ?>';
> @@ -444,7 +473,7 @@
>              case 'elseif':
>                  list($_open_tag) = end($this->_tag_stack);
>                  if ($_open_tag != 'if' && $_open_tag != 'elseif')
> -                    $this->_syntax_error('unxepected 
> {elseif}', E_USER_ERROR, __FILE__, __LINE__);
> +                    $this->_syntax_error('unexpected 
> {elseif}', E_USER_ERROR, __FILE__, __LINE__);
>                  if ($_open_tag == 'if')
>                      $this->_push_tag('elseif');
>                  return $this->_compile_if_tag($tag_args, true);
> @@ -488,29 +517,29 @@
>  
>              case 'foreachelse':
>                  $this->_push_tag('foreachelse');
> -                return "<?php endforeach; unset(\$_from); else: ?>";
> +                return "<?php endforeach; else: ?>";
>  
>              case '/foreach':
>                  $_open_tag = $this->_pop_tag('foreach');
>                  if ($_open_tag == 'foreachelse')
> -                    return "<?php endif; ?>";
> +                    return "<?php endif; unset(\$_from); ?>";
>                  else
> -                    return "<?php endforeach; 
> unset(\$_from); endif; ?>";
> +                    return "<?php endforeach; endif; 
> unset(\$_from); ?>";
>                  break;
>  
>              case 'strip':
>              case '/strip':
> -                if ($tag_command{0}=='/') {
> +                if (substr($tag_command, 0, 1)=='/') {
>                      $this->_pop_tag('strip');
>                      if (--$this->_strip_depth==0) { /* 
> outermost closing {/strip} */
>                          $this->_additional_newline = "\n";
> -                        return 
> $this->left_delimiter.$tag_command.$this->right_delimiter;
> +                        return '{' . $tag_command . '}';
>                      }
>                  } else {
>                      $this->_push_tag('strip');
>                      if ($this->_strip_depth++==0) { /* 
> outermost opening {strip} */
>                          $this->_additional_newline = "";
> -                        return 
> $this->left_delimiter.$tag_command.$this->right_delimiter;
> +                        return '{' . $tag_command . '}';
>                      }
>                  }
>                  return '';
> @@ -546,7 +575,7 @@
>                  } else if 
> ($this->_compile_block_tag($tag_command, $tag_args, 
> $tag_modifier, $output)) {
>                      return $output;
>                  } else if 
> ($this->_compile_custom_tag($tag_command, $tag_args, 
> $tag_modifier, $output)) {
> -                    return $output;
> +                    return $output;                    
>                  } else {
>                      $this->_syntax_error("unrecognized tag 
> '$tag_command'", E_USER_ERROR, __FILE__, __LINE__);
>                  }
> @@ -635,7 +664,7 @@
>       */
>      function _compile_block_tag($tag_command, $tag_args, 
> $tag_modifier, &$output)
>      {
> -        if ($tag_command{0} == '/') {
> +        if (substr($tag_command, 0, 1) == '/') {
>              $start_tag = false;
>              $tag_command = substr($tag_command, 1);
>          } else
> @@ -697,17 +726,18 @@
>          if ($start_tag) {
>              $output = '<?php ' . 
> $this->_push_cacheable_state('block', $tag_command);
>              $attrs = $this->_parse_attrs($tag_args);
> -            $arg_list = $this->_compile_arg_list('block', 
> $tag_command, $attrs, $_cache_attrs='');
> +            $_cache_attrs='';
> +            $arg_list = $this->_compile_arg_list('block', 
> $tag_command, $attrs, $_cache_attrs);
>              $output .= "$_cache_attrs\$this->_tag_stack[] = 
> array('$tag_command', array(".implode(',', $arg_list).')); ';
> -            $output .= $this->_compile_plugin_call('block', 
> $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][
> 1], null, $this, $_block_repeat=true);';
> +            $output .= '$_block_repeat=true;' . 
> $this->_compile_plugin_call('block', 
> $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][
> 1], null, $this, $_block_repeat);';
>              $output .= 'while ($_block_repeat) { ob_start(); ?>';
>          } else {
> -            $output = '<?php $this->_block_content = 
> ob_get_contents(); ob_end_clean(); ';
> -            $_out_tag_text = 
> $this->_compile_plugin_call('block', 
> $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][
> 1], $this->_block_content, $this, $_block_repeat=false)';
> +            $output = '<?php $_block_content = 
> ob_get_contents(); ob_end_clean(); ';
> +            $_out_tag_text = 
> $this->_compile_plugin_call('block', 
> $tag_command).'($this->_tag_stack[count($this->_tag_stack)-1][
> 1], $_block_content, $this, $_block_repeat)';
>              if ($tag_modifier != '') {
>                  $this->_parse_modifiers($_out_tag_text, 
> $tag_modifier);
>              }
> -            $output .= 'echo '.$_out_tag_text.'; } ';
> +            $output .= '$_block_repeat=false;echo ' . 
> $_out_tag_text . '; } ';
>              $output .= " array_pop(\$this->_tag_stack); " . 
> $this->_pop_cacheable_state('block', $tag_command) . '?>';
>          }
>  
> @@ -772,7 +802,8 @@
>  
>          $_cacheable_state = 
> $this->_push_cacheable_state('function', $tag_command);
>          $attrs = $this->_parse_attrs($tag_args);
> -        $arg_list = $this->_compile_arg_list('function', 
> $tag_command, $attrs, $_cache_attrs='');
> +        $_cache_attrs = '';
> +        $arg_list = $this->_compile_arg_list('function', 
> $tag_command, $attrs, $_cache_attrs);
>  
>          $output = $this->_compile_plugin_call('function', 
> $tag_command).'(array('.implode(',', $arg_list)."), \$this)";
>          if($tag_modifier != '') {
> @@ -797,7 +828,7 @@
>       */
>      function _compile_registered_object_tag($tag_command, 
> $attrs, $tag_modifier)
>      {
> -        if ($tag_command{0} == '/') {
> +        if (substr($tag_command, 0, 1) == '/') {
>              $start_tag = false;
>              $tag_command = substr($tag_command, 1);
>          } else {
> @@ -845,13 +876,13 @@
>                  // block method
>                  if ($start_tag) {
>                      $prefix = "\$this->_tag_stack[] = 
> array('$obj_comp', $args); ";
> -                    $prefix .= 
> "\$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_st
> ack[count(\$this->_tag_stack)-1][1], null, \$this, 
> \$_block_repeat=true); ";
> +                    $prefix .= "\$_block_repeat=true; 
> \$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_sta
> ck[count(\$this->_tag_stack)-1][1], null, \$this, \$_block_repeat); ";
>                      $prefix .= "while (\$_block_repeat) { 
> ob_start();";
>                      $return = null;
>                      $postfix = '';
>              } else {
> -                    $prefix = "\$this->_obj_block_content = 
> ob_get_contents(); ob_end_clean(); ";
> -                    $return = 
> "\$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_st
> ack[count(\$this->_tag_stack)-1][1], 
> \$this->_obj_block_content, \$this, \$_block_repeat=false)";
> +                    $prefix = "\$_obj_block_content = 
> ob_get_contents(); ob_end_clean(); ";
> +                    $return = "\$_block_repeat=false; 
> \$this->_reg_objects['$object'][0]->$obj_comp(\$this->_tag_sta
> ck[count(\$this->_tag_stack)-1][1], \$_obj_block_content, 
> \$this, \$_block_repeat)";
>                      $postfix = "} array_pop(\$this->_tag_stack);";
>                  }
>              } else {
> @@ -912,7 +943,7 @@
>  
>          $_params = "array('args' => array(".implode(', ', 
> (array)$arg_list)."))";
>  
> -        return "<?php require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.run_insert_handler.php');\necho 
> smarty_core_run_insert_handler($_params, \$this); ?>" . 
> $this->_additional_newline;
> +        return "<?php require_once(SMARTY_CORE_DIR . 
> 'core.run_insert_handler.php');\necho 
> smarty_core_run_insert_handler($_params, \$this); ?>" . 
> $this->_additional_newline;
>      }
>  
>      /**
> @@ -996,7 +1027,7 @@
>  
>          $_params = "array('smarty_file' => " . 
> $attrs['file'] . ", 'smarty_assign' => '$assign_var', 
> 'smarty_once' => $once_var, 'smarty_include_vars' => 
> array(".implode(',', $arg_list)."))";
>  
> -        return "<?php require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 
> 'core.smarty_include_php.php');\nsmarty_core_smarty_include_ph
> p($_params, \$this); ?>" . $this->_additional_newline;
> +        return "<?php require_once(SMARTY_CORE_DIR . 
> 'core.smarty_include_php.php');\nsmarty_core_smarty_include_ph
> p($_params, \$this); ?>" . $this->_additional_newline;
>      }
>  
>  
> @@ -1017,7 +1048,7 @@
>              $this->_syntax_error("missing section name", 
> E_USER_ERROR, __FILE__, __LINE__);
>          }
>  
> -        $output .= "if 
> (isset(\$this->_sections[$section_name])) 
> unset(\$this->_sections[$section_name]);\n";
> +        $output .= "unset(\$this->_sections[$section_name]);\n";
>          $section_props = "\$this->_sections[$section_name]";
>  
>          foreach ($attrs as $attr_name => $attr_value) {
> @@ -1117,50 +1148,45 @@
>          $arg_list = array();
>  
>          if (empty($attrs['from'])) {
> -            $this->_syntax_error("missing 'from' attribute", 
> E_USER_ERROR, __FILE__, __LINE__);
> +            return $this->_syntax_error("foreach: missing 
> 'from' attribute", E_USER_ERROR, __FILE__, __LINE__);
>          }
> +        $from = $attrs['from'];
>  
>          if (empty($attrs['item'])) {
> -            $this->_syntax_error("missing 'item' attribute", 
> E_USER_ERROR, __FILE__, __LINE__);
> +            return $this->_syntax_error("foreach: missing 
> 'item' attribute", E_USER_ERROR, __FILE__, __LINE__);
>          }
> -
> -        $from = $attrs['from'];
>          $item = $this->_dequote($attrs['item']);
> -        if (isset($attrs['name']))
> -            $name = $attrs['name'];
> -
> -        $output = '<?php ';
> -        if (isset($name)) {
> -            $output .= "if (isset(\$this->_foreach[$name])) 
> unset(\$this->_foreach[$name]);\n";
> -            $foreach_props = "\$this->_foreach[$name]";
> +        if (!preg_match('~^\w+$~', $item)) {
> +            return $this->_syntax_error("'foreach: item' 
> must be a variable name (literal string)", E_USER_ERROR, 
> __FILE__, __LINE__);
>          }
>  
> -        $key_part = '';
> -
> -        foreach ($attrs as $attr_name => $attr_value) {
> -            switch ($attr_name) {
> -                case 'key':
> -                    $key  = $this->_dequote($attrs['key']);
> -                    $key_part = "\$this->_tpl_vars['$key'] => ";
> -                    break;
> -
> -                case 'name':
> -                    $output .= 
> "{$foreach_props}['$attr_name'] = $attr_value;\n";
> -                    break;
> +        if (isset($attrs['key'])) {
> +            $key  = $this->_dequote($attrs['key']);
> +            if (!preg_match('~^\w+$~', $key)) {
> +                return $this->_syntax_error("foreach: 'key' 
> must to be a variable name (literal string)", E_USER_ERROR, 
> __FILE__, __LINE__);
>              }
> +            $key_part = "\$this->_tpl_vars['$key'] => ";
> +        } else {
> +            $key = null;
> +            $key_part = '';
>          }
>  
> +        if (isset($attrs['name'])) {
> +            $name = $attrs['name'];
> +        } else {
> +            $name = null;
> +        }
> +
> +        $output = '<?php ';
> +        $output .= "\$_from = $from; if (!is_array(\$_from) 
> && !is_object(\$_from)) { settype(\$_from, 'array'); }";
>          if (isset($name)) {
> -            $output .= "{$foreach_props}['total'] = 
> count(\$_from = (array)$from);\n";
> -            $output .= "{$foreach_props}['show'] = 
> {$foreach_props}['total'] > 0;\n";
> -            $output .= "if ({$foreach_props}['show']):\n";
> -            $output .= "{$foreach_props}['iteration'] = 0;\n";
> +            $foreach_props = "\$this->_foreach[$name]";
> +            $output .= "{$foreach_props} = array('total' => 
> count(\$_from), 'iteration' => 0);\n";
> +            $output .= "if ({$foreach_props}['total'] > 0):\n";
>              $output .= "    foreach (\$_from as 
> $key_part\$this->_tpl_vars['$item']):\n";
>              $output .= "        {$foreach_props}['iteration']++;\n";
> -            $output .= "        {$foreach_props}['first'] = 
> ({$foreach_props}['iteration'] == 1);\n";
> -            $output .= "        {$foreach_props}['last']  = 
> ({$foreach_props}['iteration'] == {$foreach_props}['total']);\n";
>          } else {
> -            $output .= "if (count(\$_from = (array)$from)):\n";
> +            $output .= "if (count(\$_from)):\n";
>              $output .= "    foreach (\$_from as 
> $key_part\$this->_tpl_vars['$item']):\n";
>          }
>          $output .= '?>';
> @@ -1216,16 +1242,23 @@
>      {
>  
>          /* Tokenize args for 'if' tag. */
> -        preg_match_all('/(?>
> +        preg_match_all('~(?>
>                  ' . $this->_obj_call_regexp . '(?:' . 
> $this->_mod_regexp . '*)? | # valid object call
>                  ' . $this->_var_regexp . '(?:' . 
> $this->_mod_regexp . '*)?    | # var or quoted string
>                  
> \-?0[xX][0-9a-fA-F]+|\-?\d+(?:\.\d+)?|\.\d+|!==|===|==|!=|<>|<
> <|>>|<=|>=|\&\&|\|\||\(|\)|,|\!|\^|=|\&|\~|<|>|\||\%|\+|\-|\/|
> \*|\@    | # valid non-word token
>                  \b\w+\b                                      
>                   | # valid word token
>                  \S+                                          
>                  # anything else
> -                )/x', $tag_args, $match);
> +                )~x', $tag_args, $match);
>  
>          $tokens = $match[0];
>  
> +        if(empty($tokens)) {
> +            $_error_msg .= $elseif ? "'elseif'" : "'if'";
> +            $_error_msg .= ' statement requires arguments'; 
> +            $this->_syntax_error($_error_msg, E_USER_ERROR, 
> __FILE__, __LINE__);
> +        }
> +            
> +                
>          // make sure we have balanced parenthesis
>          $token_count = array_count_values($tokens);
>          if(isset($token_count['(']) && $token_count['('] != 
> $token_count[')']) {
> @@ -1342,13 +1375,16 @@
>                      break;
>  
>                  default:
> -                    if(preg_match('!^' . $this->_func_regexp 
> . '$!', $token) ) {
> +                    if(preg_match('~^' . $this->_func_regexp 
> . '$~', $token) ) {
>                              // function call
>                              if($this->security &&
>                                 !in_array($token, 
> $this->security_settings['IF_FUNCS'])) {
>                                  
> $this->_syntax_error("(secure mode) '$token' not allowed in 
> if statement", E_USER_ERROR, __FILE__, __LINE__);
>                              }
> -                    } elseif(preg_match('!^' . 
> $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . 
> $this->_mod_regexp . '*)$!', $token)) {
> +                    } elseif(preg_match('~^' . 
> $this->_var_regexp . '$~', $token) && (strpos('+-*/^%&|', 
> substr($token, -1)) === false) && isset($tokens[$i+1]) && 
> $tokens[$i+1] == '(') {
> +                        // variable function call
> +                        $this->_syntax_error("variable 
> function call '$token' not allowed in if statement", 
> E_USER_ERROR, __FILE__, __LINE__);                      
> +                    } elseif(preg_match('~^' . 
> $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . 
> $this->_mod_regexp . '*)$~', $token)) {
>                          // object or variable
>                          $token = $this->_parse_var_props($token);
>                      } elseif(is_numeric($token)) {
> @@ -1472,10 +1508,10 @@
>      {
>  
>          /* Tokenize tag attributes. */
> -        preg_match_all('/(?:' . $this->_obj_call_regexp . 
> '|' . $this->_qstr_regexp . ' | (?>[^"\'=\s]+)
> +        preg_match_all('~(?:' . $this->_obj_call_regexp . 
> '|' . $this->_qstr_regexp . ' | (?>[^"\'=\s]+)
>                           )+ |
>                           [=]
> -                        /x', $tag_args, $match);
> +                        ~x', $tag_args, $match);
>          $tokens       = $match[0];
>  
>          $attrs = array();
> @@ -1490,7 +1526,7 @@
>                  case 0:
>                      /* If the token is a valid identifier, 
> we set attribute name
>                         and go to state 1. */
> -                    if (preg_match('!^\w+$!', $token)) {
> +                    if (preg_match('~^\w+$~', $token)) {
>                          $attr_name = $token;
>                          $state = 1;
>                      } else
> @@ -1511,15 +1547,15 @@
>                      if ($token != '=') {
>                          /* We booleanize the token if it's a 
> non-quoted possible
>                             boolean value. */
> -                        if (preg_match('!^(on|yes|true)$!', 
> $token)) {
> +                        if (preg_match('~^(on|yes|true)$~', 
> $token)) {
>                              $token = 'true';
> -                        } else if 
> (preg_match('!^(off|no|false)$!', $token)) {
> +                        } else if 
> (preg_match('~^(off|no|false)$~', $token)) {
>                              $token = 'false';
>                          } else if ($token == 'null') {
>                              $token = 'null';
> -                        } else if 
> (preg_match('!^-?([0-9]+|0[xX][0-9a-fA-F]+)$!', $token)) {
> +                        } else if (preg_match('~^' . 
> $this->_num_const_regexp . '|0[xX][0-9a-fA-F]+$~', $token)) {
>                              /* treat integer literally */
> -                        } else if (!preg_match('!^' . 
> $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . 
> $this->_mod_regexp . ')*$!', $token)) {
> +                        } else if (!preg_match('~^' . 
> $this->_obj_call_regexp . '|' . $this->_var_regexp . '(?:' . 
> $this->_mod_regexp . ')*$~', $token)) {
>                              /* treat as a string, 
> double-quote it escaping quotes */
>                              $token = '"'.addslashes($token).'"';
>                          }
> @@ -1571,44 +1607,52 @@
>      {
>          $val = trim($val);
>  
> -        if(preg_match('!^(' . $this->_obj_call_regexp . '|' 
> . $this->_dvar_regexp . ')(' . $this->_mod_regexp . '*)$!', 
> $val, $match)) {
> +        if(preg_match('~^(' . $this->_obj_call_regexp . '|' 
> . $this->_dvar_regexp . ')(' . $this->_mod_regexp . '*)$~', 
> $val, $match)) {
>              // $ variable or object
>              $return = $this->_parse_var($match[1]);
>              $modifiers = $match[2];
> -            if (!empty($this->default_modifiers) && 
> !preg_match('!(^|\|)smarty:nodefaults($|\|)!',$modifiers)) {
> +            if (!empty($this->default_modifiers) && 
> !preg_match('~(^|\|)smarty:nodefaults($|\|)~',$modifiers)) {
>                  $_default_mod_string = 
> implode('|',(array)$this->default_modifiers);
>                  $modifiers = empty($modifiers) ? 
> $_default_mod_string : $_default_mod_string . '|' . $modifiers;
>              }
>              $this->_parse_modifiers($return, $modifiers);
>              return $return;
> -        } elseif (preg_match('!^' . $this->_db_qstr_regexp . 
> '(?:' . $this->_mod_regexp . '*)$!', $val)) {
> +        } elseif (preg_match('~^' . $this->_db_qstr_regexp . 
> '(?:' . $this->_mod_regexp . '*)$~', $val)) {
>                  // double quoted text
> -                preg_match('!^(' . $this->_db_qstr_regexp . 
> ')('. $this->_mod_regexp . '*)$!', $val, $match);
> +                preg_match('~^(' . $this->_db_qstr_regexp . 
> ')('. $this->_mod_regexp . '*)$~', $val, $match);
>                  $return = $this->_expand_quoted_text($match[1]);
>                  if($match[2] != '') {
>                      $this->_parse_modifiers($return, $match[2]);
>                  }
>                  return $return;
>              }
> -        elseif(preg_match('!^' . $this->_si_qstr_regexp . 
> '(?:' . $this->_mod_regexp . '*)$!', $val)) {
> +        elseif(preg_match('~^' . $this->_num_const_regexp . 
> '(?:' . $this->_mod_regexp . '*)$~', $val)) {
> +                // numerical constant
> +                preg_match('~^(' . $this->_num_const_regexp 
> . ')('. $this->_mod_regexp . '*)$~', $val, $match);
> +                if($match[2] != '') {
> +                    $this->_parse_modifiers($match[1], $match[2]);
> +                    return $match[1];
> +                }
> +            }
> +        elseif(preg_match('~^' . $this->_si_qstr_regexp . 
> '(?:' . $this->_mod_regexp . '*)$~', $val)) {
>                  // single quoted text
> -                preg_match('!^(' . $this->_si_qstr_regexp . 
> ')('. $this->_mod_regexp . '*)$!', $val, $match);
> +                preg_match('~^(' . $this->_si_qstr_regexp . 
> ')('. $this->_mod_regexp . '*)$~', $val, $match);
>                  if($match[2] != '') {
>                      $this->_parse_modifiers($match[1], $match[2]);
>                      return $match[1];
>                  }
>              }
> -        elseif(preg_match('!^' . $this->_cvar_regexp . '(?:' 
> . $this->_mod_regexp . '*)$!', $val)) {
> +        elseif(preg_match('~^' . $this->_cvar_regexp . '(?:' 
> . $this->_mod_regexp . '*)$~', $val)) {
>                  // config var
>                  return $this->_parse_conf_var($val);
>              }
> -        elseif(preg_match('!^' . $this->_svar_regexp . '(?:' 
> . $this->_mod_regexp . '*)$!', $val)) {
> +        elseif(preg_match('~^' . $this->_svar_regexp . '(?:' 
> . $this->_mod_regexp . '*)$~', $val)) {
>                  // section var
>                  return $this->_parse_section_prop($val);
>              }
>          elseif(!in_array($val, $this->_permitted_tokens) && 
> !is_numeric($val)) {
>              // literal string
> -            return $this->_expand_quoted_text('"' . $val .'"');
> +            return $this->_expand_quoted_text('"' . 
> strtr($val, array('\\' => '\\\\', '"' => '\\"')) .'"');
>          }
>          return $val;
>      }
> @@ -1622,19 +1666,19 @@
>      function _expand_quoted_text($var_expr)
>      {
>          // if contains unescaped $, expand it
> -        if(preg_match_all('%(?:\`(?<!\\\\)\$' . 
> $this->_dvar_guts_regexp . 
> '\`)|(?:(?<!\\\\)\$\w+(\[[a-zA-Z0-9]+\])*)%', $var_expr, $_match)) {
> +        if(preg_match_all('~(?:\`(?<!\\\\)\$' . 
> $this->_dvar_guts_regexp . '(?:' . $this->_obj_ext_regexp . 
> ')*\`)|(?:(?<!\\\\)\$\w+(\[[a-zA-Z0-9]+\])*)~', $var_expr, $_match)) {
>              $_match = $_match[0];
>              rsort($_match);
>              reset($_match);
>              foreach($_match as $_var) {
>                  $var_expr = str_replace ($_var, '".(' . 
> $this->_parse_var(str_replace('`','',$_var)) . ')."', $var_expr);
>              }
> -            $_return = preg_replace('%\.""|(?<!\\\\)""\.%', 
> '', $var_expr);
> +            $_return = preg_replace('~\.""|(?<!\\\\)""\.~', 
> '', $var_expr);
>          } else {
>              $_return = $var_expr;
>          }
>          // replace double quoted literal string with single quotes
> -        $_return = preg_replace('!^"([\s\w]+)"$!',"'\\1'",$_return);
> +        $_return = preg_replace('~^"([\s\w]+)"$~',"'\\1'",$_return);
>          return $_return;
>      }
>  
> @@ -1648,7 +1692,7 @@
>      function _parse_var($var_expr)
>      {
>          $_has_math = false;
> -        $_math_vars = 
> preg_split('!('.$this->_dvar_math_regexp.'|'.$this->_qstr_rege
> xp.')!', $var_expr, -1, PREG_SPLIT_DELIM_CAPTURE);
> +        $_math_vars = 
> preg_split('~('.$this->_dvar_math_regexp.'|'.$this->_qstr_rege
> xp.')~', $var_expr, -1, PREG_SPLIT_DELIM_CAPTURE);
>  
>          if(count($_math_vars) > 1) {
>              $_first_var = "";
> @@ -1660,7 +1704,7 @@
>  
>                  if(!empty($_math_var) || is_numeric($_math_var)) {
>                      // hit a math operator, so process the 
> stuff which came before it
> -                    if(preg_match('!^' . 
> $this->_dvar_math_regexp . '$!', $_math_var)) {
> +                    if(preg_match('~^' . 
> $this->_dvar_math_regexp . '$~', $_math_var)) {
>                          $_has_math = true;
>                          if(!empty($_complete_var) || 
> is_numeric($_complete_var)) {
>                              $_output .= 
> $this->_parse_var($_complete_var);
> @@ -1674,23 +1718,13 @@
>  
>                          $_complete_var = "";
>                      } else {
> -                        // fetch multiple -> (like 
> $foo->bar->baz ) which wouldn't get fetched else, because it 
> would only get $foo->bar and treat the ->baz as "-" ">baz" then
> -                        for($_i = $_k + 1; $_i <= 
> count($_math_vars); $_i += 2) {
> -                            // fetch -> because it gets 
> splitted at - and move it back together
> -                            if( /* prevent notice */ 
> (isset($_math_vars[$_i]) && isset($_math_vars[$_i+1])) && 
> ($_math_vars[$_i] === '-' && $_math_vars[$_i+1]{0} === '>')) {
> -                                $_math_var .= 
> $_math_vars[$_i].$_math_vars[$_i+1];
> -                                $_math_vars[$_i] = 
> $_math_vars[$_i+1] = '';
> -                            } else {
> -                                break;
> -                            }
> -                        }
>                          $_complete_var .= $_math_var;
>                      }
>                  }
>              }
>              if($_has_math) {
>                  if(!empty($_complete_var) || 
> is_numeric($_complete_var))
> -                    $_output .= 
> $this->_parse_var($_complete_var, true);
> +                    $_output .= $this->_parse_var($_complete_var);
>  
>                  // get the modifiers working (only the last 
> var from math + modifier is left)
>                  $var_expr = $_complete_var;
> @@ -1698,15 +1732,16 @@
>          }
>  
>          // prevent cutting of first digit in the number (we 
> _definitly_ got a number if the first char is a digit)
> -        if(is_numeric($var_expr{0}))
> +        if(is_numeric(substr($var_expr, 0, 1)))
>              $_var_ref = $var_expr;
>          else
>              $_var_ref = substr($var_expr, 1);
> -
> +        
>          if(!$_has_math) {
> +            
>              // get [foo] and .foo and ->foo and (...) pieces
> -            preg_match_all('!(?:^\w+)|' . 
> $this->_obj_params_regexp . '|(?:' . 
> $this->_var_bracket_regexp . ')|->\$?\w+|\.\$?\w+|\S+!', 
> $_var_ref, $match);
> -
> +            preg_match_all('~(?:^\w+)|' . 
> $this->_obj_params_regexp . '|(?:' . 
> $this->_var_bracket_regexp . ')|->\$?\w+|\.\$?\w+|\S+~', 
> $_var_ref, $match);
> +                        
>              $_indexes = $match[0];
>              $_var_name = array_shift($_indexes);
>  
> @@ -1723,7 +1758,7 @@
>                      $_var_name = substr(array_shift($_indexes), 1);
>                      $_output = "\$this->_smarty_vars['$_var_name']";
>                  }
> -            } elseif(is_numeric($_var_name) && 
> is_numeric($var_expr{0})) {
> +            } elseif(is_numeric($_var_name) && 
> is_numeric(substr($var_expr, 0, 1))) {
>                  // because . is the operator for accessing 
> arrays thru inidizes we need to put it together again for 
> floating point numbers
>                  if(count($_indexes) > 0)
>                  {
> @@ -1736,11 +1771,11 @@
>              }
>  
>              foreach ($_indexes as $_index) {
> -                if ($_index{0} == '[') {
> +                if (substr($_index, 0, 1) == '[') {
>                      $_index = substr($_index, 1, -1);
>                      if (is_numeric($_index)) {
>                          $_output .= "[$_index]";
> -                    } elseif ($_index{0} == '$') {
> +                    } elseif (substr($_index, 0, 1) == '$') {
>                          if (strpos($_index, '.') !== false) {
>                              $_output .= '[' . 
> $this->_parse_var($_index) . ']';
>                          } else {
> @@ -1752,8 +1787,8 @@
>                          $_var_section_prop = 
> isset($_var_parts[1]) ? $_var_parts[1] : 'index';
>                          $_output .= 
> "[\$this->_sections['$_var_section']['$_var_section_prop']]";
>                      }
> -                } else if ($_index{0} == '.') {
> -                    if ($_index{1} == '$')
> +                } else if (substr($_index, 0, 1) == '.') {
> +                    if (substr($_index, 1, 1) == '$')
>                          $_output .= "[\$this->_tpl_vars['" . 
> substr($_index, 2) . "']]";
>                      else
>                          $_output .= "['" . substr($_index, 1) . "']";
> @@ -1762,7 +1797,7 @@
>                          $this->_syntax_error('call to 
> internal object members is not allowed', E_USER_ERROR, 
> __FILE__, __LINE__);
>                      } elseif($this->security && 
> substr($_index, 2, 1) == '_') {
>                          $this->_syntax_error('(secure) call 
> to private object member is not allowed', E_USER_ERROR, 
> __FILE__, __LINE__);
> -                    } elseif ($_index{2} == '$') {
> +                    } elseif (substr($_index, 2, 1) == '$') {
>                          if ($this->security) {
>                              $this->_syntax_error('(secure) 
> call to dynamic object member is not allowed', E_USER_ERROR, 
> __FILE__, __LINE__);
>                          } else {
> @@ -1771,7 +1806,7 @@
>                      } else {
>                          $_output .= $_index;
>                      }
> -                } elseif ($_index{0} == '(') {
> +                } elseif (substr($_index, 0, 1) == '(') {
>                      $_index = $this->_parse_parenth_args($_index);
>                      $_output .= $_index;
>                  } else {
> @@ -1791,13 +1826,14 @@
>       */
>      function _parse_parenth_args($parenth_args)
>      {
> -        preg_match_all('!' . $this->_param_regexp . 
> '!',$parenth_args, $match);
> -        $match = $match[0];
> -        rsort($match);
> -        reset($match);
> -        $orig_vals = $match;
> +        preg_match_all('~' . $this->_param_regexp . 
> '~',$parenth_args, $match);
> +        $orig_vals = $match = $match[0];
>          $this->_parse_vars_props($match);
> -        return str_replace($orig_vals, $match, $parenth_args);
> +        $replace = array();
> +        for ($i = 0, $count = count($match); $i < $count; $i++) {
> +            $replace[$orig_vals[$i]] = $match[$i];
> +        }
> +        return strtr($parenth_args, $replace);
>      }
>  
>      /**
> @@ -1853,7 +1889,7 @@
>       */
>      function _parse_modifiers(&$output, $modifier_string)
>      {
> -        preg_match_all('!\|(@?\w+)((?>:(?:'. 
> $this->_qstr_regexp . '|[^|]+))*)!', '|' . $modifier_string, $_match);
> +        preg_match_all('~\|(@?\w+)((?>:(?:'. 
> $this->_qstr_regexp . '|[^|]+))*)~', '|' . $modifier_string, $_match);
>          list(, $_modifiers, $modifier_arg_strings) = $_match;
>  
>          for ($_i = 0, $_for_max = count($_modifiers); $_i < 
> $_for_max; $_i++) {
> @@ -1864,10 +1900,10 @@
>                  continue;
>              }
>  
> -            preg_match_all('!:(' . $this->_qstr_regexp . 
> '|[^:]+)!', $modifier_arg_strings[$_i], $_match);
> +            preg_match_all('~:(' . $this->_qstr_regexp . 
> '|[^:]+)~', $modifier_arg_strings[$_i], $_match);
>              $_modifier_args = $_match[1];
>  
> -            if ($_modifier_name{0} == '@') {
> +            if (substr($_modifier_name, 0, 1) == '@') {
>                  $_map_array = false;
>                  $_modifier_name = substr($_modifier_name, 1);
>              } else {
> @@ -1889,10 +1925,10 @@
>  
>              if($_modifier_name == 'default') {
>                  // supress notifications of default modifier 
> vars and args
> -                if($output{0} == '$') {
> +                if(substr($output, 0, 1) == '$') {
>                      $output = '@' . $output;
>                  }
> -                if(isset($_modifier_args[0]) && 
> $_modifier_args[0]{0} == '$') {
> +                if(isset($_modifier_args[0]) && 
> substr($_modifier_args[0], 0, 1) == '$') {
>                      $_modifier_args[0] = '@' . $_modifier_args[0];
>                  }
>              }
> @@ -1944,7 +1980,7 @@
>          /* Extract the reference name. */
>          $_ref = substr($indexes[0], 1);
>          foreach($indexes as $_index_no=>$_index) {
> -            if ($_index{0} != '.' && $_index_no<2 || 
> !preg_match('!^(\.|\[|->)!', $_index)) {
> +            if (substr($_index, 0, 1) != '.' && $_index_no<2 
> || !preg_match('~^(\.|\[|->)~', $_index)) {
>                  $this->_syntax_error('$smarty' . implode('', 
> array_slice($indexes, 0, 2)) . ' is an invalid reference', 
> E_USER_ERROR, __FILE__, __LINE__);
>              }
>          }
> @@ -1956,13 +1992,41 @@
>                  break;
>  
>              case 'foreach':
> +                array_shift($indexes);
> +                $_var = 
> $this->_parse_var_props(substr($indexes[0], 1));
> +                $_propname = substr($indexes[1], 1);
> +                $_max_index = 1;
> +                switch ($_propname) {
> +                    case 'index':
> +                        array_shift($indexes);
> +                        $compiled_ref = 
> "(\$this->_foreach[$_var]['iteration']-1)";
> +                        break;
> +                        
> +                    case 'first':
> +                        array_shift($indexes);
> +                        $compiled_ref = 
> "(\$this->_foreach[$_var]['iteration'] <= 1)";
> +                        break;
> +
> +                    case 'last':
> +                        array_shift($indexes);
> +                        $compiled_ref = 
> "(\$this->_foreach[$_var]['iteration'] == 
> \$this->_foreach[$_var]['total'])";
> +                        break;
> +                        
> +                    case 'show':
> +                        array_shift($indexes);
> +                        $compiled_ref = 
> "(\$this->_foreach[$_var]['total'] > 0)";
> +                        break;
> +                        
> +                    default:
> +                        unset($_max_index);
> +                        $compiled_ref = "\$this->_foreach[$_var]";
> +                }
> +                break;
> +
>              case 'section':
>                  array_shift($indexes);
>                  $_var = 
> $this->_parse_var_props(substr($indexes[0], 1));
> -                if ($_ref == 'foreach')
> -                    $compiled_ref = "\$this->_foreach[$_var]";
> -                else
> -                    $compiled_ref = "\$this->_sections[$_var]";
> +                $compiled_ref = "\$this->_sections[$_var]";
>                  break;
>  
>              case 'get':
> @@ -2016,9 +2080,18 @@
>                  break;
>  
>              case 'const':
> +                if ($this->security && 
> !$this->security_settings['ALLOW_CONSTANTS']) {
> +                    $this->_syntax_error("(secure mode) 
> constants not permitted",
> +                                         E_USER_WARNING, 
> __FILE__, __LINE__);
> +                    return;
> +                }
>                  array_shift($indexes);
> -                $_val = 
> $this->_parse_var_props(substr($indexes[0],1));
> -                $compiled_ref = '@constant(' . $_val . ')';
> +                if (preg_match('!^\.\w+$!', $indexes[0])) {
> +                    $compiled_ref = '@' . substr($indexes[0], 1);
> +                } else {
> +                    $_val = 
> $this->_parse_var_props(substr($indexes[0], 1));
> +                    $compiled_ref = '@constant(' . $_val . ')';
> +                }
>                  $_max_index = 1;
>                  break;
>  
> @@ -2034,7 +2107,7 @@
>              case 'rdelim':
>                  $compiled_ref = "'$this->right_delimiter'";
>                  break;
> -
> +                
>              default:
>                  $this->_syntax_error('$smarty.' . $_ref . ' 
> is an unknown reference', E_USER_ERROR, __FILE__, __LINE__);
>                  break;
> @@ -2089,7 +2162,7 @@
>                  if ($prefilter === false) {
>                      
> unset($this->_plugins['prefilter'][$filter_name]);
>                      $_params = array('plugins' => 
> array(array('prefilter', $filter_name, null, null, false)));
> -                    require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.load_plugins.php');
> +                    require_once(SMARTY_CORE_DIR . 
> 'core.load_plugins.php');
>                      smarty_core_load_plugins($_params, $this);
>                  }
>              }
> @@ -2099,7 +2172,7 @@
>                  if ($postfilter === false) {
>                      
> unset($this->_plugins['postfilter'][$filter_name]);
>                      $_params = array('plugins' => 
> array(array('postfilter', $filter_name, null, null, false)));
> -                    require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.load_plugins.php');
> +                    require_once(SMARTY_CORE_DIR . 
> 'core.load_plugins.php');
>                      smarty_core_load_plugins($_params, $this);
>                  }
>              }
> @@ -2115,7 +2188,7 @@
>       */
>      function _quote_replace($string)
>      {
> -        return preg_replace('![\\$]\d!', '\\\\\\0', $string);
> +        return strtr($string, array('\\' => '\\\\', '$' => '\\$'));
>      }
>  
>      /**
> @@ -2143,9 +2216,9 @@
>          if ($_cacheable
>              || 0<$this->_cacheable_state++) return '';
>          if (!isset($this->_cache_serial)) 
> $this->_cache_serial = md5(uniqid('Smarty'));
> -        $_ret = 'if ($this->caching) { echo \'{nocache:'
> +        $_ret = 'if ($this->caching && 
> !$this->_cache_including) { echo \'{nocache:'
>              . $this->_cache_serial . '#' . $this->_nocache_count
> -            . '}\';}';
> +            . '}\'; };';
>          return $_ret;
>      }
>  
> @@ -2160,15 +2233,15 @@
>          $_cacheable = !isset($this->_plugins[$type][$name]) 
> || $this->_plugins[$type][$name][4];
>          if ($_cacheable
>              || --$this->_cacheable_state>0) return '';
> -        return 'if ($this->caching) { echo \'{/nocache:'
> +        return 'if ($this->caching && 
> !$this->_cache_including) { echo \'{/nocache:'
>              . $this->_cache_serial . '#' . ($this->_nocache_count++)
> -            . '}\';}';
> +            . '}\'; };';
>      }
>  
>  
>      /**
>       * push opening tag-name, file-name and line-number on 
> the tag-stack
> -     * @param: string the opening tag's name
> +     * @param string the opening tag's name
>       */
>      function _push_tag($open_tag)
>      {
> @@ -2178,8 +2251,8 @@
>      /**
>       * pop closing tag-name
>       * raise an error if this stack-top doesn't match with 
> the closing tag
> -     * @param: string the closing tag's name
> -     * @return: string the opening tag's name
> +     * @param string the closing tag's name
> +     * @return string the opening tag's name
>       */
>      function _pop_tag($close_tag)
>      {
> @@ -2200,6 +2273,13 @@
>                  $this->_pop_tag($close_tag);
>                  return $_open_tag;
>              }
> +            if ($_open_tag == 'else' || $_open_tag == 'elseif') {
> +                $_open_tag = 'if';
> +            } elseif ($_open_tag == 'sectionelse') {
> +                $_open_tag = 'section';
> +            } elseif ($_open_tag == 'foreachelse') {
> +                $_open_tag = 'foreach';
> +            }
>              $message = " expected {/$_open_tag} (opened line 
> $_line_no).";
>          }
>          $this->_syntax_error("mismatched tag {/$close_tag}.$message",
> 
> Modified: 
> plog/trunk/class/template/smarty/core/core.assemble_plugin_fil
> epath.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/core/core.assemble_plugin_fil
> epath.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/core/core.assemble_plugin_fil
> epath.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -50,9 +50,10 @@
>                  $_plugin_filepath = $_plugin_dir . 
> DIRECTORY_SEPARATOR . $_plugin_filename;
>  
>                  $_params = array('file_path' => $_plugin_filepath);
> -                require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_include_path.php');
> +                require_once(SMARTY_CORE_DIR . 
> 'core.get_include_path.php');
>                  if(smarty_core_get_include_path($_params, $smarty)) {
> -                    return $_params['new_file_path'];
> +                    $_return = $_params['new_file_path'];
> +                    break;
>                  }
>              }
>          }
> 
> Modified: 
> plog/trunk/class/template/smarty/core/core.create_dir_structure.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/core/core.create_dir_struct
> ure.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/core/core.create_dir_struct
> ure.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -22,7 +22,7 @@
>              /* unix-style paths */
>              $_dir = $params['dir'];
>              $_dir_parts = preg_split('!/+!', $_dir, -1, 
> PREG_SPLIT_NO_EMPTY);
> -            $_new_dir = ($_dir{0}=='/') ? '/' : getcwd().'/';
> +            $_new_dir = (substr($_dir, 0, 1)=='/') ? '/' : 
> getcwd().'/';
>              if($_use_open_basedir = !empty($_open_basedir_ini)) {
>                  $_open_basedirs = explode(':', $_open_basedir_ini);
>              }
> 
> Modified: 
> plog/trunk/class/template/smarty/core/core.display_debug_console.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/core/core.display_debug_cons
> ole.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/core/core.display_debug_cons
> ole.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -23,8 +23,9 @@
>          // set path to debug template from SMARTY_DIR
>          $smarty->debug_tpl = SMARTY_DIR . 'debug.tpl';
>          if($smarty->security && is_file($smarty->debug_tpl)) {
> -            $smarty->secure_dir[] = 
> dirname(realpath($smarty->debug_tpl));
> +            $smarty->secure_dir[] = realpath($smarty->debug_tpl);
>          }
> +        $smarty->debug_tpl = 'file:' . SMARTY_DIR . 'debug.tpl';
>      }
>  
>      $_ldelim_orig = $smarty->left_delimiter;
> 
> Modified: 
> plog/trunk/class/template/smarty/core/core.get_php_resource.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/core/core.get_php_resou
> rce.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/core/core.get_php_resou
> rce.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -32,7 +32,7 @@
>          } else {
>              // test for file in include_path
>              $_params = array('file_path' => 
> $params['resource_name']);
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_include_path.php');
> +            require_once(SMARTY_CORE_DIR . 
> 'core.get_include_path.php');
>              if(smarty_core_get_include_path($_params, $smarty)) {
>                  $_include_path = $_params['new_file_path'];
>                  $_readable = true;
> @@ -56,7 +56,7 @@
>  
>      if ($_readable) {
>          if ($smarty->security) {
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.is_trusted.php');
> +            require_once(SMARTY_CORE_DIR . 'core.is_trusted.php');
>              if (!smarty_core_is_trusted($params, $smarty)) {
>                  $smarty->$_error_funcc('(secure mode) ' . 
> $params['resource_type'] . ':' . $params['resource_name'] . ' 
> is not trusted');
>                  return false;
> 
> Modified: plog/trunk/class/template/smarty/core/core.is_secure.php
> ===================================================================
> --- plog/trunk/class/template/smarty/core/core.is_secure.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ plog/trunk/class/template/smarty/core/core.is_secure.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -17,41 +17,41 @@
>  
>  function smarty_core_is_secure($params, &$smarty)
>  {
> -    static $check_template_dir = true;
> -
>      if (!$smarty->security || 
> $smarty->security_settings['INCLUDE_ANY']) {
>          return true;
>      }
>  
> -    $_smarty_secure = false;
>      if ($params['resource_type'] == 'file') {
> -        if($check_template_dir) {
> -            if (!in_array($smarty->template_dir, 
> $smarty->secure_dir))
> -                // add template_dir to secure_dir array
> -                array_unshift($smarty->secure_dir, 
> $smarty->template_dir);
> -            $check_template_dir = false;
> +        $_rp = realpath($params['resource_name']);
> +        if (isset($params['resource_base_path'])) {
> +            foreach ((array)$params['resource_base_path'] as 
> $curr_dir) {
> +                if ( ($_cd = realpath($curr_dir)) !== false &&
> +                     strncmp($_rp, $_cd, strlen($_cd)) == 0 &&
> +                     substr($_rp, strlen($_cd), 1) == 
> DIRECTORY_SEPARATOR ) {
> +                    return true;
> +                }
> +            }
>          }
>          if (!empty($smarty->secure_dir)) {
> -            $_rp = realpath($params['resource_name']);
>              foreach ((array)$smarty->secure_dir as $curr_dir) {
> -                if ( !empty($curr_dir) && is_readable ($curr_dir)) {
> -                    $_cd = realpath($curr_dir);
> -                    if (strncmp($_rp, $_cd, strlen($_cd)) == 0
> -                        && $_rp{strlen($_cd)} == 
> DIRECTORY_SEPARATOR ) {
> -                        $_smarty_secure = true;
> -                        break;
> +                if ( ($_cd = realpath($curr_dir)) !== false) {
> +                    if($_cd == $_rp) {
> +                        return true;
> +                    } elseif (strncmp($_rp, $_cd, 
> strlen($_cd)) == 0 &&
> +                        substr($_rp, strlen($_cd), 1) == 
> DIRECTORY_SEPARATOR) {
> +                        return true;
>                      }
>                  }
>              }
>          }
>      } else {
>          // resource is not on local file system
> -        $_smarty_secure = call_user_func_array(
> +        return call_user_func_array(
>              
> $smarty->_plugins['resource'][$params['resource_type']][0][2],
> -            array($params['resource_name'], 
> &$_smarty_secure, &$smarty));
> +            array($params['resource_name'], &$smarty));
>      }
>  
> -    return $_smarty_secure;
> +    return false;
>  }
>  
>  /* vim: set expandtab: */
> 
> Modified: plog/trunk/class/template/smarty/core/core.is_trusted.php
> ===================================================================
> --- plog/trunk/class/template/smarty/core/core.is_trusted.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ plog/trunk/class/template/smarty/core/core.is_trusted.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -5,9 +5,6 @@
>   * @subpackage plugins
>   */
>  
> -/**#@+
> - * @access private
> - */
>  /**
>   * determines if a resource is trusted or not
>   *
> @@ -28,7 +25,7 @@
>                  if (!empty($curr_dir) && is_readable ($curr_dir)) {
>                      $_cd = realpath($curr_dir);
>                      if (strncmp($_rp, $_cd, strlen($_cd)) == 0
> -                        && $_rp{strlen($_cd)} == 
> DIRECTORY_SEPARATOR ) {
> +                        && substr($_rp, strlen($_cd), 1) == 
> DIRECTORY_SEPARATOR ) {
>                          $_smarty_trusted = true;
>                          break;
>                      }
> 
> Modified: 
> plog/trunk/class/template/smarty/core/core.process_cached_inserts.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/core/core.process_cached_inse
> rts.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/core/core.process_cached_inse
> rts.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -20,7 +20,7 @@
>      for ($i = 0, $for_max = count($cached_inserts); $i < 
> $for_max; $i++) {
>          if ($smarty->debugging) {
>              $_params = array();
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_microtime.php');
> +            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
>              $debug_start_time = 
> smarty_core_get_microtime($_params, $smarty);
>          }
>  
> @@ -29,7 +29,7 @@
>  
>          if (isset($args['script'])) {
>              $_params = array('resource_name' => 
> $smarty->_dequote($args['script']));
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_php_resource.php');
> +            require_once(SMARTY_CORE_DIR . 
> 'core.get_php_resource.php');
>              if(!smarty_core_get_php_resource($_params, $smarty)) {
>                  return false;
>              }
> @@ -52,10 +52,10 @@
>              $replace = '';
>          }
>  
> -        $params['results'] = 
> str_replace($cached_inserts[$i], $replace, $params['results']);
> +        $params['results'] = 
> substr_replace($params['results'], $replace, 
> strpos($params['results'], $cached_inserts[$i]), 
> strlen($cached_inserts[$i]));
>          if ($smarty->debugging) {
>              $_params = array();
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_microtime.php');
> +            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
>              $smarty->_smarty_debug_info[] = array('type'     
>  => 'insert',
>                                                  'filename'  
> => 'insert_'.$name,
>                                                  'depth'     
> => $smarty->_inclusion_depth,
> 
> Modified: 
> plog/trunk/class/template/smarty/core/core.process_compiled_in
> clude.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/core/core.process_compiled_in
> clude.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/core/core.process_compiled_in
> clude.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -20,6 +20,11 @@
>      $smarty->_cache_including = true;
>  
>      $_return = $params['results'];
> +
> +    foreach ($smarty->_cache_info['cache_serials'] as 
> $_include_file_path=>$_cache_serial) {
> +        $smarty->_include($_include_file_path, true);
> +    }
> +
>      foreach ($smarty->_cache_serials as 
> $_include_file_path=>$_cache_serial) {
>          $_return = 
> preg_replace_callback('!(\{nocache\:('.$_cache_serial.')#(\d+)\})!s',
>                                           array(&$smarty, 
> '_process_compiled_include_callback'),
> 
> Modified: 
> plog/trunk/class/template/smarty/core/core.read_cache_file.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/core/core.read_cache_f
> ile.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/core/core.read_cache_f
> ile.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -48,11 +48,12 @@
>          return false;
>      }
>  
> -    $cache_split = explode("\n", $params['results'], 2);
> -    $cache_header = $cache_split[0];
> +    $_contents = $params['results'];
> +    $_info_start = strpos($_contents, "\n") + 1;
> +    $_info_len = (int)substr($_contents, 0, $_info_start - 1);
> +    $_cache_info = unserialize(substr($_contents, 
> $_info_start, $_info_len));
> +    $params['results'] = substr($_contents, $_info_start + 
> $_info_len);
>  
> -    $_cache_info = unserialize($cache_header);
> -
>      if ($smarty->caching == 2 && isset ($_cache_info['expires'])){
>          // caching by expiration time
>          if ($_cache_info['expires'] > -1 && (time() > 
> $_cache_info['expires'])) {
> @@ -89,17 +90,6 @@
>          }
>      }
>  
> -    foreach ($_cache_info['cache_serials'] as 
> $_include_file_path=>$_cache_serial) {
> -        if (empty($smarty->_cache_serials[$_include_file_path])) {
> -            $smarty->_include($_include_file_path, true);
> -        }
> -
> -        if ($smarty->_cache_serials[$_include_file_path] != 
> $_cache_serial) {
> -            /* regenerate */
> -            return false;
> -        }
> -    }
> -    $params['results'] = $cache_split[1];
>      
> $content_cache[$params['tpl_file'].','.$params['cache_id'].','
> .$params['compile_id']] = array($params['results'], $_cache_info);
>  
>      $smarty->_cache_info = $_cache_info;
> 
> Modified: plog/trunk/class/template/smarty/core/core.rm_auto.php
> ===================================================================
> --- plog/trunk/class/template/smarty/core/core.rm_auto.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ plog/trunk/class/template/smarty/core/core.rm_auto.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -28,7 +28,7 @@
>              'level' => 0,
>              'exp_time' => $params['exp_time']
>          );
> -        require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.rmdir.php');
> +        require_once(SMARTY_CORE_DIR . 'core.rmdir.php');
>          $_res = smarty_core_rmdir($_params, $smarty);
>      } else {
>          $_tname = 
> $smarty->_get_auto_filename($params['auto_base'], 
> $params['auto_source'], $params['auto_id']);
> @@ -47,7 +47,7 @@
>                  'level' => 1,
>                  'exp_time' => $params['exp_time']
>              );
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.rmdir.php');
> +            require_once(SMARTY_CORE_DIR . 'core.rmdir.php');
>              $_res = smarty_core_rmdir($_params, $smarty);
>          } else {
>              // remove matching file names
> 
> Modified: plog/trunk/class/template/smarty/core/core.rmdir.php
> ===================================================================
> --- plog/trunk/class/template/smarty/core/core.rmdir.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ plog/trunk/class/template/smarty/core/core.rmdir.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -32,7 +32,6 @@
>                          'level' => $params['level'] + 1,
>                          'exp_time' => $params['exp_time']
>                      );
> -                    require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.rmdir.php');
>                      smarty_core_rmdir($_params, $smarty);
>                  }
>                  else {
> 
> Modified: 
> plog/trunk/class/template/smarty/core/core.run_insert_handler.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/core/core.run_insert_hand
> ler.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/core/core.run_insert_hand
> ler.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,7 +14,7 @@
>  function smarty_core_run_insert_handler($params, &$smarty)
>  {
>  
> -    require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 
> 'core.get_microtime.php');
> +    require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
>      if ($smarty->debugging) {
>          $_params = array();
>          $_debug_start_time = 
> smarty_core_get_microtime($_params, $smarty);
> @@ -34,7 +34,7 @@
>      } else {
>          if (isset($params['args']['script'])) {
>              $_params = array('resource_name' => 
> $smarty->_dequote($params['args']['script']));
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_php_resource.php');
> +            require_once(SMARTY_CORE_DIR . 
> 'core.get_php_resource.php');
>              if(!smarty_core_get_php_resource($_params, $smarty)) {
>                  return false;
>              }
> @@ -51,7 +51,7 @@
>          $_content = $_funcname($params['args'], $smarty);
>          if ($smarty->debugging) {
>              $_params = array();
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_microtime.php');
> +            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
>              $smarty->_smarty_debug_info[] = array('type'     
>  => 'insert',
>                                                  'filename'  
> => 'insert_'.$params['args']['name'],
>                                                  'depth'     
> => $smarty->_inclusion_depth,
> 
> Modified: 
> plog/trunk/class/template/smarty/core/core.smarty_include_php.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/core/core.smarty_include_
> php.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/core/core.smarty_include_
> php.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -21,7 +21,7 @@
>  function smarty_core_smarty_include_php($params, &$smarty)
>  {
>      $_params = array('resource_name' => $params['smarty_file']);
> -    require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 
> 'core.get_php_resource.php');
> +    require_once(SMARTY_CORE_DIR . 'core.get_php_resource.php');
>      smarty_core_get_php_resource($_params, $smarty);
>      $_smarty_resource_type = $_params['resource_type'];
>      $_smarty_php_resource = $_params['php_resource'];
> 
> Modified: 
> plog/trunk/class/template/smarty/core/core.write_cache_file.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/core/core.write_cache_f
> ile.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/core/core.write_cache_f
> ile.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -31,16 +31,39 @@
>          $smarty->_cache_info['expires'] = -1;
>      }
>  
> -    // collapse {nocache...}-tags
> -    $params['results'] = 
> preg_replace('!((\{nocache\:([0-9a-f]{32})#(\d+)\})'
> -                                      .'.*'
> -                                      .'{/nocache\:\\3#\\4\})!Us'
> -                                      ,'\\2'
> -                                      ,$params['results']);
> +    // collapse nocache.../nocache-tags
> +    if 
> (preg_match_all('!\{(/?)nocache\:[0-9a-f]{32}#\d+\}!', 
> $params['results'], $match, PREG_PATTERN_ORDER)) {
> +        // remove everything between every pair of outermost 
> noache.../nocache-tags
> +        // and replace it by a single nocache-tag
> +        // this new nocache-tag will be replaced by dynamic 
> contents in
> +        // smarty_core_process_compiled_includes() on a cache-read
> +        
> +        $match_count = count($match[0]);
> +        $results = 
> preg_split('!(\{/?nocache\:[0-9a-f]{32}#\d+\})!', 
> $params['results'], -1, PREG_SPLIT_DELIM_CAPTURE);
> +        
> +        $level = 0;
> +        $j = 0;
> +        for ($i=0, $results_count = count($results); $i < 
> $results_count && $j < $match_count; $i++) {
> +            if ($results[$i] == $match[0][$j]) {
> +                // nocache tag
> +                if ($match[1][$j]) { // closing tag
> +                    $level--;
> +                    unset($results[$i]);
> +                } else { // opening tag
> +                    if ($level++ > 0) unset($results[$i]);
> +                }
> +                $j++;
> +            } elseif ($level > 0) {
> +                unset($results[$i]);
> +            }
> +        }
> +        $params['results'] = implode('', $results);
> +    }
>      $smarty->_cache_info['cache_serials'] = $smarty->_cache_serials;
>  
>      // prepend the cache header info into cache file
> -    $params['results'] = 
> serialize($smarty->_cache_info)."\n".$params['results'];
> +    $_cache_info = serialize($smarty->_cache_info);
> +    $params['results'] = strlen($_cache_info) . "\n" . 
> $_cache_info . $params['results'];
>  
>      if (!empty($smarty->cache_handler_func)) {
>          // use cache_handler function
> @@ -62,7 +85,7 @@
>          $_auto_id = 
> $smarty->_get_auto_id($params['cache_id'], $params['compile_id']);
>          $_cache_file = 
> $smarty->_get_auto_filename($smarty->cache_dir, 
> $params['tpl_file'], $_auto_id);
>          $_params = array('filename' => $_cache_file, 
> 'contents' => $params['results'], 'create_dirs' => true);
> -        require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.write_file.php');
> +        require_once(SMARTY_CORE_DIR . 'core.write_file.php');
>          smarty_core_write_file($_params, $smarty);
>          return true;
>      }
> 
> Modified: 
> plog/trunk/class/template/smarty/core/core.write_compiled_include.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/core/core.write_compiled_incl
> ude.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/core/core.write_compiled_incl
> ude.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -10,14 +10,13 @@
>   *
>   * @param string $compile_path
>   * @param string $template_compiled
> - * @param integer $template_timestamp
>   * @return boolean
>   */
>  
>  function smarty_core_write_compiled_include($params, &$smarty)
>  {
> -    $_tag_start = 'if \(\$this->caching\) \{ echo 
> \'\{nocache\:('.$params['cache_serial'].')#(\d+)\}\';\}';
> -    $_tag_end   = 'if \(\$this->caching\) \{ echo 
> \'\{/nocache\:(\\2)#(\\3)\}\';\}';
> +    $_tag_start = 'if \(\$this->caching && 
> \!\$this->_cache_including\) \{ echo 
> \'\{nocache\:('.$params['cache_serial'].')#(\d+)\}\'; \};';
> +    $_tag_end   = 'if \(\$this->caching && 
> \!\$this->_cache_including\) \{ echo 
> \'\{/nocache\:(\\2)#(\\3)\}\'; \};';
>  
>      preg_match_all('!('.$_tag_start.'(.*)'.$_tag_end.')!Us',
>                     $params['compiled_content'], 
> $_match_source, PREG_SET_ORDER);
> @@ -26,7 +25,8 @@
>      if (count($_match_source)==0) return;
>  
>      // convert the matched php-code to functions
> -    $_include_compiled = "<?php /* funky header here */\n\n";
> +    $_include_compiled =  "<?php /* Smarty version 
> ".$smarty->_version.", created on ".strftime("%Y-%m-%d 
> %H:%M:%S")."\n";
> +    $_include_compiled .= "         compiled from " . 
> strtr(urlencode($params['resource_name']), array('%2F'=>'/', 
> '%3A'=>':')) . " */\n\n";
>  
>      $_compile_path = $params['include_file_path'];
>  
> @@ -35,12 +35,44 @@
>  
>      $_include_compiled .= $params['plugins_code'];
>      $_include_compiled .= "<?php";
> +
> +    $this_varname = ((double)phpversion() >= 5.0) ? 
> '_smarty' : 'this';
>      for ($_i = 0, $_for_max = count($_match_source); $_i < 
> $_for_max; $_i++) {
>          $_match =& $_match_source[$_i];
> +        $source = $_match[4];
> +        if ($this_varname == '_smarty') {
> +            /* rename $this to $_smarty in the sourcecode */
> +            $tokens = token_get_all('<?php ' . $_match[4]);
> +
> +            /* remove trailing <?php */
> +            $open_tag = '';
> +            while ($tokens) {
> +                $token = array_shift($tokens);
> +                if (is_array($token)) {
> +                    $open_tag .= $token[1];
> +                } else {
> +                    $open_tag .= $token;
> +                }
> +                if ($open_tag == '<?php ') break;
> +            }
> +
> +            for ($i=0, $count = count($tokens); $i < $count; $i++) {
> +                if (is_array($tokens[$i])) {
> +                    if ($tokens[$i][0] == T_VARIABLE && 
> $tokens[$i][1] == '$this') {
> +                        $tokens[$i] = '$' . $this_varname;
> +                    } else {
> +                        $tokens[$i] = $tokens[$i][1];
> +                    }                   
> +                }
> +            }
> +            $source = implode('', $tokens);
> +        }
> +
> +        /* add function to compiled include */
>          $_include_compiled .= "
> -function _smarty_tplfunc_$_match[2]_$_match[3](&\$this)
> +function _smarty_tplfunc_$_match[2]_$_match[3](&\$$this_varname)
>  {
> -$_match[4]
> +$source
>  }
>  
>  ";
> @@ -50,7 +82,7 @@
>      $_params = array('filename' => $_compile_path,
>                       'contents' => $_include_compiled, 
> 'create_dirs' => true);
>  
> -    require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 
> 'core.write_file.php');
> +    require_once(SMARTY_CORE_DIR . 'core.write_file.php');
>      smarty_core_write_file($_params, $smarty);
>      return true;
>  }
> 
> Modified: 
> plog/trunk/class/template/smarty/core/core.write_compiled_resource.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/core/core.write_compiled_reso
> urce.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/core/core.write_compiled_reso
> urce.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -10,7 +10,6 @@
>   *
>   * @param string $compile_path
>   * @param string $compiled_content
> - * @param integer $resource_timestamp
>   * @return true
>   */
>  function smarty_core_write_compiled_resource($params, &$smarty)
> @@ -25,8 +24,8 @@
>          return false;
>      }
>  
> -    $_params = array('filename' => $params['compile_path'], 
> 'timestamp'=>$params['resource_timestamp'], 'contents' => 
> $params['compiled_content'], 'create_dirs' => true);
> -    require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 
> 'core.write_file.php');
> +    $_params = array('filename' => $params['compile_path'], 
> 'contents' => $params['compiled_content'], 'create_dirs' => true);
> +    require_once(SMARTY_CORE_DIR . 'core.write_file.php');
>      smarty_core_write_file($_params, $smarty);
>      return true;
>  }
> 
> Modified: plog/trunk/class/template/smarty/core/core.write_file.php
> ===================================================================
> --- plog/trunk/class/template/smarty/core/core.write_file.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ plog/trunk/class/template/smarty/core/core.write_file.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -19,25 +19,28 @@
>  
>      if ($params['create_dirs']) {
>          $_params = array('dir' => $_dirname);
> -        require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.create_dir_structure.php');
> +        require_once(SMARTY_CORE_DIR . 
> 'core.create_dir_structure.php');
>          smarty_core_create_dir_structure($_params, $smarty);
>      }
>  
>      // write to tmp file, then rename it to avoid
>      // file locking race condition
> -    $_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('');
> +    $_tmp_file = tempnam($_dirname, 'wrt');
>  
> -    if (!($fd = @fopen($_tmp_file, 'w'))) {
> -        $smarty->trigger_error("problem writing temporary 
> file '$_tmp_file'");
> -        return false;
> +    if (!($fd = @fopen($_tmp_file, 'wb'))) {
> +        $_tmp_file = $_dirname . DIRECTORY_SEPARATOR . uniqid('wrt');
> +        if (!($fd = @fopen($_tmp_file, 'wb'))) {
> +            $smarty->trigger_error("problem writing 
> temporary file '$_tmp_file'");
> +            return false;
> +        }
>      }
>  
>      fwrite($fd, $params['contents']);
> -    if (isset($params['timestamp'])) {
> -       touch($_tmp_file, $params['timestamp']);
> -    }
>      fclose($fd);
> -    if(file_exists($params['filename'])) {
> +
> +    // Delete the file if it allready exists (this is needed on Win,
> +    // because it cannot overwrite files with rename()
> +    if (file_exists($params['filename'])) {
>          @unlink($params['filename']);
>      }
>      @rename($_tmp_file, $params['filename']);
> 
> Modified: plog/trunk/class/template/smarty/debug.tpl
> ===================================================================
> --- plog/trunk/class/template/smarty/debug.tpl	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ plog/trunk/class/template/smarty/debug.tpl	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -36,7 +36,7 @@
>  	   var title = 'Console_' + self.name;
>  	{rdelim}
>  	_smarty_console = 
> window.open("",title.value,"width=680,height=600,resizable,scr
> ollbars=yes");
> -	_smarty_console.document.write("<HTML><TITLE>Smarty 
> Debug Console_"+self.name+"</TITLE><BODY bgcolor=#ffffff>");
> +	
> _smarty_console.document.write("<HTML><HEAD><TITLE>Smarty 
> Debug Console_"+self.name+"</TITLE></HEAD><BODY bgcolor=#ffffff>");
>  	_smarty_console.document.write("<table border=0 width=100%>");
>  	_smarty_console.document.write("<tr bgcolor=#cccccc><th 
> colspan=2>Smarty Debug Console</th></tr>");
>  	_smarty_console.document.write("<tr bgcolor=#cccccc><td 
> colspan=2><b>included templates & config files (load time in 
> seconds):</b></td></tr>");
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/block.textformat.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/block.textformat.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/block.textformat.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -23,6 +23,7 @@
>   *           indent_char: string (" ")
>   *           wrap_boundary: boolean (true)
>   * </pre>
> + * @author Monte Ohrt <monte at ohrt dot com>
>   * @param string contents of the block
>   * @param Smarty clever simulation of a method
>   * @return string string $content re-formatted
> @@ -71,33 +72,30 @@
>      }
>  
>      // split into paragraphs
> -    $paragraphs = preg_split('![\r\n][\r\n]!',$content);
> -    $output = '';
> +    $_paragraphs = preg_split('![\r\n][\r\n]!',$content);
> +    $_output = '';
>  
> -    foreach ($paragraphs as $paragraph) {
> -        if ($paragraph == '') {
> +    for($_x = 0, $_y = count($_paragraphs); $_x < $_y; $_x++) {
> +        if ($_paragraphs[$_x] == '') {
>              continue;
>          }
>          // convert mult. spaces & special chars to single space
> -        $paragraph = 
> preg_replace(array('!\s+!','!(^\s+)|(\s+$)!'),array(' 
> ',''),$paragraph);
> +        $_paragraphs[$_x] = 
> preg_replace(array('!\s+!','!(^\s+)|(\s+$)!'), array(' ',''), 
> $_paragraphs[$_x]);
>          // indent first line
>          if($indent_first > 0) {
> -            $paragraph = 
> str_repeat($indent_char,$indent_first) . $paragraph;
> +            $_paragraphs[$_x] = str_repeat($indent_char, 
> $indent_first) . $_paragraphs[$_x];
>          }
>          // wordwrap sentences
> -        $paragraph = wordwrap($paragraph, $wrap - $indent, 
> $wrap_char, $wrap_cut);
> +        $_paragraphs[$_x] = wordwrap($_paragraphs[$_x], 
> $wrap - $indent, $wrap_char, $wrap_cut);
>          // indent lines
>          if($indent > 0) {
> -            $paragraph = 
> preg_replace('!^!m',str_repeat($indent_char,$indent),$paragraph);
> +            $_paragraphs[$_x] = preg_replace('!^!m', 
> str_repeat($indent_char, $indent), $_paragraphs[$_x]);
>          }
> -        $output .= $paragraph . $wrap_char . $wrap_char;
>      }
> +    $_output = implode($wrap_char . $wrap_char, $_paragraphs);
>  
> -    if ($assign) {
> -        $smarty->assign($assign,$output);
> -    } else {
> -        return $output;
> -    }
> +    return $assign ? $smarty->assign($assign, $_output) : $_output;
> +
>  }
>  
>  /* vim: set expandtab: */
> 
> Modified: plog/trunk/class/template/smarty/plugins/compiler.assign.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/compiler.assign.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/compiler.assign.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -1,4 +1,9 @@
>  <?php
> +/**
> + * Smarty plugin
> + * @package Smarty
> + * @subpackage plugins
> + */
>  
>  /**
>   * Smarty {assign} compiler function plugin
> @@ -8,6 +13,8 @@
>   * Purpose:  assign a value to a template variable
>   * @link 
> http://smarty.php.net/manual/en/language.custom.functions.php#
> LANGUAGE.FUNCTION.ASSIGN {assign}
>   *       (Smarty online manual)
> + * @author Monte Ohrt <monte at ohrt dot com> (initial author)
> + * @auther messju mohr <messju at lammfellpuschen dot de> 
> (conversion to compiler function)
>   * @param string containing var-attribute and value-attribute
>   * @param Smarty_Compiler
>   */
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/function.assign_debug
> _info.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.assign_debug
> _info.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.assign_debug
> _info.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -11,6 +11,7 @@
>   * Type:     function<br>
>   * Name:     assign_debug_info<br>
>   * Purpose:  assign debug info to the template<br>
> + * @author Monte Ohrt <monte at ohrt dot com>
>   * @param array unused in this plugin, this plugin uses 
> {@link Smarty::$_config},
>   *              {@link Smarty::$_tpl_vars} and {@link 
> Smarty::$_smarty_debug_info}
>   * @param Smarty
> @@ -24,7 +25,7 @@
>          ksort($config_vars);
>          $smarty->assign("_debug_config_keys", 
> array_keys($config_vars));
>          $smarty->assign("_debug_config_vals", 
> array_values($config_vars));
> -    }   
> +    }
>      
>      $included_templates = $smarty->_smarty_debug_info;
>      
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/function.config_load.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.config_l
> oad.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.config_l
> oad.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -13,6 +13,8 @@
>   * Purpose:  load config file vars
>   * @link 
> http://smarty.php.net/manual/en/language.function.config.load.
> php {config_load}
>   *       (Smarty online manual)
> + * @author Monte Ohrt <monte at ohrt dot com>
> + * @author messju mohr <messju at lammfellpuschen dot de> 
> (added use of resources)
>   * @param array Format:
>   * <pre>
>   * array('file' => required config file name,
> @@ -26,7 +28,7 @@
>  {
>          if ($smarty->debugging) {
>              $_params = array();
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_microtime.php');
> +            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
>              $_debug_start_time = 
> smarty_core_get_microtime($_params, $smarty);
>          }
>  
> @@ -53,7 +55,9 @@
>              }
>          }
>  
> -        $_params = array('resource_name' => $_file, 
> 'resource_base_path' => $smarty->config_dir);
> +        $_params = array('resource_name' => $_file,
> +                         'resource_base_path' => $smarty->config_dir,
> +                         'get_source' => false);
>          $smarty->_parse_resource_name($_params);
>          $_file_path = $_params['resource_type'] . ':' . 
> $_params['resource_name'];
>          if (isset($_section))
> @@ -61,10 +65,19 @@
>          else
>              $_compile_file = $smarty->_get_compile_path($_file_path);
>  
> -        if($smarty->force_compile
> -                || !file_exists($_compile_file)
> -                || ($smarty->compile_check
> -                    && !$smarty->_is_compiled($_file_path, 
> $_compile_file))) {
> +        if($smarty->force_compile || !file_exists($_compile_file)) {
> +            $_compile = true;
> +        } elseif ($smarty->compile_check) {
> +            $_params = array('resource_name' => $_file,
> +                             'resource_base_path' => 
> $smarty->config_dir,
> +                             'get_source' => false);
> +            $_compile = $smarty->_fetch_resource_info($_params) &&
> +                $_params['resource_timestamp'] > 
> filemtime($_compile_file);
> +        } else {
> +            $_compile = false;
> +        }
> +
> +        if($_compile) {
>              // compile config file
>              if(!is_object($smarty->_conf_obj)) {
>                  require_once SMARTY_DIR . 
> $smarty->config_class . '.class.php';
> @@ -74,7 +87,10 @@
>                  $smarty->_conf_obj->read_hidden = 
> $smarty->config_read_hidden;
>                  $smarty->_conf_obj->fix_newlines = 
> $smarty->config_fix_newlines;
>              }
> -            $_params = array('resource_name' => $_file, 
> 'resource_base_path' => $smarty->config_dir);
> +
> +            $_params = array('resource_name' => $_file,
> +                             'resource_base_path' => 
> $smarty->config_dir,
> +                             $_params['get_source'] = true);
>              if (!$smarty->_fetch_resource_info($_params)) {
>                  return;
>              }
> @@ -87,7 +103,7 @@
>                  $_output = '<?php $_config_vars = 
> unserialize(\'' . 
> strtr(serialize($_config_vars),array('\''=>'\\\'', 
> '\\'=>'\\\\')) . '\'); ?>';
>              }
>              $_params = (array('compile_path' => 
> $_compile_file, 'compiled_content' => $_output, 
> 'resource_timestamp' => $_params['resource_timestamp']));
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.write_compiled_resource.php');
> +            require_once(SMARTY_CORE_DIR . 
> 'core.write_compiled_resource.php');
>              smarty_core_write_compiled_resource($_params, $smarty);
>          } else {
>              include($_compile_file);
> @@ -112,7 +128,7 @@
>  
>          if ($smarty->debugging) {
>              $_params = array();
> -            require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.get_microtime.php');
> +            require_once(SMARTY_CORE_DIR . 'core.get_microtime.php');
>              $smarty->_smarty_debug_info[] = array('type'     
>  => 'config',
>                                                  'filename'  
> => $_file.' ['.$_section.'] '.$_scope,
>                                                  'depth'     
> => $smarty->_inclusion_depth,
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/function.counter.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.counter.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.counter.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -12,6 +12,7 @@
>   * Type:     function<br>
>   * Name:     counter<br>
>   * Purpose:  print out a counter value
> + * @author Monte Ohrt <monte at ohrt dot com>
>   * @link 
> http://smarty.php.net/manual/en/language.function.counter.php 
> {counter}
>   *       (Smarty online manual)
>   * @param array parameters
> 
> Modified: plog/trunk/class/template/smarty/plugins/function.cycle.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.cycle.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.cycle.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -23,7 +23,7 @@
>   *         - delimiter = the value delimiter, default is ","
>   *         - assign = boolean, assigns to template var instead of
>   *                    printed.
> - * 
> + *
>   * Examples:<br>
>   * <pre>
>   * {cycle values="#eeeeee,#d0d0d0d"}
> @@ -32,7 +32,7 @@
>   * </pre>
>   * @link 
> http://smarty.php.net/manual/en/language.function.cycle.php {cycle}
>   *       (Smarty online manual)
> - * @author Monte Ohrt <monte at ispi.net>
> + * @author Monte Ohrt <monte at ohrt dot com>
>   * @author credit to Mark Priatel <mpriatel at rogers.com>
>   * @author credit to Gerard <gerard at interfold.com>
>   * @author credit to Jason Sweat <jsweat_php at yahoo.com>
> @@ -66,7 +66,7 @@
>      $cycle_vars[$name]['delimiter'] = 
> (isset($params['delimiter'])) ? $params['delimiter'] : ',';
>      
>      if(is_array($cycle_vars[$name]['values'])) {
> -        $cycle_array = $cycle_vars[$name]['values'];    
> +        $cycle_array = $cycle_vars[$name]['values'];
>      } else {
>          $cycle_array = 
> explode($cycle_vars[$name]['delimiter'],$cycle_vars[$name]['values']);
>      }
> @@ -88,7 +88,7 @@
>  
>      if($advance) {
>          if ( $cycle_vars[$name]['index'] >= 
> count($cycle_array) -1 ) {
> -            $cycle_vars[$name]['index'] = 0;            
> +            $cycle_vars[$name]['index'] = 0;
>          } else {
>              $cycle_vars[$name]['index']++;
>          }
> 
> Modified: plog/trunk/class/template/smarty/plugins/function.debug.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.debug.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.debug.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -15,7 +15,7 @@
>   * Purpose:  popup debug window
>   * @link 
> http://smarty.php.net/manual/en/language.function.debug.php {debug}
>   *       (Smarty online manual)
> - * @author   Monte Ohrt <monte at ispi.net>
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @version  1.0
>   * @param array
>   * @param Smarty
> @@ -23,10 +23,10 @@
>   */
>  function smarty_function_debug($params, &$smarty)
>  {
> -    if($params['output']) {
> -        $smarty->assign('_smarty_debug_output',$params['output']);
> +    if (isset($params['output'])) {
> +        $smarty->assign('_smarty_debug_output', $params['output']);
>      }
> -    require_once(SMARTY_DIR . 'core' . DIRECTORY_SEPARATOR . 
> 'core.display_debug_console.php');
> +    require_once(SMARTY_CORE_DIR . 'core.display_debug_console.php');
>      return smarty_core_display_debug_console(null, $smarty);
>  }
>  
> 
> Modified: plog/trunk/class/template/smarty/plugins/function.eval.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.eval.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.eval.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  evaluate a template variable as a template<br>
>   * @link 
> http://smarty.php.net/manual/en/language.function.eval.php {eval}
>   *       (Smarty online manual)
> + * @author Monte Ohrt <monte at ohrt dot com>
>   * @param array
>   * @param Smarty
>   */
> 
> Modified: plog/trunk/class/template/smarty/plugins/function.fetch.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.fetch.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.fetch.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  fetch file, web or ftp data and display results
>   * @link 
> http://smarty.php.net/manual/en/language.function.fetch.php {fetch}
>   *       (Smarty online manual)
> + * @author Monte Ohrt <monte at ohrt dot com>
>   * @param array
>   * @param Smarty
>   * @return string|null if the assign parameter is passed, 
> Smarty assigns the
> @@ -26,9 +27,10 @@
>          return;
>      }
>  
> +    $content = '';
>      if ($smarty->security && 
> !preg_match('!^(http|ftp)://!i', $params['file'])) {
>          $_params = array('resource_type' => 'file', 
> 'resource_name' => $params['file']);
> -        require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.is_secure.php');
> +        require_once(SMARTY_CORE_DIR . 'core.is_secure.php');
>          if(!smarty_core_is_secure($_params, $smarty)) {
>              $smarty->_trigger_fatal_error('[plugin] (secure 
> mode) fetch \'' . $params['file'] . '\' is not allowed');
>              return;
> @@ -63,9 +65,12 @@
>                  } else {
>                      $port = $uri_parts['port'];
>                  }
> -                if(empty($uri_parts['user'])) {
> -                    $user = '';
> +                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) {
> @@ -171,7 +176,6 @@
>                          fputs($fp, "Authorization: BASIC 
> ".base64_encode("$user:$pass")."\r\n");
>                      }
>  
> -                    $content = '';
>                      fputs($fp, "\r\n");
>                      while(!feof($fp)) {
>                          $content .= fgets($fp,4096);
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/function.html_checkboxes.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.html_checkbo
> xes.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.html_checkbo
> xes.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -20,7 +20,8 @@
>   *           - options    (optional) - associative array
>   *           - checked    (optional) - array default not set
>   *           - separator  (optional) - ie <br> or &nbsp;
> - *           - output     (optional) - without this one the 
> buttons don't have names
> + *           - output     (optional) - the output next to 
> each checkbox
> + *           - assign     (optional) - assign the output as 
> an array to this variable
>   * Examples:
>   * <pre>
>   * {html_checkboxes values=$ids output=$names}
> @@ -30,7 +31,7 @@
>   * @link 
> http://smarty.php.net/manual/en/language.function.html.checkbo
> xes.php {html_checkboxes}
>   *      (Smarty online manual)
>   * @author     Christopher Kvarme <christopher.kvarme at flashjab.com>
> - * @author credits to Monte Ohrt <monte at ispi.net>
> + * @author credits to Monte Ohrt <monte at ohrt dot com>
>   * @version    1.0
>   * @param array
>   * @param Smarty
> @@ -81,6 +82,9 @@
>                  $options = (array)$_val;
>                  break;
>  
> +            case 'assign':
> +                break;
> +
>              default:
>                  if(!is_array($_val)) {
>                      $extra .= ' 
> '.$_key.'="'.smarty_function_escape_special_chars($_val).'"';
> @@ -95,23 +99,27 @@
>          return ''; /* raise error here? */
>  
>      settype($selected, 'array');
> -    $_html_result = '';
> +    $_html_result = array();
>  
> -    if (is_array($options)) {
> +    if (isset($options)) {
>  
>          foreach ($options as $_key=>$_val)
> -            $_html_result .= 
> smarty_function_html_checkboxes_output($name, $_key, $_val, 
> $selected, $extra, $separator, $labels);
> +            $_html_result[] = 
> smarty_function_html_checkboxes_output($name, $_key, $_val, 
> $selected, $extra, $separator, $labels);
>  
>  
>      } 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);
> +            $_html_result[] = 
> smarty_function_html_checkboxes_output($name, $_key, $_val, 
> $selected, $extra, $separator, $labels);
>          }
>  
>      }
>  
> -    return $_html_result;
> +    if(!empty($params['assign'])) {
> +        $smarty->assign($params['assign'], $_html_result);
> +    } else {
> +        return implode("\n",$_html_result);
> +    }
>  
>  }
>  
> @@ -127,7 +135,7 @@
>      }
>      $_output .= $extra . ' />' . $output;
>      if ($labels) $_output .= '</label>';
> -    $_output .=  $separator . "\n";
> +    $_output .=  $separator;
>  
>      return $_output;
>  }
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/function.html_image.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.html_im
> age.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.html_im
> age.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -15,17 +15,17 @@
>   * Purpose:  format HTML tags for the image<br>
>   * Input:<br>
>   *         - file = file (and path) of image (required)
> - *         - border = border width (optional, default 0)
>   *         - height = image height (optional, default actual height)
> - *         - image =image width (optional, default actual width)
> + *         - width = image width (optional, default actual width)
>   *         - basedir = base directory for absolute paths, default
>   *                     is environment variable DOCUMENT_ROOT
> + *         - path_prefix = prefix for path output (optional, 
> default empty)
>   *
> - * Examples: {html_image file="images/masthead.gif"}
> - * Output:   <img src="images/masthead.gif" border=0 
> width=400 height=23>
> + * Examples: {html_image file="/images/masthead.gif"}
> + * Output:   <img src="/images/masthead.gif" width=400 height=23>
>   * @link 
> http://smarty.php.net/manual/en/language.function.html.image.p
> hp {html_image}
>   *      (Smarty online manual)
> - * @author   Monte Ohrt <monte at ispi.net>
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @author credits to Duda <duda at big.hu> - wrote first image function
>   *           in repository, helped with lots of functionality
>   * @version  1.0
> @@ -40,21 +40,21 @@
>      
>      $alt = '';
>      $file = '';
> -    $border = 0;
>      $height = '';
>      $width = '';
>      $extra = '';
>      $prefix = '';
>      $suffix = '';
> +    $path_prefix = '';
>      $server_vars = ($smarty->request_use_auto_globals) ? 
> $_SERVER : $GLOBALS['HTTP_SERVER_VARS'];
>      $basedir = isset($server_vars['DOCUMENT_ROOT']) ? 
> $server_vars['DOCUMENT_ROOT'] : '';
>      foreach($params as $_key => $_val) {
>          switch($_key) {
>              case 'file':
> -            case 'border':
>              case 'height':
>              case 'width':
>              case 'dpi':
> +            case 'path_prefix':
>              case 'basedir':
>                  $$_key = $_val;
>                  break;
> @@ -93,15 +93,9 @@
>      } else {
>          $_image_path = $file;
>      }
> -
> +    
>      if(!isset($params['width']) || !isset($params['height'])) {
> -        if ($smarty->security &&
> -            ($_params = array('resource_type' => 'file', 
> 'resource_name' => $_image_path)) &&
> -            (require_once(SMARTY_DIR . 'core' . 
> DIRECTORY_SEPARATOR . 'core.is_secure.php')) &&
> -            (!smarty_core_is_secure($_params, $smarty)) ) {
> -            $smarty->trigger_error("html_image: (secure) 
> '$_image_path' not in secure directory", E_USER_NOTICE);
> -
> -        } elseif (!$_image_data = @getimagesize($_image_path)) {
> +        if(!$_image_data = @getimagesize($_image_path)) {
>              if(!file_exists($_image_path)) {
>                  $smarty->trigger_error("html_image: unable 
> to find '$_image_path'", E_USER_NOTICE);
>                  return;
> @@ -113,7 +107,13 @@
>                  return;
>              }
>          }
> -
> +        if ($smarty->security &&
> +            ($_params = array('resource_type' => 'file', 
> 'resource_name' => $_image_path)) &&
> +            (require_once(SMARTY_CORE_DIR . 'core.is_secure.php')) &&
> +            (!smarty_core_is_secure($_params, $smarty)) ) {
> +            $smarty->trigger_error("html_image: (secure) 
> '$_image_path' not in secure directory", E_USER_NOTICE);
> +        }        
> +        
>          if(!isset($params['width'])) {
>              $width = $_image_data[0];
>          }
> @@ -134,7 +134,7 @@
>          $height = round($height * $_resize);
>      }
>  
> -    return $prefix . '<img src="'.$file.'" alt="'.$alt.'" 
> border="'.$border.'" width="'.$width.'" 
> height="'.$height.'"'.$extra.' />' . $suffix;
> +    return $prefix . '<img src="'.$path_prefix.$file.'" 
> alt="'.$alt.'" width="'.$width.'" 
> height="'.$height.'"'.$extra.' />' . $suffix;
>  }
>  
>  /* vim: set expandtab: */
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/function.html_options.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.html_opti
> ons.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.html_opti
> ons.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -21,6 +21,7 @@
>   *           the passed parameters
>   * @link 
> http://smarty.php.net/manual/en/language.function.html.options
> .php {html_image}
>   *      (Smarty online manual)
> + * @author Monte Ohrt <monte at ohrt dot com>
>   * @param array
>   * @param Smarty
>   * @return string
> @@ -72,14 +73,14 @@
>  
>      $_html_result = '';
>  
> -    if (is_array($options)) {
> +    if (isset($options)) {
>          
>          foreach ($options as $_key=>$_val)
>              $_html_result .= 
> smarty_function_html_options_optoutput($_key, $_val, $selected);
>  
>      } else {
>          
> -        foreach ((array)$values as $_i=>$_key) {
> +        foreach ($values as $_i=>$_key) {
>              $_val = isset($output[$_i]) ? $output[$_i] : '';
>              $_html_result .= 
> smarty_function_html_options_optoutput($_key, $_val, $selected);
>          }
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/function.html_radios.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.html_rad
> ios.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.html_rad
> ios.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -20,7 +20,8 @@
>   *           - options    (optional) - associative array
>   *           - checked    (optional) - array default not set
>   *           - separator  (optional) - ie <br> or &nbsp;
> - *           - output     (optional) - without this one the 
> buttons don't have names
> + *           - output     (optional) - the output next to 
> each radio button
> + *           - assign     (optional) - assign the output as 
> an array to this variable
>   * Examples:
>   * <pre>
>   * {html_radios values=$ids output=$names}
> @@ -30,7 +31,7 @@
>   * @link 
> http://smarty.php.net/manual/en/language.function.html.radios.
> php {html_radios}
>   *      (Smarty online manual)
>   * @author     Christopher Kvarme <christopher.kvarme at flashjab.com>
> - * @author credits to Monte Ohrt <monte at ispi.net>
> + * @author credits to Monte Ohrt <monte at ohrt dot com>
>   * @version    1.0
>   * @param array
>   * @param Smarty
> @@ -47,6 +48,7 @@
>      $selected = null;
>      $separator = '';
>      $labels = true;
> +    $label_ids = false;
>      $output = null;
>      $extra = '';
>  
> @@ -67,6 +69,7 @@
>                  break;
>  
>              case 'labels':
> +            case 'label_ids':
>                  $$_key = (bool)$_val;
>                  break;
>  
> @@ -84,6 +87,8 @@
>                  $options = (array)$_val;
>                  break;
>  
> +            case 'assign':
> +                break;
>  
>              default:
>                  if(!is_array($_val)) {
> @@ -98,39 +103,52 @@
>      if (!isset($options) && !isset($values))
>          return ''; /* raise error here? */
>  
> -    $_html_result = '';
> +    $_html_result = array();
>  
> -    if (isset($options) && is_array($options)) {
> +    if (isset($options)) {
>  
> -        foreach ((array)$options as $_key=>$_val)
> -            $_html_result .= 
> smarty_function_html_radios_output($name, $_key, $_val, 
> $selected, $extra, $separator, $labels);
> +        foreach ($options as $_key=>$_val)
> +            $_html_result[] = 
> smarty_function_html_radios_output($name, $_key, $_val, 
> $selected, $extra, $separator, $labels, $label_ids);
>  
>      } else {
>  
> -        foreach ((array)$values as $_i=>$_key) {
> +        foreach ($values as $_i=>$_key) {
>              $_val = isset($output[$_i]) ? $output[$_i] : '';
> -            $_html_result .= 
> smarty_function_html_radios_output($name, $_key, $_val, 
> $selected, $extra, $separator, $labels);
> +            $_html_result[] = 
> smarty_function_html_radios_output($name, $_key, $_val, 
> $selected, $extra, $separator, $labels, $label_ids);
>          }
>  
>      }
>  
> -    return $_html_result;
> +    if(!empty($params['assign'])) {
> +        $smarty->assign($params['assign'], $_html_result);
> +    } else {
> +        return implode("\n",$_html_result);
> +    }
>  
>  }
>  
> -function smarty_function_html_radios_output($name, $value, 
> $output, $selected, $extra, $separator, $labels) {
> +function smarty_function_html_radios_output($name, $value, 
> $output, $selected, $extra, $separator, $labels, $label_ids) {
>      $_output = '';
> -    if ($labels) $_output .= '<label>';
> -    $_output .= '<input type="radio" name="'
> +    if ($labels) {
> +      if($label_ids) {
> +          $_id = 
> smarty_function_escape_special_chars(preg_replace('![^\w\-\.]!
> ', '_', $name . '_' . $value));
> +          $_output .= '<label for="' . $_id . '">';
> +      } else {
> +          $_output .= '<label>';           
> +      }
> +   }
> +   $_output .= '<input type="radio" name="'
>          . smarty_function_escape_special_chars($name) . '" value="'
>          . smarty_function_escape_special_chars($value) . '"';
>  
> -    if ($value==$selected) {
> +   if ($labels && $label_ids) $_output .= ' id="' . $_id . '"';
> +
> +    if ((string)$value==$selected) {
>          $_output .= ' checked="checked"';
>      }
>      $_output .= $extra . ' />' . $output;
>      if ($labels) $_output .= '</label>';
> -    $_output .=  $separator . "\n";
> +    $_output .=  $separator;
>  
>      return $_output;
>  }
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/function.html_select_date.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.html_select_
> date.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.html_select_
> date.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -22,16 +22,20 @@
>   *                month values (Gary Loescher)
>   *           - 1.3.1 added support for choosing format for
>   *                day values (Marcus Bointon)
> + *           - 1.3.2 suppport negative timestamps, force year
> + *             dropdown to include given date unless 
> explicitly set (Monte)
>   * @link 
> http://smarty.php.net/manual/en/language.function.html.select.
> date.php {html_select_date}
>   *      (Smarty online manual)
> - * @version 1.3.1
> - * @author   Andrei Zmievski
> + * @version 1.3.2
> + * @author Andrei Zmievski
> + * @author Monte Ohrt <monte at ohrt dot com>
>   * @param array
>   * @param Smarty
>   * @return string
>   */
>  function smarty_function_html_select_date($params, &$smarty)
>  {
> +    require_once 
> $smarty->_get_plugin_filepath('shared','escape_special_chars');
>      require_once 
> $smarty->_get_plugin_filepath('shared','make_timestamp');
>      require_once 
> $smarty->_get_plugin_filepath('function','html_options');
>      /* Default values. */
> @@ -76,6 +80,7 @@
>      $day_empty       = null;
>      $month_empty     = null;
>      $year_empty      = null;
> +    $extra_attrs     = '';
>  
>      foreach ($params as $_key=>$_value) {
>          switch ($_key) {
> @@ -117,21 +122,28 @@
>                  break;
>  
>              default:
> -                $smarty->trigger_error("[html_select_date] 
> unknown parameter $_key", E_USER_WARNING);
> -
> +                if(!is_array($_value)) {
> +                    $extra_attrs .= ' 
> '.$_key.'="'.smarty_function_escape_special_chars($_value).'"';
> +                } else {
> +                    
> $smarty->trigger_error("html_select_date: extra attribute 
> '$_key' cannot be an array", E_USER_NOTICE);
> +                }
> +                break;
>          }
>      }
>  
> +    if(preg_match('!^-\d+$!',$time)) {
> +        // negative timestamp, use date()
> +        $time = date('Y-m-d',$time);
> +    }
>      // If $time is not in format yyyy-mm-dd
>      if (!preg_match('/^\d{0,4}-\d{0,2}-\d{0,2}$/', $time)) {
> -        // then $time is empty or unix timestamp or mysql timestamp
> -        // using smarty_make_timestamp to get an unix timestamp and
> +        // use smarty_make_timestamp to get an unix timestamp and
>          // strftime to make yyyy-mm-dd
>          $time = strftime('%Y-%m-%d', smarty_make_timestamp($time));
>      }
>      // Now split this in pieces, which later can be used to 
> set the select
>      $time = explode("-", $time);
> -
> +    
>      // make syntax "+N" or "-N" work with start_year and end_year
>      if (preg_match('!^(\+|\-)\s*(\d+)$!', $end_year, $match)) {
>          if ($match[1] == '+') {
> @@ -147,6 +159,16 @@
>              $start_year = strftime('%Y') - $match[2];
>          }
>      }
> +    if (strlen($time[0]) > 0) { 
> +        if ($start_year > $time[0] && 
> !isset($params['start_year'])) {
> +            // force start year to include given date if not 
> explicitly set
> +            $start_year = $time[0];
> +        }
> +        if($end_year < $time[0] && !isset($params['end_year'])) {
> +            // force end year to include given date if not 
> explicitly set
> +            $end_year = $time[0];
> +        }
> +    }
>  
>      $field_order = strtoupper($field_order);
>  
> @@ -179,14 +201,13 @@
>          if (null !== $all_extra){
>              $month_result .= ' ' . $all_extra;
>          }
> -        $month_result .= '>'."\n";
> +        $month_result .= $extra_attrs . '>'."\n";
>  
>          $month_result .= 
> smarty_function_html_options(array('output'     => $month_names,
>                                                              
> 'values'     => $month_values,
> -                                                            
> 'selected'   => $month_values[(int)$time[1]],
> +                                                            
> 'selected'   => (int)$time[1] ? strftime($month_value_format, 
> mktime(0, 0, 0, (int)$time[1], 1, 2000)) : '',
>                                                              
> 'print_result' => false),
>                                                        $smarty);
> -
>          $month_result .= '</select>';
>      }
>  
> @@ -216,7 +237,7 @@
>          if (null !== $day_extra){
>              $day_result .= ' ' . $day_extra;
>          }
> -        $day_result .= '>'."\n";
> +        $day_result .= $extra_attrs . '>'."\n";
>          $day_result .= 
> smarty_function_html_options(array('output'     => $days,
>                                                            
> 'values'     => $day_values,
>                                                            
> 'selected'   => $time[2],
> @@ -239,11 +260,13 @@
>              if (null !== $year_extra){
>                  $year_result .= ' ' . $year_extra;
>              }
> -            $year_result .= '>';
> +            $year_result .= ' />';
>          } else {
>              $years = range((int)$start_year, (int)$end_year);
>              if ($reverse_years) {
>                  rsort($years, SORT_NUMERIC);
> +            } else {
> +                sort($years, SORT_NUMERIC);
>              }
>              $yearvals = $years;
>              if(isset($year_empty)) {
> @@ -260,7 +283,7 @@
>              if (null !== $year_extra){
>                  $year_result .= ' ' . $year_extra;
>              }
> -            $year_result .= '>'."\n";
> +            $year_result .= $extra_attrs . '>'."\n";
>              $year_result .= 
> smarty_function_html_options(array('output' => $years,
>                                                               
>   'values' => $yearvals,
>                                                               
>   'selected'   => $time[0],
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/function.html_select_time.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.html_select_
> time.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.html_select_
> time.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,8 @@
>   * Purpose:  Prints the dropdowns for time selection
>   * @link 
> http://smarty.php.net/manual/en/language.function.html.select.
> time.php {html_select_time}
>   *          (Smarty online manual)
> + * @author Roberto Berto <roberto at berto.net>
> + * @credits Monte Ohrt <monte AT ohrt DOT com>
>   * @param array
>   * @param Smarty
>   * @return string
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/function.html_table.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.html_ta
> ble.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.html_ta
> ble.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -33,7 +33,7 @@
>   * {table loop=$data cols=4 tr_attr='"bgcolor=red"'}
>   * {table loop=$data cols=4 tr_attr=$colors}
>   * </pre>
> - * @author   Monte Ohrt <monte at ispi.net>
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @version  1.0
>   * @link 
> http://smarty.php.net/manual/en/language.function.html.table.p
> hp {html_table}
>   *          (Smarty online manual)
> @@ -73,6 +73,7 @@
>              case 'trailpad':
>              case 'hdir':
>              case 'vdir':
> +            case 'inner':
>                  $$_key = (string)$_value;
>                  break;
>  
> 
> Modified: plog/trunk/class/template/smarty/plugins/function.mailto.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.mailto.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.mailto.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -20,6 +20,7 @@
>   *         - encode = (optional) can be one of:
>   *                * none : no encoding (default)
>   *                * javascript : encode with javascript
> + *                * javascript_charcode : encode with 
> javascript charcode
>   *                * hex : encode with hexidecimal (no javascript)
>   *         - cc = (optional) address(es) to carbon copy
>   *         - bcc = (optional) address(es) to blind carbon copy
> @@ -40,7 +41,7 @@
>   * @link 
> http://smarty.php.net/manual/en/language.function.mailto.php {mailto}
>   *          (Smarty online manual)
>   * @version  1.2
> - * @author   Monte Ohrt <monte at ispi.net>
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @author   credits to Jason Sweat (added cc, bcc and 
> subject functionality)
>   * @param    array
>   * @param    Smarty
> @@ -48,7 +49,7 @@
>   */
>  function smarty_function_mailto($params, &$smarty)
>  {
> -    $extra = '';    
> +    $extra = '';
>  
>      if (empty($params['address'])) {
>          $smarty->trigger_error("mailto: missing 'address' 
> parameter");
> @@ -92,7 +93,7 @@
>      $address .= $mail_parm_vals;
>  
>      $encode = (empty($params['encode'])) ? 'none' : 
> $params['encode'];
> -    if (!in_array($encode,array('javascript','hex','none')) ) {
> +    if 
> (!in_array($encode,array('javascript','javascript_charcode','h
> ex','none')) ) {
>          $smarty->trigger_error("mailto: 'encode' parameter 
> must be none, javascript or hex");
>          return;
>      }
> @@ -105,8 +106,27 @@
>              $js_encode .= '%' . bin2hex($string[$x]);
>          }
>  
> -        return '<script type="text/javascript" 
> language="javascript">eval(unescape(\''.$js_encode.'\'))</script>';
> +        return '<script 
> type="text/javascript">eval(unescape(\''.$js_encode.'\'))</script>';
>  
> +    } elseif ($encode == 'javascript_charcode' ) {
> +        $string = '<a href="mailto:'.$address.'" 
> '.$extra.'>'.$text.'</a>';
> +
> +        for($x = 0, $y = strlen($string); $x < $y; $x++ ) {
> +            $ord[] = ord($string[$x]);   
> +        }
> +
> +        $_ret = "<script type=\"text/javascript\" 
> language=\"javascript\">\n";
> +        $_ret .= "<!--\n";
> +        $_ret .= "{document.write(String.fromCharCode(";
> +        $_ret .= implode(',',$ord);
> +        $_ret .= "))";
> +        $_ret .= "}\n";
> +        $_ret .= "//-->\n";
> +        $_ret .= "</script>\n";
> +        
> +        return $_ret;
> +        
> +        
>      } elseif ($encode == 'hex') {
>  
>          preg_match('!^(.*)(\?.*)$!',$address,$match);
> @@ -114,6 +134,7 @@
>              $smarty->trigger_error("mailto: hex encoding 
> does not work with extra attributes. Try javascript.");
>              return;
>          }
> +        $address_encode = '';
>          for ($x=0; $x < strlen($address); $x++) {
>              if(preg_match('!\w!',$address[$x])) {
>                  $address_encode .= '%' . bin2hex($address[$x]);
> @@ -121,11 +142,13 @@
>                  $address_encode .= $address[$x];
>              }
>          }
> +        $text_encode = '';
>          for ($x=0; $x < strlen($text); $x++) {
>              $text_encode .= '&#x' . bin2hex($text[$x]).';';
>          }
>  
> -        return '<a href="mailto:'.$address_encode.'" 
> '.$extra.'>'.$text_encode.'</a>';
> +        $mailto = "&#109;&#97;&#105;&#108;&#116;&#111;&#58;";
> +        return '<a href="'.$mailto.$address_encode.'" 
> '.$extra.'>'.$text_encode.'</a>';
>  
>      } else {
>          // no encoding
> 
> Modified: plog/trunk/class/template/smarty/plugins/function.math.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.math.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.math.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  handle math computations in template<br>
>   * @link 
> http://smarty.php.net/manual/en/language.function.math.php {math}
>   *          (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param array
>   * @param Smarty
>   * @return string
> @@ -35,12 +36,13 @@
>      }
>  
>      // match all vars in equation, make sure all are passed
> -    
> preg_match_all("!\!(0x)([a-zA-Z][a-zA-Z0-9_]*)!",$equation, $match);
> +    
> preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]+)!",
> $equation, $match);
>      $allowed_funcs = 
> array('int','abs','ceil','cos','exp','floor','log','log10',
>                             
> 'max','min','pi','pow','rand','round','sin','sqrt','srand','tan');
> -    foreach($match[2] as $curr_var) {
> -        if (!in_array($curr_var,array_keys($params)) && 
> !in_array($curr_var, $allowed_funcs)) {
> -            $smarty->trigger_error("math: parameter 
> $curr_var not passed as argument");
> +    
> +    foreach($match[1] as $curr_var) {
> +        if ($curr_var && !in_array($curr_var, 
> array_keys($params)) && !in_array($curr_var, $allowed_funcs)) {
> +            $smarty->trigger_error("math: function call 
> $curr_var not allowed");
>              return;
>          }
>      }
> @@ -56,7 +58,7 @@
>                  $smarty->trigger_error("math: parameter 
> $key: is not numeric");
>                  return;
>              }
> -            $equation = preg_replace("/\b$key\b/",$val, $equation);
> +            $equation = preg_replace("/\b$key\b/", " 
> \$params['$key'] ", $equation);
>          }
>      }
>  
> 
> Modified: plog/trunk/class/template/smarty/plugins/function.popup.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.popup.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.popup.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  make text pop up in windows via overlib
>   * @link 
> http://smarty.php.net/manual/en/language.function.popup.php {popup}
>   *          (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param array
>   * @param Smarty
>   * @return string
> @@ -25,7 +26,11 @@
>          switch ($_key) {
>              case 'text':
>              case 'trigger':
> +            case 'function':
> +            case 'inarray':
>                  $$_key = (string)$_value;
> +                if ($_key == 'function' || $_key == 'inarray')
> +                    $append .= ',' . strtoupper($_key) . 
> ",'$_value'";
>                  break;
>  
>              case 'caption':
> @@ -42,6 +47,15 @@
>              case 'textfont':
>              case 'captionfont':
>              case 'closefont':
> +            case 'fgbackground':
> +            case 'bgbackground':
> +            case 'caparray':
> +            case 'capicon':
> +            case 'background':
> +            case 'frame':
> +                $append .= ',' . strtoupper($_key) . ",'$_value'";
> +                break;
> +
>              case 'textsize':
>              case 'captionsize':
>              case 'closesize':
> @@ -50,23 +64,15 @@
>              case 'border':
>              case 'offsetx':
>              case 'offsety':
> -            case 'fgbackground':
> -            case 'bgbackground':
> -            case 'inarray':
> -            case 'caparray':
> -            case 'capicon':
>              case 'snapx':
>              case 'snapy':
>              case 'fixx':
>              case 'fixy':
> -            case 'background':
>              case 'padx':
>              case 'pady':
> -            case 'frame':
>              case 'timeout':
>              case 'delay':
> -            case 'function':
> -                $append .= ',' . strtoupper($_key) . ",'$_value'";
> +                $append .= ',' . strtoupper($_key) . ",$_value";
>                  break;
>  
>              case 'sticky':
> @@ -81,6 +87,9 @@
>              case 'fullhtml':
>              case 'hauto':
>              case 'vauto':
> +            case 'mouseoff':
> +            case 'followmouse':
> +            case 'closeclick':
>                  if ($_value) $append .= ',' . strtoupper($_key);
>                  break;
>  
> @@ -97,8 +106,11 @@
>      if (empty($trigger)) { $trigger = "onmouseover"; }
>  
>      $retval = $trigger . '="return 
> overlib(\''.preg_replace(array("!'!","![\r\n]!"),array("\'",'\
> r'),$text).'\'';
> -    $retval .= $append . ');" onmouseout="nd();"';
> +    $retval .= $append . ');"';
> +    if ($trigger == 'onmouseover')
> +       $retval .= ' onmouseout="nd();"';
>  
> +
>      return $retval;
>  }
>  
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/function.popup_init.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/function.popup_i
> nit.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/function.popup_i
> nit.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  initialize overlib
>   * @link 
> http://smarty.php.net/manual/en/language.function.popup.init.p
> hp {popup_init}
>   *          (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param array
>   * @param Smarty
>   * @return string
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.capitalize.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.capital
> ize.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.capital
> ize.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,12 +14,30 @@
>   * Purpose:  capitalize words in the string
>   * @link 
> http://smarty.php.net/manual/en/language.modifiers.php#LANGUAG
> E.MODIFIER.CAPITALIZE
>   *      capitalize (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @return string
>   */
> -function smarty_modifier_capitalize($string)
> +function smarty_modifier_capitalize($string, $uc_digits = false)
>  {
> -    return ucwords($string);
> +    smarty_modifier_capitalize_ucfirst(null, $uc_digits);
> +    return preg_replace_callback('!\b\w+\b!', 
> 'smarty_modifier_capitalize_ucfirst', $string);
>  }
>  
> +function smarty_modifier_capitalize_ucfirst($string, 
> $uc_digits = null)
> +{
> +    static $_uc_digits = false;
> +    
> +    if(isset($uc_digits)) {
> +        $_uc_digits = $uc_digits;
> +        return;
> +    }
> +    
> +    if(!preg_match('!\d!',$string[0]) || $_uc_digits)
> +        return ucfirst($string[0]);
> +    else
> +        return $string[0];
> +}
> +
> +
>  ?>
> 
> Modified: plog/trunk/class/template/smarty/plugins/modifier.cat.php
> ===================================================================
> --- plog/trunk/class/template/smarty/plugins/modifier.cat.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ plog/trunk/class/template/smarty/plugins/modifier.cat.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -17,7 +17,7 @@
>   * Example:  {$var|cat:"foo"}
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.cat.php cat
>   *          (Smarty online manual)
> - * @author   Monte Ohrt <monte at ispi.net>
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @version 1.0
>   * @param string
>   * @param string
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.count_characters.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.count_charac
> ters.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.count_charac
> ters.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  count the number of characters in a text
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.count.characters.php
>   *          count_characters (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @param boolean include whitespace in the character count
>   * @return integer
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.count_paragraphs.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.count_paragr
> aphs.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.count_paragr
> aphs.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  count the number of paragraphs in a text
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
>   *          count_paragraphs (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @return integer
>   */
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.count_sentences.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.count_senten
> ces.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.count_senten
> ces.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  count the number of sentences in a text
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.count.paragraphs.php
>   *          count_sentences (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @return integer
>   */
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.count_words.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.count_wo
> rds.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.count_wo
> rds.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  count the number of words in a text
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.count.words.php
>   *          count_words (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @return integer
>   */
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.date_format.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.date_for
> mat.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.date_for
> mat.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -21,6 +21,7 @@
>   *         - default_date: default date if $string is empty
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.date.format.php
>   *          date_format (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @param string
>   * @param string
> @@ -29,6 +30,11 @@
>   */
>  function smarty_modifier_date_format($string, $format="%b 
> %e, %Y", $default_date=null)
>  {
> +    if (substr(PHP_OS,0,3) == 'WIN') {
> +           $_win_from = array ('%e',  '%T',       '%D');
> +           $_win_to   = array ('%#d', '%H:%M:%S', '%m/%d/%y');
> +           $format = str_replace($_win_from, $_win_to, $format);
> +    }
>      if($string != '') {
>          return strftime($format, smarty_make_timestamp($string));
>      } elseif (isset($default_date) && $default_date != '') {
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.debug_print_var.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.debug_print_
> var.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.debug_print_
> var.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  formats variable contents for display in the console
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.debug.print.var.php
>   *          debug_print_var (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param array|object
>   * @param integer
>   * @param integer
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.default.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.default.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.default.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  designate default value for empty variables
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.default.php
>   *          default (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @param string
>   * @return string
> 
> Modified: plog/trunk/class/template/smarty/plugins/modifier.escape.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.escape.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.escape.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,25 +14,26 @@
>   * Purpose:  Escape the string according to escapement type
>   * @link http://smarty.php.net/manual/en/language.modifier.escape.php
>   *          escape (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @param html|htmlall|url|quotes|hex|hexentity|javascript
>   * @return string
>   */
> -function smarty_modifier_escape($string, $esc_type = 'html')
> +function smarty_modifier_escape($string, $esc_type = 'html', 
> $char_set = 'ISO-8859-1')
>  {
>      switch ($esc_type) {
>          case 'html':
> -            return htmlspecialchars($string, ENT_QUOTES);
> +            return htmlspecialchars($string, ENT_QUOTES, $char_set);
>  
>          case 'htmlall':
> -            return htmlentities($string, ENT_QUOTES);
> +            return htmlentities($string, ENT_QUOTES, $char_set);
>  
>          case 'url':
> -            return urlencode($string);
> -            
> -        case 'raw':
>              return rawurlencode($string);
>  
> +        case 'urlpathinfo':
> +            return str_replace('%2F','/',rawurlencode($string));
> +            
>          case 'quotes':
>              // escape unescaped single quotes
>              return preg_replace("%(?<!\\\\)'%", "\\'", $string);
> @@ -52,9 +53,35 @@
>              }
>              return $return;
>  
> +        case 'decentity':
> +            $return = '';
> +            for ($x=0; $x < strlen($string); $x++) {
> +                $return .= '&#' . ord($string[$x]) . ';';
> +            }
> +            return $return;
> +
>          case 'javascript':
> -            // escape quotes and backslashes and newlines
> -            return strtr($string, 
> array('\\'=>'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\n'));
> +            // escape quotes and backslashes, newlines, etc.
> +            return strtr($string, 
> array('\\'=>'\\\\',"'"=>"\\'",'"'=>'\\"',"\r"=>'\\r',"\n"=>'\\
> n','</'=>'<\/'));
> +            
> +        case 'mail':
> +            // safe way to display e-mail address on a web page
> +            return str_replace(array('@', '.'),array(' [AT] 
> ', ' [DOT] '), $string);
> +            
> +        case 'nonstd':
> +           // escape non-standard chars, such as ms document quotes
> +           $_res = '';
> +           for($_i = 0, $_len = strlen($string); $_i < 
> $_len; $_i++) {
> +               $_ord = ord(substr($string, $_i, 1));
> +               // non-standard char, escape it
> +               if($_ord >= 126){
> +                   $_res .= '&#' . $_ord . ';';
> +               }
> +               else {
> +                   $_res .= substr($string, $_i, 1);
> +               }
> +           }
> +           return $_res;
>  
>          default:
>              return $string;
> 
> Modified: plog/trunk/class/template/smarty/plugins/modifier.indent.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.indent.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.indent.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  indent lines of text
>   * @link http://smarty.php.net/manual/en/language.modifier.indent.php
>   *          indent (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @param integer
>   * @param string
> 
> Modified: plog/trunk/class/template/smarty/plugins/modifier.lower.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.lower.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.lower.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  convert string to lowercase
>   * @link http://smarty.php.net/manual/en/language.modifier.lower.php
>   *          lower (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @return string
>   */
> 
> Modified: plog/trunk/class/template/smarty/plugins/modifier.nl2br.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.nl2br.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.nl2br.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -21,7 +21,7 @@
>   * @link http://smarty.php.net/manual/en/language.modifier.nl2br.php
>   *          nl2br (Smarty online manual)
>   * @version  1.0
> - * @author   Monte Ohrt <monte at ispi.net>
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @return string
>   */
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.regex_replace.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.regex_repl
> ace.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.regex_repl
> ace.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  regular epxression search/replace
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.regex.replace.php
>   *          regex_replace (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @param string|array
>   * @param string|array
> @@ -21,6 +22,10 @@
>   */
>  function smarty_modifier_regex_replace($string, $search, $replace)
>  {
> +    if (preg_match('!\W(\w+)$!s', $search, $match) && 
> (strpos($match[1], 'e') !== false)) {
> +        /* remove eval-modifier from $search */
> +        $search = substr($search, 0, -strlen($match[1])) . 
> str_replace('e', '', $match[1]);
> +    }
>      return preg_replace($search, $replace, $string);
>  }
>  
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.replace.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.replace.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.replace.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  simple search/replace
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.replace.php
>   *          replace (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @param string
>   * @param string
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.spacify.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.spacify.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.spacify.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  add spaces between characters in a string
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.spacify.php
>   *          spacify (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @param string
>   * @return string
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.string_format.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.string_for
> mat.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.string_for
> mat.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  format strings via sprintf
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.string.format.php
>   *          string_format (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @param string
>   * @return string
> 
> Modified: plog/trunk/class/template/smarty/plugins/modifier.strip.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.strip.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.strip.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -17,7 +17,7 @@
>   * Date:     September 25th, 2002
>   * @link http://smarty.php.net/manual/en/language.modifier.strip.php
>   *          strip (Smarty online manual)
> - * @author   Monte Ohrt <monte at ispi.net>
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @version  1.0
>   * @param string
>   * @param string
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.strip_tags.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.strip_t
> ags.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.strip_t
> ags.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  strip html tags from text
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.strip.tags.php
>   *          strip_tags (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @param boolean
>   * @return string
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.truncate.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.trunc
> ate.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.trunc
> ate.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -13,29 +13,36 @@
>   * Name:     truncate<br>
>   * Purpose:  Truncate a string to a certain length if necessary,
>   *           optionally splitting in the middle of a word, and
> - *           appending the $etc string.
> + *           appending the $etc string or inserting $etc 
> into the middle.
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.truncate.php
>   *          truncate (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @param integer
>   * @param string
>   * @param boolean
> + * @param boolean
>   * @return string
>   */
>  function smarty_modifier_truncate($string, $length = 80, 
> $etc = '...',
> -                                  $break_words = false)
> +                                  $break_words = false, 
> $middle = false)
>  {
>      if ($length == 0)
>          return '';
>  
>      if (strlen($string) > $length) {
>          $length -= strlen($etc);
> -        if (!$break_words)
> +        if (!$break_words && !$middle) {
>              $string = preg_replace('/\s+?(\S+)?$/', '', 
> substr($string, 0, $length+1));
> -      
> -        return substr($string, 0, $length).$etc;
> -    } else
> +        }
> +        if(!$middle) {
> +            return substr($string, 0, $length).$etc;
> +        } else {
> +            return substr($string, 0, $length/2) . $etc . 
> substr($string, -$length/2);
> +        }
> +    } else {
>          return $string;
> +    }
>  }
>  
>  /* vim: set expandtab: */
> 
> Modified: plog/trunk/class/template/smarty/plugins/modifier.upper.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.upper.php	
> 2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.upper.php	
> 2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  convert string to uppercase
>   * @link http://smarty.php.net/manual/en/language.modifier.upper.php
>   *          upper (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @return string
>   */
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/modifier.wordwrap.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/modifier.wordw
> rap.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/modifier.wordw
> rap.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -14,6 +14,7 @@
>   * Purpose:  wrap a string of text at a given length
>   * @link 
> http://smarty.php.net/manual/en/language.modifier.wordwrap.php
>   *          wordwrap (Smarty online manual)
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @param integer
>   * @param string
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/outputfilter.trimwhit
> espace.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/outputfilter.trimwhit
> espace.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/outputfilter.trimwhit
> espace.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -19,7 +19,7 @@
>   * Install:  Drop into the plugin directory, call
>   *           
> <code>$smarty->load_filter('output','trimwhitespace');</code>
>   *           from application.
> - * @author   Monte Ohrt <monte at ispi.net>
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @author Contributions from Lars Noschinski 
> <lars at usenet.noschinski.de>
>   * @version  1.3
>   * @param string
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/shared.escape_special
> _chars.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/shared.escape_special
> _chars.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/shared.escape_special
> _chars.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -12,6 +12,7 @@
>   * Function: smarty_function_escape_special_chars<br>
>   * Purpose:  used by other smarty functions to escape
>   *           special chars except for already escaped ones
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @return string
>   */
> 
> Modified: 
> plog/trunk/class/template/smarty/plugins/shared.make_timestamp.php
> ===================================================================
> --- 
> plog/trunk/class/template/smarty/plugins/shared.make_timest
> amp.php	2006-01-31 22:34:25 UTC (rev 2878)
> +++ 
> plog/trunk/class/template/smarty/plugins/shared.make_timest
> amp.php	2006-02-01 15:27:58 UTC (rev 2879)
> @@ -10,32 +10,35 @@
>   * Function: smarty_make_timestamp<br>
>   * Purpose:  used by other smarty functions to make a timestamp
>   *           from a string.
> + * @author   Monte Ohrt <monte at ohrt dot com>
>   * @param string
>   * @return string
>   */
>  function smarty_make_timestamp($string)
>  {
>      if(empty($string)) {
> -        $string = "now";
> -    }
> -    $time = strtotime($string);
> -    if (is_numeric($time) && $time != -1)
> -        return $time;
> +        // use "now":
> +        $time = time();
>  
> -    // is mysql timestamp format of YYYYMMDDHHMMSS?
> -    if (preg_match('/^\d{14}$/', $string)) {
> -        $time = 
> mktime(substr($string,8,2),substr($string,10,2),substr($string,12,2),
> -               
> substr($string,4,2),substr($string,6,2),substr($string,0,4));
> -
> -        return $time;
> +    } elseif (preg_match('/^\d{14}$/', $string)) {
> +        // it is mysql timestamp format of YYYYMMDDHHMMSS?   
>          
> +        $time = mktime(substr($string, 8, 2),substr($string, 
> 10, 2),substr($string, 12, 2),
> +                       substr($string, 4, 2),substr($string, 
> 6, 2),substr($string, 0, 4));
> +        
> +    } elseif (is_numeric($string)) {
> +        // it is a numeric string, we handle it as timestamp
> +        $time = (int)$string;
> +        
> +    } else {
> +        // strtotime should handle it
> +        $time = strtotime($string);
> +        if ($time == -1 || $time === false) {
> +            // strtotime() was not able to parse $string, use "now":
> +            $time = time();
> +        }
>      }
> +    return $time;
>  
> -    // couldn't recognize it, try to return a time
> -    $time = (int) $string;
> -    if ($time > 0)
> -        return $time;
> -    else
> -        return time();
>  }
>  
>  /* vim: set expandtab: */
> 
> _______________________________________________
> pLog-svn mailing list
> pLog-svn at devel.lifetype.net
> http://devel.lifetype.net/mailman/listinfo/plog-svn



More information about the pLog-svn mailing list