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

"""Veränderung der Einträge
"""

import sys, re
import classEntry04




class EntryModifyer:
	"""die Klasse bekommt einen Eintrag. Wortlemma1 und Wortlemma2 werden in 
	entry[1] bzw. entry[2] als Liste in folgendem Format übergeben: [(LEMMA, FREQUENZ),]
	z.B. [... [("heimbraecht", "0"), ("heimbr\xc4cht", "54")], [("heimbringen", "202")], ...]
	FREQUENZ bezieht sich auf die Trefferhäufigkeit, die das voranstehende Lemma
	in den IDS-Korpora erzielt hat.
	"""


	def __init__(self, p):
		"""bekommt ein Objekt der Klasse Entry und macht daraus ein Klassenattribut
		"""
		self.p = p
		self._rmNull()
		self._treatEntRef()
		
		
	def _rmNull(self):
		"""entfernt den Null-Character '^@' aus Wl1 und Wl2, wenn vorhanden.
		"""
		wl1 = []
		wl2 = []
		f = open("../../res/teilergebnisse/04rmNullChar.txt", "a")
		for lem in self.p.getWl1():
			if re.search("\x00", lem[0]):
				wl1.append((lem[0].replace("\x00", ""), lem[1]))
				f.write("ID: " + self.p.getIdent() + "\t WL1: " + lem[0] +
					"\t -> \t" + lem[0].replace("\x00", "")+ "\n")
			else:
				wl1.append(lem)
		self.p.setWl1(wl1)
		for lem in self.p.getWl2():
			if re.search("\x00", lem[0]):
				wl2.append((lem[0].replace("\x00", ""), lem[1]))
				f.write("ID: " + self.p.getIdent() + "\t WL2: " + lem[0] +
					"\t -> \t" + lem[0].replace("\x00", "")+ "\n")
			else:
				wl2.append(lem)
		self.p.setWl2(wl2)
		

	def _treatEntRef(self):
		"""behandelt die Tupel wl1 und wl2: 
		fügt Entity-Referenzen in Lemmata ein, die XML-Metazeichen enthalten,
		damit das Lexikon für XML-Parser lesbar wird.
		"""
		self.p.setWl1([(self._setEntRef(lem[0]),lem[1]) for lem in self.p.getWl1()])
		self.p.setWl2([(self._setEntRef(lem[0]),lem[1]) for lem in self.p.getWl2()])

		
	def _setEntRef(self, lemma):
		"""bekommt ein Lemma. Setzt die Entity-Referenz für: < > " " &
		wenn vorhanden und übergibt das Lemma mit Entity-Referenz. 
		"""
		i = 0
		if not lemma.find("<") == -1:
			newLemma = lemma.replace("<", "&lt;") 
			i = 1
		elif not lemma.find(">") == -1:
			newLemma  = lemma.replace(">", "&gt;")
			i = 1
		elif not lemma.find("'") == -1:
			newLemma = lemma.replace("'", "&apos;") 
			i = 1
		elif not lemma.find('"') == -1:
			newLemma  = lemma.replace('"', "&quot;") 
			i = 1
		elif not lemma.find("&") == -1:
			newLemma  = lemma.replace("&", "&amp;") 
			i = 1
		else:
			newLemma = lemma
		if i == 1:
			f = open("../../res/teilergebnisse/04rmXmlMeta.txt", "a")
			f.write(
				"Entity-Referenzn gesetzt: " + "ID" + " " + self.p.getIdent(
					) + " " + lemma + " " +"->" + " " + newLemma + "\n")
		return newLemma
		

	def insertNewZ1Verb(self):
		"""fügt eine neue Z1-Zeile (Z1   0   0   0   0) bei Verben ein, wenn 
		der Eintrag ein Infinitiv-, Präteritum- oder Präsensstamm ist und die 
		Z1-Zeile fehlt.
		"""
		zDic = self.p.getZ()
		if self.p.getRectyp() == '1' and zDic.has_key("Z6"):
			if not (int(zDic["Z6"][2]) & 16) == 0 or zDic["Z6"][2] == "1" or zDic["Z6"][2] == "2":
				if not zDic.has_key("Z1"):
					zDic["newZ1"] = ("0", "0", "0", "0")
					self.p.setZ(zDic)
					f = open("../../res/teilergebnisse/newZLines/04newZ1LineVerb.txt", "a")
					f.write(
						"neue Z-Zeile gesetzt: " + "ID" + " " + self.p.getIdent(
							) + " " + self.p.getWl1()[0][0] + "\n")
							
									
	def insertNewZ2Verb(self):
		"""fügt eine neue Z2-Zeile (Z2   0   0   n   n) bei Verben ein, wenn 
		der Eintrag ein Präteritum- oder Infinitivstamm ist und die Z2-Zeile fehlt.
		"""
		zDic = self.p.getZ()
		if self.p.getRectyp() == '1' and zDic.has_key("Z6"):
			if not (int(zDic["Z6"][2]) & 16) == 0 or zDic["Z6"][2] == "1":
				if not zDic.has_key("Z2"):
					zDic["newZ2"] = ("0", "0", "n", "n")
					self.p.setZ(zDic)
					f = open("../../res/teilergebnisse/newZLines/04newZ2LineVerb.txt", "a")
					f.write(
						"neue Z-Zeile gesetzt: " + "ID" + " " + self.p.getIdent(
							) + " " + self.p.getWl1()[0][0] + "\n")

							
	def insertNewZ3Verb(self):
		"""fügt eine neue Z3-Zeile (Z3   0   0   0   0) bei Verben ein, wenn 
		diese Zeile fehlt.
		"""
		zDic = self.p.getZ()
		if self.p.getRectyp() == '1' and not zDic.has_key("Z3"):
			zDic["newZ3"] = ("0", "0", "0", "0")
			self.p.setZ(zDic)
			f = open("../../res/teilergebnisse/newZLines/04newZ3LineVerb.txt", "a")
			f.write(
				"neue Z-Zeile gesetzt: " + "ID" + " " + self.p.getIdent(
					) + " " + self.p.getWl1()[0][0] + "\n")

					
	def insertNewZ5Verb(self):
		"""fügt eine neue Z5-Zeile (Z5   0   0   0   0) bei Verben ein, wenn 
		diese Zeile fehlt.
		"""
		zDic = self.p.getZ()
		if self.p.getRectyp() == '1' and not zDic.has_key("Z5"):
			zDic["newZ5"] = ("0", "0", "0", "0")
			self.p.setZ(zDic)
			f = open("../../res/teilergebnisse/newZLines/04newZ5LineVerb.txt", "a")
			f.write(
				"neue Z-Zeile gesetzt: " + "ID" + " " + self.p.getIdent(
					) + " " + self.p.getWl1()[0][0] + "\n")					
						
						
	def insertNewZ12Verb(self):
		"""fügt eine neue Z12-Zeile (Z12   0   0   0   0) bei Verben ein, wenn 
		diese Zeile fehlt.
		"""
		zDic = self.p.getZ()
		if self.p.getRectyp() == '1' and not zDic.has_key("Z12"):
			zDic["newZ12"] = ("0", "0", "0", "0")
			self.p.setZ(zDic)
			f = open("../../res/teilergebnisse/newZLines/04newZ12LineVerb.txt", "a")
			f.write(
				"neue Z-Zeile gesetzt: " + "ID" + " " + self.p.getIdent(
					) + " " + self.p.getWl1()[0][0] + "\n")
							
							
	def insertNewZ1Adj(self):
		"""fügt eine neue Z1-Zeile (Z1   0   0   0   0) bei Adjektiven ein, wenn 
		diese Zeile fehlt.
		"""
		zDic = self.p.getZ()
		if self.p.getRectyp() == '3' and not zDic.has_key("Z1"):
			zDic["newZ1"] = ("0", "0", "0", "0")
			self.p.setZ(zDic)
			f = open("../../res/teilergebnisse/newZLines/04newZ1LineAdj.txt", "a")
			f.write(
				"neue Z-Zeile gesetzt: " + "ID" + " " + self.p.getIdent(
					) + " " + self.p.getWl1()[0][0] + "\n")

					
	def insertNewZ3Adj(self):
		"""fügt eine neue Z3-Zeile (Z3   0   0   0   0) bei Adjektiven ein, wenn 
		diese Zeile fehlt.
		"""
		zDic = self.p.getZ()
		if self.p.getRectyp() == '3' and not zDic.has_key("Z3"):
			zDic["newZ3"] = ("0", "0", "0", "0")
			self.p.setZ(zDic)
			f = open("../../res/teilergebnisse/newZLines/04newZ3LineAdj.txt", "a")
			f.write(
				"neue Z-Zeile gesetzt: " + "ID" + " " + self.p.getIdent(
					) + " " + self.p.getWl1()[0][0] + "\n")
					
					
	def insertNewZ4Adj(self):
		"""fügt eine neue Z4-Zeile (Z4   0   0   0   0) bei Adjektiven ein, wenn 
		diese Zeile fehlt.
		"""
		zDic = self.p.getZ()
		if self.p.getRectyp() == '3' and not zDic.has_key("Z4"):
			zDic["newZ4"] = ("0", "0", "0", "0")
			self.p.setZ(zDic)
			f = open("../../res/teilergebnisse/newZLines/04newZ4LineAdj.txt", "a")
			f.write(
				"neue Z-Zeile gesetzt: " + "ID" + " " + self.p.getIdent(
					) + " " + self.p.getWl1()[0][0] + "\n")					
					
							
	def insertNewZ1Subst(self):
		"""fügt eine neue Z1-Zeile (Z1   0   0   0   0) bei Substantiven ein, wenn 
		Genitiv-, Dativ-, und Akkusativendung endungslos sind und die Z1-Zeile fehlt.
		"""
		zDic = self.p.getZ()
		if self.p.getRectyp() == "2" and zDic.has_key("Z2"):
			if zDic["Z2"][0] == "0" and zDic["Z2"][1] == "0" and zDic["Z2"][2] == "0":
				if not zDic.has_key("Z1"):
					zDic["newZ1"] = ("0", "0", "0", "0")
					self.p.setZ(zDic)
					f = open("../../res/teilergebnisse/newZLines/04newZ1LineSubst.txt", "a")
					f.write(
						"neue Z-Zeile gesetzt: " + "ID" + " " + self.p.getIdent(
							) + " " + self.p.getWl1()[0][0] + "\n")
							
	
	def insertNewZ2Subst(self):
		"""fügt eine neue Z2-Zeile (Z2   0   0   0   0) bei Substantiven ein, wenn 
		der Eintrag femininen Geschlechts ist und die Z2-Zeile fehlt.
		"""
		zDic = self.p.getZ()
		if self.p.getRectyp() == '2' and zDic.has_key("Z1"):
			if zDic["Z1"][0] == "0":
				if not zDic.has_key("Z2"):
					zDic["newZ2"] = ("0", "0", "0", "0")
					self.p.setZ(zDic)
					f = open("../../res/teilergebnisse/newZLines/04newZ2LineSubst.txt", "a")
					f.write(
						"neue Z-Zeile gesetzt: " + "ID" + " " + self.p.getIdent(
							) + " " + self.p.getWl1()[0][0] + "\n")


	def insertNewZ1Z2Subst(self):
		"""überprüft, ob eine neue Z1- und Z2-Zeile eingefügt werden soll. 
		Das ist der Fall bei Substantiven mit folgenden Ableitungssuffixen: -ANZ, 
		-ENS, -ENZ, -IK, -ION, -HEIT, -KEIT, -LEI, -REI, -SCHAFT, -TAET, -TUM, -UNG.
		"""
		zDic = self.p.getZ()
		if self.p.getRectyp() == "2":
			if not self.p.getZ().has_key("Z1") and not self.p.getZ().has_key("Z2"):
				if self.p.getWl1()[0][0].endswith("HEIT") or self.p.getWl1()[0][0].endswith("ION"):
					self._insertZ1Z2(zDic)
				elif self.p.getWl1()[0][0].endswith("KEIT") or self.p.getWl1()[0][0].endswith("UNG"):
					self._insertZ1Z2(zDic)
				elif self.p.getWl1()[0][0].endswith("TAET") or self.p.getWl1()[0][0].endswith("SCHAFT"):
					self._insertZ1Z2(zDic)
				elif self.p.getWl1()[0][0].endswith("ENS") or self.p.getWl1()[0][0].endswith("IK"):
					self._insertZ1Z2(zDic)
				elif self.p.getWl1()[0][0].endswith("ENZ") or self.p.getWl1()[0][0].endswith("ANZ"):
					self._insertZ1Z2(zDic)	
				elif self.p.getWl1()[0][0].endswith("REI") or self.p.getWl1()[0][0].endswith("LEI"):
					self._insertZ1Z2(zDic)

					
	def insertNewZ6Subst(self):
		"""überprüft, ob eine neue Z6-Zeile eingefügt werden soll. Das ist der 
		Fall bei femininen Substantiven auf -E sowie -ION, -HEIT, -KEIT, -SCHAFT, 
		-TAET, -TUM, -UNG.
		"""
		zDic = self.p.getZ()
		if self.p.getRectyp() == "2":
			if not self.p.getZ().has_key("Z6"):
				if self.p.getWl1()[0][0].endswith("HEIT") or self.p.getWl1()[0][0].endswith("ION"):
					self._insertZ60(zDic)
				elif self.p.getWl1()[0][0].endswith("KEIT") or self.p.getWl1()[0][0].endswith("UNG"):
					self._insertZ60(zDic)
				elif self.p.getWl1()[0][0].endswith("TAET") or self.p.getWl1()[0][0].endswith("SCHAFT"):
					self._insertZ60(zDic)
				elif self.p.getWl1()[0][0].endswith("TUM"):
					self._insertZ60(zDic)	
				if zDic.has_key("Z1") and zDic["Z1"][0] == "0":
					if self.p.getWl1()[0][0].endswith("E"):
						self._insertZ61(zDic)
						
						
	def _insertZ1Z2(self, zDic):
		"""fügt eine neue Z1- und Z2-Zeile mit jeweils 0   0   0   0  ein.
		"""
		zDic["newZ2"] = ("0", "0", "0", "0")
		zDic["newZ1"] = ("0", "0", "0", "0")
		f = open("../../res/teilergebnisse/newZLines/04newZ1Z2LineSubst.txt", "a")
		f.write(
			"zwei neue Z-Zeilen gesetzt: " + "ID" + " " + self.p.getIdent(
				) + " " + self.p.getWl1()[0][0] + "\n")
				
				
	def _insertZ60(self, zDic):
		"""fügt eine neue Z6-Zeile mit Z6 0   0   16   0  ein.
		"""	
		zDic["newZ6"] = ("0", "0", "16", "0")
		f = open("../../res/teilergebnisse/newZLines/04newZ6LineSubst.txt", "a")
		f.write(
			"neue Z-Zeilen gesetzt: " + "ID" + " " + self.p.getIdent(
				) + " " + self.p.getWl1()[0][0] + "\n")		
				
				
	def _insertZ61(self, zDic):
		"""fügt eine neue Z6-Zeile mit Z6 0   0   4   0  ein.
		"""	
		zDic["newZ6"] = ("0", "0", "4", "0")
		f = open("../../res/teilergebnisse/newZLines/04newZ6LineSubst.txt", "a")
		f.write(
			"zwei neue Z-Zeilen gesetzt: " + "ID" + " " + self.p.getIdent(
				) + " " + self.p.getWl1()[0][0] + "\n")	
		
		
	def treatCases(self):  
		"""entscheidet, welche Lemmata groß bzw. klein geschrieben werden.
		Die Funktionswortklasse wurde nicht mitberücksichtigt.
		"""
		if self.p.getRectyp() == "1" or self.p.getRectyp() == "3":
			self.p.setWl1(self._setLowerCase(self.p.getWl1()))
			self.p.setWl2(self._setLowerCase(self.p.getWl2()))
		elif self.p.getRectyp() == "2":
			self.p.setWl1(self._setCapital(self.p.getWl1()))
			self.p.setWl2(self._setCapital(self.p.getWl2()))
			
			
	def _setLowerCase(self, lemmaList):
		"""bekommt eine Liste aus Tupeln [(LEMMA, FREQUENZ), ...]. Ruft für jedes
		Lemma die lower-Funktion auf und gibt die Tuple-Liste in Kleinschreibung 
		zurück [(lemma, FREQUENZ), ...].
		"""
		return [(self._lowerLemma(lem[0]),lem[1]) for lem in lemmaList]
				
		
	def _setCapital(self, lemmaList):
		"""bekommt eine Liste aus Tupeln [(LEMMA, FREQUENZ),...]. Ruft für 
		jedes Lemma die capitalize-Funktion auf und gibt die Tuple-Liste in 
		Großschreibung zurück [(Lemma, FREQUENZ), ...].
		"""
		return [(self._capitalizeLemma(lem[0]),lem[1]) for lem in lemmaList]
		
		
	def _lowerLemma(self, lemma):
		"""bekommt ein Lemma. Setzt jeden Buchstaben (auch die Umlaute) in 
		Kleinbuchstaben. Übergibt das Lemma.
		"""
		lemma = lemma.lower()
		if re.search("Ä", lemma):
			lemma = lemma.replace("Ä","ä")
		if re.search("Ö", lemma):
			lemma = lemma.replace("Ö", "ö")
		if re.search("Ü", lemma):
			lemma = lemma.replace("Ü","ü")
		return lemma
		
		
	def _capitalizeLemma(self, lemma):
		"""bekommt ein Lemma. Setzt den ersten Buschstaben groß, alle anderen
		(auch die Umlaute) klein. Übergibt das Lemma
		"""
		newLemma = lemma.capitalize()
		if re.search( "Ä",lemma[1:]):
			newLemma = lemma[0] + newLemma[1:].replace("Ä","ä")
		if re.search( "Ö",lemma[1:]):
			newLemma = lemma[0] + newLemma[1:].replace("Ö", "ö")
		if re.search( "Ü",lemma[1:]):
			newLemma = lemma[0] + newLemma[1:].replace("Ü","ü")
		return newLemma		

		