aboutsummaryrefslogtreecommitdiffstats
path: root/phpBB
diff options
context:
space:
mode:
Diffstat (limited to 'phpBB')
-rw-r--r--phpBB/includes/functions_template.php114
1 files changed, 15 insertions, 99 deletions
diff --git a/phpBB/includes/functions_template.php b/phpBB/includes/functions_template.php
index 1f7eeb9030..94b676a77c 100644
--- a/phpBB/includes/functions_template.php
+++ b/phpBB/includes/functions_template.php
@@ -300,13 +300,12 @@ class template_filter extends php_user_filter
}
/**
- * Compile IF tags - much of this is from Smarty with
+ * Compile a general expression - much of this is from Smarty with
* some adaptions for our block level methods
* @access private
*/
- private function compile_tag_if($tag_args, $elseif)
+ private function compile_expression($tag_args)
{
- // Tokenize args for 'if' tag.
$match = array();
preg_match_all('/(?:
"[^"\\\\]*(?:\\\\.[^"\\\\]*)*" |
@@ -400,9 +399,9 @@ class template_filter extends php_user_filter
case 'is':
$is_arg_start = ($tokens[$i-1] == ')') ? array_pop($is_arg_stack) : $i-1;
- $is_arg = implode(' ', array_slice($tokens, $is_arg_start, $i - $is_arg_start));
+ $is_arg = implode(' ', array_slice($tokens, $is_arg_start, $i - $is_arg_start));
- $new_tokens = $this->_parse_is_expr($is_arg, array_slice($tokens, $i+1));
+ $new_tokens = $this->_parse_is_expr($is_arg, array_slice($tokens, $i+1));
array_splice($tokens, $is_arg_start, sizeof($tokens), $new_tokens);
@@ -442,64 +441,18 @@ class template_filter extends php_user_filter
}
$token = "sizeof($varref)";
}
- else if (!empty($token))
- {
- $token = '(' . $token . ')';
- /**
- * If we need to really secure the usage, or force specific types on specific operations... the following would be the code
-
- if (!isset($tokens[$i - 1]))
- {
- unset($tokens[$i]);
- break;
- }
-
- $prev_token = trim($tokens[$i - 1]);
-
- switch ($prev_token)
- {
- // Integer
- case '<':
- case '>':
- case '<=':
- case '>=':
- case '%':
- $token = ( ((double) $token) != 0) ? (double) $token : (int) $token;
- break;
-
- case '==':
- case '!=':
- $int_token = (((double) $token) != 0) ? (double) $token : (int) $token;
- if ($int_token && $int_token == $token)
- {
- $token = $int_token;
- break;
- }
-
- // It is a string...
- $token = '(' . $token . ')';
- break;
-
- case '!':
- case '||':
- case '&&':
- default:
- unset($tokens[$i]);
- break;
- break;
- }
- */
- }
break;
}
}
- // If there are no valid tokens left or only control/compare characters left, we do skip this statement
- if (!sizeof($tokens) || str_replace(array(' ', '=', '!', '<', '>', '&', '|', '%', '(', ')'), '', implode('', $tokens)) == '')
- {
- $tokens = array('false');
- }
+ return $tokens;
+ }
+
+
+ private function compile_tag_if($tag_args, $elseif)
+ {
+ $tokens = $this->compile_expression($tag_args);
return (($elseif) ? '} else if (' : 'if (') . (implode(' ', $tokens) . ') { ');
}
@@ -510,9 +463,9 @@ class template_filter extends php_user_filter
private function compile_tag_define($tag_args, $op)
{
$match = array();
- preg_match('#^((?:[a-z0-9\-_]+\.)+)?\$(?=[A-Z])([A-Z0-9_\-]*)(?: = (\'?)([^\']*)(\'?))?$#', $tag_args, $match);
+ preg_match('#^((?:[a-z0-9\-_]+\.)+)?\$(?=[A-Z])([A-Z0-9_\-]*) = (.*?)$#', $tag_args, $match);
- if (empty($match[2]) || (!isset($match[4]) && $op))
+ if (empty($match[2]) || (!isset($match[3]) && $op))
{
return '';
}
@@ -522,46 +475,9 @@ class template_filter extends php_user_filter
return 'unset(' . (($match[1]) ? $this->generate_block_data_ref(substr($match[1], 0, -1), true, true) . '[\'' . $match[2] . '\']' : '$_tpldata[\'DEFINE\'][\'.\'][\'' . $match[2] . '\']') . ');';
}
- $varrefs = array();
- // Are we a string?
- if ($match[3] && $match[5])
- {
- $match[4] = str_replace(array('\\\'', '\\\\', '\''), array('\'', '\\', '\\\''), $match[4]);
-
- // Compile reference, we allow template variables in defines...
- $match[4] = $this->compile($match[4]);
-
- // Now replace the php code
- $match[4] = "'" . str_replace(array('<?php echo ', '; ?>'), array("' . ", " . '"), $match[4]) . "'";
- }
- // is this a template variable?
- else if (preg_match('#^((?:[a-z0-9\-_]+\.)+)?(\$)?(?=[A-Z])([A-Z0-9\-_]+)#s', $match[4], $varrefs))
- {
- $match[4] = (!empty($varrefs[1])) ? $this->generate_block_data_ref(substr($varrefs[1], 0, -1), true, $varrefs[2]) . '[\'' . $varrefs[3] . '\']' : (($varrefs[2]) ? '$_tpldata[\'DEFINE\'][\'.\'][\'' . $varrefs[3] . '\']' : '$_rootref[\'' . $varrefs[3] . '\']');
- }
- else
- {
- $type = array();
- preg_match('#true|false|\.#i', $match[4], $type);
-
- switch (strtolower($type[0]))
- {
- case 'true':
- case 'false':
- $match[4] = strtoupper($match[4]);
- break;
-
- case '.':
- $match[4] = doubleval($match[4]);
- break;
-
- default:
- $match[4] = intval($match[4]);
- break;
- }
- }
+ $parsed_statement = implode(' ', $this->compile_expression($match[3]));
- return (($match[1]) ? $this->generate_block_data_ref(substr($match[1], 0, -1), true, true) . '[\'' . $match[2] . '\']' : '$_tpldata[\'DEFINE\'][\'.\'][\'' . $match[2] . '\']') . ' = ' . $match[4] . ';';
+ return (($match[1]) ? $this->generate_block_data_ref(substr($match[1], 0, -1), true, true) . '[\'' . $match[2] . '\']' : '$_tpldata[\'DEFINE\'][\'.\'][\'' . $match[2] . '\']') . ' = ' . $parsed_statement . ';';
}
/**