# -*- encoding: iso-8859-1 -*-

"""Öffnet die modifizierte Wörterbuchversion 04WAT.txt.
Übergibt alle Wörterbucheinträge einzeln an die Klassen classEntry04 
und classEntryModifyer. Ruft die Funktion printXml auf.
"""

import re, sys, os
import classEntry04
import classXmlMixin
import classEntryModifyer



def printXml(p, q):
	"""bekommt ein Objekt der Klasse Entry04 und der Klasse XmlMixin. Druckt 
	den aktuellen Eintrag der Klasse Entry04 in XML-Format.
	"""
	q.openElement("entry", {"id" : p.getIdent(), "checked":0})
	q.printBreak()
	
	q.openElement("wl1")
	q.addElement("original", {"lemma": p.getWl1Origin()[0], "freq": p.getWl1Origin()[1]})
	if p.getWl1MostProb():
		q.addElement("mostProb", {"lemma": p.getWl1MostProb()[0], "freq": p.getWl1MostProb()[1]})
	if not p.getWl1Rest() == []:
		i = 1
		for lem in p.getWl1Rest():
			q.addElement("wl1Rest", {"id": i, "lemma": lem[0], "freq": lem[1]})
			i += 1
	q.closeElement()		
	q.printBreak()
	
	if not p.getWl2() == []:
		q.openElement("wl2")
		q.addElement("original", {"lemma": p.getWl2Origin()[0], "freq": p.getWl2Origin()[1]})
		if p.getWl2MostProb():
			q.addElement("mostProb", {"lemma": p.getWl2MostProb()[0], "freq": p.getWl2MostProb()[1]})
		if p.getWl2Rest():
			i = 1
			for lem in p.getWl2Rest():
				q.addElement("wl2Rest", {"id": i, "lemma": lem[0], "freq": lem[1]})
				i += 1
		q.closeElement()		
		q.printBreak()
		
	q.addElement("ibed", {"nr": p.getIbed()})
	q.addElement("rectyp", {"typ": p.getRectyp()})
	q.printBreak()
			
	zList = p.getZ().items()
	zList.sort(cmpKey)
	for zLine in zList:
		if re.match("new", zLine[0]):
			q.openElement("Z", {"id": (re.search("[0-9]+", zLine[0])).group(), "new": "yes"})
		else:		
			q.openElement("Z", {"id": (re.search("[0-9]+", zLine[0])).group(), "new": "no"})
		sCount = 1
		for s in zLine[1]:
			q.addElement("s"+str(sCount), {"info": s})
			sCount += 1
		q.closeElement()
		q.printBreak()
		
	for qLine in p.getQ():
		q.openElement((re.search("[A-Z]", qLine[0]).group()),
			({"id": (re.search("[0-9]+",qLine[0])).group()}))
		sCount = 1
		for s in qLine[1]:
			if re.search("=", s):
				mat = re.search("(.+)=(.+)", s)
				q.addElement("s" + str(sCount), {mat.group(1): mat.group(2)})
			else:
				q.addElement("s" + str(sCount), {"info": s})
			sCount += 1
		q.closeElement()
		q.printBreak()
		
	q.addElement("author", {"name": p.getAuthor()})
	if p.getDate():
		q.addElement("date", {"date": p.getDate()})
	if p.getUnknown():
		q.addElement("unknown", {"text": p.getUnknown()})
	q.closeElement()
	q.printBreak()
	q.printBreak()
	
	
def cmpKey(tup1, tup2):
	"""bekommt zwei Tupel, in deren erstem Element ein Buchstabe und eine Zahl als
	String gespeichert stehen. Vergleicht die Zahlen der beiden Strings miteinander.
	"""
	num1 = re.search("[0-9]+", tup1[0]).group()
	num2 = re.search("[0-9]+", tup2[0]).group()
	return cmp(int(num1), int(num2))	
	
	
def callModifyer(o):
	"""ruft alle public Module der Klasse EntryModifyer auf.
	"""
	o.insertNewZ1Verb()
	o.insertNewZ2Verb()
	o.insertNewZ3Verb()
	o.insertNewZ5Verb()
	o.insertNewZ12Verb()
	o.insertNewZ1Subst()
	o.insertNewZ2Subst()
	o.insertNewZ1Z2Subst()
	o.insertNewZ6Subst()
	o.insertNewZ1Adj()
	o.insertNewZ3Adj()
	o.insertNewZ4Adj()
	o.treatCases()	



def rmOldVersions():
	"""löscht, wenn vorhanden, Dateien, die durch dieses Programm neu erstellt werden.
	Da die Dateien im Append-Modus geöffnet werden, werden die alten Versionen 
	nicht automatisch überschrieben.
	"""
	if os.path.exists("../../res/11WAT.xml"): 
		os.unlink("../../res/11WAT.xml")
		
	if os.path.exists("../../res/teilergebnisse/04rmXmlMeta.txt"):
		os.unlink("../../res/teilergebnisse/04rmXmlMeta.txt")

	if os.path.exists("../../res/teilergebnisse/04rmNullChar.txt"):
		os.unlink("../../res/teilergebnisse/04rmNullChar.txt")
		
	if os.path.exists("../../res/teilergebnisse/newZLines/04newZ1LineVerb.txt"):
		os.unlink("../../res/teilergebnisse/newZLines/04newZ1LineVerb.txt")
				
	if os.path.exists("../../res/teilergebnisse/newZLines/04newZ2LineVerb.txt"):
		os.unlink("../../res/teilergebnisse/newZLines/04newZ2LineVerb.txt")
		
	if os.path.exists("../../res/teilergebnisse/newZLines/04newZ3LineVerb.txt"):
		os.unlink("../../res/teilergebnisse/newZLines/04newZ3LineVerb.txt")
		
	if os.path.exists("../../res/teilergebnisse/newZLines/04newZ5LineVerb.txt"):
		os.unlink("../../res/teilergebnisse/newZLines/04newZ5LineVerb.txt")
		
	if os.path.exists("../../res/teilergebnisse/newZLines/04newZ12LineVerb.txt"):
		os.unlink("../../res/teilergebnisse/newZLines/04newZ12LineVerb.txt")
							
	if os.path.exists("../../res/teilergebnisse/newZLines/04newZ1LineSubst.txt"):
		os.unlink("../../res/teilergebnisse/newZLines/04newZ1LineSubst.txt")
		
	if os.path.exists("../../res/teilergebnisse/newZLines/04newZ2LineSubst.txt"):
		os.unlink("../../res/teilergebnisse/newZLines/04newZ2LineSubst.txt")
		
	if os.path.exists("../../res/teilergebnisse/newZLines/04newZ1Z2LineSubst.txt"):
		os.unlink("../../res/teilergebnisse/newZLines/04newZ1Z2LineSubst.txt")

	if os.path.exists("../../res/teilergebnisse/newZLines/04newZ6LineSubst.txt"):
		os.unlink("../../res/teilergebnisse/newZLines/04newZ6LineSubst.txt")
		
	if os.path.exists("../../res/teilergebnisse/newZLines/04newZ1LineAdj.txt"):
		os.unlink("../../res/teilergebnisse/newZLines/04newZ1LineAdj.txt")

	if os.path.exists("../../res/teilergebnisse/newZLines/04newZ3LineAdj.txt"):
		os.unlink("../../res/teilergebnisse/newZLines/04newZ3LineAdj.txt")
		
	if os.path.exists("../../res/teilergebnisse/newZLines/04newZ4LineAdj.txt"):
		os.unlink("../../res/teilergebnisse/newZLines/04newZ4LineAdj.txt")
				
		
if __name__ == "__main__":
	"""Öffnet die modifizierte Wörterbuchversion 04version.txt.
	Übergibt alle Wörterbucheinträge einzeln an die Klassen classEntry04 
	und classEntryModifyer. Ruft die Funktion printXml auf.
	"""
	lexicon = open("../../res/04WAT.txt", "r")
	rmOldVersions()	
	q = classXmlMixin.XMLMixin('../../res/11WAT.xml')
	q.printProlog("iso-8859-1", "dictionary")
	wholeEntry = []
	countEntry = 0
	line = lexicon.readline()
	while line:
		line = line.strip()
		if re.search("ID:", line):
			if wholeEntry and wholeEntry[0] is not "":
				p = classEntry04.Entry(wholeEntry)
				o = classEntryModifyer.EntryModifyer(p)
				callModifyer(o)
				printXml(p, q)
				countEntry += 1
			wholeEntry = []
		wholeEntry.append(line)
		line = lexicon.readline()
	p = classEntry04.Entry(wholeEntry)
	o = classEntryModifyer.EntryModifyer(p)
	callModifyer(o)
	printXml(p, q)
	countEntry += 1
	q.closeElement()
	print "Anzahl der Einträge: ", countEntry

