Compare commits

..

49 Commits

Author SHA1 Message Date
Uwe Tews bf1de6c105 Merge branch 'v3.1.18' 2014-10-31 02:15:15 +01:00
Uwe Tews 97decc4c04 Merge branch 'v3.1.17' 2014-10-31 02:10:17 +01:00
Uwe Tews 43be80762e Merge branch 'v3.1.16' 2014-10-31 02:05:49 +01:00
Uwe.Tews@googlemail.com c7071d9d2c - bugfix clearCompiledTemplate() did not delete files on WINDOWS when a compile_id was specified 2014-04-19 13:53:20 +00:00
Uwe.Tews@googlemail.com 8658b04c86 bugfix calling createTemplate(template, data) with empty data array caused notice of array to string conversion (Issue 189) 2014-04-19 11:42:11 +00:00
Uwe.Tews@googlemail.com d6c1482996 fixed typos 2014-04-18 08:13:32 +00:00
Uwe.Tews@googlemail.com 608dddc19a 2014-04-18 08:09:38 +00:00
Uwe.Tews@googlemail.com a613394887 Update dev version number to 3.1.19-dev 2014-04-07 19:57:42 +00:00
monte.ohrt f67473f085 update to 3.1.18 2014-04-07 18:30:41 +00:00
Uwe.Tews@googlemail.com 00c919dcc2 bugfix update of composer file (Issue 168 and 184) 2014-04-06 19:06:32 +00:00
Uwe.Tews@googlemail.com 668bc16717 - bugfix template inheritance fail when using custom resource after patch of 8.3.2014 (Issue 187) 2014-04-06 18:50:39 +00:00
Uwe.Tews@googlemail.com 79d67afb0f - bugfix default date format leads to extra spaces when displaying dates with single digit days (Issue 182) 2014-04-04 23:38:36 +00:00
Uwe.Tews@googlemail.com 58982caf27 - bugfix Smart_Resource_Custom should not lowercase the resource name (Issue 183) 2014-03-26 20:33:03 +00:00
Uwe.Tews@googlemail.com 474e863af1 - bugfix using a {foreach} property like @iteration could fail when used in inheritance parent templates (Issue 182) 2014-03-24 18:52:29 +00:00
Uwe.Tews@googlemail.com 478db521c9 - bugfix $smarty->auto_literal and mbsting.func_overload 2, 6 or 7 did fail (forum topic 24899) 2014-03-20 22:07:26 +00:00
Uwe.Tews@googlemail.com 7dec7d9963 - revert change of 17.03.2014 2014-03-18 18:22:33 +00:00
Uwe.Tews@googlemail.com d82d54bffd fix line endings 2014-03-17 21:57:15 +00:00
Uwe.Tews@googlemail.com 45fc4cd729 - bugfix $smarty->auto_literal and mbsting.func_overload 2, 6 or 7 did fail (forum topic 24899) 2014-03-17 19:04:48 +00:00
Uwe.Tews@googlemail.com ad62b0b2f8 - bugfix Smarty_CacheResource_Keyvaluestore did use different keys on read/writes and clearCache() calls (Issue 169) 2014-03-15 21:43:04 +00:00
Uwe.Tews@googlemail.com 3d4d35f4d7 - bugfix clearXxx() change of 27.1.2014 did not work when specifing cache_id or compile_id (forum topic 24868 and 24867) 2014-03-13 20:32:39 +00:00
monte.ohrt 40acefe91b update changelog 2014-03-12 19:50:58 +00:00
Uwe.Tews@googlemail.com af13907219 08.03.2014
- bugfix relative file path {include} within {block} of child templates did throw exception on first call (Issue 177)
2014-03-08 23:03:08 +00:00
Uwe.Tews@googlemail.com f06013927c - bugfix Smarty failed when executing PHP on HHVM (Hip Hop 2.4) because uniqid('',true) does return string with ',' (forum topic 20343) 2014-02-17 18:21:31 +00:00
Uwe.Tews@googlemail.com bfa0ce8ba4 - bugfix a '//' or '\\' in template_dir path could produce wrong path on relative filepath in {include} (Issue 175) 2014-02-16 18:34:08 +00:00
Uwe.Tews@googlemail.com f242ce30fb - bugfix shared.literal_compiler_param.php did throw an exception when literal did contain a '-' (smarty-developers group) 2014-02-05 19:39:21 +00:00
Uwe.Tews@googlemail.com ba2996fef5 - bugfix clearCompiledTemplate(), clearAll() and clear() should use realpath to avoid possible exception from RecursiveDirectoryIterator (Issue 171) 2014-01-27 16:35:56 +00:00
Uwe.Tews@googlemail.com 79dfde4977 - bugfix $smarty->debugging = true; did show the variable of the $smarty object not the variables used in display() call (forum topic 24764) 2014-01-27 16:08:55 +00:00
Uwe.Tews@googlemail.com 0e03ba5b61 - bugfix undo block nesting checks for {nocache} for reasons like forum topic 23280 (forum topic 24762) 2014-01-26 20:11:19 +00:00
Uwe.Tews@googlemail.com 290dd3f73f - bugfix the compiler did fail when using template inheritance and recursive {include} (smarty-developers group) 2014-01-18 14:43:02 +00:00
Uwe.Tews@googlemail.com 1dfbe19ebf - internals content cache should be clear when updating cache file 2014-01-11 12:21:12 +00:00
Uwe.Tews@googlemail.com 18ff092501 2014-01-11 12:15:37 +00:00
Uwe.Tews@googlemail.com 54d5d949de - bugfix SmartyBC.class.php should use require_once to load Smarty.class.php (forum topic 24683) 2014-01-08 21:16:06 +00:00
Uwe.Tews@googlemail.com 797bd37c5f - bugfix Smarty_CacheResource_Custom did not handle template resource type specifications on clearCache() calls (Issue 161) 2014-01-08 21:05:58 +00:00
monte.ohrt fa09638f95 update changelog 2013-12-17 16:06:12 +00:00
Uwe.Tews@googlemail.com a0a24e1975 - enhancement additional debug output at $smarty->_parserdebug = true; 2013-12-15 15:25:50 +00:00
Uwe.Tews@googlemail.com 7f88dcd31f - bugfix {include} with {block} tag handling (forum topic 24599, 24594, 24682) (Issue 161)
Read 3.1.16_RELEASE_NOTES for more details
2013-12-15 15:19:01 +00:00
Uwe.Tews@googlemail.com 6abc9ea0d3 - bugfix compiler could fail if PHP mbstring.func_overload is enabled (Issue 164) 2013-11-07 20:00:56 +00:00
Uwe.Tews@googlemail.com 4e1f7b1568 - bugfix too restrictive handling of {include} within {block} tags. 3.1.15 did throw errors where 3.1.14 did not (forum topic 24599) 2013-11-07 19:09:37 +00:00
Uwe.Tews@googlemail.com c8996a4085 - bugfix multiple {block}s with same name in parent did not work (forum topic 24631) 2013-10-29 00:40:14 +00:00
Uwe.Tews@googlemail.com 5dc4b61771 - bugfix correction of modifier capitalize fix from 3.10.2013 (issue 159) 2013-10-28 23:56:41 +00:00
Uwe.Tews@googlemail.com c3e6823f5d - bugfix notice "Trying to get property of non-object" removed (Issue 163) 2013-10-28 23:53:01 +00:00
Uwe.Tews@googlemail.com 26e4a5120e - bugfix variable resource name at custom resource plugin did not work within {block} tags (Issue 163) 2013-10-28 18:24:01 +00:00
Uwe.Tews@googlemail.com 8342cf45f3 - bugfix a variable file name at {extends} tag did fail (forum topic 24618) 2013-10-20 15:27:35 +00:00
Uwe.Tews@googlemail.com fccd80818b - bugfix yesterdays fix could result in an undefined variable 2013-10-14 07:47:49 +00:00
Uwe.Tews@googlemail.com c3994f4006 .- bugfix relative includes with same name like {include './foo.tpl'} from different folder failed (forum topic 24590)(Issue 161) 2013-10-13 17:49:38 +00:00
Uwe.Tews@googlemail.com cd6c1c2ff8 bugfix variable names on {include} in template inheritance did unextepted error message (forum topic 24585) (Issue 161) 2013-10-13 12:48:07 +00:00
Uwe.Tews@googlemail.com 51453d196b - bugfix variable file names at {extends} had been disbabled by mistake with the rewrite of
template inheritance of 24.08.2013   (forum topic 24585)
2013-10-04 08:47:46 +00:00
Uwe.Tews@googlemail.com 655a2d9301 - bugfix loops using modifier capitalize did eat up memory (issue 159) 2013-10-03 09:16:27 +00:00
monte.ohrt 3281c14769 update change log 2013-10-01 19:35:02 +00:00
28 changed files with 3310 additions and 2955 deletions
+35
View File
@@ -0,0 +1,35 @@
In Smarty 3.1 template inheritance is a compile time process. All the extending of {block} tags
is done at compile time and the parent and child templates are compiled in a single compiled template.
{include} subtemplate could also {block} tags. Such subtemplate could not compiled by it's own because
it could be used in other context where the {block} extended with a different result. For that reasion
the compiled code of {include} subtemplates gets also merged in compiled inheritance template.
Merging the code into a single compile template has some drawbacks.
1. You could not use variable file names in {include} Smarty would use the {include} of compilation time.
2. You could not use individual compile_id in {include}
3. Seperate caching of subtemplate was not possible
4. Any change of the template directory structure between calls was not necessarily seen.
Starting with 3.1.15 some of the above conditions got checked and resulted in an exception. It turned out
that a couple of users did use some of above and now got exceptions.
To resolve this starting with 3.1.16 there is a new configuration parameter $inheritance_merge_compiled_includes.
For most backward compatibility its default setting is true.
With this setting all {include} subtemplate will be merge into the compiled inheritance template, but the above cases
could be rejected by exception.
If $smarty->inheritance_merge_compiled_includes = false; {include} subtemplate will not be merged.
You must now manually merge all {include} subtemplate which do contain {block} tags. This is done by setting the "inline" option.
{include file='foo.bar' inline}
1. In case of a variable file name like {include file=$foo inline} you must you the variable in a compile_id $smarty->compile_id = $foo;
2. If you use individual compile_id in {include file='foo.tpl' compile_id=$bar inline} it must be used in the
global compile_id as well $smarty->compile_id = $foo;
3. If call templates with different template_dir configurations and a parent could same named child template from different folders
you must make the folder name part of the compile_id.
In the upcomming major release Smarty 3.2 inheritance will no longer be a compile time process.
All restrictions will be then removed.
+103 -1
View File
@@ -1,5 +1,107 @@
===== Smarty-3.1.15 =====
===== 3.1.19-dev ===== (xx.xx.2014)
19.04.2014
- bugfix calling createTemplate(template, data) with empty data array caused notice of array to string conversion (Issue 189)
- bugfix clearCompiledTemplate() did not delete files on WINDOWS when a compile_id was specified
18.04.2014
- revert bugfix of 5.4.2015 because %-e date format is not supported on all operating systems
===== 3.1.18 ===== (07.04.2014)
06.04.2014
- bugfix template inheritance fail when using custom resource after patch of 8.3.2014 (Issue 187)
- bugfix update of composer file (Issue 168 and 184)
05.04.2014
- bugfix default date format leads to extra spaces when displaying dates with single digit days (Issue 165)
26.03.2014
- bugfix Smart_Resource_Custom should not lowercase the resource name (Issue 183)
24.03.2014
- bugfix using a {foreach} property like @iteration could fail when used in inheritance parent templates (Issue 182)
20.03.2014
- bugfix $smarty->auto_literal and mbsting.func_overload 2, 6 or 7 did fail (forum topic 24899)
18.03.2014
- revert change of 17.03.2014
17.03.2014
- bugfix $smarty->auto_literal and mbsting.func_overload 2, 6 or 7 did fail (forum topic 24899)
15.03.2014
- bugfix Smarty_CacheResource_Keyvaluestore did use different keys on read/writes and clearCache() calls (Issue 169)
13.03.2014
- bugfix clearXxx() change of 27.1.2014 did not work when specifing cache_id or compile_id (forum topic 24868 and 24867)
===== 3.1.17 =====
08.03.2014
- bugfix relative file path {include} within {block} of child templates did throw exception on first call (Issue 177)
17.02.2014
- bugfix Smarty failed when executing PHP on HHVM (Hip Hop 2.4) because uniqid('',true) does return string with ',' (forum topic 20343)
16.02.2014
- bugfix a '//' or '\\' in template_dir path could produce wrong path on relative filepath in {include} (Issue 175)
05.02.2014
- bugfix shared.literal_compiler_param.php did throw an exception when literal did contain a '-' (smarty-developers group)
27.01.2014
- bugfix $smarty->debugging = true; did show the variable of the $smarty object not the variables used in display() call (forum topic 24764)
- bugfix clearCompiledTemplate(), clearAll() and clear() should use realpath to avoid possible exception from RecursiveDirectoryIterator (Issue 171)
26.01.2014
- bugfix undo block nesting checks for {nocache} for reasons like forum topic 23280 (forum topic 24762)
18.01.2014
- bugfix the compiler did fail when using template inheritance and recursive {include} (smarty-developers group)
11.01.2014
- bugfix "* }" (spaces before right delimiter) was interpreted by mistake as comment end tag (Issue 170)
- internals content cache should be clear when updating cache file
08.01.2014
- bugfix Smarty_CacheResource_Custom did not handle template resource type specifications on clearCache() calls (Issue 169)
- bugfix SmartyBC.class.php should use require_once to load Smarty.class.php (forum topic 24683)
===== 3.1.16 =====
15.12.2013
- bugfix {include} with {block} tag handling (forum topic 24599, 24594, 24682) (Issue 161)
Read 3.1.16_RELEASE_NOTES for more details
- enhancement additional debug output at $smarty->_parserdebug = true;
07.11.2013
- bugfix too restrictive handling of {include} within {block} tags. 3.1.15 did throw errors where 3.1.14 did not (forum topic 24599)
- bugfix compiler could fail if PHP mbstring.func_overload is enabled (Issue 164)
28.10.2013
- bugfix variable resource name at custom resource plugin did not work within {block} tags (Issue 163)
- bugfix notice "Trying to get property of non-object" removed (Issue 163)
- bugfix correction of modifier capitalize fix from 3.10.2013 (issue 159)
- bugfix multiple {block}s with same name in parent did not work (forum topic 24631)
20.10.2013
- bugfix a variable file name at {extends} tag did fail (forum topic 24618)
14.10.2013
- bugfix yesterdays fix could result in an undefined variable
13.10.2013
- bugfix variable names on {include} in template inheritance did unextepted error message (forum topic 24594) (Issue 161)
.- bugfix relative includes with same name like {include './foo.tpl'} from different folder failed (forum topic 24590)(Issue 161)
04.10.2013
- bugfix variable file names at {extends} had been disbabled by mistake with the rewrite of
template inheritance of 24.08.2013 (forum topic 24585)
03.10.2013
- bugfix loops using modifier capitalize did eat up memory (issue 159)
===== Smarty 3.1.15 =====
01.10.2013
- use current delimiters in compiler error messages (issue 157)
- improvement on performance when using error handler and multiple template folders (issue 152)
+33 -20
View File
@@ -113,7 +113,7 @@ class Smarty extends Smarty_Internal_TemplateBase
/**
* smarty version
*/
const SMARTY_VERSION = 'Smarty-3.1-DEV';
const SMARTY_VERSION = 'Smarty-3.1.19-dev';
/**
* define variable scopes
@@ -299,6 +299,11 @@ class Smarty extends Smarty_Internal_TemplateBase
* @var boolean
*/
public $merge_compiled_includes = false;
/**
* template inheritance merge compiled includes
* @var boolean
*/
public $inheritance_merge_compiled_includes = true;
/**
* cache lifetime in seconds
* @var integer
@@ -830,7 +835,7 @@ class Smarty extends Smarty_Internal_TemplateBase
{
$this->template_dir = array();
foreach ((array) $template_dir as $k => $v) {
$this->template_dir[$k] = rtrim($v, '/\\') . DS;
$this->template_dir[$k] = str_replace(array('//','\\\\'), DS, rtrim($v, '/\\')) . DS;
}
$this->joined_template_dir = join(DIRECTORY_SEPARATOR, $this->template_dir);
@@ -853,20 +858,24 @@ class Smarty extends Smarty_Internal_TemplateBase
if (is_array($template_dir)) {
foreach ($template_dir as $k => $v) {
$v = str_replace(array('//','\\\\'), DS, rtrim($v, '/\\')) . DS;
if (is_int($k)) {
// indexes are not merged but appended
$this->template_dir[] = rtrim($v, '/\\') . DS;
$this->template_dir[] = $v;
} else {
// string indexes are overridden
$this->template_dir[$k] = rtrim($v, '/\\') . DS;
$this->template_dir[$k] = $v;
}
}
} elseif ($key !== null) {
// override directory at specified index
$this->template_dir[$key] = rtrim($template_dir, '/\\') . DS;
} else {
// append new directory
$this->template_dir[] = rtrim($template_dir, '/\\') . DS;
} else {
$v = str_replace(array('//','\\\\'), DS, rtrim($template_dir, '/\\')) . DS;
if ($key !== null) {
// override directory at specified index
$this->template_dir[$key] = $v;
} else {
// append new directory
$this->template_dir[] = $v;
}
}
$this->joined_template_dir = join(DIRECTORY_SEPARATOR, $this->template_dir);
@@ -898,7 +907,7 @@ class Smarty extends Smarty_Internal_TemplateBase
{
$this->config_dir = array();
foreach ((array) $config_dir as $k => $v) {
$this->config_dir[$k] = rtrim($v, '/\\') . DS;
$this->config_dir[$k] = str_replace(array('//','\\\\'), DS, rtrim($v, '/\\')) . DS;
}
$this->joined_config_dir = join(DIRECTORY_SEPARATOR, $this->config_dir);
@@ -920,20 +929,24 @@ class Smarty extends Smarty_Internal_TemplateBase
if (is_array($config_dir)) {
foreach ($config_dir as $k => $v) {
$v = str_replace(array('//','\\\\'), DS, rtrim($v, '/\\')) . DS;
if (is_int($k)) {
// indexes are not merged but appended
$this->config_dir[] = rtrim($v, '/\\') . DS;
$this->config_dir[] = $v;
} else {
// string indexes are overridden
$this->config_dir[$k] = rtrim($v, '/\\') . DS;
$this->config_dir[$k] = $v;
}
}
} elseif ($key !== null) {
// override directory at specified index
$this->config_dir[$key] = rtrim($config_dir, '/\\') . DS;
} else {
// append new directory
$this->config_dir[] = rtrim($config_dir, '/\\') . DS;
$v = str_replace(array('//','\\\\'), DS, rtrim($config_dir, '/\\')) . DS;
if ($key !== null) {
// override directory at specified index
$this->config_dir[$key] = rtrim($v, '/\\') . DS;
} else {
// append new directory
$this->config_dir[] = rtrim($v, '/\\') . DS;
}
}
$this->joined_config_dir = join(DIRECTORY_SEPARATOR, $this->config_dir);
@@ -1207,11 +1220,11 @@ class Smarty extends Smarty_Internal_TemplateBase
*/
public function createTemplate($template, $cache_id = null, $compile_id = null, $parent = null, $do_clone = true)
{
if (!empty($cache_id) && (is_object($cache_id) || is_array($cache_id))) {
if ($cache_id !== null && (is_object($cache_id) || is_array($cache_id))) {
$parent = $cache_id;
$cache_id = null;
}
if (!empty($parent) && is_array($parent)) {
if ($parent !== null && is_array($parent)) {
$data = $parent;
$parent = null;
} else {
+1 -1
View File
@@ -32,7 +32,7 @@
/**
* @ignore
*/
require(dirname(__FILE__) . '/Smarty.class.php');
require_once(dirname(__FILE__) . '/Smarty.class.php');
/**
* Smarty Backward Compatability Wrapper Class
+33 -11
View File
@@ -30,36 +30,58 @@ function smarty_modifier_capitalize($string, $uc_digits = false, $lc_rest = fals
$upper_string = mb_convert_case( $string, MB_CASE_TITLE, Smarty::$_CHARSET );
} else {
// uppercase word breaks
$upper_string = preg_replace_callback("!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER, create_function ('$matches', 'return stripslashes($matches[1]).mb_convert_case(stripslashes($matches[2]),MB_CASE_UPPER, "' . addslashes(Smarty::$_CHARSET) . '");'), $string);
$upper_string = preg_replace_callback("!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_mbconvert_cb', $string);
}
// check uc_digits case
if (!$uc_digits) {
if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) {
foreach ($matches[1] as $match) {
foreach($matches[1] as $match) {
$upper_string = substr_replace($upper_string, mb_strtolower($match[0], Smarty::$_CHARSET), $match[1], strlen($match[0]));
}
}
}
}
$upper_string = preg_replace_callback("!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, create_function ('$matches', 'return stripslashes($matches[1]).mb_convert_case(stripslashes($matches[3]),MB_CASE_UPPER, "' . addslashes(Smarty::$_CHARSET) . '");'), $upper_string);
$upper_string = preg_replace_callback("!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_mbconvert2_cb', $upper_string);
return $upper_string;
}
// lowercase first
if ($lc_rest) {
$string = strtolower($string);
}
// uppercase (including hyphenated words)
$upper_string = preg_replace_callback("!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER, create_function ('$matches', 'return stripslashes($matches[1]).ucfirst(stripslashes($matches[2]));'), $string);
$upper_string = preg_replace_callback("!(^|[^\p{L}'])([\p{Ll}])!S" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_ucfirst_cb', $string);
// check uc_digits case
if (!$uc_digits) {
if (preg_match_all("!\b([\p{L}]*[\p{N}]+[\p{L}]*)\b!" . Smarty::$_UTF8_MODIFIER, $string, $matches, PREG_OFFSET_CAPTURE)) {
foreach ($matches[1] as $match) {
foreach($matches[1] as $match) {
$upper_string = substr_replace($upper_string, strtolower($match[0]), $match[1], strlen($match[0]));
}
}
}
}
$upper_string = preg_replace_callback("!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, create_function ('$matches', 'return stripslashes($matches[1]).ucfirst(stripslashes($matches[3]));'), $upper_string);
$upper_string = preg_replace_callback("!((^|\s)['\"])(\w)!" . Smarty::$_UTF8_MODIFIER, 'smarty_mod_cap_ucfirst2_cb', $upper_string);
return $upper_string;
}
/*
*
* Bug: create_function() use exhausts memory when used in long loops
* Fix: use declared functions for callbacks instead of using create_function()
* Note: This can be fixed using anonymous functions instead, but that requires PHP >= 5.3
*
* @author Kyle Renfrow
*/
function smarty_mod_cap_mbconvert_cb($matches){
return stripslashes($matches[1]).mb_convert_case(stripslashes($matches[2]),MB_CASE_UPPER, Smarty::$_CHARSET);
}
function smarty_mod_cap_mbconvert2_cb($matches){
return stripslashes($matches[1]).mb_convert_case(stripslashes($matches[3]),MB_CASE_UPPER, Smarty::$_CHARSET);
}
function smarty_mod_cap_ucfirst_cb($matches){
return stripslashes($matches[1]).ucfirst(stripslashes($matches[2]));
}
function smarty_mod_cap_ucfirst2_cb($matches){
return stripslashes($matches[1]).ucfirst(stripslashes($matches[3]));
}
@@ -23,7 +23,7 @@ function smarty_literal_compiler_param($params, $index, $default=null)
return $default;
}
// test if param is a literal
if (!preg_match('/^([\'"]?)[a-zA-Z0-9]+(\\1)$/', $params[$index])) {
if (!preg_match('/^([\'"]?)[a-zA-Z0-9-]+(\\1)$/', $params[$index])) {
throw new SmartyException('$param[' . $index . '] is not a literal and is thus not evaluatable at compile time');
}
+1
View File
@@ -372,6 +372,7 @@ class Smarty_Template_Cached
{
if (!$_template->source->recompiled) {
if ($this->handler->writeCachedContent($_template, $content)) {
$this->content = null;
$this->timestamp = time();
$this->exists = true;
$this->valid = true;
@@ -186,8 +186,34 @@ abstract class Smarty_CacheResource_Custom extends Smarty_CacheResource
public function clear(Smarty $smarty, $resource_name, $cache_id, $compile_id, $exp_time)
{
$this->cache = array();
$cache_name = null;
return $this->delete($resource_name, $cache_id, $compile_id, $exp_time);
if (isset($resource_name)) {
$_save_stat = $smarty->caching;
$smarty->caching = true;
$tpl = new $smarty->template_class($resource_name, $smarty);
$smarty->caching = $_save_stat;
if ($tpl->source->exists) {
$cache_name = $tpl->source->name;
} else {
return 0;
}
// remove from template cache
if ($smarty->allow_ambiguous_resources) {
$_templateId = $tpl->source->unique_resource . $tpl->cache_id . $tpl->compile_id;
} else {
$_templateId = $smarty->joined_template_dir . '#' . $resource_name . $tpl->cache_id . $tpl->compile_id;
}
if (isset($_templateId[150])) {
$_templateId = sha1($_templateId);
}
unset($smarty->template_objects[$_templateId]);
// template object no longer needed
unset($tpl);
}
return $this->delete($cache_name, $cache_id, $compile_id, $exp_time);
}
/**
@@ -54,7 +54,7 @@ abstract class Smarty_CacheResource_KeyValueStore extends Smarty_CacheResource
public function populate(Smarty_Template_Cached $cached, Smarty_Internal_Template $_template)
{
$cached->filepath = $_template->source->uid
. '#' . $this->sanitize($cached->source->name)
. '#' . $this->sanitize($cached->source->resource)
. '#' . $this->sanitize($cached->cache_id)
. '#' . $this->sanitize($cached->compile_id);
@@ -139,7 +139,7 @@
$_compile_id = isset($compile_id) ? preg_replace('![^\w\|]+!', '_', $compile_id) : null;
$_dir_sep = $smarty->use_sub_dirs ? '/' : '^';
$_compile_id_offset = $smarty->use_sub_dirs ? 3 : 0;
$_dir = $smarty->getCacheDir();
$_dir = realpath($smarty->getCacheDir()) . '/';
$_dir_length = strlen($_dir);
if (isset($_cache_id)) {
$_cache_id_parts = explode('|', $_cache_id);
@@ -84,7 +84,7 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase
$this->template->block_data[$_name]['source'] = '';
// build {block} for child block
self::$block_data[$_name]['source'] =
"{$compiler->smarty->left_delimiter}private_child_block name={$_attr['name']} file='{$compiler->template->source->filepath}'" .
"{$compiler->smarty->left_delimiter}private_child_block name={$_attr['name']} file='{$compiler->template->source->filepath}' type='{$compiler->template->source->type}' resource='{$compiler->template->template_resource}'" .
" uid='{$compiler->template->source->uid}' line={$compiler->lex->line}";
if ($_attr['nocache']) {
self::$block_data[$_name]['source'] .= ' nocache';
@@ -160,6 +160,7 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase
if ($compiler->smarty->debugging) {
Smarty_Internal_Debug::ignore($_tpl);
}
$_tpl->tpl_vars = $compiler->template->tpl_vars;
$_tpl->variable_filters = $compiler->template->variable_filters;
$_tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash'];
$_tpl->allow_relative_path = true;
@@ -330,8 +331,8 @@ class Smarty_Internal_Compile_Blockclose extends Smarty_Internal_CompileBase
} else {
$_output = $compiler->parser->current_buffer->to_smarty_php();
}
unset($compiler->template->block_data[$_name]['compiled']);
}
unset($compiler->template->block_data[$_name]['compiled']);
// reset flags
$compiler->parser->current_buffer = $saved_data[2];
if ($compiler->nocache) {
@@ -360,7 +361,7 @@ class Smarty_Internal_Compile_Private_Child_Block extends Smarty_Internal_Compil
* @var array
* @see Smarty_Internal_CompileBase
*/
public $required_attributes = array('name', 'file', 'uid', 'line');
public $required_attributes = array('name', 'file', 'uid', 'line', 'type', 'resource');
/**
@@ -375,6 +376,17 @@ class Smarty_Internal_Compile_Private_Child_Block extends Smarty_Internal_Compil
// check and get attributes
$_attr = $this->getAttributes($compiler, $args);
// update template with original template resource of {block}
if (trim($_attr['type'], "'") == 'file') {
$compiler->template->template_resource = realpath(trim($_attr['file'], "'"));
} else {
$compiler->template->template_resource = trim($_attr['resource'], "'");
}
// source object
unset ($compiler->template->source);
$exists = $compiler->template->source->exists;
// must merge includes
if ($_attr['nocache'] == true) {
$compiler->tag_nocache = true;
@@ -50,17 +50,12 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase
if (strpos($_attr['file'], '$_tmp') !== false) {
$compiler->trigger_template_error('illegal value for file attribute', $compiler->lex->taglineno);
}
// add tag to call parent template at the end of source
if ($compiler->has_variable_string || !((substr_count($_attr['file'], '"') == 2 || substr_count($_attr['file'], "'") == 2))
|| substr_count($_attr['file'], '(') != 0 || substr_count($_attr['file'], '$_smarty_tpl->') != 0
) {
$compiler->trigger_template_error('variable template file name not allowed', $compiler->lex->taglineno);
}
$name = trim($_attr['file'],"\"'");
$name = $_attr['file'];
$_smarty_tpl = $compiler->template;
eval("\$tpl_name = $name;");
// create template object
$_template = new $compiler->smarty->template_class($name, $compiler->smarty, $compiler->template);
$_template = new $compiler->smarty->template_class($tpl_name, $compiler->smarty, $compiler->template);
// check for recursion
$uid = $_template->source->uid;
if (isset($compiler->extends_uid[$uid])) {
@@ -49,7 +49,6 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase
*/
public function compile($args, $compiler, $parameter)
{
$tpl = $compiler->template;
// check and get attributes
$_attr = $this->getAttributes($compiler, $args);
@@ -80,12 +79,12 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase
$ItemVarName = '$' . trim($item, '\'"') . '@';
// evaluates which Smarty variables and properties have to be computed
if ($has_name) {
$usesSmartyFirst = strpos($tpl->source->content, $SmartyVarName . 'first') !== false;
$usesSmartyLast = strpos($tpl->source->content, $SmartyVarName . 'last') !== false;
$usesSmartyIndex = strpos($tpl->source->content, $SmartyVarName . 'index') !== false;
$usesSmartyIteration = strpos($tpl->source->content, $SmartyVarName . 'iteration') !== false;
$usesSmartyShow = strpos($tpl->source->content, $SmartyVarName . 'show') !== false;
$usesSmartyTotal = strpos($tpl->source->content, $SmartyVarName . 'total') !== false;
$usesSmartyFirst = strpos($compiler->lex->data, $SmartyVarName . 'first') !== false;
$usesSmartyLast = strpos($compiler->lex->data, $SmartyVarName . 'last') !== false;
$usesSmartyIndex = strpos($compiler->lex->data, $SmartyVarName . 'index') !== false;
$usesSmartyIteration = strpos($compiler->lex->data, $SmartyVarName . 'iteration') !== false;
$usesSmartyShow = strpos($compiler->lex->data, $SmartyVarName . 'show') !== false;
$usesSmartyTotal = strpos($compiler->lex->data, $SmartyVarName . 'total') !== false;
} else {
$usesSmartyFirst = false;
$usesSmartyLast = false;
@@ -93,12 +92,12 @@ class Smarty_Internal_Compile_Foreach extends Smarty_Internal_CompileBase
$usesSmartyShow = false;
}
$usesPropFirst = $usesSmartyFirst || strpos($tpl->source->content, $ItemVarName . 'first') !== false;
$usesPropLast = $usesSmartyLast || strpos($tpl->source->content, $ItemVarName . 'last') !== false;
$usesPropIndex = $usesPropFirst || strpos($tpl->source->content, $ItemVarName . 'index') !== false;
$usesPropIteration = $usesPropLast || strpos($tpl->source->content, $ItemVarName . 'iteration') !== false;
$usesPropShow = strpos($tpl->source->content, $ItemVarName . 'show') !== false;
$usesPropTotal = $usesSmartyTotal || $usesSmartyShow || $usesPropShow || $usesPropLast || strpos($tpl->source->content, $ItemVarName . 'total') !== false;
$usesPropFirst = $usesSmartyFirst || strpos($compiler->lex->data, $ItemVarName . 'first') !== false;
$usesPropLast = $usesSmartyLast || strpos($compiler->lex->data, $ItemVarName . 'last') !== false;
$usesPropIndex = $usesPropFirst || strpos($compiler->lex->data, $ItemVarName . 'index') !== false;
$usesPropIteration = $usesPropLast || strpos($compiler->lex->data, $ItemVarName . 'iteration') !== false;
$usesPropShow = strpos($compiler->lex->data, $ItemVarName . 'show') !== false;
$usesPropTotal = $usesSmartyTotal || $usesSmartyShow || $usesPropShow || $usesPropLast || strpos($compiler->lex->data, $ItemVarName . 'total') !== false;
// generate output code
$output = "<?php ";
$output .= " \$_smarty_tpl->tpl_vars[$item] = new Smarty_Variable; \$_smarty_tpl->tpl_vars[$item]->_loop = false;\n";
@@ -85,7 +85,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
$_caching = Smarty::CACHING_OFF;
// flag if included template code should be merged into caller
$merge_compiled_includes = ($compiler->smarty->merge_compiled_includes || $_attr['inline'] === true) && !$compiler->template->source->recompiled;
$merge_compiled_includes = ($compiler->smarty->merge_compiled_includes ||($compiler->inheritance && $compiler->smarty->inheritance_merge_compiled_includes)|| $_attr['inline'] === true) && !$compiler->template->source->recompiled;
// set default when in nocache mode
// if ($compiler->template->caching && ($compiler->nocache || $compiler->tag_nocache || $compiler->forceNocache == 2)) {
@@ -121,7 +121,7 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
}
if ($_attr['nocache'] === true) {
$compiler->tag_nocache = true;
if ($merge_compiled_includes || $compiler->inheritance) {
if ($merge_compiled_includes) {
$_caching = self::CACHING_NOCACHE_CODE;
} else {
$_caching = Smarty::CACHING_OFF;
@@ -129,13 +129,13 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
}
$has_compiled_template = false;
if ($merge_compiled_includes || $compiler->inheritance) {
if ($merge_compiled_includes && $_attr['inline'] !== true) {
// variable template name ?
if ($compiler->has_variable_string || !((substr_count($include_file, '"') == 2 || substr_count($include_file, "'") == 2))
|| substr_count($include_file, '(') != 0 || substr_count($include_file, '$_smarty_tpl->') != 0
) {
$merge_compiled_includes = false;
if ($compiler->inheritance) {
if ($compiler->inheritance && $compiler->smarty->inheritance_merge_compiled_includes) {
$compiler->trigger_template_error(' variable template file names not allow within {block} tags');
}
}
@@ -145,28 +145,31 @@ class Smarty_Internal_Compile_Include extends Smarty_Internal_CompileBase
|| substr_count($_attr['compile_id'], '(') != 0 || substr_count($_attr['compile_id'], '$_smarty_tpl->') != 0
) {
$merge_compiled_includes = false;
if ($compiler->inheritance) {
if ($compiler->inheritance && $compiler->smarty->inheritance_merge_compiled_includes) {
$compiler->trigger_template_error(' variable compile_id not allow within {block} tags');
}
}
}
}
if ($merge_compiled_includes) {
if ($compiler->template->caching && ($compiler->tag_nocache || $compiler->nocache) && $_caching != self::CACHING_NOCACHE_CODE) {
$merge_compiled_includes = false;
if ($compiler->inheritance) {
if ($compiler->inheritance && $compiler->smarty->inheritance_merge_compiled_includes) {
$compiler->trigger_template_error(' invalid caching mode of subtemplate within {block} tags');
}
}
}
if ($merge_compiled_includes || $compiler->inheritance) {
if ($merge_compiled_includes) {
// we must observe different compile_id
$uid = sha1($_compile_id);
$tpl_name = null;
$nocache = false;
$_smarty_tpl = $compiler->template;
eval("\$tpl_name = $include_file;");
if (!isset($compiler->smarty->merged_templates_func[$tpl_name][$uid]) || $compiler->inheritance) {
if (!isset($compiler->smarty->merged_templates_func[$tpl_name][$uid])) {
$tpl = new $compiler->smarty->template_class ($tpl_name, $compiler->smarty, $compiler->template, $compiler->template->cache_id, $compiler->template->compile_id);
// save unique function name
$compiler->smarty->merged_templates_func[$tpl_name][$uid]['func'] = $tpl->properties['unifunc'] = 'content_' . str_replace('.', '_', uniqid('', true));
$compiler->smarty->merged_templates_func[$tpl_name][$uid]['func'] = $tpl->properties['unifunc'] = 'content_' . str_replace(array('.',','), '_', uniqid('', true));
// use current nocache hash for inlined code
$compiler->smarty->merged_templates_func[$tpl_name][$uid]['nocache_hash'] = $tpl->properties['nocache_hash'] = $compiler->template->properties['nocache_hash'];
if ($compiler->template->caching && $_caching == self::CACHING_NOCACHE_CODE) {
@@ -32,11 +32,8 @@ class Smarty_Internal_Compile_Nocache extends Smarty_Internal_CompileBase
if ($_attr['nocache'] === true) {
$compiler->trigger_template_error('nocache option not allowed', $compiler->lex->taglineno);
}
if ($compiler->template->caching) {
// enter nocache mode
$this->openTag($compiler, 'nocache', $compiler->nocache);
$compiler->nocache = true;
}
// this tag does not return compiled code
$compiler->has_code = false;
@@ -65,10 +62,8 @@ class Smarty_Internal_Compile_Nocacheclose extends Smarty_Internal_CompileBase
public function compile($args, $compiler)
{
$_attr = $this->getAttributes($compiler, $args);
if ($compiler->template->caching) {
// restore old nocache mode
$compiler->nocache = $this->closeTag($compiler, 'nocache');
}
// leave nocache mode
$compiler->nocache = false;
// this tag does not return compiled code
$compiler->has_code = false;
@@ -2,10 +2,10 @@
/**
* Smarty Internal Plugin Configfilelexer
*
* This is the lexer to break the config file source into tokens
* This is the lexer to break the config file source into tokens
* @package Smarty
* @subpackage Config
* @author Uwe Tews
* @author Uwe Tews
*/
/**
* Smarty Internal Plugin Configfilelexer
@@ -20,17 +20,21 @@ class Smarty_Internal_Configfilelexer
public $node;
public $line;
private $state = 1;
public $yyTraceFILE;
public $yyTracePrompt;
public $state_name = array (1 => 'START', 2 => 'VALUE', 3 => 'NAKED_STRING_VALUE', 4 => 'COMMENT', 5 => 'SECTION', 6 => 'TRIPPLE');
public $smarty_token_names = array ( // Text for parser error messages
);
public function __construct($data, $smarty)
);
function __construct($data, $smarty)
{
// set instance object
self::instance($this);
self::instance($this);
$this->data = $data . "\n"; //now all lines are \n-terminated
$this->counter = 0;
$this->line = 1;
$this->smarty = $smarty;
$this->smarty = $smarty;
$this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
}
public static function &instance($new_instance = null)
@@ -38,10 +42,16 @@ class Smarty_Internal_Configfilelexer
static $instance = null;
if (isset($new_instance) && is_object($new_instance))
$instance = $new_instance;
return $instance;
}
public function PrintTrace()
{
$this->yyTraceFILE = fopen('php://output', 'w');
$this->yyTracePrompt = '<br>';
}
private $_yy_state = 1;
private $_yy_stack = array();
@@ -52,20 +62,39 @@ class Smarty_Internal_Configfilelexer
public function yypushstate($state)
{
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sState push %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
array_push($this->_yy_stack, $this->_yy_state);
$this->_yy_state = $state;
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
}
public function yypopstate()
{
$this->_yy_state = array_pop($this->_yy_stack);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sState pop %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
$this->_yy_state = array_pop($this->_yy_stack);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%snew State %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
}
public function yybegin($state)
{
$this->_yy_state = $state;
$this->_yy_state = $state;
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sState set %s\n", $this->yyTracePrompt, isset($this->state_name[$this->_yy_state]) ? $this->state_name[$this->_yy_state] : $this->_yy_state);
}
}
public function yylex1()
{
$tokenMap = array (
@@ -129,50 +158,54 @@ class Smarty_Internal_Configfilelexer
} // end function
const START = 1;
public function yy_r1_1($yy_subpatterns)
function yy_r1_1($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_COMMENTSTART;
$this->yypushstate(self::COMMENT);
}
public function yy_r1_2($yy_subpatterns)
function yy_r1_2($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_OPENB;
$this->yypushstate(self::SECTION);
}
public function yy_r1_3($yy_subpatterns)
function yy_r1_3($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_CLOSEB;
}
public function yy_r1_4($yy_subpatterns)
function yy_r1_4($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_EQUAL;
$this->yypushstate(self::VALUE);
}
public function yy_r1_5($yy_subpatterns)
function yy_r1_5($yy_subpatterns)
{
return false;
}
public function yy_r1_6($yy_subpatterns)
function yy_r1_6($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE;
}
public function yy_r1_7($yy_subpatterns)
function yy_r1_7($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_ID;
}
public function yy_r1_8($yy_subpatterns)
function yy_r1_8($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_OTHER;
}
public function yylex2()
{
$tokenMap = array (
@@ -237,61 +270,62 @@ class Smarty_Internal_Configfilelexer
} // end function
const VALUE = 2;
public function yy_r2_1($yy_subpatterns)
function yy_r2_1($yy_subpatterns)
{
return false;
}
public function yy_r2_2($yy_subpatterns)
function yy_r2_2($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_FLOAT;
$this->yypopstate();
}
public function yy_r2_3($yy_subpatterns)
function yy_r2_3($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_INT;
$this->yypopstate();
}
public function yy_r2_4($yy_subpatterns)
function yy_r2_4($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES;
$this->yypushstate(self::TRIPPLE);
}
public function yy_r2_5($yy_subpatterns)
function yy_r2_5($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_SINGLE_QUOTED_STRING;
$this->yypopstate();
}
public function yy_r2_6($yy_subpatterns)
function yy_r2_6($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_DOUBLE_QUOTED_STRING;
$this->yypopstate();
}
public function yy_r2_7($yy_subpatterns)
function yy_r2_7($yy_subpatterns)
{
if (!$this->smarty->config_booleanize || !in_array(strtolower($this->value), Array("true", "false", "on", "off", "yes", "no")) ) {
$this->yypopstate();
$this->yypushstate(self::NAKED_STRING_VALUE);
return true; //reprocess in new state
} else {
$this->token = Smarty_Internal_Configfileparser::TPC_BOOL;
$this->yypopstate();
}
}
public function yy_r2_8($yy_subpatterns)
function yy_r2_8($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
$this->yypopstate();
}
public function yy_r2_9($yy_subpatterns)
function yy_r2_9($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
@@ -299,6 +333,8 @@ class Smarty_Internal_Configfilelexer
$this->yypopstate();
}
public function yylex3()
{
$tokenMap = array (
@@ -355,14 +391,17 @@ class Smarty_Internal_Configfilelexer
} // end function
const NAKED_STRING_VALUE = 3;
public function yy_r3_1($yy_subpatterns)
function yy_r3_1($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
$this->yypopstate();
}
public function yylex4()
{
$tokenMap = array (
@@ -421,23 +460,27 @@ class Smarty_Internal_Configfilelexer
} // end function
const COMMENT = 4;
public function yy_r4_1($yy_subpatterns)
function yy_r4_1($yy_subpatterns)
{
return false;
}
public function yy_r4_2($yy_subpatterns)
function yy_r4_2($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_NAKED_STRING;
}
public function yy_r4_3($yy_subpatterns)
function yy_r4_3($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_NEWLINE;
$this->yypopstate();
}
public function yylex5()
{
$tokenMap = array (
@@ -495,19 +538,21 @@ class Smarty_Internal_Configfilelexer
} // end function
const SECTION = 5;
public function yy_r5_1($yy_subpatterns)
function yy_r5_1($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_DOT;
}
public function yy_r5_2($yy_subpatterns)
function yy_r5_2($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_SECTION;
$this->yypopstate();
}
public function yylex6()
{
$tokenMap = array (
@@ -565,15 +610,16 @@ class Smarty_Internal_Configfilelexer
} // end function
const TRIPPLE = 6;
public function yy_r6_1($yy_subpatterns)
function yy_r6_1($yy_subpatterns)
{
$this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_QUOTES_END;
$this->yypopstate();
$this->yypushstate(self::START);
}
public function yy_r6_2($yy_subpatterns)
function yy_r6_2($yy_subpatterns)
{
if ($this->mbstring_overload) {
@@ -586,7 +632,7 @@ class Smarty_Internal_Configfilelexer
$to = $match[0][1];
} else {
$this->compiler->trigger_template_error ("missing or misspelled literal closing tag");
}
}
if ($this->mbstring_overload) {
$this->value = mb_substr($this->data,$this->counter,$to-$this->counter,'latin1');
} else {
@@ -595,4 +641,6 @@ class Smarty_Internal_Configfilelexer
$this->token = Smarty_Internal_Configfileparser::TPC_TRIPPLE_TEXT;
}
}
@@ -83,8 +83,9 @@ class TPC_yyStackEntry
** is the value of the token */
};
#line 12 "smarty_internal_configfileparser.y"
class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser.php"
class Smarty_Internal_Configfileparser#line 80 "smarty_internal_configfileparser.php"
{
#line 14 "smarty_internal_configfileparser.y"
@@ -94,12 +95,11 @@ class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser
private $lex;
private $internalError = false;
public function __construct($lex, $compiler)
{
function __construct($lex, $compiler) {
// set instance object
self::instance($this);
self::instance($this);
$this->lex = $lex;
$this->smarty = $compiler->smarty;
$this->smarty = $compiler->smarty;
$this->compiler = $compiler;
}
public static function &instance($new_instance = null)
@@ -107,25 +107,21 @@ class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser
static $instance = null;
if (isset($new_instance) && is_object($new_instance))
$instance = $new_instance;
return $instance;
}
private function parse_bool($str)
{
private function parse_bool($str) {
if (in_array(strtolower($str) ,array('on','yes','true'))) {
$res = true;
} else {
$res = false;
}
return $res;
}
private static $escapes_single = Array('\\' => '\\',
'\'' => '\'');
private static function parse_single_quoted_string($qstr)
{
private static function parse_single_quoted_string($qstr) {
$escaped_string = substr($qstr, 1, strlen($qstr)-2); //remove outer quotes
$ss = preg_split('/(\\\\.)/', $escaped_string, -1, PREG_SPLIT_DELIM_CAPTURE);
@@ -144,20 +140,16 @@ class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser
return $str;
}
private static function parse_double_quoted_string($qstr)
{
private static function parse_double_quoted_string($qstr) {
$inner_str = substr($qstr, 1, strlen($qstr)-2);
return stripcslashes($inner_str);
}
private static function parse_tripple_double_quoted_string($qstr)
{
private static function parse_tripple_double_quoted_string($qstr) {
return stripcslashes($qstr);
}
private function set_var(Array $var, Array &$target_array)
{
private function set_var(Array $var, Array &$target_array) {
$key = $var["key"];
$value = $var["value"];
@@ -169,8 +161,7 @@ class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser
}
}
private function add_global_vars(Array $vars)
{
private function add_global_vars(Array $vars) {
if (!isset($this->compiler->config_data['vars'])) {
$this->compiler->config_data['vars'] = Array();
}
@@ -179,8 +170,7 @@ class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser
}
}
private function add_section_vars($section_name, Array $vars)
{
private function add_section_vars($section_name, Array $vars) {
if (!isset($this->compiler->config_data['sections'][$section_name]['vars'])) {
$this->compiler->config_data['sections'][$section_name]['vars'] = Array();
}
@@ -188,7 +178,7 @@ class Smarty_Internal_Configfileparser#line 79 "smarty_internal_configfileparser
$this->set_var($var, $this->compiler->config_data['sections'][$section_name]);
}
}
#line 173 "smarty_internal_configfileparser.php"
#line 174 "smarty_internal_configfileparser.php"
const TPC_OPENB = 1;
const TPC_SECTION = 2;
@@ -219,7 +209,7 @@ static public $yy_action = array(
/* 20 */ 15, 17, 23, 18, 27, 26, 4, 5, 6, 32,
/* 30 */ 2, 11, 28, 22, 16, 9, 7, 10,
);
public static $yy_lookahead = array(
static public $yy_lookahead = array(
/* 0 */ 7, 8, 9, 10, 11, 12, 5, 27, 15, 16,
/* 10 */ 20, 21, 23, 23, 17, 18, 13, 14, 17, 18,
/* 20 */ 15, 2, 17, 4, 25, 26, 6, 3, 3, 14,
@@ -227,17 +217,17 @@ static public $yy_action = array(
);
const YY_SHIFT_USE_DFLT = -8;
const YY_SHIFT_MAX = 19;
public static $yy_shift_ofst = array(
static public $yy_shift_ofst = array(
/* 0 */ -8, 1, 1, 1, -7, -3, -3, 30, -8, -8,
/* 10 */ -8, 19, 5, 3, 15, 16, 24, 25, 32, 20,
);
const YY_REDUCE_USE_DFLT = -21;
const YY_REDUCE_MAX = 10;
public static $yy_reduce_ofst = array(
static public $yy_reduce_ofst = array(
/* 0 */ -10, -1, -1, -1, -20, 10, 12, 8, 14, 7,
/* 10 */ -11,
);
public static $yyExpectedTokens = array(
static public $yyExpectedTokens = array(
/* 0 */ array(),
/* 1 */ array(5, 17, 18, ),
/* 2 */ array(5, 17, 18, ),
@@ -275,7 +265,7 @@ static public $yy_action = array(
/* 34 */ array(),
/* 35 */ array(),
);
public static $yy_default = array(
static public $yy_default = array(
/* 0 */ 44, 37, 41, 40, 58, 58, 58, 36, 39, 44,
/* 10 */ 44, 58, 58, 58, 58, 58, 58, 58, 58, 58,
/* 20 */ 55, 54, 57, 56, 50, 45, 43, 42, 38, 46,
@@ -290,37 +280,37 @@ static public $yy_action = array(
const YYFALLBACK = 0;
public static $yyFallback = array(
);
public static function Trace($TraceFILE, $zTracePrompt)
public function Trace($TraceFILE, $zTracePrompt)
{
if (!$TraceFILE) {
$zTracePrompt = 0;
} elseif (!$zTracePrompt) {
$TraceFILE = 0;
}
self::$yyTraceFILE = $TraceFILE;
self::$yyTracePrompt = $zTracePrompt;
$this->yyTraceFILE = $TraceFILE;
$this->yyTracePrompt = $zTracePrompt;
}
public static function PrintTrace()
public function PrintTrace()
{
self::$yyTraceFILE = fopen('php://output', 'w');
self::$yyTracePrompt = '<br>';
$this->yyTraceFILE = fopen('php://output', 'w');
$this->yyTracePrompt = '<br>';
}
public static $yyTraceFILE;
public static $yyTracePrompt;
public $yyTraceFILE;
public $yyTracePrompt;
public $yyidx; /* Index of top element in stack */
public $yyerrcnt; /* Shifts left before out of the error */
public $yystack = array(); /* The parser's stack */
public $yyTokenName = array(
'$', 'OPENB', 'SECTION', 'CLOSEB',
'DOT', 'ID', 'EQUAL', 'FLOAT',
'$', 'OPENB', 'SECTION', 'CLOSEB',
'DOT', 'ID', 'EQUAL', 'FLOAT',
'INT', 'BOOL', 'SINGLE_QUOTED_STRING', 'DOUBLE_QUOTED_STRING',
'TRIPPLE_QUOTES', 'TRIPPLE_TEXT', 'TRIPPLE_QUOTES_END', 'NAKED_STRING',
'OTHER', 'NEWLINE', 'COMMENTSTART', 'error',
'start', 'global_vars', 'sections', 'var_list',
'section', 'newline', 'var', 'value',
'OTHER', 'NEWLINE', 'COMMENTSTART', 'error',
'start', 'global_vars', 'sections', 'var_list',
'section', 'newline', 'var', 'value',
);
public static $yyRuleName = array(
@@ -373,9 +363,9 @@ static public $yy_action = array(
return;
}
$yytos = array_pop($this->yystack);
if (self::$yyTraceFILE && $this->yyidx >= 0) {
fwrite(self::$yyTraceFILE,
self::$yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] .
if ($this->yyTraceFILE && $this->yyidx >= 0) {
fwrite($this->yyTraceFILE,
$this->yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] .
"\n");
}
$yymajor = $yytos->major;
@@ -390,8 +380,8 @@ static public $yy_action = array(
while ($this->yystack !== Array()) {
$this->yy_pop_parser_stack();
}
if (is_resource(self::$yyTraceFILE)) {
fclose(self::$yyTraceFILE);
if (is_resource($this->yyTraceFILE)) {
fclose($this->yyTraceFILE);
}
}
@@ -559,8 +549,8 @@ static public $yy_action = array(
self::$yy_lookahead[$i] != $iLookAhead) {
if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
&& ($iFallback = self::$yyFallback[$iLookAhead]) != 0) {
if (self::$yyTraceFILE) {
fwrite(self::$yyTraceFILE, self::$yyTracePrompt . "FALLBACK " .
if ($this->yyTraceFILE) {
fwrite($this->yyTraceFILE, $this->yyTracePrompt . "FALLBACK " .
$this->yyTokenName[$iLookAhead] . " => " .
$this->yyTokenName[$iFallback] . "\n");
}
@@ -602,8 +592,8 @@ static public $yy_action = array(
$this->yyidx++;
if ($this->yyidx >= self::YYSTACKDEPTH) {
$this->yyidx--;
if (self::$yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sStack Overflow!\n", self::$yyTracePrompt);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sStack Overflow!\n", $this->yyTracePrompt);
}
while ($this->yyidx >= 0) {
$this->yy_pop_parser_stack();
@@ -612,7 +602,7 @@ static public $yy_action = array(
$this->internalError = true;
$this->compiler->trigger_config_file_error("Stack overflow in configfile parser");
#line 593 "smarty_internal_configfileparser.php"
#line 601 "smarty_internal_configfileparser.php"
return;
}
@@ -621,15 +611,15 @@ static public $yy_action = array(
$yytos->major = $yyMajor;
$yytos->minor = $yypMinor;
array_push($this->yystack, $yytos);
if (self::$yyTraceFILE && $this->yyidx > 0) {
fprintf(self::$yyTraceFILE, "%sShift %d\n", self::$yyTracePrompt,
if ($this->yyTraceFILE && $this->yyidx > 0) {
fprintf($this->yyTraceFILE, "%sShift %d\n", $this->yyTracePrompt,
$yyNewState);
fprintf(self::$yyTraceFILE, "%sStack:", self::$yyTracePrompt);
fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt);
for ($i = 1; $i <= $this->yyidx; $i++) {
fprintf(self::$yyTraceFILE, " %s",
fprintf($this->yyTraceFILE, " %s",
$this->yyTokenName[$this->yystack[$i]->major]);
}
fwrite(self::$yyTraceFILE,"\n");
fwrite($this->yyTraceFILE,"\n");
}
}
@@ -683,115 +673,99 @@ static public $yy_action = array(
18 => 17,
);
#line 131 "smarty_internal_configfileparser.y"
public function yy_r0()
{
function yy_r0(){
$this->_retvalue = null;
}
#line 666 "smarty_internal_configfileparser.php"
#line 675 "smarty_internal_configfileparser.php"
#line 136 "smarty_internal_configfileparser.y"
public function yy_r1()
{
function yy_r1(){
$this->add_global_vars($this->yystack[$this->yyidx + 0]->minor); $this->_retvalue = null;
}
#line 671 "smarty_internal_configfileparser.php"
#line 680 "smarty_internal_configfileparser.php"
#line 149 "smarty_internal_configfileparser.y"
public function yy_r4()
{
function yy_r4(){
$this->add_section_vars($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor);
$this->_retvalue = null;
}
#line 677 "smarty_internal_configfileparser.php"
#line 686 "smarty_internal_configfileparser.php"
#line 154 "smarty_internal_configfileparser.y"
public function yy_r5()
{
function yy_r5(){
if ($this->smarty->config_read_hidden) {
$this->add_section_vars($this->yystack[$this->yyidx + -3]->minor, $this->yystack[$this->yyidx + 0]->minor);
}
$this->_retvalue = null;
}
#line 685 "smarty_internal_configfileparser.php"
#line 694 "smarty_internal_configfileparser.php"
#line 162 "smarty_internal_configfileparser.y"
public function yy_r6()
{
function yy_r6(){
$this->_retvalue = $this->yystack[$this->yyidx + -1]->minor;
}
#line 690 "smarty_internal_configfileparser.php"
#line 699 "smarty_internal_configfileparser.php"
#line 166 "smarty_internal_configfileparser.y"
public function yy_r7()
{
function yy_r7(){
$this->_retvalue = array_merge($this->yystack[$this->yyidx + -1]->minor, Array($this->yystack[$this->yyidx + 0]->minor));
}
#line 695 "smarty_internal_configfileparser.php"
#line 704 "smarty_internal_configfileparser.php"
#line 170 "smarty_internal_configfileparser.y"
public function yy_r8()
{
function yy_r8(){
$this->_retvalue = Array();
}
#line 700 "smarty_internal_configfileparser.php"
#line 709 "smarty_internal_configfileparser.php"
#line 176 "smarty_internal_configfileparser.y"
public function yy_r9()
{
function yy_r9(){
$this->_retvalue = Array("key" => $this->yystack[$this->yyidx + -2]->minor, "value" => $this->yystack[$this->yyidx + 0]->minor);
}
#line 705 "smarty_internal_configfileparser.php"
#line 714 "smarty_internal_configfileparser.php"
#line 181 "smarty_internal_configfileparser.y"
public function yy_r10()
{
function yy_r10(){
$this->_retvalue = (float) $this->yystack[$this->yyidx + 0]->minor;
}
#line 710 "smarty_internal_configfileparser.php"
#line 719 "smarty_internal_configfileparser.php"
#line 185 "smarty_internal_configfileparser.y"
public function yy_r11()
{
function yy_r11(){
$this->_retvalue = (int) $this->yystack[$this->yyidx + 0]->minor;
}
#line 715 "smarty_internal_configfileparser.php"
#line 724 "smarty_internal_configfileparser.php"
#line 189 "smarty_internal_configfileparser.y"
public function yy_r12()
{
function yy_r12(){
$this->_retvalue = $this->parse_bool($this->yystack[$this->yyidx + 0]->minor);
}
#line 720 "smarty_internal_configfileparser.php"
#line 729 "smarty_internal_configfileparser.php"
#line 193 "smarty_internal_configfileparser.y"
public function yy_r13()
{
function yy_r13(){
$this->_retvalue = self::parse_single_quoted_string($this->yystack[$this->yyidx + 0]->minor);
}
#line 725 "smarty_internal_configfileparser.php"
#line 734 "smarty_internal_configfileparser.php"
#line 197 "smarty_internal_configfileparser.y"
public function yy_r14()
{
function yy_r14(){
$this->_retvalue = self::parse_double_quoted_string($this->yystack[$this->yyidx + 0]->minor);
}
#line 730 "smarty_internal_configfileparser.php"
#line 739 "smarty_internal_configfileparser.php"
#line 201 "smarty_internal_configfileparser.y"
public function yy_r15()
{
function yy_r15(){
$this->_retvalue = self::parse_tripple_double_quoted_string($this->yystack[$this->yyidx + -1]->minor);
}
#line 735 "smarty_internal_configfileparser.php"
#line 744 "smarty_internal_configfileparser.php"
#line 205 "smarty_internal_configfileparser.y"
public function yy_r16()
{
function yy_r16(){
$this->_retvalue = '';
}
#line 740 "smarty_internal_configfileparser.php"
#line 749 "smarty_internal_configfileparser.php"
#line 209 "smarty_internal_configfileparser.y"
public function yy_r17()
{
function yy_r17(){
$this->_retvalue = $this->yystack[$this->yyidx + 0]->minor;
}
#line 745 "smarty_internal_configfileparser.php"
#line 754 "smarty_internal_configfileparser.php"
private $_retvalue;
public function yy_reduce($yyruleno)
{
$yymsp = $this->yystack[$this->yyidx];
if (self::$yyTraceFILE && $yyruleno >= 0
if ($this->yyTraceFILE && $yyruleno >= 0
&& $yyruleno < count(self::$yyRuleName)) {
fprintf(self::$yyTraceFILE, "%sReduce (%d) [%s].\n",
self::$yyTracePrompt, $yyruleno,
fprintf($this->yyTraceFILE, "%sReduce (%d) [%s].\n",
$this->yyTracePrompt, $yyruleno,
self::$yyRuleName[$yyruleno]);
}
@@ -811,7 +785,7 @@ static public $yy_action = array(
}
$yyact = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, $yygoto);
if ($yyact < self::YYNSTATE) {
if (!self::$yyTraceFILE && $yysize) {
if (!$this->yyTraceFILE && $yysize) {
$this->yyidx++;
$x = new TPC_yyStackEntry;
$x->stateno = $yyact;
@@ -828,8 +802,8 @@ static public $yy_action = array(
public function yy_parse_failed()
{
if (self::$yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sFail!\n", self::$yyTracePrompt);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sFail!\n", $this->yyTracePrompt);
} while ($this->yyidx >= 0) {
$this->yy_pop_parser_stack();
}
@@ -842,13 +816,13 @@ static public $yy_action = array(
$this->internalError = true;
$this->yymajor = $yymajor;
$this->compiler->trigger_config_file_error();
#line 808 "smarty_internal_configfileparser.php"
#line 816 "smarty_internal_configfileparser.php"
}
public function yy_accept()
{
if (self::$yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sAccept!\n", self::$yyTracePrompt);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sAccept!\n", $this->yyTracePrompt);
} while ($this->yyidx >= 0) {
$stack = $this->yy_pop_parser_stack();
}
@@ -858,7 +832,7 @@ static public $yy_action = array(
$this->internalError = false;
$this->retvalue = $this->_retvalue;
//echo $this->retvalue."\n\n";
#line 826 "smarty_internal_configfileparser.php"
#line 833 "smarty_internal_configfileparser.php"
}
public function doParse($yymajor, $yytokenvalue)
@@ -876,9 +850,9 @@ static public $yy_action = array(
}
$yyendofinput = ($yymajor==0);
if (self::$yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sInput %s\n",
self::$yyTracePrompt, $this->yyTokenName[$yymajor]);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sInput %s\n",
$this->yyTracePrompt, $this->yyTokenName[$yymajor]);
}
do {
@@ -899,9 +873,9 @@ static public $yy_action = array(
} elseif ($yyact < self::YYNSTATE + self::YYNRULE) {
$this->yy_reduce($yyact - self::YYNSTATE);
} elseif ($yyact == self::YY_ERROR_ACTION) {
if (self::$yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sSyntax Error!\n",
self::$yyTracePrompt);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sSyntax Error!\n",
$this->yyTracePrompt);
}
if (self::YYERRORSYMBOL) {
if ($this->yyerrcnt < 0) {
@@ -909,9 +883,9 @@ static public $yy_action = array(
}
$yymx = $this->yystack[$this->yyidx]->major;
if ($yymx == self::YYERRORSYMBOL || $yyerrorhit) {
if (self::$yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sDiscard input token %s\n",
self::$yyTracePrompt, $this->yyTokenName[$yymajor]);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sDiscard input token %s\n",
$this->yyTracePrompt, $this->yyTokenName[$yymajor]);
}
$this->yy_destructor($yymajor, $yytokenvalue);
$yymajor = self::YYNOCODE;
+393 -393
View File
@@ -1,393 +1,393 @@
<?php
/**
* Smarty Internal Plugin Templateparser Parsetrees
*
* These are classes to build parsetrees in the template parser
*
* @package Smarty
* @subpackage Compiler
* @author Thue Kristensen
* @author Uwe Tews
*/
/**
* @package Smarty
* @subpackage Compiler
* @ignore
*/
abstract class _smarty_parsetree
{
/**
* Parser object
* @var object
*/
public $parser;
/**
* Buffer content
* @var mixed
*/
public $data;
/**
* Return buffer
*
* @return string buffer content
*/
abstract public function to_smarty_php();
}
/**
* A complete smarty tag.
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_tag extends _smarty_parsetree
{
/**
* Saved block nesting level
* @var int
*/
public $saved_block_nesting;
/**
* Create parse tree buffer for Smarty tag
*
* @param object $parser parser object
* @param string $data content
*/
public function __construct($parser, $data)
{
$this->parser = $parser;
$this->data = $data;
$this->saved_block_nesting = $parser->block_nesting_level;
}
/**
* Return buffer content
*
* @return string content
*/
public function to_smarty_php()
{
return $this->data;
}
/**
* Return complied code that loads the evaluated outout of buffer content into a temporary variable
*
* @return string template code
*/
public function assign_to_var()
{
$var = sprintf('$_tmp%d', ++Smarty_Internal_Templateparser::$prefix_number);
$this->parser->compiler->prefix_code[] = sprintf('<?php ob_start();?>%s<?php %s=ob_get_clean();?>', $this->data, $var);
return $var;
}
}
/**
* Code fragment inside a tag.
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_code extends _smarty_parsetree
{
/**
* Create parse tree buffer for code fragment
*
* @param object $parser parser object
* @param string $data content
*/
public function __construct($parser, $data)
{
$this->parser = $parser;
$this->data = $data;
}
/**
* Return buffer content in parentheses
*
* @return string content
*/
public function to_smarty_php()
{
return sprintf("(%s)", $this->data);
}
}
/**
* Double quoted string inside a tag.
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_doublequoted extends _smarty_parsetree
{
/**
* Create parse tree buffer for double quoted string subtrees
*
* @param object $parser parser object
* @param _smarty_parsetree $subtree parsetree buffer
*/
public function __construct($parser, _smarty_parsetree $subtree)
{
$this->parser = $parser;
$this->subtrees[] = $subtree;
if ($subtree instanceof _smarty_tag) {
$this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
}
}
/**
* Append buffer to subtree
*
* @param _smarty_parsetree $subtree parsetree buffer
*/
public function append_subtree(_smarty_parsetree $subtree)
{
$last_subtree = count($this->subtrees) - 1;
if ($last_subtree >= 0 && $this->subtrees[$last_subtree] instanceof _smarty_tag && $this->subtrees[$last_subtree]->saved_block_nesting < $this->parser->block_nesting_level) {
if ($subtree instanceof _smarty_code) {
$this->subtrees[$last_subtree]->data .= '<?php echo ' . $subtree->data . ';?>';
} elseif ($subtree instanceof _smarty_dq_content) {
$this->subtrees[$last_subtree]->data .= '<?php echo "' . $subtree->data . '";?>';
} else {
$this->subtrees[$last_subtree]->data .= $subtree->data;
}
} else {
$this->subtrees[] = $subtree;
}
if ($subtree instanceof _smarty_tag) {
$this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
}
}
/**
* Merge subtree buffer content together
*
* @return string compiled template code
*/
public function to_smarty_php()
{
$code = '';
foreach ($this->subtrees as $subtree) {
if ($code !== "") {
$code .= ".";
}
if ($subtree instanceof _smarty_tag) {
$more_php = $subtree->assign_to_var();
} else {
$more_php = $subtree->to_smarty_php();
}
$code .= $more_php;
if (!$subtree instanceof _smarty_dq_content) {
$this->parser->compiler->has_variable_string = true;
}
}
return $code;
}
}
/**
* Raw chars as part of a double quoted string.
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_dq_content extends _smarty_parsetree
{
/**
* Create parse tree buffer with string content
*
* @param object $parser parser object
* @param string $data string section
*/
public function __construct($parser, $data)
{
$this->parser = $parser;
$this->data = $data;
}
/**
* Return content as double quoted string
*
* @return string doubled quoted string
*/
public function to_smarty_php()
{
return '"' . $this->data . '"';
}
}
/**
* Template element
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_template_buffer extends _smarty_parsetree
{
/**
* Array of template elements
*
* @var array
*/
public $subtrees = Array();
/**
* Create root of parse tree for template elements
*
* @param object $parser parse object
*/
public function __construct($parser)
{
$this->parser = $parser;
}
/**
* Append buffer to subtree
*
* @param _smarty_parsetree $subtree
*/
public function append_subtree(_smarty_parsetree $subtree)
{
$this->subtrees[] = $subtree;
}
/**
* Sanitize and merge subtree buffers together
*
* @return string template code content
*/
public function to_smarty_php()
{
$code = '';
for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key++) {
if ($key + 2 < $cnt) {
if ($this->subtrees[$key] instanceof _smarty_linebreak && $this->subtrees[$key + 1] instanceof _smarty_tag && $this->subtrees[$key + 1]->data == '' && $this->subtrees[$key + 2] instanceof _smarty_linebreak) {
$key = $key + 1;
continue;
}
if (substr($this->subtrees[$key]->data, -1) == '<' && $this->subtrees[$key + 1]->data == '' && substr($this->subtrees[$key + 2]->data, -1) == '?') {
$key = $key + 2;
continue;
}
}
if (substr($code, -1) == '<') {
$subtree = $this->subtrees[$key]->to_smarty_php();
if (substr($subtree, 0, 1) == '?') {
$code = substr($code, 0, strlen($code) - 1) . '<<?php ?>?' . substr($subtree, 1);
} elseif ($this->parser->asp_tags && substr($subtree, 0, 1) == '%') {
$code = substr($code, 0, strlen($code) - 1) . '<<?php ?>%' . substr($subtree, 1);
} else {
$code .= $subtree;
}
continue;
}
if ($this->parser->asp_tags && substr($code, -1) == '%') {
$subtree = $this->subtrees[$key]->to_smarty_php();
if (substr($subtree, 0, 1) == '>') {
$code = substr($code, 0, strlen($code) - 1) . '%<?php ?>>' . substr($subtree, 1);
} else {
$code .= $subtree;
}
continue;
}
if (substr($code, -1) == '?') {
$subtree = $this->subtrees[$key]->to_smarty_php();
if (substr($subtree, 0, 1) == '>') {
$code = substr($code, 0, strlen($code) - 1) . '?<?php ?>>' . substr($subtree, 1);
} else {
$code .= $subtree;
}
continue;
}
$code .= $this->subtrees[$key]->to_smarty_php();
}
return $code;
}
}
/**
* template text
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_text extends _smarty_parsetree
{
/**
* Create template text buffer
*
* @param object $parser parser object
* @param string $data text
*/
public function __construct($parser, $data)
{
$this->parser = $parser;
$this->data = $data;
}
/**
* Return buffer content
*
* @return strint text
*/
public function to_smarty_php()
{
return $this->data;
}
}
/**
* template linebreaks
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_linebreak extends _smarty_parsetree
{
/**
* Create buffer with linebreak content
*
* @param object $parser parser object
* @param string $data linebreak string
*/
public function __construct($parser, $data)
{
$this->parser = $parser;
$this->data = $data;
}
/**
* Return linebrak
*
* @return string linebreak
*/
public function to_smarty_php()
{
return $this->data;
}
}
<?php
/**
* Smarty Internal Plugin Templateparser Parsetrees
*
* These are classes to build parsetrees in the template parser
*
* @package Smarty
* @subpackage Compiler
* @author Thue Kristensen
* @author Uwe Tews
*/
/**
* @package Smarty
* @subpackage Compiler
* @ignore
*/
abstract class _smarty_parsetree
{
/**
* Parser object
* @var object
*/
public $parser;
/**
* Buffer content
* @var mixed
*/
public $data;
/**
* Return buffer
*
* @return string buffer content
*/
abstract public function to_smarty_php();
}
/**
* A complete smarty tag.
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_tag extends _smarty_parsetree
{
/**
* Saved block nesting level
* @var int
*/
public $saved_block_nesting;
/**
* Create parse tree buffer for Smarty tag
*
* @param object $parser parser object
* @param string $data content
*/
public function __construct($parser, $data)
{
$this->parser = $parser;
$this->data = $data;
$this->saved_block_nesting = $parser->block_nesting_level;
}
/**
* Return buffer content
*
* @return string content
*/
public function to_smarty_php()
{
return $this->data;
}
/**
* Return complied code that loads the evaluated outout of buffer content into a temporary variable
*
* @return string template code
*/
public function assign_to_var()
{
$var = sprintf('$_tmp%d', ++Smarty_Internal_Templateparser::$prefix_number);
$this->parser->compiler->prefix_code[] = sprintf('<?php ob_start();?>%s<?php %s=ob_get_clean();?>', $this->data, $var);
return $var;
}
}
/**
* Code fragment inside a tag.
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_code extends _smarty_parsetree
{
/**
* Create parse tree buffer for code fragment
*
* @param object $parser parser object
* @param string $data content
*/
public function __construct($parser, $data)
{
$this->parser = $parser;
$this->data = $data;
}
/**
* Return buffer content in parentheses
*
* @return string content
*/
public function to_smarty_php()
{
return sprintf("(%s)", $this->data);
}
}
/**
* Double quoted string inside a tag.
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_doublequoted extends _smarty_parsetree
{
/**
* Create parse tree buffer for double quoted string subtrees
*
* @param object $parser parser object
* @param _smarty_parsetree $subtree parsetree buffer
*/
public function __construct($parser, _smarty_parsetree $subtree)
{
$this->parser = $parser;
$this->subtrees[] = $subtree;
if ($subtree instanceof _smarty_tag) {
$this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
}
}
/**
* Append buffer to subtree
*
* @param _smarty_parsetree $subtree parsetree buffer
*/
public function append_subtree(_smarty_parsetree $subtree)
{
$last_subtree = count($this->subtrees) - 1;
if ($last_subtree >= 0 && $this->subtrees[$last_subtree] instanceof _smarty_tag && $this->subtrees[$last_subtree]->saved_block_nesting < $this->parser->block_nesting_level) {
if ($subtree instanceof _smarty_code) {
$this->subtrees[$last_subtree]->data .= '<?php echo ' . $subtree->data . ';?>';
} elseif ($subtree instanceof _smarty_dq_content) {
$this->subtrees[$last_subtree]->data .= '<?php echo "' . $subtree->data . '";?>';
} else {
$this->subtrees[$last_subtree]->data .= $subtree->data;
}
} else {
$this->subtrees[] = $subtree;
}
if ($subtree instanceof _smarty_tag) {
$this->parser->block_nesting_level = count($this->parser->compiler->_tag_stack);
}
}
/**
* Merge subtree buffer content together
*
* @return string compiled template code
*/
public function to_smarty_php()
{
$code = '';
foreach ($this->subtrees as $subtree) {
if ($code !== "") {
$code .= ".";
}
if ($subtree instanceof _smarty_tag) {
$more_php = $subtree->assign_to_var();
} else {
$more_php = $subtree->to_smarty_php();
}
$code .= $more_php;
if (!$subtree instanceof _smarty_dq_content) {
$this->parser->compiler->has_variable_string = true;
}
}
return $code;
}
}
/**
* Raw chars as part of a double quoted string.
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_dq_content extends _smarty_parsetree
{
/**
* Create parse tree buffer with string content
*
* @param object $parser parser object
* @param string $data string section
*/
public function __construct($parser, $data)
{
$this->parser = $parser;
$this->data = $data;
}
/**
* Return content as double quoted string
*
* @return string doubled quoted string
*/
public function to_smarty_php()
{
return '"' . $this->data . '"';
}
}
/**
* Template element
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_template_buffer extends _smarty_parsetree
{
/**
* Array of template elements
*
* @var array
*/
public $subtrees = Array();
/**
* Create root of parse tree for template elements
*
* @param object $parser parse object
*/
public function __construct($parser)
{
$this->parser = $parser;
}
/**
* Append buffer to subtree
*
* @param _smarty_parsetree $subtree
*/
public function append_subtree(_smarty_parsetree $subtree)
{
$this->subtrees[] = $subtree;
}
/**
* Sanitize and merge subtree buffers together
*
* @return string template code content
*/
public function to_smarty_php()
{
$code = '';
for ($key = 0, $cnt = count($this->subtrees); $key < $cnt; $key++) {
if ($key + 2 < $cnt) {
if ($this->subtrees[$key] instanceof _smarty_linebreak && $this->subtrees[$key + 1] instanceof _smarty_tag && $this->subtrees[$key + 1]->data == '' && $this->subtrees[$key + 2] instanceof _smarty_linebreak) {
$key = $key + 1;
continue;
}
if (substr($this->subtrees[$key]->data, -1) == '<' && $this->subtrees[$key + 1]->data == '' && substr($this->subtrees[$key + 2]->data, -1) == '?') {
$key = $key + 2;
continue;
}
}
if (substr($code, -1) == '<') {
$subtree = $this->subtrees[$key]->to_smarty_php();
if (substr($subtree, 0, 1) == '?') {
$code = substr($code, 0, strlen($code) - 1) . '<<?php ?>?' . substr($subtree, 1);
} elseif ($this->parser->asp_tags && substr($subtree, 0, 1) == '%') {
$code = substr($code, 0, strlen($code) - 1) . '<<?php ?>%' . substr($subtree, 1);
} else {
$code .= $subtree;
}
continue;
}
if ($this->parser->asp_tags && substr($code, -1) == '%') {
$subtree = $this->subtrees[$key]->to_smarty_php();
if (substr($subtree, 0, 1) == '>') {
$code = substr($code, 0, strlen($code) - 1) . '%<?php ?>>' . substr($subtree, 1);
} else {
$code .= $subtree;
}
continue;
}
if (substr($code, -1) == '?') {
$subtree = $this->subtrees[$key]->to_smarty_php();
if (substr($subtree, 0, 1) == '>') {
$code = substr($code, 0, strlen($code) - 1) . '?<?php ?>>' . substr($subtree, 1);
} else {
$code .= $subtree;
}
continue;
}
$code .= $this->subtrees[$key]->to_smarty_php();
}
return $code;
}
}
/**
* template text
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_text extends _smarty_parsetree
{
/**
* Create template text buffer
*
* @param object $parser parser object
* @param string $data text
*/
public function __construct($parser, $data)
{
$this->parser = $parser;
$this->data = $data;
}
/**
* Return buffer content
*
* @return strint text
*/
public function to_smarty_php()
{
return $this->data;
}
}
/**
* template linebreaks
*
* @package Smarty
* @subpackage Compiler
* @ignore
*/
class _smarty_linebreak extends _smarty_parsetree
{
/**
* Create buffer with linebreak content
*
* @param object $parser parser object
* @param string $data linebreak string
*/
public function __construct($parser, $data)
{
$this->parser = $parser;
$this->data = $data;
}
/**
* Return linebrak
*
* @return string linebreak
*/
public function to_smarty_php()
{
return $this->data;
}
}
@@ -98,8 +98,10 @@ class Smarty_Internal_SmartyTemplateCompiler extends Smarty_Internal_TemplateCom
// start state on child templates
$this->lex->yypushstate(Smarty_Internal_Templatelexer::CHILDBODY);
}
if ($this->smarty->_parserdebug)
if ($this->smarty->_parserdebug) {
$this->parser->PrintTrace();
$this->lex->PrintTrace();
}
// get tokens from lexer and parse them
while ($this->lex->yylex() && !$this->abort_and_recompile) {
if ($this->smarty->_parserdebug) {
+3 -3
View File
@@ -217,7 +217,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
return false;
}
$this->properties['cache_lifetime'] = $this->cache_lifetime;
$this->properties['unifunc'] = 'content_' . str_replace('.', '_', uniqid('', true));
$this->properties['unifunc'] = 'content_' . str_replace(array('.',','), '_', uniqid('', true));
$content = $this->createTemplateCodeFrame($content, true);
$_smarty_tpl = $this;
eval("?>" . $content);
@@ -243,7 +243,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
{
// already in template cache?
if ($this->smarty->allow_ambiguous_resources) {
$_templateId = Smarty_Resource::getUniqueTemplateName($this->smarty, $template) . $cache_id . $compile_id;
$_templateId = Smarty_Resource::getUniqueTemplateName($this, $template) . $cache_id . $compile_id;
} else {
$_templateId = $this->smarty->joined_template_dir . '#' . $template . $cache_id . $compile_id;
}
@@ -399,7 +399,7 @@ class Smarty_Internal_Template extends Smarty_Internal_TemplateBase
}
$this->properties['version'] = Smarty::SMARTY_VERSION;
if (!isset($this->properties['unifunc'])) {
$this->properties['unifunc'] = 'content_' . str_replace('.', '_', uniqid('', true));
$this->properties['unifunc'] = 'content_' . str_replace(array('.',','), '_', uniqid('', true));
}
if (!$this->source->recompiled) {
$output .= "\$_valid = \$_smarty_tpl->decodeProperties(" . var_export($this->properties, true) . ',' . ($cache ? 'true' : 'false') . "); /*/%%SmartyHeaderCode%%*/?>\n";
@@ -34,7 +34,7 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data
if ($template === null && $this instanceof $this->template_class) {
$template = $this;
}
if (!empty($cache_id) && is_object($cache_id)) {
if ($cache_id !== null && is_object($cache_id)) {
$parent = $cache_id;
$cache_id = null;
}
@@ -343,7 +343,7 @@ abstract class Smarty_Internal_TemplateBase extends Smarty_Internal_Data
}
// debug output
if ($this->smarty->debugging) {
Smarty_Internal_Debug::display_debug($this);
Smarty_Internal_Debug::display_debug($_template);
}
if ($merge_tpl_vars) {
// restore local variables
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1179,25 +1179,25 @@ static public $yy_action = array(
const YYFALLBACK = 0;
public static $yyFallback = array(
);
public static function Trace($TraceFILE, $zTracePrompt)
public function Trace($TraceFILE, $zTracePrompt)
{
if (!$TraceFILE) {
$zTracePrompt = 0;
} elseif (!$zTracePrompt) {
$TraceFILE = 0;
}
self::$yyTraceFILE = $TraceFILE;
self::$yyTracePrompt = $zTracePrompt;
$this->yyTraceFILE = $TraceFILE;
$this->yyTracePrompt = $zTracePrompt;
}
public static function PrintTrace()
public function PrintTrace()
{
self::$yyTraceFILE = fopen('php://output', 'w');
self::$yyTracePrompt = '<br>';
$this->yyTraceFILE = fopen('php://output', 'w');
$this->yyTracePrompt = '<br>';
}
public static $yyTraceFILE;
public static $yyTracePrompt;
public $yyTraceFILE;
public $yyTracePrompt;
public $yyidx; /* Index of top element in stack */
public $yyerrcnt; /* Shifts left before out of the error */
public $yystack = array(); /* The parser's stack */
@@ -1469,9 +1469,9 @@ static public $yy_action = array(
return;
}
$yytos = array_pop($this->yystack);
if (self::$yyTraceFILE && $this->yyidx >= 0) {
fwrite(self::$yyTraceFILE,
self::$yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] .
if ($this->yyTraceFILE && $this->yyidx >= 0) {
fwrite($this->yyTraceFILE,
$this->yyTracePrompt . 'Popping ' . $this->yyTokenName[$yytos->major] .
"\n");
}
$yymajor = $yytos->major;
@@ -1486,8 +1486,8 @@ static public $yy_action = array(
while ($this->yystack !== Array()) {
$this->yy_pop_parser_stack();
}
if (is_resource(self::$yyTraceFILE)) {
fclose(self::$yyTraceFILE);
if (is_resource($this->yyTraceFILE)) {
fclose($this->yyTraceFILE);
}
}
@@ -1655,8 +1655,8 @@ static public $yy_action = array(
self::$yy_lookahead[$i] != $iLookAhead) {
if (count(self::$yyFallback) && $iLookAhead < count(self::$yyFallback)
&& ($iFallback = self::$yyFallback[$iLookAhead]) != 0) {
if (self::$yyTraceFILE) {
fwrite(self::$yyTraceFILE, self::$yyTracePrompt . "FALLBACK " .
if ($this->yyTraceFILE) {
fwrite($this->yyTraceFILE, $this->yyTracePrompt . "FALLBACK " .
$this->yyTokenName[$iLookAhead] . " => " .
$this->yyTokenName[$iFallback] . "\n");
}
@@ -1698,8 +1698,8 @@ static public $yy_action = array(
$this->yyidx++;
if ($this->yyidx >= self::YYSTACKDEPTH) {
$this->yyidx--;
if (self::$yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sStack Overflow!\n", self::$yyTracePrompt);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sStack Overflow!\n", $this->yyTracePrompt);
}
while ($this->yyidx >= 0) {
$this->yy_pop_parser_stack();
@@ -1717,15 +1717,15 @@ static public $yy_action = array(
$yytos->major = $yyMajor;
$yytos->minor = $yypMinor;
array_push($this->yystack, $yytos);
if (self::$yyTraceFILE && $this->yyidx > 0) {
fprintf(self::$yyTraceFILE, "%sShift %d\n", self::$yyTracePrompt,
if ($this->yyTraceFILE && $this->yyidx > 0) {
fprintf($this->yyTraceFILE, "%sShift %d\n", $this->yyTracePrompt,
$yyNewState);
fprintf(self::$yyTraceFILE, "%sStack:", self::$yyTracePrompt);
fprintf($this->yyTraceFILE, "%sStack:", $this->yyTracePrompt);
for ($i = 1; $i <= $this->yyidx; $i++) {
fprintf(self::$yyTraceFILE, " %s",
fprintf($this->yyTraceFILE, " %s",
$this->yyTokenName[$this->yystack[$i]->major]);
}
fwrite(self::$yyTraceFILE,"\n");
fwrite($this->yyTraceFILE,"\n");
}
}
@@ -3079,10 +3079,10 @@ static public $yy_action = array(
public function yy_reduce($yyruleno)
{
$yymsp = $this->yystack[$this->yyidx];
if (self::$yyTraceFILE && $yyruleno >= 0
if ($this->yyTraceFILE && $yyruleno >= 0
&& $yyruleno < count(self::$yyRuleName)) {
fprintf(self::$yyTraceFILE, "%sReduce (%d) [%s].\n",
self::$yyTracePrompt, $yyruleno,
fprintf($this->yyTraceFILE, "%sReduce (%d) [%s].\n",
$this->yyTracePrompt, $yyruleno,
self::$yyRuleName[$yyruleno]);
}
@@ -3102,7 +3102,7 @@ static public $yy_action = array(
}
$yyact = $this->yy_find_reduce_action($this->yystack[$this->yyidx]->stateno, $yygoto);
if ($yyact < self::YYNSTATE) {
if (!self::$yyTraceFILE && $yysize) {
if (!$this->yyTraceFILE && $yysize) {
$this->yyidx++;
$x = new TP_yyStackEntry;
$x->stateno = $yyact;
@@ -3119,8 +3119,8 @@ static public $yy_action = array(
public function yy_parse_failed()
{
if (self::$yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sFail!\n", self::$yyTracePrompt);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sFail!\n", $this->yyTracePrompt);
} while ($this->yyidx >= 0) {
$this->yy_pop_parser_stack();
}
@@ -3138,8 +3138,8 @@ static public $yy_action = array(
public function yy_accept()
{
if (self::$yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sAccept!\n", self::$yyTracePrompt);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sAccept!\n", $this->yyTracePrompt);
} while ($this->yyidx >= 0) {
$stack = $this->yy_pop_parser_stack();
}
@@ -3167,9 +3167,9 @@ static public $yy_action = array(
}
$yyendofinput = ($yymajor==0);
if (self::$yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sInput %s\n",
self::$yyTracePrompt, $this->yyTokenName[$yymajor]);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sInput %s\n",
$this->yyTracePrompt, $this->yyTokenName[$yymajor]);
}
do {
@@ -3190,9 +3190,9 @@ static public $yy_action = array(
} elseif ($yyact < self::YYNSTATE + self::YYNRULE) {
$this->yy_reduce($yyact - self::YYNSTATE);
} elseif ($yyact == self::YY_ERROR_ACTION) {
if (self::$yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sSyntax Error!\n",
self::$yyTracePrompt);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sSyntax Error!\n",
$this->yyTracePrompt);
}
if (self::YYERRORSYMBOL) {
if ($this->yyerrcnt < 0) {
@@ -3200,9 +3200,9 @@ static public $yy_action = array(
}
$yymx = $this->yystack[$this->yyidx]->major;
if ($yymx == self::YYERRORSYMBOL || $yyerrorhit) {
if (self::$yyTraceFILE) {
fprintf(self::$yyTraceFILE, "%sDiscard input token %s\n",
self::$yyTracePrompt, $this->yyTokenName[$yymajor]);
if ($this->yyTraceFILE) {
fprintf($this->yyTraceFILE, "%sDiscard input token %s\n",
$this->yyTracePrompt, $this->yyTokenName[$yymajor]);
}
$this->yy_destructor($yymajor, $yytokenvalue);
$yymajor = self::YYNOCODE;
@@ -3241,4 +3241,4 @@ static public $yy_action = array(
}
} while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
}
}
}
File diff suppressed because it is too large Load Diff
@@ -38,7 +38,7 @@ class Smarty_Internal_Write_File
}
// write to tmp file, then move to overt file lock race condition
$_tmp_file = $_dirpath . DS . uniqid('wrt', true);
$_tmp_file = $_dirpath . DS . str_replace(array('.',','), '_', uniqid('wrt', true));
if (!file_put_contents($_tmp_file, $_contents)) {
error_reporting($_error_reporting);
throw new SmartyException("unable to write file {$_tmp_file}");
+18 -7
View File
@@ -491,17 +491,21 @@ abstract class Smarty_Resource
/**
* modify template_resource according to resource handlers specifications
*
* @param string $smarty Smarty instance
* @param Smarty_Internal_template $template Smarty instance
* @param string $template_resource template_resource to extracate resource handler and name of
* @return string unique resource name
*/
public static function getUniqueTemplateName($smarty, $template_resource)
public static function getUniqueTemplateName($template, $template_resource)
{
self::parseResourceName($template_resource, $smarty->default_resource_type, $name, $type);
self::parseResourceName($template_resource, $template->smarty->default_resource_type, $name, $type);
// TODO: optimize for Smarty's internal resource types
$resource = Smarty_Resource::load($smarty, $type);
return $resource->buildUniqueResourceName($smarty, $name);
$resource = Smarty_Resource::load($template->smarty, $type);
// go relative to a given template?
$_file_is_dotted = $name[0] == '.' && ($name[1] == '.' || $name[1] == '/' || $name[1] == "\\");
if ($template instanceof Smarty_Internal_Template && $_file_is_dotted && ($template->source->type == 'file' || $template->parent->source->type == 'extends')) {
$name = dirname($template->source->filepath) . DS . $name;
}
return $resource->buildUniqueResourceName($template->smarty, $name);
}
/**
@@ -524,7 +528,14 @@ abstract class Smarty_Resource
// parse resource_name, load resource handler, identify unique resource name
self::parseResourceName($template_resource, $smarty->default_resource_type, $name, $type);
$resource = Smarty_Resource::load($smarty, $type);
$unique_resource_name = $resource->buildUniqueResourceName($smarty, $name);
// go relative to a given template?
$_file_is_dotted = isset($name[0]) && $name[0] == '.' && ($name[1] == '.' || $name[1] == '/' || $name[1] == "\\");
if ($_file_is_dotted && isset($_template) && $_template->parent instanceof Smarty_Internal_Template && ($_template->parent->source->type == 'file' || $_template->parent->source->type == 'extends')) {
$name2 = dirname($_template->parent->source->filepath) . DS . $name;
} else {
$name2 = $name;
}
$unique_resource_name = $resource->buildUniqueResourceName($smarty, $name2);
// check runtime cache
$_cache_key = 'template|' . $unique_resource_name;
+1 -1
View File
@@ -48,7 +48,7 @@ abstract class Smarty_Resource_Custom extends Smarty_Resource
*/
public function populate(Smarty_Template_Source $source, Smarty_Internal_Template $_template=null)
{
$source->filepath = strtolower($source->type . ':' . $source->name);
$source->filepath = $source->type . ':' . $source->name;
$source->uid = sha1($source->type . ':' . $source->name);
$mtime = $this->fetchTimestamp($source->name);