📄 apibuild.py
字号:
output.write(" <macro name='%s' file='%s'>\n" % (name, self.modulename_file(id.header))) if id.info != None: try: (args, desc) = id.info if desc != None and desc != "": output.write(" <info>%s</info>\n" % (escape(desc))) self.indexString(name, desc) for arg in args: (name, desc) = arg if desc != None and desc != "": output.write(" <arg name='%s' info='%s'/>\n" % ( name, escape(desc))) self.indexString(name, desc) else: output.write(" <arg name='%s'/>\n" % (name)) except: pass output.write(" </macro>\n") def serialize_typedef(self, output, name): id = self.idx.typedefs[name] if id.info[0:7] == 'struct ': output.write(" <struct name='%s' file='%s' type='%s'" % ( name, self.modulename_file(id.header), id.info)) name = id.info[7:] if self.idx.structs.has_key(name) and ( \ type(self.idx.structs[name].info) == type(()) or type(self.idx.structs[name].info) == type([])): output.write(">\n"); try: for field in self.idx.structs[name].info: desc = field[2] self.indexString(name, desc) if desc == None: desc = '' else: desc = escape(desc) output.write(" <field name='%s' type='%s' info='%s'/>\n" % (field[1] , field[0], desc)) except: print "Failed to serialize struct %s" % (name) output.write(" </struct>\n") else: output.write("/>\n"); else : output.write(" <typedef name='%s' file='%s' type='%s'/>\n" % ( name, self.modulename_file(id.header), id.info)) def serialize_variable(self, output, name): id = self.idx.variables[name] if id.info != None: output.write(" <variable name='%s' file='%s' type='%s'/>\n" % ( name, self.modulename_file(id.header), id.info)) else: output.write(" <variable name='%s' file='%s'/>\n" % ( name, self.modulename_file(id.header))) def serialize_function(self, output, name): id = self.idx.functions[name] if name == debugsym: print "=>", id output.write(" <%s name='%s' file='%s' module='%s'>\n" % (id.type, name, self.modulename_file(id.header), self.modulename_file(id.module))) # # Processing of conditionals modified by Bill 1/1/05 # if id.conditionals != None: apstr = "" for cond in id.conditionals: if apstr != "": apstr = apstr + " && " apstr = apstr + cond output.write(" <cond>%s</cond>\n"% (apstr)); try: (ret, params, desc) = id.info output.write(" <info>%s</info>\n" % (escape(desc))) self.indexString(name, desc) if ret[0] != None: if ret[0] == "void": output.write(" <return type='void'/>\n") else: output.write(" <return type='%s' info='%s'/>\n" % ( ret[0], escape(ret[1]))) self.indexString(name, ret[1]) for param in params: if param[0] == 'void': continue if param[2] == None: output.write(" <arg name='%s' type='%s' info=''/>\n" % (param[1], param[0])) else: output.write(" <arg name='%s' type='%s' info='%s'/>\n" % (param[1], param[0], escape(param[2]))) self.indexString(name, param[2]) except: print "Failed to save function %s info: " % name, `id.info` output.write(" </%s>\n" % (id.type)) def serialize_exports(self, output, file): module = self.modulename_file(file) output.write(" <file name='%s'>\n" % (module)) dict = self.headers[file] if dict.info != None: for data in ('Summary', 'Description', 'Author'): try: output.write(" <%s>%s</%s>\n" % ( string.lower(data), escape(dict.info[data]), string.lower(data))) except: print "Header %s lacks a %s description" % (module, data) if dict.info.has_key('Description'): desc = dict.info['Description'] if string.find(desc, "DEPRECATED") != -1: output.write(" <deprecated/>\n") ids = dict.macros.keys() ids.sort() for id in uniq(ids): # Macros are sometime used to masquerade other types. if dict.functions.has_key(id): continue if dict.variables.has_key(id): continue if dict.typedefs.has_key(id): continue if dict.structs.has_key(id): continue if dict.enums.has_key(id): continue output.write(" <exports symbol='%s' type='macro'/>\n" % (id)) ids = dict.enums.keys() ids.sort() for id in uniq(ids): output.write(" <exports symbol='%s' type='enum'/>\n" % (id)) ids = dict.typedefs.keys() ids.sort() for id in uniq(ids): output.write(" <exports symbol='%s' type='typedef'/>\n" % (id)) ids = dict.structs.keys() ids.sort() for id in uniq(ids): output.write(" <exports symbol='%s' type='struct'/>\n" % (id)) ids = dict.variables.keys() ids.sort() for id in uniq(ids): output.write(" <exports symbol='%s' type='variable'/>\n" % (id)) ids = dict.functions.keys() ids.sort() for id in uniq(ids): output.write(" <exports symbol='%s' type='function'/>\n" % (id)) output.write(" </file>\n") def serialize_xrefs_files(self, output): headers = self.headers.keys() headers.sort() for file in headers: module = self.modulename_file(file) output.write(" <file name='%s'>\n" % (module)) dict = self.headers[file] ids = uniq(dict.functions.keys() + dict.variables.keys() + \ dict.macros.keys() + dict.typedefs.keys() + \ dict.structs.keys() + dict.enums.keys()) ids.sort() for id in ids: output.write(" <ref name='%s'/>\n" % (id)) output.write(" </file>\n") pass def serialize_xrefs_functions(self, output): funcs = {} for name in self.idx.functions.keys(): id = self.idx.functions[name] try: (ret, params, desc) = id.info for param in params: if param[0] == 'void': continue if funcs.has_key(param[0]): funcs[param[0]].append(name) else: funcs[param[0]] = [name] except: pass typ = funcs.keys() typ.sort() for type in typ: if type == '' or type == 'void' or type == "int" or \ type == "char *" or type == "const char *" : continue output.write(" <type name='%s'>\n" % (type)) ids = funcs[type] ids.sort() pid = '' # not sure why we have dups, but get rid of them! for id in ids: if id != pid: output.write(" <ref name='%s'/>\n" % (id)) pid = id output.write(" </type>\n") def serialize_xrefs_constructors(self, output): funcs = {} for name in self.idx.functions.keys(): id = self.idx.functions[name] try: (ret, params, desc) = id.info if ret[0] == "void": continue if funcs.has_key(ret[0]): funcs[ret[0]].append(name) else: funcs[ret[0]] = [name] except: pass typ = funcs.keys() typ.sort() for type in typ: if type == '' or type == 'void' or type == "int" or \ type == "char *" or type == "const char *" : continue output.write(" <type name='%s'>\n" % (type)) ids = funcs[type] ids.sort() for id in ids: output.write(" <ref name='%s'/>\n" % (id)) output.write(" </type>\n") def serialize_xrefs_alpha(self, output): letter = None ids = self.idx.identifiers.keys() ids.sort() for id in ids: if id[0] != letter: if letter != None: output.write(" </letter>\n") letter = id[0] output.write(" <letter name='%s'>\n" % (letter)) output.write(" <ref name='%s'/>\n" % (id)) if letter != None: output.write(" </letter>\n") def serialize_xrefs_references(self, output): typ = self.idx.identifiers.keys() typ.sort() for id in typ: idf = self.idx.identifiers[id] module = idf.header output.write(" <reference name='%s' href='%s'/>\n" % (id, 'html/' + self.basename + '-' + self.modulename_file(module) + '.html#' + id)) def serialize_xrefs_index(self, output): index = self.xref typ = index.keys() typ.sort() letter = None count = 0 chunk = 0 chunks = [] for id in typ: if len(index[id]) > 30: continue if id[0] != letter: if letter == None or count > 200: if letter != None: output.write(" </letter>\n") output.write(" </chunk>\n") count = 0 chunks.append(["chunk%s" % (chunk -1), first_letter, letter]) output.write(" <chunk name='chunk%s'>\n" % (chunk)) first_letter = id[0] chunk = chunk + 1 elif letter != None: output.write(" </letter>\n") letter = id[0] output.write(" <letter name='%s'>\n" % (letter)) output.write(" <word name='%s'>\n" % (id)) tokens = index[id]; tokens.sort() tok = None for token in tokens: if tok == token: continue tok = token output.write(" <ref name='%s'/>\n" % (token)) count = count + 1 output.write(" </word>\n") if letter != None: output.write(" </letter>\n") output.write(" </chunk>\n") if count != 0: chunks.append(["chunk%s" % (chunk -1), first_letter, letter]) output.write(" <chunks>\n") for ch in chunks: output.write(" <chunk name='%s' start='%s' end='%s'/>\n" % ( ch[0], ch[1], ch[2])) output.write(" </chunks>\n") def serialize_xrefs(self, output): output.write(" <references>\n") self.serialize_xrefs_references(output) output.write(" </references>\n") output.write(" <alpha>\n") self.serialize_xrefs_alpha(output) output.write(" </alpha>\n") output.write(" <constructors>\n") self.serialize_xrefs_constructors(output) output.write(" </constructors>\n") output.write(" <functions>\n") self.serialize_xrefs_functions(output) output.write(" </functions>\n") output.write(" <files>\n") self.serialize_xrefs_files(output) output.write(" </files>\n") output.write(" <index>\n") self.serialize_xrefs_index(output) output.write(" </index>\n") def serialize(self): filename = "%s-api.xml" % self.name print "Saving XML description %s" % (filename) output = open(filename, "w") output.write('<?xml version="1.0" encoding="ISO-8859-1"?>\n') output.write("<api name='%s'>\n" % self.name) output.write(" <files>\n") headers = self.headers.keys() headers.sort() for file in headers: self.serialize_exports(output, file) output.write(" </files>\n") output.write(" <symbols>\n") macros = self.idx.macros.keys() macros.sort() for macro in macros: self.serialize_macro(output, macro) enums = self.idx.enums.keys() enums.sort() for enum in enums: self.serialize_enum(output, enum) typedefs = self.idx.typedefs.keys() typedefs.sort() for typedef in typedefs: self.serialize_typedef(output, typedef) variables = self.idx.variables.keys() variables.sort() for variable in variables: self.serialize_variable(output, variable) functions = self.idx.functions.keys() functions.sort() for function in functions: self.serialize_function(output, function) output.write(" </symbols>\n") output.write("</api>\n") output.close() filename = "%s-refs.xml" % self.name print "Saving XML Cross References %s" % (filename) output = open(filename, "w") output.write('<?xml version="1.0" encoding="ISO-8859-1"?>\n') output.write("<apirefs name='%s'>\n" % self.name) self.serialize_xrefs(output) output.write("</apirefs>\n") output.close()def rebuild(): builder = None if glob.glob("parser.c") != [] : print "Rebuilding API description for libxml2" builder = docBuilder("libxml2", [".", "."], ["xmlwin32version.h", "tst.c"]) elif glob.glob("../parser.c") != [] : print "Rebuilding API description for libxml2" builder = docBuilder("libxml2", ["..", "../include/libxml"], ["xmlwin32version.h", "tst.c"]) elif glob.glob("../libxslt/transform.c") != [] : print "Rebuilding API description for libxslt" builder = docBuilder("libxslt", ["../libxslt"], ["win32config.h", "libxslt.h", "tst.c"]) else: print "rebuild() failed, unable to guess the module" return None builder.scan() builder.analyze() builder.serialize() if glob.glob("../libexslt/exslt.c") != [] : extra = docBuilder("libexslt", ["../libexslt"], ["libexslt.h"]) extra.scan() extra.analyze() extra.serialize() return builder## for debugging the parser#def parse(filename): parser = CParser(filename) idx = parser.parse() return idxif __name__ == "__main__": if len(sys.argv) > 1: debug = 1 parse(sys.argv[1]) else: rebuild()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -