mirror of
https://github.com/smarty-php/smarty.git
synced 2025-08-05 10:54:27 +02:00
- bugfix $auto_literal = false did not work with { block} tags in child templates
(problem was reintroduced after fix in 3.1.7)(Forum Topic 20581)
This commit is contained in:
@@ -1,4 +1,8 @@
|
|||||||
===== trunk =====
|
===== trunk =====
|
||||||
|
21.08.2012
|
||||||
|
- bugfix $auto_literal = false did not work with { block} tags in child templates
|
||||||
|
(problem was reintroduced after fix in 3.1.7)(Forum Topic 20581)
|
||||||
|
|
||||||
17.08.2012
|
17.08.2012
|
||||||
- bugfix compiled code of nocache sections could contain wrong escaping (Forum Topic 22810)
|
- bugfix compiled code of nocache sections could contain wrong escaping (Forum Topic 22810)
|
||||||
|
|
||||||
|
@@ -78,7 +78,7 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
|
|||||||
public static function saveBlockData($block_content, $block_tag, $template, $filepath) {
|
public static function saveBlockData($block_content, $block_tag, $template, $filepath) {
|
||||||
$_rdl = preg_quote($template->smarty->right_delimiter);
|
$_rdl = preg_quote($template->smarty->right_delimiter);
|
||||||
$_ldl = preg_quote($template->smarty->left_delimiter);
|
$_ldl = preg_quote($template->smarty->left_delimiter);
|
||||||
if ($template->smarty->auto_literal) {
|
if (!$template->smarty->auto_literal) {
|
||||||
$al = '\s*';
|
$al = '\s*';
|
||||||
} else {
|
} else {
|
||||||
$al = '';
|
$al = '';
|
||||||
@@ -90,7 +90,7 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
|
|||||||
$_name = trim($_match[3], '\'"');
|
$_name = trim($_match[3], '\'"');
|
||||||
if ($_match[8] != 'hide' || isset($template->block_data[$_name])) { // replace {$smarty.block.child}
|
if ($_match[8] != 'hide' || isset($template->block_data[$_name])) { // replace {$smarty.block.child}
|
||||||
// do we have {$smart.block.child} in nested {block} tags?
|
// do we have {$smart.block.child} in nested {block} tags?
|
||||||
if (0 != preg_match_all("!({$_ldl}{$al}block\s+)(name=)?(\w+|'.*'|\".*\")([\s\S]*?)(hide)?(\s*{$_rdl})([\s\S]*?)({$_ldl}{$al}\\\$smarty\.block\.child{$_rdl})([\s\S]*?{$_ldl}{$al}/block{$_rdl})!", $block_content, $_match2)) {
|
if (0 != preg_match_all("!({$_ldl}{$al}block\s+)(name=)?(\w+|'.*'|\".*\")([\s\S]*?)(hide)?(\s*{$_rdl})([\s\S]*?)({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})([\s\S]*?{$_ldl}{$al}/block\s*{$_rdl})!", $block_content, $_match2)) {
|
||||||
foreach ($_match2[3] as $key => $name) {
|
foreach ($_match2[3] as $key => $name) {
|
||||||
// get it's replacement
|
// get it's replacement
|
||||||
$_name2 = trim($name, '\'"');
|
$_name2 = trim($name, '\'"');
|
||||||
@@ -101,17 +101,17 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
|
|||||||
$replacement = '';
|
$replacement = '';
|
||||||
}
|
}
|
||||||
// replace {$smarty.block.child} tag
|
// replace {$smarty.block.child} tag
|
||||||
$search = array("%({$_ldl}{$al}block[\s\S]*?{$name}[\s\S]*?{$_rdl})([\s\S]*?)({$_ldl}{$al}\\\$smarty\.block\.child{$_rdl})([\s\S]*?)({$_ldl}{$al}/block{$_rdl})%", "/<2F><><EFBFBD>child<6C><64><EFBFBD>/");
|
$search = array("%({$_ldl}{$al}block[\s\S]*?{$name}[\s\S]*?{$_rdl})([\s\S]*?)({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})([\s\S]*?)({$_ldl}{$al}/block\s*{$_rdl})%", "/<2F><><EFBFBD>child<6C><64><EFBFBD>/");
|
||||||
$replace = array('\2<><32><EFBFBD>child<6C><64><EFBFBD>\4', $replacement);
|
$replace = array('\2<><32><EFBFBD>child<6C><64><EFBFBD>\4', $replacement);
|
||||||
$block_content = preg_replace($search, $replace, $block_content);
|
$block_content = preg_replace($search, $replace, $block_content);
|
||||||
} else {
|
} else {
|
||||||
// remove hidden blocks
|
// remove hidden blocks
|
||||||
$block_content = preg_replace("%({$_ldl}{$al}block[\s\S]*?{$name}[\s\S]*?{$_rdl}[\s\S]*?{$_ldl}{$al}/block{$_rdl})%", '', $block_content);
|
$block_content = preg_replace("%({$_ldl}{$al}block[\s\S]*?{$name}[\s\S]*?{$_rdl}[\s\S]*?{$_ldl}{$al}/block\s*{$_rdl})%", '', $block_content);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// do we have not nested {$smart.block.child}
|
// do we have not nested {$smart.block.child}
|
||||||
if (0 != preg_match("/({$_ldl}{$al}\\\$smarty\.block\.child{$_rdl})/", $block_content, $_match2)) {
|
if (0 != preg_match("/({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})/", $block_content, $_match2)) {
|
||||||
// get child replacement for this block
|
// get child replacement for this block
|
||||||
if (isset($template->block_data[$_name])) {
|
if (isset($template->block_data[$_name])) {
|
||||||
$replacement = $template->block_data[$_name]['source'];
|
$replacement = $template->block_data[$_name]['source'];
|
||||||
@@ -119,7 +119,7 @@ class Smarty_Internal_Compile_Block extends Smarty_Internal_CompileBase {
|
|||||||
} else {
|
} else {
|
||||||
$replacement = '';
|
$replacement = '';
|
||||||
}
|
}
|
||||||
$block_content = preg_replace("/({$_ldl}{$al}\\\$smarty\.block\.child{$_rdl})/", $replacement, $block_content);
|
$block_content = preg_replace("/({$_ldl}{$al}\\\$smarty\.block\.child\s*{$_rdl})/", $replacement, $block_content);
|
||||||
}
|
}
|
||||||
if (isset($template->block_data[$_name])) {
|
if (isset($template->block_data[$_name])) {
|
||||||
if (strpos($template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) {
|
if (strpos($template->block_data[$_name]['source'], '%%%%SMARTY_PARENT%%%%') !== false) {
|
||||||
|
@@ -51,6 +51,11 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase {
|
|||||||
static $_is_stringy = array('string' => true, 'eval' => true);
|
static $_is_stringy = array('string' => true, 'eval' => true);
|
||||||
$this->_rdl = preg_quote($compiler->smarty->right_delimiter);
|
$this->_rdl = preg_quote($compiler->smarty->right_delimiter);
|
||||||
$this->_ldl = preg_quote($compiler->smarty->left_delimiter);
|
$this->_ldl = preg_quote($compiler->smarty->left_delimiter);
|
||||||
|
if (!$compiler->smarty->auto_literal) {
|
||||||
|
$al = '\s*';
|
||||||
|
} else {
|
||||||
|
$al = '';
|
||||||
|
}
|
||||||
$filepath = $compiler->template->source->filepath;
|
$filepath = $compiler->template->source->filepath;
|
||||||
$this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
|
$this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
|
||||||
// check and get attributes
|
// check and get attributes
|
||||||
@@ -78,11 +83,11 @@ class Smarty_Internal_Compile_Extends extends Smarty_Internal_CompileBase {
|
|||||||
}
|
}
|
||||||
$compiler->template->properties['file_dependency'][$template_sha1] = array($_template->source->filepath, $_template->source->timestamp, $_template->source->type);
|
$compiler->template->properties['file_dependency'][$template_sha1] = array($_template->source->filepath, $_template->source->timestamp, $_template->source->type);
|
||||||
$_content = ($this->mbstring_overload ? mb_substr($compiler->template->source->content, $compiler->lex->counter - 1, 20000000, 'latin1') : substr($compiler->template->source->content, $compiler->lex->counter - 1));
|
$_content = ($this->mbstring_overload ? mb_substr($compiler->template->source->content, $compiler->lex->counter - 1, 20000000, 'latin1') : substr($compiler->template->source->content, $compiler->lex->counter - 1));
|
||||||
if (preg_match_all("!({$this->_ldl}block\s(.+?){$this->_rdl})!", $_content, $s) !=
|
if (preg_match_all("!({$this->_ldl}{$al}block\s(.+?)\s*{$this->_rdl})!", $_content, $s) !=
|
||||||
preg_match_all("!({$this->_ldl}/block{$this->_rdl})!", $_content, $c)) {
|
preg_match_all("!({$this->_ldl}{$al}/block\s*{$this->_rdl})!", $_content, $c)) {
|
||||||
$compiler->trigger_template_error('unmatched {block} {/block} pairs');
|
$compiler->trigger_template_error('unmatched {block} {/block} pairs');
|
||||||
}
|
}
|
||||||
preg_match_all("!{$this->_ldl}block\s(.+?){$this->_rdl}|{$this->_ldl}/block{$this->_rdl}|{$this->_ldl}\*([\S\s]*?)\*{$this->_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE);
|
preg_match_all("!{$this->_ldl}{$al}block\s(.+?)\s*{$this->_rdl}|{$this->_ldl}{$al}/block\s*{$this->_rdl}|{$this->_ldl}\*([\S\s]*?)\*{$this->_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE);
|
||||||
$_result_count = count($_result[0]);
|
$_result_count = count($_result[0]);
|
||||||
$_start = 0;
|
$_start = 0;
|
||||||
while ($_start+1 < $_result_count) {
|
while ($_start+1 < $_result_count) {
|
||||||
|
@@ -89,6 +89,11 @@ class Smarty_Internal_Resource_Extends extends Smarty_Resource {
|
|||||||
$this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
|
$this->mbstring_overload = ini_get('mbstring.func_overload') & 2;
|
||||||
$_rdl = preg_quote($source->smarty->right_delimiter);
|
$_rdl = preg_quote($source->smarty->right_delimiter);
|
||||||
$_ldl = preg_quote($source->smarty->left_delimiter);
|
$_ldl = preg_quote($source->smarty->left_delimiter);
|
||||||
|
if (!$source->smarty->auto_literal) {
|
||||||
|
$al = '\s*';
|
||||||
|
} else {
|
||||||
|
$al = '';
|
||||||
|
}
|
||||||
$_components = array_reverse($source->components);
|
$_components = array_reverse($source->components);
|
||||||
$_first = reset($_components);
|
$_first = reset($_components);
|
||||||
$_last = end($_components);
|
$_last = end($_components);
|
||||||
@@ -105,11 +110,11 @@ class Smarty_Internal_Resource_Extends extends Smarty_Resource {
|
|||||||
|
|
||||||
// extend sources
|
// extend sources
|
||||||
if ($_component != $_last) {
|
if ($_component != $_last) {
|
||||||
if (preg_match_all("!({$_ldl}block\s(.+?){$_rdl})!", $_content, $_open) !=
|
if (preg_match_all("!({$_ldl}{$al}block\s(.+?)\s*{$_rdl})!", $_content, $_open) !=
|
||||||
preg_match_all("!({$_ldl}/block{$_rdl})!", $_content, $_close)) {
|
preg_match_all("!({$_ldl}{$al}/block\s*{$_rdl})!", $_content, $_close)) {
|
||||||
throw new SmartyException("unmatched {block} {/block} pairs in template {$_component->type} '{$_component->name}'");
|
throw new SmartyException("unmatched {block} {/block} pairs in template {$_component->type} '{$_component->name}'");
|
||||||
}
|
}
|
||||||
preg_match_all("!{$_ldl}block\s(.+?){$_rdl}|{$_ldl}/block{$_rdl}|{$_ldl}\*([\S\s]*?)\*{$_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE);
|
preg_match_all("!{$_ldl}{$al}block\s(.+?)\s*{$_rdl}|{$_ldl}{$al}/block\s*{$_rdl}|{$_ldl}\*([\S\s]*?)\*{$_rdl}!", $_content, $_result, PREG_OFFSET_CAPTURE);
|
||||||
$_result_count = count($_result[0]);
|
$_result_count = count($_result[0]);
|
||||||
$_start = 0;
|
$_start = 0;
|
||||||
while ($_start+1 < $_result_count) {
|
while ($_start+1 < $_result_count) {
|
||||||
|
@@ -141,11 +141,12 @@ class Smarty_Internal_Templatelexer
|
|||||||
21 => 0,
|
21 => 0,
|
||||||
22 => 0,
|
22 => 0,
|
||||||
23 => 0,
|
23 => 0,
|
||||||
|
24 => 0,
|
||||||
);
|
);
|
||||||
if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
|
if ($this->counter >= ($this->mbstring_overload ? mb_strlen($this->data,'latin1'): strlen($this->data))) {
|
||||||
return false; // end of input
|
return false; // end of input
|
||||||
}
|
}
|
||||||
$yy_global_pattern = "/\G(".$this->ldel."[$]smarty\\.block\\.child".$this->rdel.")|\G(\\{\\})|\G(".$this->ldel."\\*([\S\s]*?)\\*".$this->rdel.")|\G(".$this->ldel."strip".$this->rdel.")|\G(".$this->ldel."\\s{1,}strip\\s{1,}".$this->rdel.")|\G(".$this->ldel."\/strip".$this->rdel.")|\G(".$this->ldel."\\s{1,}\/strip\\s{1,}".$this->rdel.")|\G(".$this->ldel."\\s*literal\\s*".$this->rdel.")|\G(".$this->ldel."\\s{1,}\/)|\G(".$this->ldel."\\s*(if|elseif|else if|while)\\s+)|\G(".$this->ldel."\\s*for\\s+)|\G(".$this->ldel."\\s*foreach(?![^\s]))|\G(".$this->ldel."\\s*setfilter\\s+)|\G(".$this->ldel."\\s{1,})|\G(".$this->ldel."\/)|\G(".$this->ldel.")|\G(<\\?(?:php\\w+|=|[a-zA-Z]+)?)|\G(\\?>)|\G(<%)|\G(%>)|\G([\S\s])/iS";
|
$yy_global_pattern = "/\G(".$this->ldel."[$]smarty\\.block\\.child".$this->rdel.")|\G(\\{\\})|\G(".$this->ldel."\\*([\S\s]*?)\\*".$this->rdel.")|\G(".$this->ldel."strip".$this->rdel.")|\G(".$this->ldel."\\s{1,}strip\\s{1,}".$this->rdel.")|\G(".$this->ldel."\/strip".$this->rdel.")|\G(".$this->ldel."\\s{1,}\/strip\\s{1,}".$this->rdel.")|\G(".$this->ldel."\\s*literal\\s*".$this->rdel.")|\G(".$this->ldel."\\s{1,}\/)|\G(".$this->ldel."\\s*(if|elseif|else if|while)\\s+)|\G(".$this->ldel."\\s*for\\s+)|\G(".$this->ldel."\\s*foreach(?![^\s]))|\G(".$this->ldel."\\s*setfilter\\s+)|\G(".$this->ldel."\\s{1,})|\G(".$this->ldel."\/)|\G(".$this->ldel.")|\G(<\\?(?:php\\w+|=|[a-zA-Z]+)?)|\G(\\?>)|\G(".$this->rdel.")|\G(<%)|\G(%>)|\G([\S\s])/iS";
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
|
if ($this->mbstring_overload ? preg_match($yy_global_pattern, mb_substr($this->data, $this->counter,2000000000,'latin1'), $yymatches) : preg_match($yy_global_pattern,$this->data, $yymatches, null, $this->counter)) {
|
||||||
@@ -344,16 +345,21 @@ class Smarty_Internal_Templatelexer
|
|||||||
function yy_r1_21($yy_subpatterns)
|
function yy_r1_21($yy_subpatterns)
|
||||||
{
|
{
|
||||||
|
|
||||||
$this->token = Smarty_Internal_Templateparser::TP_ASPSTARTTAG;
|
$this->token = Smarty_Internal_Templateparser::TP_TEXT;
|
||||||
}
|
}
|
||||||
function yy_r1_22($yy_subpatterns)
|
function yy_r1_22($yy_subpatterns)
|
||||||
{
|
{
|
||||||
|
|
||||||
$this->token = Smarty_Internal_Templateparser::TP_ASPENDTAG;
|
$this->token = Smarty_Internal_Templateparser::TP_ASPSTARTTAG;
|
||||||
}
|
}
|
||||||
function yy_r1_23($yy_subpatterns)
|
function yy_r1_23($yy_subpatterns)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
$this->token = Smarty_Internal_Templateparser::TP_ASPENDTAG;
|
||||||
|
}
|
||||||
|
function yy_r1_24($yy_subpatterns)
|
||||||
|
{
|
||||||
|
|
||||||
if ($this->mbstring_overload) {
|
if ($this->mbstring_overload) {
|
||||||
$to = mb_strlen($this->data,'latin1');
|
$to = mb_strlen($this->data,'latin1');
|
||||||
} else {
|
} else {
|
||||||
@@ -1187,4 +1193,3 @@ class Smarty_Internal_Templatelexer
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
?>
|
|
@@ -3252,4 +3252,3 @@ static public $yy_action = array(
|
|||||||
} while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
|
} while ($yymajor != self::YYNOCODE && $this->yyidx >= 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
?>
|
|
Reference in New Issue
Block a user