diff options
Diffstat (limited to 'program/include')
-rw-r--r-- | program/include/main.inc | 62 | ||||
-rw-r--r-- | program/include/rcube_shared.inc | 3 |
2 files changed, 64 insertions, 1 deletions
diff --git a/program/include/main.inc b/program/include/main.inc index 9cf1f6767..a7e50e4e1 100644 --- a/program/include/main.inc +++ b/program/include/main.inc @@ -1142,8 +1142,12 @@ function parse_template($name='main', $exit=TRUE) // parse for specialtags - $output = parse_rcube_xml($templ); + $output = parse_rcube_xml(parse_rcube_conditions($templ)); + // add debug console + if ($CONFIG['debug_level'] & 8) + $OUTPUT->footer = '<div style="position:absolute;top:5px;left:5px;width:400px;opacity:0.8;z-index:9000;"><form name="debugform"><textarea name="console" rows="15" cols="40" style="width:400px;border:none;font-size:x-small"></textarea></form>'; + $OUTPUT->write(trim(parse_with_globals($output)), $skin_path); if ($exit) @@ -1161,6 +1165,55 @@ function parse_with_globals($input) } +// parse conditional code +function parse_rcube_conditions($input) + { + if (($matches = preg_split('/<roundcube:(if|elseif|else|endif)\s+([^>]+)>/is', $input, 2, PREG_SPLIT_DELIM_CAPTURE)) && count($matches)==4) + { + if (preg_match('/^(else|endif)$/i', $matches[1])) + return $matches[0] . parse_rcube_conditions($matches[3]); + else + { + $attrib = parse_attrib_string($matches[2]); + if (isset($attrib['condition'])) + { + $condmet = rcube_xml_condition($attrib['condition']); + $submatches = preg_split('/<roundcube:(elseif|else|endif)\s+([^>]+)>/is', $matches[3], 2, PREG_SPLIT_DELIM_CAPTURE); + + if ($condmet) + $result = $submatches[0] . preg_replace('/.*<roundcube:endif\s+[^>]+>/is', '', $submatches[3]); + else + $result = "<roundcube:$submatches[1] $submatches[2]>" . $submatches[3]; + + return $matches[0] . parse_rcube_conditions($result); + } + else + { + raise_error(array('code' => 500, 'type' => 'php', 'line' => __LINE__, 'file' => __FILE__, + 'message' => "Unable to parse conditional tag " . $matches[2]), TRUE, FALSE); + } + } + } + + return $input; + } + + +/** + * Determines if a given condition is met + * + * @return True if condition is valid, False is not + */ +function rcube_xml_condition($condition) + { + $condition = preg_replace( + array('/session:([a-z0-9_]+)/i', '/config:([a-z0-9_]+)/i', '/request:([a-z0-9_]+)/ie'), + array("\$_SESSION['\\1']", "\$GLOBALS['CONFIG']['\\1']", "get_input_value('\\1', RCUBE_INPUT_GPC)"), + $condition); + + return @eval("return (".$condition.");"); + } + function parse_rcube_xml($input) { @@ -1169,12 +1222,19 @@ function parse_rcube_xml($input) } +/** + * Convert a xml command tag into real content + */ function rcube_xml_command($command, $str_attrib, $add_attrib=array()) { global $IMAP, $CONFIG, $OUTPUT; $command = strtolower($command); $attrib = parse_attrib_string($str_attrib) + $add_attrib; + + // empty output if required condition is not met + if (!empty($attrib['condition']) && !rcube_xml_condition($attrib['condition'])) + return ''; // execute command switch ($command) diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc index a5e5e8598..7a0fd059d 100644 --- a/program/include/rcube_shared.inc +++ b/program/include/rcube_shared.inc @@ -169,6 +169,9 @@ class rcube_html_page if (strlen($this->scripts['foot'])) $__page_footer .= sprintf($this->script_tag, $this->scripts['foot']); + + if ($this->footer) + $__page_footer .= "\n" . $this->footer; $__page_header .= $this->css->show(); |