#!/usr/bin/env python
# I, Danny Milosavljevic, hereby release this file into the public domain.

import sys
import xml.sax
import io
from xml.sax.saxutils import XMLGenerator
from xml.sax.xmlreader import AttributesNSImpl
import hashlib
import os

temp_name = "temp"
class PageCopier(xml.sax.handler.ContentHandler):
	def __init__(self):
		xml.sax.handler.ContentHandler.__init__(self)
		self.prefix = io.StringIO()
		self.text = io.StringIO()
		self.SVG_attributes = {}
		self.page_title = None
		self.summer = None

	def startDocument(self):
		pass
		
	def endDocument(self):
		pass
		
	def startElement(self, name, attributes):
		if name == "svg":
			self.SVG_attributes = attributes
		elif name == "page":
			self.output_file = open(temp_name, "w")
			self.output_XML = XMLGenerator(self.output_file, "utf-8")
			self.output_XML.startDocument()
			self.output_XML.startElement("svg", self.SVG_attributes)
			self.summer = hashlib.md5()
		elif name == "pageSet": # yes, and?
			pass
		else:
			self.output_XML.startElement(name, attributes) # NS((None, name), name, attributes)
			self.text = io.StringIO()
		
	def endElement(self, name):
		if name == "svg":
			pass
		elif name == "page":
			self.output_XML.endDocument()
			self.output_XML.endElement("svg")
			self.output_file.close()
			name = self.summer.hexdigest() if self.page_title is None else self.page_title
			os.rename(temp_name, name)
			self.summer = None
		elif name == "pageSet": # yes, and?
			pass
		else:
			self.output_XML.endElement(name)
			if name == "title":
				self.page_title = self.text.getvalue()
				if self.page_title.startswith("Unknown"): # oops?! date is wrong.
					self.page_title = None
		
	#def startElementNS(self, qname, attributes):
	#def endElementNS(self):
		
	def characters(self, data):
		self.output_XML.characters(data)
		self.text.write(data)
		if self.summer is not None:
			self.summer.update(data.encode("utf-8") if hasattr(data, "encode") else data)
		
	#def processingInstruction(self, target, data):
	#	pass

xml.sax.parse(sys.stdin, PageCopier())

