📄 generator.py
字号:
for name in functions.keys(): found = 0; (desc, ret, args, file) = functions[name] for type in ctypes: classe = classes_type[type][2] if name[0:3] == "xml" and len(args) >= 1 and args[0][1] == type: found = 1 func = nameFixup(name, classe, type, file) info = (0, func, name, ret, args, file) function_classes[classe].append(info) elif name[0:3] == "xml" and len(args) >= 2 and args[1][1] == type \ and file != "python_accessor": found = 1 func = nameFixup(name, classe, type, file) info = (1, func, name, ret, args, file) function_classes[classe].append(info) elif name[0:4] == "html" and len(args) >= 1 and args[0][1] == type: found = 1 func = nameFixup(name, classe, type, file) info = (0, func, name, ret, args, file) function_classes[classe].append(info) elif name[0:4] == "html" and len(args) >= 2 and args[1][1] == type \ and file != "python_accessor": found = 1 func = nameFixup(name, classe, type, file) info = (1, func, name, ret, args, file) function_classes[classe].append(info) if found == 1: continue if name[0:8] == "xmlXPath": continue if name[0:6] == "xmlStr": continue if name[0:10] == "xmlCharStr": continue func = nameFixup(name, "None", file, file) info = (0, func, name, ret, args, file) function_classes['None'].append(info) classes = open("libxml2class.py", "w") txt = open("libxml2class.txt", "w") txt.write(" Generated Classes for libxml2-python\n\n") txt.write("#\n# Global functions of the module\n#\n\n") if function_classes.has_key("None"): flist = function_classes["None"] flist.sort(functionCompare) oldfile = "" for info in flist: (index, func, name, ret, args, file) = info if file != oldfile: classes.write("#\n# Functions from module %s\n#\n\n" % file) txt.write("\n# functions from module %s\n" % file) oldfile = file classes.write("def %s(" % func) txt.write("%s()\n" % func); n = 0 for arg in args: if n != 0: classes.write(", ") classes.write("%s" % arg[0]) n = n + 1 classes.write("):\n") writeDoc(name, args, ' ', classes); for arg in args: if classes_type.has_key(arg[1]): classes.write(" if %s is None: %s__o = None\n" % (arg[0], arg[0])) classes.write(" else: %s__o = %s%s\n" % (arg[0], arg[0], classes_type[arg[1]][0])) if ret[0] != "void": classes.write(" ret = "); else: classes.write(" "); classes.write("libxml2mod.%s(" % name) n = 0 for arg in args: if n != 0: classes.write(", "); classes.write("%s" % arg[0]) if classes_type.has_key(arg[1]): classes.write("__o"); n = n + 1 classes.write(")\n"); if ret[0] != "void": if classes_type.has_key(ret[0]): # # Raise an exception # if functions_noexcept.has_key(name): classes.write(" if ret is None:return None\n"); elif string.find(name, "URI") >= 0: classes.write( " if ret is None:raise uriError('%s() failed')\n" % (name)) elif string.find(name, "XPath") >= 0: classes.write( " if ret is None:raise xpathError('%s() failed')\n" % (name)) elif string.find(name, "Parse") >= 0: classes.write( " if ret is None:raise parserError('%s() failed')\n" % (name)) else: classes.write( " if ret is None:raise treeError('%s() failed')\n" % (name)) classes.write(" return "); classes.write(classes_type[ret[0]][1] % ("ret")); classes.write("\n"); else: classes.write(" return ret\n"); classes.write("\n"); txt.write("\n\n#\n# Set of classes of the module\n#\n\n") for classname in classes_list: if classname == "None": pass else: if classes_ancestor.has_key(classname): txt.write("\n\nClass %s(%s)\n" % (classname, classes_ancestor[classname])) classes.write("class %s(%s):\n" % (classname, classes_ancestor[classname])) classes.write(" def __init__(self, _obj=None):\n") if classes_ancestor[classname] == "xmlCore" or \ classes_ancestor[classname] == "xmlNode": classes.write(" if type(_obj).__name__ != ") classes.write("'PyCObject':\n") classes.write(" raise TypeError, ") classes.write("'%s needs a PyCObject argument'\n" % \ classname) if reference_keepers.has_key(classname): rlist = reference_keepers[classname] for ref in rlist: classes.write(" self.%s = None\n" % ref[1]) classes.write(" self._o = _obj\n") classes.write(" %s.__init__(self, _obj=_obj)\n\n" % ( classes_ancestor[classname])) if classes_ancestor[classname] == "xmlCore" or \ classes_ancestor[classname] == "xmlNode": classes.write(" def __repr__(self):\n") format = "<%s (%%s) object at 0x%%x>" % (classname) classes.write(" return \"%s\" %% (self.name, id (self))\n\n" % ( format)) else: txt.write("Class %s()\n" % (classname)) classes.write("class %s:\n" % (classname)) classes.write(" def __init__(self, _obj=None):\n") if reference_keepers.has_key(classname): list = reference_keepers[classname] for ref in list: classes.write(" self.%s = None\n" % ref[1]) classes.write(" if _obj != None:self._o = _obj;return\n") classes.write(" self._o = None\n\n"); destruct=None if classes_destructors.has_key(classname): classes.write(" def __del__(self):\n") classes.write(" if self._o != None:\n") classes.write(" libxml2mod.%s(self._o)\n" % classes_destructors[classname]); classes.write(" self._o = None\n\n"); destruct=classes_destructors[classname] flist = function_classes[classname] flist.sort(functionCompare) oldfile = "" for info in flist: (index, func, name, ret, args, file) = info # # Do not provide as method the destructors for the class # to avoid double free # if name == destruct: continue; if file != oldfile: if file == "python_accessor": classes.write(" # accessors for %s\n" % (classname)) txt.write(" # accessors\n") else: classes.write(" #\n") classes.write(" # %s functions from module %s\n" % ( classname, file)) txt.write("\n # functions from module %s\n" % file) classes.write(" #\n\n") oldfile = file classes.write(" def %s(self" % func) txt.write(" %s()\n" % func); n = 0 for arg in args: if n != index: classes.write(", %s" % arg[0]) n = n + 1 classes.write("):\n") writeDoc(name, args, ' ', classes); n = 0 for arg in args: if classes_type.has_key(arg[1]): if n != index: classes.write(" if %s is None: %s__o = None\n" % (arg[0], arg[0])) classes.write(" else: %s__o = %s%s\n" % (arg[0], arg[0], classes_type[arg[1]][0])) n = n + 1 if ret[0] != "void": classes.write(" ret = "); else: classes.write(" "); classes.write("libxml2mod.%s(" % name) n = 0 for arg in args: if n != 0: classes.write(", "); if n != index: classes.write("%s" % arg[0]) if classes_type.has_key(arg[1]): classes.write("__o"); else: classes.write("self"); if classes_type.has_key(arg[1]): classes.write(classes_type[arg[1]][0]) n = n + 1 classes.write(")\n"); if ret[0] != "void": if classes_type.has_key(ret[0]): # # Raise an exception # if functions_noexcept.has_key(name): classes.write( " if ret is None:return None\n"); elif string.find(name, "URI") >= 0: classes.write( " if ret is None:raise uriError('%s() failed')\n" % (name)) elif string.find(name, "XPath") >= 0: classes.write( " if ret is None:raise xpathError('%s() failed')\n" % (name)) elif string.find(name, "Parse") >= 0: classes.write( " if ret is None:raise parserError('%s() failed')\n" % (name)) else: classes.write( " if ret is None:raise treeError('%s() failed')\n" % (name)) # # generate the returned class wrapper for the object # classes.write(" __tmp = "); classes.write(classes_type[ret[0]][1] % ("ret")); classes.write("\n"); # # Sometime one need to keep references of the source # class in the returned class object. # See reference_keepers for the list # tclass = classes_type[ret[0]][2] if reference_keepers.has_key(tclass): list = reference_keepers[tclass] for pref in list: if pref[0] == classname: classes.write(" __tmp.%s = self\n" % pref[1]) # # return the class # classes.write(" return __tmp\n"); elif converter_type.has_key(ret[0]): # # Raise an exception # if functions_noexcept.has_key(name): classes.write( " if ret is None:return None"); elif string.find(name, "URI") >= 0: classes.write( " if ret is None:raise uriError('%s() failed')\n" % (name)) elif string.find(name, "XPath") >= 0: classes.write( " if ret is None:raise xpathError('%s() failed')\n" % (name)) elif string.find(name, "Parse") >= 0: classes.write( " if ret is None:raise parserError('%s() failed')\n" % (name)) else: classes.write( " if ret is None:raise treeError('%s() failed')\n" % (name)) classes.write(" return "); classes.write(converter_type[ret[0]] % ("ret")); classes.write("\n"); else: classes.write(" return ret\n"); classes.write("\n"); # # Generate enum constants # for type,enum in enums.items(): classes.write("# %s\n" % type) items = enum.items() items.sort(lambda i1,i2: cmp(long(i1[1]),long(i2[1]))) for name,value in items: classes.write("%s = %s\n" % (name,value)) classes.write("\n"); txt.close() classes.close()buildStubs()buildWrappers()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -