⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 docmaker.py

📁 Qt/Embedded是一个多平台的C++图形用户界面应用程序框架
💻 PY
字号:
#!/usr/bin/env python## DocMaker is a very simple program used to generate HTML documentation# from the source files of the FreeType packages.#import fileinput, sys, string# This function is used to parse a source file, and extract comment blocks# from it. The following comment block formats are recognized :##  /**************************#   *#   *  FORMAT1#   *#   *#   *#   *#   *************************/##  /**************************/#  /*                        */#  /*  FORMAT2               */#  /*                        */#  /*                        */#  /*                        */#  /*                        */##  /**************************/#  /*                        */#  /*  FORMAT3               */#  /*                        */#  /*                        */#  /*                        */#  /*                        */#  /**************************/## Each block is modeled as a simple list of text strings# The function returns a list of blocks, i.e. a list of strings lists#def make_block_list():    """parse a file and extract comments blocks from it"""    list   = []    block  = []    format = 0    for line in fileinput.input():	line = string.strip(line)	l    = len(line)	if format == 0:	    if l > 3 and line[0:3] == '/**':		i = 3		while (i < l) and (line[i] == '*'):		    i = i+1		if i == l:		    # this is '/**' followed by any number of '*', the		    # beginning of a Format 1 block		    #		    block  = [];		    format = 1;		elif (i == l-1) and (line[i] == '/'):		    # this is '/**' followed by any number of '*', followed		    # by a '/', i.e. the beginning of a Format 2 or 3 block		    #		    block  = [];		    format = 2;					##############################################################	#	# FORMAT 1	#	elif format == 1:	    # if the line doesn't begin with a "*", something went	    # wrong, and we must exit, and forget the current block..	    if (l == 0) or (line[0] != '*'):		block  = []		format = 0			    # otherwise, we test for an end of block, which is an	    # arbitrary number of '*', followed by '/'	    else:		i = 1		while (i < l) and (line[i] == '*'):		    i = i+1		# test for the end of the block		if (i < l) and (line[i] == '/'):		    if block != []: list.append( block )		    format = 0		    block  = []		else:		    block.append( line[1:] )	##############################################################	#	# FORMAT 2	#	elif format == 2:	    # if the line doesn't begin with '/*' and end with '*/',	    # this is the end of the format 2 format..	    if (l < 4 ) or (line[:2] != '/*') or (line[-2:] != '*/'):		if block != []: list.append(block)		block  = []		format = 0		continue	    # remove the start and end comment delimiters, then right-strip	    # the line	    line = string.rstrip(line[2:-2])	    # check for end of a format2 block, i.e. a run of '*'	    if string.count(line,'*') == l-4:		if block != []: list.append(block)		block = []		format = 0	    else:		# otherwise, add the line to the current block		block.append(line)    return list        # This function is only used for debugging#def dump_block_list( list ):    """dump a comment block list"""    for block in list:	print "----------------------------------------"	for line in block:	    print line    print "---------the end-----------------------"######################################################################################### The DocParagraph is used to store either simple text paragraph or# source code lines### If the paragraph contains source code (use code=1 when initializing the# object), self.lines is a list of source code strings## Otherwise, self.lines is simply a list of words for the paragraph#class DocParagraph:    def __init__(self,code=0,margin=0):	self.lines  = []	self.code   = code	self.margin = margin 	    def	add(self,line):    	if self.code==0:	    # get rid of unwanted spaces in the paragraph	    self.lines.extend( string.split(line) )		else:	    # remove margin whitespace	    if string.strip( line[:self.margin] ) == "": line = line[self.margin:]	    self.lines.append(line)        def dump(self):	max_width = 50	if self.code == 0:	    cursor = 0	    line   = ""	    	    for word in self.lines:		if cursor+len(word)+1 > max_width:		    print line		    cursor = 0		    line = ""		line   = line + word + " "		cursor = cursor + len(word) + 1			    if cursor > 0:		print line	else:	    for line in self.lines:		print "--" + line			print ""######################################################################################### The DocContent class is used to store the content of a given marker# Each DocContent can have its own text, plus a list of fields. Each field# has its own text too## Hence, the following lines :##    """  #    Some arbitraty text:##      fieldone :: some arbitraty text for this field,#                  note that the text stretches to several lines##      fieldtwo :: some other text##    """## will be stored as (each text is a list of string:##    self.fields = [ "", "fieldone", "fieldtwo" ]#    self.texts  = [#                    [ "some arbitraty text for this field," ,#                      "note that the text stretches to several lines" ],##                    [ "some other text" ]#                  ]##class DocContent:    def __init__(self, paragraph_lines=[]):    	self.fields = []	self.texts  = []		code_mode   = 0	code_margin = 0		field       = ""	text        = []	paragraph   = None 	for aline in paragraph_lines:		    if code_mode == 0:		line   = string.lstrip(aline) 	        l      = len(line)		margin = len(aline) - l		# if the line is empty, this is the end of the current		# paragraph		if line == "":		    if paragraph:			text.append(paragraph)			paragraph = None		    continue	    		# test for the beginning of a code block, i.e.'{' is the first		# and only character on the line..		#		if line == '{':		    code_mode   = 1		    code_margin = margin		    if paragraph:			text.append(paragraph)		    paragraph = DocParagraph( 1, margin )		    continue	    		words = string.split(line)				# test for a field delimiter on the start of the line, i.e.		# the oken `::'		#		if len(words) >= 2 and words[1] == "::":		    if paragraph:			text.append(paragraph)			paragraph = None					    self.fields.append(field)		    self.texts.append(text)				    field = words[0]		    text  = []		    words = words[2:]					if len(words) > 0:		    line = string.join(words)		    if not paragraph:			paragraph = DocParagraph()		    paragraph.add( line )	    	    else:		line = aline				# the code block ends with a line that has a single '}' on it		if line == " "*code_margin+'}':		    text.append(paragraph)		    paragraph   = None		    code_mode   = 0		    code_margin = 0				# otherwise, add the line to the current paragraph		else:		    paragraph.add(line)		if paragraph:	    text.append(paragraph)	    	self.fields.append( field )	self.texts.append( text )            def dump(self):	for i in range(len(self.fields)):	    field = self.fields[i]	    if field: print "<field "+field+">"	    for paras in self.texts[i]:		paras.dump()	    	    if field: print "</field>	"######################################################################################### The DocBlock class is used to store a given comment block. It contains# a list of markers, as well as a list of contents for each marker.##class DocBlock:    def __init__(self, block_line_list=[]):	self.markers  = []	self.contents = []            marker   = ""        content  = []        alphanum = string.letters + string.digits + "_"            for line in block_line_list:    	    line2  = string.lstrip(line)	    l      = len(line2)	    margin = len(line) - l		    if l > 3 and line2[0] == '<':	        i = 1	        while i < l and line2[i] in alphanum: i = i+1	        if i < l and line2[i] == '>':		    if marker or content:    			self.add( marker, content )		    marker  = line2[1:i]		    content = []		    line2   = string.lstrip(line2[i+1:])		    l       = len(line2)		    line    = " "*margin + line2		    content.append(line)		if marker or content:	    self.add( marker, content )		    def add( self, marker, lines ):    	# remove the first and last empty lines from the content list	l = len(lines)	if l > 0:	    i = 0	    while l > 0 and string.strip(lines[l-1]) == "": l = l-1	    while i < l and string.strip(lines[i]) == "": i = i+1	    lines = lines[i:l]	    l     = len(lines)	    	# add a new marker only if its marker and its content list aren't empty	if l > 0 and marker:	    self.markers.append(marker)	    self.contents.append(lines)    def dump( self ):	for i in range( len(self.markers) ):	    print "["+self.markers[i]+"]"	    for line in self.contents[i]:		print "-- "+line    def doc_contents(self):	contents = []	for item in self.contents:	  contents.append( DocContent(item) )	return contentsdef dump_doc_blocks( block_list ):    for block in block_list:	docblock = DocBlock(block)	docblock.dump()	print "<<------------------->>"###def dump_single_content( block_list ):    block = block_list[0]    docblock = DocBlock(block)    print "<block>"    for i in range(len(docblock.markers)):	marker   = docblock.markers[i]	contents = docblock.contents[i]		print "<marker "+marker+">"	doccontent = DocContent( contents )	doccontent.dump()			print "</marker>"	    print "</block>"        def dump_doc_contents( block_list ):    for block in block_list:	docblock = DocBlock(block)	print "<block>"		for i in range(len(docblock.markers)):	    print "<marker "+docblock.markers[i]+">"	    content = DocContent( docblock.contents[i] )	    content.dump()	    print "</marker>"	print "</block>"def main(argv):    """main program loop"""    print "extracting comment blocks from sources .."    list = make_block_list()    #    dump_block_list( list )#    dump_doc_blocks( list )#    print "dumping block contents .."    dump_doc_contents(list)#    dump_single_content(list)# If called from the command lineif __name__=='__main__': main(sys.argv)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -