X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=include%2Fsieve%2Fclass_My_Tree.inc;h=ee1276a36ac3c1aba3c85281c0f2aa6b0bd2696b;hb=4ef5a0ec2c799536446dd29d5d828488cc14608f;hp=c94d34cef8d7d8836ab52a657c303b6cec07bd8e;hpb=cb9ea5d47269896fbf4fde8b1cc7e2742105524f;p=gosa.git diff --git a/include/sieve/class_My_Tree.inc b/include/sieve/class_My_Tree.inc index c94d34cef..ee1276a36 100644 --- a/include/sieve/class_My_Tree.inc +++ b/include/sieve/class_My_Tree.inc @@ -17,11 +17,11 @@ class My_Tree extends Tree var $pap = array(); var $parent = NULL; - function My_Tree(&$root,$parent) - { + function My_Tree(&$root,$parent) + { $this->parent = $parent; - $this->_construct($root); - } + $this->_construct($root); + } function execute() { @@ -42,6 +42,13 @@ class My_Tree extends Tree $this->mode_stack = array(); $this->pap = array(); $this->doDump_(0, '', true); + + /* Add left elements */ + if(count($this->mode_stack)){ + foreach($this->mode_stack as $element){ + $this->handle_elements( $element,preg_replace("/[^0-9]/","",microtime())); + } + } } /* Create html results */ @@ -49,23 +56,34 @@ class My_Tree extends Tree $block_indent_start = $smarty->fetch(get_template_path("templates/block_indent_start.tpl",TRUE,dirname(__FILE__))); $block_indent_stop = $smarty->fetch(get_template_path("templates/block_indent_stop.tpl",TRUE,dirname(__FILE__))); - - $this -> dump_ = ""; $ends = array(); + $ends_complete_block = array(); + foreach($this->pap as $key => $object){ if(is_object($object)){ - $end = $this->get_block_end($key); - if($end != $key && get_class($object) == "sieve_if") { - $ends[$end] = $end; - $this->dump_ .= $block_indent_start; + $end = $this->get_block_end($key,false); + $end2 = $this->get_block_end($key); + if($end != $key && in_array(get_class($object),array("sieve_if"))){ + $ends_complete_block[$end2] = $end2; + $this->dump_ .= "
"; + $this->dump_ .= "
"; } - $this->dump_ .= preg_replace("/>/",">\n",$object->execute()); if(isset($ends[$key])){ $this->dump_ .= $block_indent_stop; } + $this->dump_ .= preg_replace("/>/",">\n",$object->execute()); + if($end != $key && in_array(get_class($object),array("sieve_if","sieve_else","sieve_elsif"))) { + $ends[$end] = $end; + $this->dump_ .= $block_indent_start; + } + + if(isset($ends_complete_block[$key])){ + $this->dump_ .= "
"; + $this->dump_ .= "
"; + } } } @@ -87,12 +105,17 @@ class My_Tree extends Tree /* Get node */ $node = $this->nodes_[$node_id]; - /* Get last element class */ + /* Get last element class and type */ $last_class = ""; + $last_type = ""; if(count($this->mode_stack)){ $key = key($this->mode_stack); $tmp = array_reverse($this->mode_stack[$key]['ELEMENTS']); $last_class = $tmp[key($tmp)]['class']; + + if(isset($this->mode_stack[$key]['TYPE'])){ + $last_type = $this->mode_stack[$key]['TYPE']; + } } /* This closes the last mode */ @@ -115,38 +138,42 @@ class My_Tree extends Tree $this->handle_elements($tmp,$node_id); } + /* We can't handle comments within if tag right now */ + if(!in_array_ics($last_type,array("if","elsif"))){ - /* Comments require special attention. - * We do not want to create a single comment element - * foreach each "#comment" string found in the script. - * Sometimes comments are used like this - * # This is a comment - * # and it still is a comment - * # ... - * So we combine them to one single comment. - */ - if($last_class != "comment" && $node['class'] == "comment"){ - $tmp =array_pop($this->mode_stack); - $this->handle_elements($tmp,$node_id); - $this->mode_stack[] = array("TYPE" => $node['class']); - } + /* Comments require special attention. + * We do not want to create a single comment element + * foreach each "#comment" string found in the script. + * Sometimes comments are used like this + * # This is a comment + * # and it still is a comment + * # ... + * So we combine them to one single comment. + */ + if($last_class != "comment" && $node['class'] == "comment"){ + $tmp =array_pop($this->mode_stack); + $this->handle_elements($tmp,$node_id); + $this->mode_stack[] = array("TYPE" => $node['class']); + } - if($last_class == "comment" && $node['class'] != "comment"){ - $tmp =array_pop($this->mode_stack); - $this->handle_elements($tmp,$node_id); + if($last_class == "comment" && $node['class'] != "comment"){ + $tmp =array_pop($this->mode_stack); + $this->handle_elements($tmp,$node_id); + } } - /* Handle identifiers */ $identifiers = array("else","if","elsif","end","reject","redirect","vacation","keep","discard","fileinto","require","stop"); if($node['class'] == "identifier" && in_array($node['text'],$identifiers)){ $this->mode_stack[] = array("TYPE" => $node['text']); } - /* Add current node to current command stack */ - end($this->mode_stack); - $key = key($this->mode_stack); - $this->mode_stack[$key]['ELEMENTS'][] = $node; + if(!($last_type == "if" && $node['class'] == "comment")){ + /* Add current node to current command stack */ + end($this->mode_stack); + $key = key($this->mode_stack); + $this->mode_stack[$key]['ELEMENTS'][] = $node; + } /* Remove last mode from mode stack, cause it was only valid for a single line */ if($rewoke_last){ @@ -214,6 +241,16 @@ class My_Tree extends Tree /* Remove the object at the given position */ function remove_object($key_id) { + if(count($this->pap) == 1){ + print_red(_("Can't remove last element.")); + return; + } + + if(!isset($this->pap[$key_id])){ + trigger_error(_("Can't remove element with object_id=".$key_id.", there is no object with this identifier. Remove aborted.")); + return(false); + } + $class = get_class($this->pap[$key_id]); if(in_array($class,array("sieve_if","sieve_elsif","sieve_else"))){ $block_start= $key_id; @@ -351,7 +388,7 @@ class My_Tree extends Tree /* This function returns the id of the element * where the current block ends */ - function get_block_end($start) + function get_block_end($start,$complete = TRUE) { /* Only execute if this is a really a block element. * Block elements is only sieve_if @@ -374,12 +411,22 @@ class My_Tree extends Tree $block_depth --; } - if( $block_depth == 0 && - $class == "sieve_block_end" && - !in_array($next_class,array("sieve_else","sieve_elsif"))){ - $end = TRUE; - $start --; + if($complete){ + if( $block_depth == 0 && + $class == "sieve_block_end" && + !in_array($next_class,array("sieve_else","sieve_elsif"))){ + $end = TRUE; + $start --; + } + }else{ + + if( $block_depth == 0 && + $class == "sieve_block_end" ){ + $end = TRUE; + $start --; + } } + $start ++; $class = get_class($this->pap[$start]); @@ -515,6 +562,7 @@ class My_Tree extends Tree if(!$include_self){ $key_id ++; } + $include_self = FALSE; $current_class = get_class($test[$key_id]); if(in_array($current_class, $allowed_to_add_after)){ return($key_id); @@ -553,14 +601,19 @@ class My_Tree extends Tree } $tmp2 = $part->get_sieve_script_part(); - if(get_class($part) == "sieve_reject"){ - $tmp.=$tmp2; - }else{ - - $tmp3 = split("\n",$tmp2); - foreach($tmp3 as $str){ - $str2 = trim($str); - if(empty($str2)) continue; + $tmp3 = split("\n",$tmp2); + foreach($tmp3 as $str){ + $str2 = trim($str); + + /* If the current line only contains an '.' + * we must skip the line indent. + * The text: statement uses a single '.' to mark the text end. + * This '.' must be the only char in the current line, no + * whitespaces are allowed here. + */ + if($str2 == "."){ + $tmp.=$str."\n"; + }else{ $tmp.= $buffer.$str."\n"; } } @@ -570,19 +623,19 @@ class My_Tree extends Tree } } if(!preg_match("/Generated by GOsa - Gonicus System Administrator/",$tmp)){ - $tmp = "#Generated by GOsa - Gonicus System Administrator \n ".$tmp; +# $tmp = "#Generated by GOsa - Gonicus System Administrator \n ".$tmp; } return($tmp); } function check() { - $msgs = array(); + $msgs = array(); /* Some logical checks. * like : only sieve_comment can appear before require. */ - + /* Ensure that there are no command before require * - Get id of last require tag * - Collect object types in from of this tag. @@ -606,14 +659,14 @@ class My_Tree extends Tree $msgs[] = $str; print_red($str);; } - - foreach($this->pap as $obj){ - $o_msgs = $obj->check(); - foreach($o_msgs as $o_msg){ - $msgs[] = $o_msg; - } - } - return($msgs); + + foreach($this->pap as $obj){ + $o_msgs = $obj->check(); + foreach($o_msgs as $o_msg){ + $msgs[] = $o_msg; + } + } + return($msgs); } @@ -629,7 +682,7 @@ class My_Tree extends Tree $require_id = $key; } } - + /* No require found, add one */ if($require_id == -1){ $require = new sieve_require(NULL,preg_replace("/[^0-9]/","",microtime()),$this); @@ -682,7 +735,7 @@ function sieve_create_strings($data,$force_string = FALSE) } $ret = preg_replace("/\"\"/","\"",$ret); $ret = preg_replace("/\n/","\r\n",$ret); - + return($ret); } @@ -697,11 +750,12 @@ function sieve_get_strings($data,$id) { $ret = array(); if($data[$id]['class'] == "left-bracket"){ - while($data[$id]['class'] != "right-bracket" && $id < count($data)){ - + while(isset($data[$id]) && $data[$id]['class'] != "right-bracket" && $id < count($data)){ + if($data[$id]['class'] == "quoted-string"){ $ret[] = $data[$id]['text']; } + $id ++; } }elseif($data[$id]['class'] == "quoted-string"){ @@ -713,7 +767,7 @@ function sieve_get_strings($data,$id) $str = trim(preg_replace("/\.$/","",$str)); $ret[] = $str; } - + return(array("OFFSET" => $id, "STRINGS" => $ret)); }