from genshi.core import Attrs, Stream, QName

class ElementTreeStream(Stream):
	"""
	Adapted from function ET in genshi.template from Genshi 0.3.4.
	
	This allows you to select(...) the resulting stream. It also unwraps lists
	passed in, specifically to handle the result of element.findall(...).
	"""
	
	@classmethod
	def convert(cls, element):
		tag_name = element.tag
		if tag_name.startswith('{'):
			tag_name = tag_name[1:]
		tag_name = QName(tag_name)
		attrib = Attrs(element.items())
		
		yield (Stream.START, (tag_name, attrib), (None, -1, -1))
		if element.text:
			yield Stream.TEXT, element.text, (None, -1, -1)
		for child in element.getchildren():
			for item in cls.convert(child):
				yield item
		yield Stream.END, tag_name, (None, -1, -1)
		if element.tail:
			yield Stream.TEXT, element.tail, (None, -1, -1)
	#
	
	def __iter__(self):
		if isinstance(self.events, list):
			from itertools import chain
			return chain(*(self.convert(element) for element in self.events))
		
		else:
			return self.convert(self.events)
	#
#



# End
