# HTML export plugin for database objects
# Version:0.1
# Author : Alexey Tveritinov [alexey.tveritinov@sap.com]

# for x in dia.diagrams()[0].data.layers[0].objects : print(str(x))
# for x in dia.diagrams()[2].data.layers[0].objects[0].properties.keys() : print(str(x))
# print(str(dia.diagrams()[2].data.layers[0].objects[0].properties["attributes"].keys()))

import sys, dia, types, string

plugname = "HTML Exporting plugin for DIA"
version  = "0.1"
author   = "Alexey Tveritinov [alexey.tveritinov@sap.com]"

# HTML formatting constants
align_center_macro = "style='text-align:center;'";
xml_spcial_chars = [('&', '&amp;'), ('<', '&lt;'), ('>', '&gt;'), ('"', '&quot;'), ("'", '&apos;')]
bool_replace = [('1','X'), ('0','&nbsp;')]

class HTMLRenderer :
	def __init__ (self) :
		pass
	def GetName (self, o) :
		"A small helper to turn a dia object into a name"
		s = ""
		if o.properties.has_key("name") :
			s = o.properties["name"].value
		elif o.properties.has_key("text") :
			s = o.properties["text"].value.text
		if s is None or s == "" :
			s = str(o)
		return s
	def print_html_into (self) :
		self.f.write("<html>\n")
		self.f.write("<body>\n")
	def print_html_outro (self) :
		self.f.write("</body>\n")
		self.f.write("</html>\n")
	def print_database_table (self, o) :
		self.f.write("%s\n" % ("<table border='1'>"))
		self.print_table_header(o)
		self.print_table_contents(o)
		self.f.write("<table>\n")
		pass
	def print_table_header (self,o) :
		tmp_filler = ""

		# Print name and comment
		self.f.write("<tr>\n")
		self.f.write("<td>%s</td>\n" % (o.properties["name"].value))
#		self.f.write("")
		if o.properties.has_key("comment"):
			tmp_filler = "<i>%s</i>" % (o.properties["comment"].value,)
		else:
			tmp_filler = "&nbsp;"
		self.f.write("<td colspan='5'>%s</td>\n" % (tmp_filler))
		self.f.write("</tr>\n")
		# Print header
		self.f.write("<tr>\n" +
			"<td>Name</td>\n" +
			"<td>Primary</td>\n" +
			"<td>Unique</td>\n" +
			"<td>Nullable</td>\n" +
			"<td>Type</td>\n" +
			"<td>Comment</td>\n" +
		"</tr>\n")

	def print_table_contents(self, o) :
		nbsp_filler = "&nbsp;"
#		pass
#		self.f.write("<!-- %s -->" % (str(o.properties["attributes"])))
#		print("<!-- %s -->" % (str(o.properties["attributes"])))
# for a,b,c,d,e,f in dia.diagrams()[0].data.layers[0].objects[0].properties["attributes"].value: print(a,b,c)
		for attr_name,attr_type,attr_comment, \
		    attr_primary, attr_nullable, attr_unique \
		     in o.properties["attributes"].value :
 			self.f.write("<!-- %s -->\n" % (str(attr_name)))
			self.f.write("<tr>\n")
			self.f.write("<td>%s</td>\n" % (attr_name))
			self.f.write("<td %s>%s</td>\n" % (align_center_macro, attr_primary))
			self.f.write("<td %s>%s</td>\n" % (align_center_macro, attr_unique))
			self.f.write("<td %s>%s</td>\n" % (align_center_macro, attr_nullable))
			if len(attr_type) == 0 : attr_type = nbsp_filler
			self.f.write("<td>%s</td>\n" % (attr_type))
			if len(attr_comment) == 0 : attr_comment = nbsp_filler
			self.f.write("<td>%s</td>\n" % (attr_comment))
			self.f.write("</tr>\n")

		
	def print_version_info (self) :
		self.f.write("<!-- %s %s %s -->\n" % (plugname, version, author,))		
	def begin_render (self, data, filename) :
		self.filename = filename
		self.f = open(self.filename, "w")
		self.print_version_info()
#		self.f.write ("# %s\n" % (filename,))
		self.print_html_into()
		for layer in data.layers :
			for o in layer.objects :
				self.print_database_table(o)
				
				#self.f.write(o.properties["name"].value)
		self.print_html_outro()

	def end_render (self) :
		self.f.close()

dia.register_export ("PyDia HTML export", "html", HTMLRenderer())
