diff options
Diffstat (limited to 'phpBB')
-rw-r--r-- | phpBB/includes/functions_template.php | 114 |
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 . ';'; } /** |