+\r
+#\r
+# Template (Version 2.5)\r
+#\r
+# Klasse zum Parsen von Templates\r
+#\r
+# Autor: Patrick Canterino <patrick@patshaping.de>\r
+# Letzte Aenderung: 25.11.2011\r
+#\r
+# Copyright (C) 2002-2011 Patrick Canterino\r
+#\r
+# Diese Datei kann unter den Bedingungen der "Artistic License 2.0"\r
+# weitergegeben und / oder veraendert werden.\r
+# Siehe:\r
+# http://www.opensource.org/licenses/artistic-license-2.0\r
+#\r
+\r
+import os.path\r
+import sys\r
+\r
+class Template:\r
+\r
+ # __init__()\r
+ #\r
+ # Konstruktor\r
+ #\r
+ # Parameter: -keine-\r
+ #\r
+ # Rueckgabe: -nichts-\r
+\r
+ def __init__(self):\r
+ self.file = ''\r
+ self.template = ''\r
+ self.original = ''\r
+ self.old_parsing = 0\r
+ self.vars = {}\r
+ self.defined_vars = []\r
+ self.loop_vars = {}\r
+\r
+ # get_template()\r
+ #\r
+ # Kompletten Vorlagentext zurueckgeben\r
+ #\r
+ # Parameter: -keine-\r
+ #\r
+ # Rueckgabe: Kompletter Vorlagentext (String)\r
+\r
+ def get_template(self):\r
+ return str(self.template)\r
+\r
+ # set_template()\r
+ #\r
+ # Kompletten Vorlagentext aendern\r
+ #\r
+ # Parameter: Vorlagentext\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def set_template(self,template):\r
+ self.template = str(template)\r
+\r
+ # add_text()\r
+ #\r
+ # Vorlagentext ans Template-Objekt anhaengen\r
+ #\r
+ # Parameter: Vorlagentext\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def add_text(self,text):\r
+ self.set_template(self.get_template()+str(text))\r
+\r
+ # read_file()\r
+ #\r
+ # Einlesen einer Vorlagendatei und {INCLUDE}-Anweisungen ggf. verarbeiten\r
+ # (Text wird an bereits vorhandenen Text angehaengt)\r
+ #\r
+ # Parameter: 1. Datei zum Einlesen\r
+ # 2. Status-Code (Boolean):\r
+ # true => {INCLUDE}-Anweisungen nicht verarbeiten\r
+ # false => {INCLUDE}-Anweisungen verarbeiten (Standard)\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def read_file(self,file,not_include=0):\r
+ self.file = file\r
+\r
+ fp = open(file,'r')\r
+ content = fp.read()\r
+ fp.close()\r
+\r
+ self.add_text(content)\r
+ self.save_state()\r
+\r
+ if not not_include: self.parse_includes()\r
+\r
+ # set_var()\r
+ #\r
+ # Wert einer Variable setzen\r
+ #\r
+ # Parameter: 1. Name der Variable\r
+ # 2. Wert, den die Variable erhalten soll\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def set_var(self,var,content):\r
+ self.vars[var] = content\r
+\r
+ # get_var()\r
+ #\r
+ # Wert einer Variable zurueckgeben\r
+ #\r
+ # Parameter: (optional) Variablenname\r
+ #\r
+ # Rueckgabe: Wert der Variable;\r
+ # wenn die Variable nicht existiert, false;\r
+ # wenn kein Variablenname angegeben wurde, wird ein\r
+ # Array mit den Variablennamen zurueckgegeben\r
+\r
+ def get_var(self,var=None):\r
+ if var is not None:\r
+ if self.vars.has_key(var):\r
+ return self.vars[var]\r
+ else:\r
+ return None\r
+ else:\r
+ return self.vars.keys()\r
+\r
+ # set_vars()\r
+ #\r
+ # Komplettes Variablen-Array mit einem anderen Array ueberschreiben\r
+ #\r
+ # Parameter: Array\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def set_vars(self,vars):\r
+ self.vars = vars\r
+\r
+ # add_vars()\r
+ #\r
+ # Zum bestehenden Variablen-Array weitere Variablen in Form eines Arrays\r
+ # hinzufuegen\r
+ #\r
+ # Parameter: Array\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def add_vars(self,vars):\r
+ self.vars.update(vars)\r
+\r
+ # set_loop_data()\r
+ #\r
+ # Daten fuer eine Schleife setzen\r
+ #\r
+ # Parameter: 1. Name der Schleife\r
+ # 2. Array mit den Dictionaries mit den Variablen fuer\r
+ # die Schleifendurchgaenge\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def set_loop_data(self,loop,data):\r
+ self.loop_vars[loop] = data\r
+\r
+ # add_loop_data()\r
+ #\r
+ # Daten fuer einen Schleifendurchgang hinzufuegen\r
+ #\r
+ # Parameter: 1. Name der Schleife\r
+ # 2. Dictionary mit den Variablen fuer den\r
+ # Schleifendurchgang\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def add_loop_data(self,loop,data):\r
+ if self.loop_vars.has_key(loop) and type(self.loop_vars[loop]) is list:\r
+ self.loop_vars[loop].append(data)\r
+ else:\r
+ self.loop_vars[loop] = [data]\r
+\r
+ # parse()\r
+ #\r
+ # In der Template definierte Variablen auslesen, Variablen\r
+ # ersetzen, {IF}- und {TRIM}-Bloecke parsen\r
+ #\r
+ # Parameter: -nichts-\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def parse(self):\r
+ if self.old_parsing: return self.parse_old()\r
+\r
+ # Zuerst die Schleifen parsen\r
+\r
+ if self.loop_vars and self.loop_vars.keys():\r
+ loops = self.loop_vars.keys()\r
+\r
+ for loop in loops:\r
+ self.parse_loop(loop)\r
+\r
+ # In Template-Datei definierte Variablen auslesen\r
+\r
+ self.get_defined_vars()\r
+\r
+ # Variablen ersetzen\r
+\r
+ vars = self.get_var()\r
+\r
+ if vars is not None and type(vars) is list:\r
+ self.parse_if_blocks()\r
+ self.replace_vars()\r
+\r
+ # {TRIM}-Bloecke entfernen\r
+\r
+ self.parse_trim_blocks()\r
+\r
+ # parse_old()\r
+ #\r
+ # In der Template definierte Variablen auslesen, Variablen\r
+ # ersetzen, {IF}- und {TRIM}-Bloecke parsen\r
+ # (alte Methode)\r
+ #\r
+ # Parameter: -nichts-\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def parse_old(self):\r
+ # Zuerst die Schleifen parsen\r
+\r
+ if self.loop_vars and self.loop_vars.keys():\r
+ loops = self.loop_vars.keys()\r
+\r
+ for loop in loops:\r
+ self.parse_loop(loop)\r
+\r
+ # Normale Variablen durchgehen\r
+\r
+ if self.get_var():\r
+ vars = self.get_var()\r
+\r
+ for var in vars:\r
+ val = self.get_var(var)\r
+\r
+ self.parse_if_block(var,val)\r
+\r
+ if type(val) is list:\r
+ self.fillin_array(var,val)\r
+ else:\r
+ self.fillin(var,val)\r
+\r
+ # Jetzt dasselbe mit denen, die direkt in der Template-Datei definiert\r
+ # sind, machen. Ich weiss, dass das eine ziemlich unsaubere Loesung ist,\r
+ # aber es funktioniert\r
+\r
+ self.get_defined_vars()\r
+\r
+ for var in self.defined_vars:\r
+ val = self.get_var(var)\r
+\r
+ self.parse_if_block(var,val)\r
+ self.fillin(var,val)\r
+\r
+ # {TRIM}-Bloecke entfernen\r
+\r
+ self.parse_trim_blocks()\r
+\r
+ # fillin()\r
+ #\r
+ # Variablen durch Text ersetzen\r
+ #\r
+ # Parameter: 1. Variable zum Ersetzen\r
+ # 2. Text, durch den die Variable ersetzt werden soll\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def fillin(self,var,text):\r
+ if text is None: text = ''\r
+\r
+ template = self.get_template();\r
+ template = template.replace('{'+str(var)+'}',str(text));\r
+\r
+ self.set_template(template);\r
+\r
+ # fillin_array()\r
+ #\r
+ # Variable durch Array ersetzen\r
+ #\r
+ # Parameter: 1. Variable zum Ersetzen\r
+ # 2. Array, durch das die Variable ersetzt werden soll\r
+ # 3. Zeichenkette, mit der das Array verbunden werden soll\r
+ # (Standard: '')\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def fillin_array(self,var,array,glue=''):\r
+ self.fillin(var,str(glue).join(array))\r
+\r
+ # replace_vars()\r
+ #\r
+ # Variablen eine nach der anderen ersetzen. Sollte in einer Variable eine\r
+ # andere Variable auftauchen, so wird diese nicht ersetzt.\r
+ #\r
+ # Parameter: Array mit zu parsenden Variablen (optional)\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def replace_vars(self,valid=None):\r
+ template = self.get_template()\r
+\r
+ if valid is None:\r
+ valid_vars = self.get_var()\r
+ else:\r
+ valid_vars = valid\r
+\r
+ x = 0\r
+\r
+ while x < len(template):\r
+ if template[x] == '{':\r
+ for var in valid_vars:\r
+ # Pruefen, ob hier eine gueltige Variable beginnt\r
+\r
+ if template[x+1:x+len(var)+2] == var + '}':\r
+ if type(self.get_var(var)) is list:\r
+ content = ''.join(self.get_var(var))\r
+ else:\r
+ # Muss es nochmal zum String machen\r
+ # Hilft gegen den "ordinal not in range(128)"-Fehler\r
+ # Habe aber keine Ahnung, welche neuen Probleme das verursachen koennte\r
+ # Bin gespannt...\r
+ content = str(self.get_var(var))\r
+\r
+ if content is None: content = ''\r
+\r
+ # Daten vor und nach der Variable\r
+\r
+ pre = template[0:x]\r
+ post = template[len(pre)+2+len(var):]\r
+\r
+ # Alles neu zusammensetzen\r
+\r
+ template = pre + content + post\r
+\r
+ # Zaehler aendern\r
+\r
+ x = len(pre + content) - 1\r
+\r
+ x += 1\r
+\r
+ self.set_template(template)\r
+\r
+ # to_file()\r
+ #\r
+ # Template in Datei schreiben\r
+ #\r
+ # Parameter: Datei-Handle\r
+ #\r
+ # Rueckgabe: Status-Code (Boolean)\r
+\r
+ def to_file(self,handle):\r
+ return handle.write(self.get_template())\r
+\r
+ # reset()\r
+ #\r
+ # Den gesicherten Stand des Template-Textes wiederherstellen\r
+ #\r
+ # Parameter: -nichts-\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def reset(self):\r
+ self.template = self.original\r
+\r
+ # save_state()\r
+ #\r
+ # Aktuellen Stand des Template-Textes sichern\r
+ # (alte Sicherung wird ueberschrieben)\r
+ #\r
+ # Parameter: -nichts-\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def save_state(self):\r
+ self.original = self.template\r
+\r
+ # parse_loop()\r
+ #\r
+ # Eine Schleife parsen\r
+ #\r
+ # Parameter: Name der Schleife\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def parse_loop(self,name):\r
+ template = self.get_template()\r
+ if template.find('{LOOP '+name+'}') == -1: return\r
+\r
+ offset = 0\r
+ name_len = len(name)\r
+\r
+ while template.find('{LOOP '+name+'}',offset) != -1:\r
+ begin = template.find('{LOOP '+name+'}',offset)\r
+\r
+ if template.find('{ENDLOOP}',begin+6+name_len) != -1:\r
+ end = template.find('{ENDLOOP}',begin+6+name_len)\r
+\r
+ block = template[begin:end+9]\r
+ content = block[name_len+7:-9]\r
+\r
+ parsed_block = ''\r
+\r
+ x = 0\r
+\r
+ while x < len(self.loop_vars[name]):\r
+ loop_data = self.loop_vars[name][x]\r
+ loop_vars = loop_data.keys()\r
+\r
+ ctpl = Template()\r
+ ctpl.set_template(content)\r
+\r
+ for loop_var in loop_vars:\r
+ ctpl.set_var(name+'.'+loop_var,loop_data[loop_var])\r
+\r
+ if self.old_parsing:\r
+ ctpl.parse_old()\r
+ else:\r
+ ctpl.parse()\r
+\r
+ parsed_block += ctpl.get_template()\r
+\r
+ del(ctpl)\r
+ x += 1\r
+\r
+ template = template.replace(block,parsed_block)\r
+ offset = begin+len(parsed_block)\r
+\r
+ else:\r
+ break\r
+\r
+ self.set_template(template)\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
+ def get_defined_vars(self):\r
+ template = self.get_template()\r
+ if template.find('{DEFINE ') == -1: return\r
+\r
+ offset = 0\r
+\r
+ while template.find('{DEFINE ',offset) != -1:\r
+ begin = template.find('{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
+ x = begin\r
+\r
+ while x < len(template):\r
+ if template[x] == '\012' or 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
+ 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 self.get_var(name) is None:\r
+ # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist\r
+\r
+ self.set_var(name,content)\r
+ self.defined_vars.append(name)\r
+\r
+ # {DEFINE}-Block entfernen\r
+\r
+ pre = template[0:begin-8]\r
+ post = template[x+2:]\r
+\r
+ template = pre+post\r
+\r
+ # Fertig!\r
+\r
+ offset = len(pre)\r
+ break\r
+\r
+ elif 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
+ else:\r
+ content += template[x+1]\r
+\r
+ x += 1\r
+\r
+ else:\r
+ content += template[x]\r
+\r
+ else:\r
+ if name_found == 1:\r
+ if var_open == 0:\r
+ if template[x] == '"':\r
+ var_open = 1\r
+ else:\r
+ break\r
+\r
+ else:\r
+ # Variablennamen auslesen\r
+\r
+ if template[x] == '}' and name != '':\r
+ # Wir haben einen {DEFINE}-Block\r
+\r
+ name_found = 1\r
+ define_found = 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 template.find('{ENDDEFINE}',x) != -1:\r
+ end = template.find('{ENDDEFINE}',x)\r
+ x += 1\r
+\r
+ content = template[x:end]\r
+\r
+ if self.get_var(name) is None:\r
+ # Die Variable wird nur gesetzt, wenn sie nicht bereits gesetzt ist\r
+\r
+ self.set_var(name,content)\r
+ self.defined_vars.append(name)\r
+\r
+ pre = template[0:begin-8]\r
+ post = template[end+11:]\r
+\r
+ template = pre + post\r
+\r
+ # Fertig!\r
+\r
+ offset = len(pre)\r
+ break\r
+\r
+ else:\r
+ break\r
+\r
+ elif template[x] != ' ':\r
+ name += template[x]\r
+\r
+ elif template[x] != '':\r
+ name_found = 1\r
+\r
+ else:\r
+ break\r
+\r
+ x += 1\r
+\r
+ self.set_template(template)\r
+\r
+ # parse_if_block()\r
+ #\r
+ # IF-Bloecke verarbeiten\r
+ #\r
+ # Parameter: 1. Name des IF-Blocks (das, was nach dem IF steht)\r
+ # 2. Status-Code (true => Inhalt anzeigen\r
+ # false => Inhalt nicht anzeigen\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def parse_if_block(self,name,state,no_negate=0):\r
+ name = str(name)\r
+ template = self.get_template()\r
+\r
+ count = 0;\r
+\r
+ while template.find('{IF '+name+'}') >= 0:\r
+ count += 1\r
+\r
+ start = template.find('{IF '+name+'}')\r
+ tpl_tmp = template[start:]\r
+ splitted = tpl_tmp.split('{ENDIF}')\r
+\r
+ block = '' # Kompletter bedingter Block\r
+ ifs = 0 # IF-Zaehler (wird fuer jedes IF erhoeht und fuer jedes ENDIF erniedrigt)\r
+\r
+ # {IF}\r
+\r
+ x = 0\r
+\r
+ while x < len(splitted):\r
+ # Verschachtelungsfehler abfangen\r
+ if x == len(splitted)-1: raise TplClassIFNestingError(self.file,name,count)\r
+\r
+ ifs += splitted[x].count('{IF ') # Zum Zaehler jedes Vorkommen von IF hinzuzaehlen\r
+ ifs -= 1 # Zaehler um 1 erniedrigen\r
+ block += splitted[x]+'{ENDIF}' # Daten zum Block hinzufuegen\r
+\r
+ x += 1\r
+\r
+ if ifs == 0:\r
+ # Zaehler wieder 0, also haben wir das Ende des IF-Blocks gefunden :-))\r
+ break\r
+\r
+ if_block = block[len(name)+5:-7] # Alles zwischen {IF} und {ENDIF}\r
+\r
+ # {ELSE}\r
+\r
+ else_block = '' # Alles ab {ELSE}\r
+ ifs = 0 # IF-Zaehler\r
+\r
+ splitted = if_block.split('{ELSE}');\r
+\r
+ x = 0\r
+\r
+ while x < len(splitted):\r
+ ifs += splitted[x].count('{IF ') # Zum Zaehler jedes Vorkommen von IF hinzuzaehlen\r
+ ifs -= splitted[x].count('{ENDIF}') # Vom Zaehler jedes Vorkommen von ENDIF abziehen\r
+\r
+ x += 1\r
+\r
+ if ifs == 0:\r
+ # Zaehler 0, also haben wir das Ende des IF-Abschnitts gefunden\r
+\r
+ # Aus dem Rest den ELSE-Block zusammenbauen\r
+\r
+ y = x\r
+\r
+ while y < len(splitted):\r
+ else_block += '{ELSE}'+splitted[y]\r
+ y += 1\r
+\r
+ if else_block:\r
+ if_block = if_block[0:len(if_block)-len(else_block)]\r
+ else_block = else_block[6:]\r
+\r
+ break\r
+\r
+ if state:\r
+ replacement = if_block\r
+ else:\r
+ replacement = else_block\r
+\r
+ template = template.replace(block,replacement)\r
+\r
+ self.set_template(template)\r
+\r
+ # Evtl. verneinte Form parsen\r
+\r
+ if not no_negate:\r
+ self.parse_if_block('!'+name,not state,1)\r
+\r
+ # parse_if_blocks()\r
+ #\r
+ # IF-Bloecke zu allen definierten Variablen verarbeiten\r
+ #\r
+ # Parameter: Array mit zu verarbeitenden IF-Bloecken (optional)\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def parse_if_blocks(self,valid=None):\r
+ if valid is None:\r
+ valid_vars = self.get_var()\r
+ else:\r
+ valid_vars = valid\r
+\r
+ for valid_var in valid_vars:\r
+ self.parse_if_block(valid_var,self.get_var(valid_var))\r
+\r
+ # parse_trim_blocks()\r
+ #\r
+ # {TRIM}-Bloecke parsen\r
+ #\r
+ # Dieser Parser ist nicht rekursiv, was auch nicht\r
+ # noetig sein sollte.\r
+ #\r
+ # Parameter: -nichts-\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def parse_trim_blocks(self):\r
+ template = self.get_template()\r
+ if template.find('{TRIM}') == -1: return\r
+\r
+ offset = 0\r
+\r
+ while template.find('{TRIM}',offset) >= 0:\r
+ begin = template.find('{TRIM}',offset)\r
+\r
+ if template.find('{ENDTRIM}',begin+6) >= 0:\r
+ end = template.find('{ENDTRIM}',begin+6)\r
+\r
+ block = template[begin:end+9]\r
+ content = block[6:-9]\r
+\r
+ trimmed = content.strip()\r
+\r
+ template = template.replace(block,trimmed)\r
+\r
+ offset = begin+len(trimmed)\r
+ else:\r
+ break\r
+\r
+ self.set_template(template)\r
+\r
+ # parse_condtag()\r
+ #\r
+ # Bedingungstags in einem Vorlagentext verarbeiten\r
+ #\r
+ # Parameter: 1. Tagname\r
+ # 2. Status-Code (true => Tag-Inhalt anzeigen\r
+ # false => Tag-Inhalt nicht anzeigen\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def parse_condtag(self,condtag,state):\r
+ condtag = str(condtag)\r
+ template = self.get_template()\r
+\r
+ while template.find('<'+condtag+'>') >= 0:\r
+ start = template.find('<'+condtag+'>') # Beginn des Blocks\r
+ end = template.find('</'+condtag+'>')+len(condtag)+3 # Ende des Blocks\r
+\r
+ extract = template[start:end] # Kompletten Bedingungsblock extrahieren...\r
+\r
+ if state:\r
+ replacement = extract[len(condtag)+2:0-len(condtag)-3]\r
+ else:\r
+ replacement = ''\r
+\r
+ template = template.replace(extract,replacement) # Block durch neue Daten ersetzen\r
+\r
+ self.set_template(template)\r
+\r
+ # parse_includes()\r
+ #\r
+ # {INCLUDE}-Anweisungen verarbeiten\r
+ #\r
+ # Parameter: -nichts-\r
+ #\r
+ # Rueckgabe: -nichts- (Template-Objekt wird modifiziert)\r
+\r
+ def parse_includes(self):\r
+ template = self.get_template()\r
+ if template.find('{INCLUDE ') == -1: return\r
+\r
+ offset = 0\r
+\r
+ while template.find('{INCLUDE ',offset) >= 0:\r
+ begin = template.find('{INCLUDE ',offset)\r
+\r
+ start = begin+9\r
+ offset = start\r
+ long = 0\r
+\r
+ if template[start] == '"':\r
+ long = 1\r
+ start += 1\r
+\r
+ file = ''\r
+ skip = 0\r
+\r
+ x = start\r
+\r
+ while x < len(template):\r
+ if template[x] == '\012' or template[x] == '\015':\r
+ skip = 1\r
+ break\r
+ elif long == 0 and template[x] == ' ':\r
+ skip = 1\r
+ break\r
+ elif long == 1 and template[x] == '"':\r
+ if template[x+1] != '}': skip = 1\r
+ break\r
+ elif long == 0 and template[x] == '}':\r
+ break\r
+ else:\r
+ file += template[x]\r
+\r
+ x += 1\r
+\r
+ if skip == 1: continue\r
+\r
+ if file != '':\r
+ filepath = file\r
+\r
+ if not os.path.isabs(file):\r
+ dir = os.path.dirname(self.file)\r
+ if not dir: dir = '.'\r
+ filepath = os.path.normpath(dir+'/'+file)\r
+\r
+ if os.path.isfile(filepath):\r
+ inc = Template()\r
+ inc.read_file(file)\r
+\r
+ if long == 1: end = start + len(file) + 2\r
+ else: end = start + len(file) + 1\r
+\r
+ pre = template[0:begin]\r
+ post = template[end:]\r
+\r
+ template = pre+inc.get_template()+post\r
+ offset = len(pre)+len(inc.get_template())\r
+\r
+ del(inc)\r
+\r
+ self.set_template(template)\r
+\r
+# Klasse zum Erzeugen des Fehlers bei falsch verschachtelten\r
+# {IF}-Bloecken\r
+\r
+class TplClassIFNestingError:\r
+\r
+ def __init__(self,file,name,count):\r
+ self.file = file\r
+ self.name = name\r
+ self.count = count\r
+\r
+ def __str__(self):\r
+ return 'Nesting error found while parsing IF block "'+self.name+'" nr. '+str(self.count)+' in template file "'+self.file+'"'\r
+\r
+#\r
+### Ende ###
\ No newline at end of file