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

"""Verwalter eines Eintrags
"""

import re, sys


class Entry:
	"""macht die einzelnen Informationseinheiten innerhalb des Eintrags 
	zugänglich.
	"""

	def __init__(self, entry):
		"""bekommt einen kompletten Wörterbucheintrag in einer Liste, in der jedes
		Listenelement eine Wörterbuchinformation enthält. Legt für 
		jede Informationseinheiten ein Klassenattribut an. Ruft die Funktion 
		_parse auf.
		"""
		self.wl1 = []
		self.wl2 = []
		self.zList = []
		self.qList = []
		self.unknown = ''
		self._parse(entry)


	def _parse(self, entry):
		"""bekommt einen kompletten Wörterbucheintrag in einer Liste. 
		Weist durch reguläre Ausdrücke den folgenden Klassenattributen 
		einen Wert zu: self.wl1, self.wl2, self.ibed, self.rectyp, 
		self.zDic, self.qList, self.author, self.date, self.unknown.
		Matcht ein Element auf keinen der regulären Ausdrücke, liegt ein 
		Fehler vor. Das dürfte hier nicht mehr der Fall sein.
		"""
		for line in entry:
			switch = 0
			
			mat = re.search("ID:\s([0-9]+)", line)
			if mat:
				self.ident = mat.group(1)
				switch = 1
					
			mat = re.search("WL1:\s(.+)", line)
			if mat:
				self.wl1.append(mat.group(1))
				switch = 1

			mat = re.search("WL2:\s?(.*)", line)
			if mat:
				self.wl2.append(mat.group(1))
				switch = 1

			mat = re.search("IBED:\s([0-9]+)", line)
			if mat:
				self.ibed = mat.group(1)
				switch = 1

			mat = re.search("RECTYP:\s([0-9]+)", line)
			if mat:
				self.rectyp = mat.group(1)
				switch = 1
				
			mat = re.search(
				"(Z[0-9]+)((\s+[0-9]+){4,4})", line)
			if mat:
				tup = ((mat.group(1)), (tuple(mat.group(2).split()))) 
				self.zList.append(tup)
				switch = 1
			
			mat = re.search(
 				"(Q[0-9]+)((\t[0-9]+|\t[a-z]+[0-9]?=[0-9]+){4,4})", line)
			if mat:
				tup = ((mat.group(1)), (tuple(mat.group(2).split()))) 
				self.qList.append(tup)
				switch = 1

			mat = re.search("AUTOR:\s([A-Z]+)", line)
			if mat:
				self.author = mat.group(1)
				switch = 1

			mat = re.search("DATUM:\s?([0-9]*)", line)	
				#Datum ist nicht immer vermerkt, deshalb "*" statt "+"
			if mat:
				self.date = mat.group(1)
				switch = 1
				
			mat = re.search("UNBEKANNT:\s(.+)", line)
			if mat:
				self.unknown = mat.group(1)
#				print self.unknown
				switch = 1

			if switch == 0 and len(line.strip()) > 2:
				sys.stderr.write("in entry " + self.wl1 + " not found: " + line + "\n")



	def getIdent(self):
		"""gibt die ID-Nummer als String zurück
		"""
		return self.ident
			
			
	def getWl1(self):
		"""gibt das Wortlemma1 als Liste zurück: 
		[LEMMA-Original, LEMMA-Version1, LEMMA-Version2, ...]
		"""
		return self.wl1	
	
		
	def setWl1(self,wl1):
		"""weist Wortlemma1 einen neuen Wert zu.
		"""
		self.wl1 = wl1	
				
	
	def getWl2(self):
		"""gibt das Wortlemma2 als Liste zurück: 
		[LEMMA-Original, LEMMA-Version1, LEMMA-Version2, ...]
		Ist kein Wortlemma2 verzeichnet, wird die leere Liste zurückgegeben.
		"""
		return self.wl2
		
		
	def setWl2(self,wl2):
		"""weist Wortlemma2 einen neuen Wert zu.
		"""	
		self.wl2 = wl2	
		
		
	def getIbed(self):
		"""gibt die Bedeutungsnummer als String zurück.
		"""
		return self.ibed


	def getRectyp(self):
		"""gibt den Rektionstyp als String zurück.
		"""	
		return self.rectyp


	def getZ(self):
		"""gibt alle Z-Zeilen in einer Liste mit Tupeln zurück. Das 
		Tupel besteht aus dem Kopf der Zeile und aus einem Quadrupel
		der folgenden vier Elemente, z.B.:
		[('Z1', ('0', '4', '0', '9')), ('Z2', ('1', '2', '0', '2')), ...]
		Sortiert die Liste nach Größe des erste Tupel-Elements, also Z1 
		vor Z2 vor Z18.
		"""	
		return self.zList


	def getQ(self):
		"""gibt alle Q-Zeilen in einer Liste mit Tupeln zurück. Das 
		Tupel besteht aus dem Kopf der Zeile und aus einem Vierer-Tupel 
		mit den vier folgenden Elementen, z.B.:
		[('Q1', ('0', 'jwk=40', 'jstw=0', 'jbed=9')), 
		('Q15', ('ksubk=1', 'kgrph=2', 'kkla1=0', 'kkla2=0')), 
		...]
		"""	
		return self.qList

		
	def getUnknown(self):
		"""gibt einen String von Daten zurück, die in keines der definierten 
		Schemen passen.
		"""
		return self.unknown
		
		
	def getAuthor(self):
		"""gibt einen String zurück, der vermutlich den Autor des 
		WDG-Eintrags enthält.
		"""
		return self.author


	def getDate(self):
		"""gibt Zahlen - vermutlich das Eintragungsdatum - als String zurück.
		"""
		return self.date
				
