From 964632243a7aca77fcf432b829aaa3d41e55f49b Mon Sep 17 00:00:00 2001
From: sullivan <sullivan@sullivan-desktop.(none)>
Date: Wed, 29 Aug 2012 13:39:38 +0200
Subject: [PATCH] Implementation of javascript code generation.

Add the JsRenderer class in plug-ins/python/codegen.py providing
javascript 'objects' generation. All attributes and methods are
public. "use strict" is automatically added to all methods.

This module was needed for implementing a complex media center
in javascript.
---
 plug-ins/python/codegen.py |   70 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 70 insertions(+), 0 deletions(-)

diff --git a/plug-ins/python/codegen.py b/plug-ins/python/codegen.py
index 3face4b..60b4ed5 100644
--- a/plug-ins/python/codegen.py
+++ b/plug-ins/python/codegen.py
@@ -211,6 +211,75 @@ class CxxRenderer(ObjRenderer) :
 		ObjRenderer.end_render(self)
 
 # #############################################################################
+# JsRenderer: export Dia UML diagram to Object style ECMA5 javascript code.
+#
+# Features:
+#  - All methods and attributes are public.
+#  - Inheriting from one class.
+#  - Comments for classes, attributes and operations are supported.
+#  - Method parameter default values are supported.
+#  - Order of attributes and operations is preserved.
+#  - Auto generate type check.
+#
+class JsRenderer(ObjRenderer) : 
+	def __init__(self) :
+		ObjRenderer.__init__(self)
+	def end_render(self) :
+		f = open(self.filename, "w")
+		f.write("/* generated by dia/codegen.py */\n\n")
+		for sk in self.klasses.keys() :
+			f.write("// class definition : %s\n" % (sk, ))
+			parents = self.klasses[sk].parents
+			#add inheritance
+			if parents:
+				f.write("// Inherits from %s.\n" % (parents[0], ))
+				f.write("%s.prototype = new %s();\n" % (sk, parents[0]))
+				f.write("%s.prototype.constructor = %s;\n\n" % (sk, sk))
+			f.write ("function %s () {\n" % (sk,))
+			k = self.klasses[sk]
+			if len(k.comment) > 0 :
+				f.write ("\n\t/*" + k.comment + "*/\n")
+			#use strict
+			f.write("\t\"use strict\";\n")
+			if k.attributes:
+				f.write("\n")
+			#all attributes are public
+			for sa, attr in k.attributes :
+				value = attr[2] == "" and "null" or attr[2]
+				f.write("\tthis.%s = %s;\n" % (sa, value))
+				#expected types checks (constructor)
+				if attr[0]:
+					f.write("\tif (typeof(this.%s) !== '%s') {\n" % (sa, attr[0]));
+					f.write("\t\tthrow \"Unexpected type '\"+typeof(this.%s)+\"' for attribute this.%s.\";\n" % (sa, sa))
+					f.write("\t}\n")
+			f.write("}\n\n")
+			#operations are defined out of class definition
+			#return the first item of given p (tuple) ie : parameter name
+			def p_name(p):
+				return p[0]
+			for so, op in k.operations :
+				# only parameter names needed
+				pars = ", ".join(map(p_name,op[2]))
+				f.write("%s.prototype.%s = function(%s) {\n" % (sk, so, pars))
+				if op[4]: f.write("\t/* %s */\n" % op[4])
+				f.write("\t\"use strict\";\n\n")
+				for p in op[2]:
+					#default values :
+					if len(p[2]) > 0 :
+						t = (p[0], p[0], p[2])
+						f.write("\tif (%s === undefined) {\n\t%s = %s;\n\t}\n" % t)
+					#expected types checks
+					if len(p[3]) > 0 :
+						f.write("\tif (typeof(%s) !== '%s') {\n" % (p[0], p[3]));
+						f.write("\t\tthrow \"Unexpected type '\"+typeof(%s)+\"' for parameter %s.\";\n" % (p[0], p[0]))
+						f.write("\t}\n");
+				f.write("\t// returns %s\n" % (op[0], ))
+				f.write("\treturn ;\n")
+				f.write("};\n\n")
+		f.close()
+		ObjRenderer.end_render(self)
+
+# #############################################################################
 # PascalRenderer: export Dia UML diagram to Object Pascal (Free Pascal, Delphi)
 #
 # Please follow some "drawing guidelines" and "naming conventions" so that the
@@ -632,4 +701,5 @@ dia.register_export ("PyDia Code Generation (Python)", "py", PyRenderer())
 dia.register_export ("PyDia Code Generation (C++)", "cxx", CxxRenderer())
 dia.register_export ("PyDia Code Generation (Pascal)", "pas", PascalRenderer())
 dia.register_export ("PyDia Code Generation (Java)", "java", JavaRenderer())
+dia.register_export ("PyDia Code Generation (JavaScript)", "js", JsRenderer())
 dia.register_export ("PyDia Code Generation (PHP)", "php", PhpRenderer())
-- 
1.7.5.4

