See ChangeLog for details.

This commit is contained in:
andrey
2001-07-24 18:39:03 +00:00
parent d1cad64fad
commit a6717ba3a4
4 changed files with 104 additions and 31 deletions

12
NEWS
View File

@@ -1,8 +1,12 @@
- fixed bug with SMARTY_DIR not prepended to Config_File include (Monte) - fixed comments handling to allow commenting out template blocks. (Andrei)
- implemented named capture buffers, with results accessible via
$smarty.capture.<name>. (Andrei)
- added ability to index arrays directly by numbers. (Andrei)
- fixed bug with SMARTY_DIR not prepended to Config_File include. (Monte)
Version 1.4.4 Version 1.4.4
------------- -------------
- fixed problem with including insecure templates with security enabled - fixed problem with including insecure templates with security enabled.
(Monte) (Monte)
- numerous documentation updates. (Monte) - numerous documentation updates. (Monte)
- added ENT_QUOTES to escapement of html. (Monte, Sam Beckwith) - added ENT_QUOTES to escapement of html. (Monte, Sam Beckwith)
@@ -11,9 +15,9 @@ Version 1.4.4
- fixed a bug with parsing function arguments inside {if} tags if a comma - fixed a bug with parsing function arguments inside {if} tags if a comma
was present. (Andrei) was present. (Andrei)
- updated debug console with config file vars. (Monte) - updated debug console with config file vars. (Monte)
- added SMARTY_DIR constant as an alternative to relying on include_path - added SMARTY_DIR constant as an alternative to relying on include_path.
(Monte) (Monte)
- added popup_init and popup functions, (requires overlib.js) (Monte) - added popup_init and popup functions (requires overlib.js). (Monte)
- updated debug console with config file vars. (Monte) - updated debug console with config file vars. (Monte)
- added debugging url control. (Monte) - added debugging url control. (Monte)
- added 'quotes' type to escape modifier. (Monte, Mike Krus) - added 'quotes' type to escape modifier. (Monte, Mike Krus)

View File

@@ -46,6 +46,7 @@ class Smarty_Compiler extends Smarty {
var $_php_blocks = array(); // keeps php code blocks var $_php_blocks = array(); // keeps php code blocks
var $_current_file = null; // the current template being compiled var $_current_file = null; // the current template being compiled
var $_current_line_no = 1; // line number for error messages var $_current_line_no = 1; // line number for error messages
var $_capture_stack = array(); // keeps track of nested capture buffers
/*======================================================================*\ /*======================================================================*\
@@ -78,6 +79,13 @@ class Smarty_Compiler extends Smarty {
$ldq = preg_quote($this->left_delimiter, '!'); $ldq = preg_quote($this->left_delimiter, '!');
$rdq = preg_quote($this->right_delimiter, '!'); $rdq = preg_quote($this->right_delimiter, '!');
/* Annihilate the comments. */
if (preg_match_all("!{$ldq}\*.*?\*{$rdq}!s", $template_source, $match)) {
foreach ($match[0] as $comment)
$this->_current_line_no += substr_count($comment, "\n");
$template_source = preg_replace("!{$ldq}\*.*?\*{$rdq}!s", '', $template_source);
}
/* Pull out the literal blocks. */ /* Pull out the literal blocks. */
preg_match_all("!{$ldq}literal{$rdq}(.*?){$ldq}/literal{$rdq}!s", $template_source, $match); preg_match_all("!{$ldq}literal{$rdq}(.*?){$ldq}/literal{$rdq}!s", $template_source, $match);
$this->_literal_blocks = $match[1]; $this->_literal_blocks = $match[1];
@@ -167,10 +175,6 @@ class Smarty_Compiler extends Smarty {
\*======================================================================*/ \*======================================================================*/
function _compile_tag($template_tag) function _compile_tag($template_tag)
{ {
/* Matched comment. */
if ($template_tag{0} == '*' && $template_tag{strlen($template_tag)-1} == '*')
return '';
$qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\''; $qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'';
/* Split tag into two parts: command and the arguments. */ /* Split tag into two parts: command and the arguments. */
@@ -184,7 +188,7 @@ class Smarty_Compiler extends Smarty {
/* If the tag name matches a variable or section property definition, /* If the tag name matches a variable or section property definition,
we simply process it. */ we simply process it. */
if (preg_match('!^\$\w+(?>(\[\w+(\.\w+)?\])|((\.|->)\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // if a variable if (preg_match('!^\$\w+(?>(\[(\d+|\w+(\.\w+)?)\])|((\.|->)\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // if a variable
preg_match('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // or a configuration variable preg_match('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // or a configuration variable
preg_match('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command)) { // or a section property preg_match('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command)) { // or a section property
settype($tag_command, 'array'); settype($tag_command, 'array');
@@ -209,10 +213,10 @@ class Smarty_Compiler extends Smarty {
return '<?php endif; ?>'; return '<?php endif; ?>';
case 'capture': case 'capture':
return '<?php ob_start(); ?>'; return $this->_compile_capture_tag(true, $tag_args);
case '/capture': case '/capture':
return '<?php $this->assign("return", ob_get_contents()); ob_end_clean(); ?>'; return $this->_compile_capture_tag(false);
case 'ldelim': case 'ldelim':
return $this->left_delimiter; return $this->left_delimiter;
@@ -499,6 +503,31 @@ class Smarty_Compiler extends Smarty {
} }
/*======================================================================*\
Function: _compile_capture_tag
Purpose: Compile {capture} .. {/capture} tags
\*======================================================================*/
function _compile_capture_tag($start, $tag_args = '')
{
$attrs = $this->_parse_attrs($tag_args);
if ($start) {
if (isset($attrs['name']))
$buffer = $attrs['name'];
else
$buffer = "'default'";
$output = "<?php ob_start(); ?>";
$this->_capture_stack[] = $buffer;
} else {
$buffer = array_pop($this->_capture_stack);
$output = "<?php \$this->_tpl_vars['smarty']['capture'][$buffer] = ob_get_contents(); ob_end_clean(); ?>";
}
return $output;
}
/*======================================================================*\ /*======================================================================*\
Function: _compile_if_tag Function: _compile_if_tag
Purpose: Compile {if ...} tag Purpose: Compile {if ...} tag
@@ -757,7 +786,7 @@ class Smarty_Compiler extends Smarty {
{ {
$qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\''; $qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'';
$var_exprs = preg_grep('!^\$\w+(?>(\[\w+(\.\w+)?\])|((\.|->)\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); $var_exprs = preg_grep('!^\$\w+(?>(\[(\d+|\w+(\.\w+)?)\])|((\.|->)\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);
$conf_var_exprs = preg_grep('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); $conf_var_exprs = preg_grep('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);
$sect_prop_exprs = preg_grep('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); $sect_prop_exprs = preg_grep('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);
@@ -799,10 +828,15 @@ class Smarty_Compiler extends Smarty {
foreach ($indexes as $index) { foreach ($indexes as $index) {
if ($index{0} == '[') { if ($index{0} == '[') {
$parts = explode('.', substr($index, 1, -1)); $index = substr($index, 1, -1);
if (is_numeric($index)) {
$output .= "[$index]";
} else {
$parts = explode('.', $index);
$section = $parts[0]; $section = $parts[0];
$section_prop = isset($parts[1]) ? $parts[1] : 'index'; $section_prop = isset($parts[1]) ? $parts[1] : 'index';
$output .= "[\$this->_sections['$section']['properties']['$section_prop']]"; $output .= "[\$this->_sections['$section']['properties']['$section_prop']]";
}
} else if ($index{0} == '.') { } else if ($index{0} == '.') {
$output .= "['" . substr($index, 1) . "']"; $output .= "['" . substr($index, 1) . "']";
} else { } else {

5
TODO
View File

@@ -1,6 +1,6 @@
* Ability to load multiple sections in one {config_load ...} * Ability to load multiple sections in one {config_load ...}
* do way with Smarty.addons.php and make drop-in plugin * do away with Smarty.addons.php and make drop-in plugin directory for
directory for functions and modifiers functions and modifiers
* handle asp style tags in $php_handler * handle asp style tags in $php_handler
* correctly capture nested php tag syntax in templates: * correctly capture nested php tag syntax in templates:
<?php echo "<?php exit(); ?>"; ?> <?php echo "<?php exit(); ?>"; ?>
@@ -10,3 +10,4 @@
* possibly implement default modifiers that apply to variables upon display * possibly implement default modifiers that apply to variables upon display
* possibly implement undefined template tags custom handling * possibly implement undefined template tags custom handling
* think about possibility of supporting something like {$data[foo].{$key[bar]}} * think about possibility of supporting something like {$data[foo].{$key[bar]}}
* allow {custom} .. {/custom} style of custom functions

View File

@@ -46,6 +46,7 @@ class Smarty_Compiler extends Smarty {
var $_php_blocks = array(); // keeps php code blocks var $_php_blocks = array(); // keeps php code blocks
var $_current_file = null; // the current template being compiled var $_current_file = null; // the current template being compiled
var $_current_line_no = 1; // line number for error messages var $_current_line_no = 1; // line number for error messages
var $_capture_stack = array(); // keeps track of nested capture buffers
/*======================================================================*\ /*======================================================================*\
@@ -78,6 +79,13 @@ class Smarty_Compiler extends Smarty {
$ldq = preg_quote($this->left_delimiter, '!'); $ldq = preg_quote($this->left_delimiter, '!');
$rdq = preg_quote($this->right_delimiter, '!'); $rdq = preg_quote($this->right_delimiter, '!');
/* Annihilate the comments. */
if (preg_match_all("!{$ldq}\*.*?\*{$rdq}!s", $template_source, $match)) {
foreach ($match[0] as $comment)
$this->_current_line_no += substr_count($comment, "\n");
$template_source = preg_replace("!{$ldq}\*.*?\*{$rdq}!s", '', $template_source);
}
/* Pull out the literal blocks. */ /* Pull out the literal blocks. */
preg_match_all("!{$ldq}literal{$rdq}(.*?){$ldq}/literal{$rdq}!s", $template_source, $match); preg_match_all("!{$ldq}literal{$rdq}(.*?){$ldq}/literal{$rdq}!s", $template_source, $match);
$this->_literal_blocks = $match[1]; $this->_literal_blocks = $match[1];
@@ -167,10 +175,6 @@ class Smarty_Compiler extends Smarty {
\*======================================================================*/ \*======================================================================*/
function _compile_tag($template_tag) function _compile_tag($template_tag)
{ {
/* Matched comment. */
if ($template_tag{0} == '*' && $template_tag{strlen($template_tag)-1} == '*')
return '';
$qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\''; $qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'';
/* Split tag into two parts: command and the arguments. */ /* Split tag into two parts: command and the arguments. */
@@ -184,7 +188,7 @@ class Smarty_Compiler extends Smarty {
/* If the tag name matches a variable or section property definition, /* If the tag name matches a variable or section property definition,
we simply process it. */ we simply process it. */
if (preg_match('!^\$\w+(?>(\[\w+(\.\w+)?\])|((\.|->)\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // if a variable if (preg_match('!^\$\w+(?>(\[(\d+|\w+(\.\w+)?)\])|((\.|->)\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // if a variable
preg_match('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // or a configuration variable preg_match('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command) || // or a configuration variable
preg_match('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command)) { // or a section property preg_match('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tag_command)) { // or a section property
settype($tag_command, 'array'); settype($tag_command, 'array');
@@ -209,10 +213,10 @@ class Smarty_Compiler extends Smarty {
return '<?php endif; ?>'; return '<?php endif; ?>';
case 'capture': case 'capture':
return '<?php ob_start(); ?>'; return $this->_compile_capture_tag(true, $tag_args);
case '/capture': case '/capture':
return '<?php $this->assign("return", ob_get_contents()); ob_end_clean(); ?>'; return $this->_compile_capture_tag(false);
case 'ldelim': case 'ldelim':
return $this->left_delimiter; return $this->left_delimiter;
@@ -499,6 +503,31 @@ class Smarty_Compiler extends Smarty {
} }
/*======================================================================*\
Function: _compile_capture_tag
Purpose: Compile {capture} .. {/capture} tags
\*======================================================================*/
function _compile_capture_tag($start, $tag_args = '')
{
$attrs = $this->_parse_attrs($tag_args);
if ($start) {
if (isset($attrs['name']))
$buffer = $attrs['name'];
else
$buffer = "'default'";
$output = "<?php ob_start(); ?>";
$this->_capture_stack[] = $buffer;
} else {
$buffer = array_pop($this->_capture_stack);
$output = "<?php \$this->_tpl_vars['smarty']['capture'][$buffer] = ob_get_contents(); ob_end_clean(); ?>";
}
return $output;
}
/*======================================================================*\ /*======================================================================*\
Function: _compile_if_tag Function: _compile_if_tag
Purpose: Compile {if ...} tag Purpose: Compile {if ...} tag
@@ -757,7 +786,7 @@ class Smarty_Compiler extends Smarty {
{ {
$qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\''; $qstr_regexp = '"[^"\\\\]*(?:\\\\.[^"\\\\]*)*"|\'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\'';
$var_exprs = preg_grep('!^\$\w+(?>(\[\w+(\.\w+)?\])|((\.|->)\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); $var_exprs = preg_grep('!^\$\w+(?>(\[(\d+|\w+(\.\w+)?)\])|((\.|->)\w+))*(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);
$conf_var_exprs = preg_grep('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); $conf_var_exprs = preg_grep('!^#(\w+)#(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);
$sect_prop_exprs = preg_grep('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens); $sect_prop_exprs = preg_grep('!^%\w+\.\w+%(?>\|@?\w+(:(?>' . $qstr_regexp . '|[^|]+))*)*$!', $tokens);
@@ -799,10 +828,15 @@ class Smarty_Compiler extends Smarty {
foreach ($indexes as $index) { foreach ($indexes as $index) {
if ($index{0} == '[') { if ($index{0} == '[') {
$parts = explode('.', substr($index, 1, -1)); $index = substr($index, 1, -1);
if (is_numeric($index)) {
$output .= "[$index]";
} else {
$parts = explode('.', $index);
$section = $parts[0]; $section = $parts[0];
$section_prop = isset($parts[1]) ? $parts[1] : 'index'; $section_prop = isset($parts[1]) ? $parts[1] : 'index';
$output .= "[\$this->_sections['$section']['properties']['$section_prop']]"; $output .= "[\$this->_sections['$section']['properties']['$section_prop']]";
}
} else if ($index{0} == '.') { } else if ($index{0} == '.') {
$output .= "['" . substr($index, 1) . "']"; $output .= "['" . substr($index, 1) . "']";
} else { } else {