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


"""Mixin für Dokumente zur XML-Erzeugung
"""

class XMLMixin:
	"""erzeugt eine XML-Datei
	"""

	def __init__(self, f):
		"""bekommt eine Datei, in die gedruckt wird. Legt einen Stack als 
		Instanzvariable an.
		"""
		self._elStack = []
		self.f = open(f, 'a')
		
		
	def printProlog(self, enc, elName):
		"""bekommt ein Encoding und den alles umschließenden Tag. Druckt den XML-Prolog
		mit dem gegebenen Encoding und öffnet den ersten Tag.
		"""
		self.f.write(u'<?%s%s"%s"?>'%('xml version="1.0" ', 'encoding=',enc)+'\n'+'\n'+'\n')
		self.f.write('<%s>'%elName + '\n')
		self._elStack.append(elName)
		self.f.flush()


	def openElement(self, elName, atts=None):
		"""bekommt einen Elementnamen und ggf Attribute. Druckt den Elementnamen 
		mit den Attributen in ein sich öffnendes Tag. Speichert den Elementnamen 
		auf einem Stack.
		"""
		attString = ""
		if atts is not None:
			attString = " "+(" ".join(['%s="%s"'%(attName,
				attVal)
				for attName, attVal in atts.items()]))
		self.f.write(("<%s%s>"%(elName, attString)))
		self._elStack.append(elName)


	def closeElement(self):
		"""nimmt das letzte Element vom Stack und druckt den dort abgelegten Elementnamen 
		in ein sich schließendes Tag.
		"""
		self.f.write(u"</%s>"%self._elStack.pop())


	def addElement(self, elName, atts=None, content=None):
		"""bekommt einen Elementnamen, ggf Attribute und ggf Text innerhalb der Tags. Druckt
		daraus ein komplettes XML-Element.
		"""
		self.openElement(elName, atts)
		if content:
			self.f.write(u"%s"%content)
		self.closeElement()


	def printBreak(self):
		"""druckt einen Zeilenumbruch.
		"""
		self.f.write(u"\n")
