Exemplo n.º 1
0
    function compile_tag_if($tag_args, $elseif)
    {
        /* Tokenize args for 'if' tag. */
        preg_match_all('/(?:
						 "[^"\\\\]*(?:\\\\.[^"\\\\]*)*"	 |
						 \'[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*\' |
						 [(),]							  |
						 [^\\s(),]+)/x', $tag_args, $match);
        $tokens = $match[0];
        $is_arg_stack = array();
        for ($i = 0; $i < count($tokens); $i++) {
            $token =& $tokens[$i];
            switch ($token) {
                case '!':
                case '%':
                case '!==':
                case '==':
                case '===':
                case '>':
                case '<':
                case '!=':
                case '<>':
                case '<<':
                case '>>':
                case '<=':
                case '>=':
                case '&&':
                case '||':
                case '|':
                case '^':
                case '&':
                case '~':
                case ')':
                case ',':
                case '+':
                case '-':
                case '*':
                case '/':
                case '@':
                    break;
                case 'eq':
                    $token = '==';
                    break;
                case 'ne':
                case 'neq':
                    $token = '!=';
                    break;
                case 'lt':
                    $token = '<';
                    break;
                case 'le':
                case 'lte':
                    $token = '<=';
                    break;
                case 'gt':
                    $token = '>';
                    break;
                case 'ge':
                case 'gte':
                    $token = '>=';
                    break;
                case 'and':
                    $token = '&&';
                    break;
                case 'or':
                    $token = '||';
                    break;
                case 'not':
                    $token = '!';
                    break;
                case 'mod':
                    $token = '%';
                    break;
                case '(':
                    array_push($is_arg_stack, $i);
                    break;
                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));
                    $new_tokens = RosterTplEncode::_parse_is_expr($is_arg, array_slice($tokens, $i + 1));
                    array_splice($tokens, $is_arg_start, count($tokens), $new_tokens);
                    $i = $is_arg_start;
                default:
                    if (preg_match('#^(([a-z0-9\\-_]+?\\.)+?)?(\\$)?([A-Z]+[A-Z0-9\\-_]+)$#s', $token, $varrefs)) {
                        $token = !empty($varrefs[1]) ? RosterTplEncode::generate_block_data_ref(substr($varrefs[1], 0, -1), true, $varrefs[3]) . '[\'' . $varrefs[4] . '\']' : ($varrefs[3] ? '$this->_tpldata[\'DEFINE\'][\'.\'][\'' . $varrefs[4] . '\']' : '$this->_tpldata[\'.\'][0][\'' . $varrefs[4] . '\']');
                    }
                    break;
            }
        }
        return ($elseif ? '} elseif (' : 'if (') . (implode(' ', $tokens) . ') { ');
    }