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) . ') { '); }