[dia] Implementation of javascript code generation.



commit eebd028fd80b37d01bc97cc312e66f9dcaebea7f
Author: Sullivan MATAS <smatas viotech net>
Date:   Wed Aug 29 13:39:38 2012 +0200

    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.
    
    Signed-off-by: Hans Breuer <hans breuer org>

 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())



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]