def gen_classes(nodes, ct, classes): classes.add(ct) for child in nodes: class_mapping = mp_actor member = child.attrib["member"] res_id = "" if "id" in child.attrib: res_id = child.attrib["id"] if not res_id: res_id = os.path.splitext(child.attrib["file"])[0] class_mapping = mp_sprite if "ref" in child.attrib: class_mapping = mp_sprite try: #print res_id class_name = child.attrib["class"] class_mapping = find_mapping(class_name, classes) if not class_mapping: if class_name.endswith("<"): class_name = class_name.rstrip("<") class_mapping = class_type(class_name, "sp" + class_name, class_name, class_name + ".h", ns="", member=res_id, parent=mp_sprite, generated=True) gen_classes(nodes, class_mapping, classes) elif class_name.startswith(">"): return else: class_mapping = class_type(class_name, "sp" + class_name, class_name, class_name + ".h", ns="") except KeyError: pass classes.add(class_mapping) index = child.attrib["order"] ct.members.append(class_member(member, class_mapping, res_id))
def gen_classes(nodes, ct, classes): classes.add(ct) for child in nodes: class_mapping = mp_actor member = child.attrib["member"] res_id = "" if "id" in child.attrib: res_id = child.attrib["id"] if not res_id: res_id = os.path.splitext(child.attrib["file"])[0] class_mapping = mp_sprite if "ref" in child.attrib: class_mapping = mp_sprite try: # print res_id class_name = child.attrib["class"] class_mapping = find_mapping(class_name, classes) if not class_mapping: if class_name.endswith("<"): class_name = class_name.rstrip("<") class_mapping = class_type( class_name, "sp" + class_name, class_name, class_name + ".h", ns="", member=res_id, parent=mp_sprite, generated=True, ) gen_classes(nodes, class_mapping, classes) elif class_name.startswith(">"): return else: class_mapping = class_type(class_name, "sp" + class_name, class_name, class_name + ".h", ns="") except KeyError: pass classes.add(class_mapping) index = child.attrib["order"] ct.members.append(class_member(member, class_mapping, res_id))
def gen2(xml_res_file, dest_folder, mappings): global user_mp user_mp = mappings import os from sets import Set from jinja2 import Environment, FileSystemLoader if not os.path.exists(dest_folder): os.makedirs(dest_folder) xml_res_file = os.path.normpath(xml_res_file) xml_res_file = xml_res_file.replace("\\", "/") from os import path doc = minidom.parse(xml_res_file) root = doc.documentElement folder = os.path.split(__file__)[0] + "/gen_view_code/templates" env = Environment(trim_blocks = True, lstrip_blocks = True, loader = FileSystemLoader(folder)) class_h_template = env.get_template("class.h") class_cpp_template = env.get_template("class.cpp") import StringIO classes_node = root.getElementsByTagName("class")[0] classes = Set() for class_node in classes_node.childNodes: if class_node.nodeType == class_node.TEXT_NODE: continue res = [] get_plain_actors(class_node, res) class_name = class_node.getAttribute("class") local_classes = Set() parent = find_mapping(class_node.nodeName, classes) custom_class = class_type("sp" + class_name, class_name, class_name + ".h", ns = "", member = "", parent = parent, generated=True) classes.add(custom_class) local_classes.add(custom_class) header = StringIO.StringIO() cpp = StringIO.StringIO() for node in res: name = node.getAttribute("name") ct = find_mapping(node.nodeName, classes) custom_class.members.append(class_member(name, ct)) classes.add(ct) local_classes.add(ct) cls = list(local_classes) q = 0 cls.sort(cmp = lambda a, b: cmp(b.ns, a.ns) or cmp(b.primary, a.primary) or cmp(a.className, b.className)) includes = [inc for inc in cls if inc.header] args = {"types":cls, "ct":custom_class, "includes":includes} header.write(env.get_template("header.h").render(**args)) cpp.write(env.get_template("header.cpp").render(**args)) args = {"ct":custom_class, "xml":xml_res_file, "members":custom_class.members} header.write(class_h_template.render(**args)) cpp.write(class_cpp_template.render(**args)) header_name = class_name + ".h" cpp_name = class_name + ".cpp" gen_code = class_node.getAttribute("gencode") if gen_code == "false": continue save_if_changed(dest_folder + header_name, header.getvalue()) save_if_changed(dest_folder + cpp_name, cpp.getvalue())
def save_if_changed(name, content): try: with open(name, "r") as rd: data = rd.read() if data == content: return except IOError: pass with open(name, "w") as rd: rd.write(content) mp_actor = class_type("spActor", "Actor", "Actor.h") mp_button = class_type("spButton", "Button", "Button.h") mp_text = class_type("spTextActor", "TextActor", "TextActor.h") mp_bar = class_type("spProgressBar", "ProgressBar", "ProgressBar.h") mp_clip = class_type("spClipRectActor", "ClipRectActor", "ClipRectActor.h") mp_sprite = class_type("spSprite", "Sprite", "Sprite.h") mp_sliding = class_type("spSlidingActor", "SlidingActor", "SlidingActor.h") mp_color = class_type("spColorRectSprite", "ColorRectSprite", "ColorRectSprite.h") mp_box9sprite = class_type("spBox9Sprite", "Box9Sprite", "Box9Sprite.h") mp_view = class_type("spView", "View", "View.h") def_mappings = (mp_bar, mp_clip, mp_button, mp_text, mp_actor,
def gen2(xml_res_file, dest_folder, mappings): global user_mp user_mp = mappings import os from jinja2 import Environment, FileSystemLoader if not os.path.exists(dest_folder): os.makedirs(dest_folder) xml_res_file = os.path.normpath(xml_res_file) xml_res_file = xml_res_file.replace("\\", "/") from os import path doc = minidom.parse(xml_res_file) root = doc.documentElement folder = os.path.split(__file__)[0] + "/gen_view_code/templates" env = Environment(trim_blocks=True, lstrip_blocks=True, loader=FileSystemLoader(folder)) class_h_template = env.get_template("class.h") class_cpp_template = env.get_template("class.cpp") import io classes_node = root.getElementsByTagName("class")[0] classes = set() for class_node in classes_node.childNodes: if class_node.nodeType == class_node.TEXT_NODE: continue res = [] get_plain_actors(class_node, res) class_name = class_node.getAttribute("class") local_classes = set() parent = find_mapping(class_node.nodeName, classes) custom_class = class_type("sp" + class_name, class_name, class_name + ".h", ns="", member="", parent=parent, generated=True) classes.add(custom_class) local_classes.add(custom_class) header = io.StringIO() cpp = io.StringIO() for node in res: name = node.getAttribute("name") ct = find_mapping(node.nodeName, classes) custom_class.members.append(class_member(name, ct)) classes.add(ct) local_classes.add(ct) cls = list(local_classes) q = 0 def ff(a, b): def cmp(a, b): if a < b: return -1 if a > b: return 1 return 0 return cmp(b.ns, a.ns) or cmp(b.primary, a.primary) or cmp( a.className, b.className) import functools cls.sort(key=functools.cmp_to_key(ff)) includes = [inc for inc in cls if inc.header] args = {"types": cls, "ct": custom_class, "includes": includes} header.write(env.get_template("header.h").render(**args)) cpp.write(env.get_template("header.cpp").render(**args)) args = { "ct": custom_class, "xml": xml_res_file, "members": custom_class.members } header.write(class_h_template.render(**args)) cpp.write(class_cpp_template.render(**args)) header_name = class_name + ".h" cpp_name = class_name + ".cpp" gen_code = class_node.getAttribute("gencode") if gen_code == "false": continue save_if_changed(dest_folder + header_name, header.getvalue()) save_if_changed(dest_folder + cpp_name, cpp.getvalue())
def save_if_changed(name, content): try: with open(name, "r") as rd: data = rd.read() if data == content: return except IOError: pass with open(name, "w") as rd: rd.write(content) mp_actor = class_type("spActor", "Actor", "Actor.h") mp_button = class_type("spButton", "Button", "Button.h") mp_text = class_type("spTextField", "TextField", "TextField.h") mp_bar = class_type("spProgressBar", "ProgressBar", "ProgressBar.h") mp_clip = class_type("spClipRectActor", "ClipRectActor", "ClipRectActor.h") mp_sprite = class_type("spSprite", "Sprite", "Sprite.h") mp_sliding = class_type("spSlidingActor", "SlidingActor", "SlidingActor.h") mp_color = class_type("spColorRectSprite", "ColorRectSprite", "ColorRectSprite.h") mp_box9sprite = class_type("spBox9Sprite", "Box9Sprite", "Box9Sprite.h") mp_polygon = class_type("spPolygon", "Polygon", "Polygon.h") mp_msprite = class_type("spMaskedSprite", "MaskedSprite", "MaskedSprite.h") mp_view = class_type("spView", "View", "View.h") def_mappings = (mp_bar, mp_clip, mp_button, mp_text, mp_actor, mp_sprite, mp_sliding, mp_color, mp_box9sprite, mp_polygon, mp_msprite)