+\r
+ # parse_loop()\r
+ #\r
+ # Eine Schleife parsen\r
+ #\r
+ # Parameter: Name der Schleife\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function parse_loop($name) {\r
+ $template = $this->get_template();\r
+ if(strpos($template,'{LOOP '.$name.'}') === false) return;\r
+\r
+ $offset = 0;\r
+ $name_len = strlen($name);\r
+\r
+ while(($begin = strpos($template,'{LOOP '.$name.'}',$offset)) !== false) {\r
+ if(($end = strpos($template,'{ENDLOOP}',$begin+6+$name_len)) !== false) {\r
+ $block = substr($template,$begin,$end+9-$begin);\r
+ $content = substr($block,$name_len+7,-9);\r
+\r
+ $parsed_block = '';\r
+\r
+ for($x=0;$x<count($this->loop_vars[$name]);$x++) {\r
+ $loop_data = $this->loop_vars[$name][$x];\r
+ $loop_vars = array_keys($loop_data);\r
+\r
+ $ctpl = new Template;\r
+ $ctpl->set_template($content);\r
+\r
+ foreach($loop_vars as $loop_var) {\r
+ $ctpl->set_var($name.'.'.$loop_var,$loop_data[$loop_var]);\r
+ }\r
+\r
+ if($this->old_parsing) {\r
+ $ctpl->parse_old();\r
+ }\r
+ else {\r
+ $ctpl->parse();\r
+ }\r
+\r
+ $parsed_block .= $ctpl->get_template();\r
+\r
+ unset($ctpl);\r
+ }\r
+\r
+ $template = str_replace($block,$parsed_block,$template);\r
+ $offset = $begin+strlen($parsed_block);\r
+ }\r
+ else break;\r
+ }\r
+\r
+ $this->set_template($template);\r
+ }\r
+\r
+ # get_defined_vars()\r
+ #\r
+ # In der Template-Datei definierte Variablen auslesen\r
+ #\r
+ # Parameter: -nichts-\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ function get_defined_vars() {\r
+ $template = $this->get_template();\r
+ if(strpos($template,'{DEFINE ') === false) return;\r
+\r
+ $offset = 0;\r
+\r
+ while(strpos($template,'{DEFINE ',$offset) !== false) {\r
+ $begin = strpos($template,'{DEFINE ',$offset)+8;\r
+ $offset = $begin;\r
+\r
+ $name = '';\r
+ $content = '';\r
+\r
+ $var_open = 0;\r
+ $name_found = 0;\r
+ $define_block = 0;\r
+\r
+ for($x=$begin;$x<strlen($template);$x++) {\r
+ if($template[$x] == "\012" || $template[$x] == "\015") {\r
+ # Wenn in einem {DEFINE}-Block ein Zeilenumbruch gefunden wird,\r
+ # brechen wir mit dem Parsen des Blockes ab\r
+\r
+ break;\r
+ }\r
+\r
+ if($var_open == 1) {\r
+ if($template[$x] == '"') {\r
+ # Der Inhalt der Variable ist hier zu Ende\r
+\r
+ $var_open = 0;\r
+\r
+ if($template[$x+1] == '}') {\r
+ # Hier ist der Block zu Ende\r
+\r
+ if($this->get_var($name) === false) {\r
+ # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist\r
+\r
+ $this->set_var($name,$content);\r
+ array_push($this->defined_vars,$name);\r
+ }\r
+\r
+ # {DEFINE}-Block entfernen\r
+\r
+ $pre = substr($template,0,$begin-8);\r
+ $post = substr($template,$x+2);\r
+\r
+ $template = $pre.$post;\r
+\r
+ # Fertig!\r
+\r
+ $offset = strlen($pre);\r
+ break;\r
+ }\r
+ }\r
+ elseif($template[$x] == '\\') {\r
+ # Ein Backslash wurde gefunden, er dient zum Escapen von Zeichen\r
+\r
+ if($template[$x+1] == 'n') {\r
+ # "\n" in Zeilenumbrueche umwandeln\r
+\r
+ $content .= "\n";\r
+ }\r
+ else $content .= $template[$x+1];\r
+\r
+ $x++;\r
+ }\r
+ else $content .= $template[$x];\r
+ }\r
+ else {\r
+ if($name_found == 1) {\r
+ if($var_open == 0) {\r
+ if($template[$x] == '"') $var_open = 1;\r
+ else break;\r
+ }\r
+ }\r
+ else {\r
+ # Variablennamen auslesen\r
+\r
+ if($template[$x] == '}' && $name != '') {\r
+ # Wir haben einen {DEFINE}-Block\r
+\r
+ $name_found = 1;\r
+ $define_block = 1;\r
+\r
+ # Alles ab hier sollte mit dem Teil verbunden werden, der das\r
+ # {DEFINE} in einer Zeile verarbeitet\r
+\r
+ # Der Parser fuer {DEFINE}-Bloecke ist nicht rekursiv, was auch\r
+ # nicht noetig sein sollte\r
+\r
+ if(($end = strpos($template,'{ENDDEFINE}',$x)) !== false) {\r
+ $x++;\r
+\r
+ $content = substr($template,$x,$end-$x);\r
+\r
+ if($this->get_var($name) === false) {\r
+ # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist\r
+\r
+ $this->set_var($name,$content);\r
+ array_push($this->defined_vars,$name);\r
+ }\r
+\r
+ $pre = substr($template,0,$begin-8);\r
+ $post = substr($template,$end+11);\r
+\r
+ $template = $pre.$post;\r
+\r
+ # Fertig!\r
+\r
+ $offset = strlen($pre);\r
+ break;\r
+ }\r
+ else break;\r
+ }\r
+ elseif($template[$x] != ' ') {\r
+ $name .= $template[$x];\r
+ }\r
+ elseif($name != '') {\r
+ $name_found = 1;\r
+ }\r
+ else break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ $this->set_template($template);\r