| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- ##############################################################################
- # Name: misc/scripts/update_doc_baseclasses.py
- # Purpose: Warns about missing classes in the "Derived from"
- # sections in the doc files
- # Created: 2007-07-28
- # Copyright: (c) 2007 Francesco Montorsi
- # Licence: wxWindows licence
- ##############################################################################
- from update_doc_utils import scanTexFiles
- # classes whose docs cannot be fixed automatically
- # because of:
- # 1) multiple inheritance
- # 2) other strange things specific of these classes
- EXCEPTIONS=['wxNotebook','wxChoicebook','wxListbook','wxToolbook','wxTreebook','wxURLDataObject','wxHScrolledWindow','wxVScrolledWindow','wxVarHVScrollHelper','wxHVScrolledWindow','wxFileStream']
- def myCallback(classname, texFileName, content, i):
- # now search the base classes for this class
- baseclasses = []
- for j in range(i,len(content)):
- line = content[j]
- if line.startswith("\wxheading{Derived from}"):
- # take all lines contained between this \wxheading and the next one
- # as base classes
- for k in range(j+1,len(content)):
- line = content[k]
- if "\wxheading" in line:
- break
- elif "\helpref" in line:
- baseclasses.append(line)
- break # we've already processed the 'derived from' section for this class
- if baseclasses == []:
- print " no base classes declared for class %s" % classname
- return True # keep going on with next \class tags
- # polish baseclasses list
- for i in range(len(baseclasses)):
- s = baseclasses[i]
- baseclasses[i] = s[s.find("{")+1:s.find("}")]
- # store the baseclasses
- tree[classname] = baseclasses
- treetex[classname] = texFileName
- treepos[classname] = j+1
- print " class '%s' has %d base class(es): %s" % (classname, len(baseclasses), ','.join(baseclasses))
- return True
- tree = dict()
- treetex = dict()
- treepos = dict()
- count = scanTexFiles(myCallback)
- print "\nProcessed %d files." % count
- print "\nNow starting to compare the base class lists.\n"
- def getFullListOfBaseClasses(classname):
- if classname not in tree or classname=='':
- return []
- # only use the first base class of info taken from .tex files
- # i.e. we assume that at least the first class declared as base class is always correct
- baseclass = tree[classname][0]
- return [baseclass] + getFullListOfBaseClasses(baseclass)
- # now compare the theorical list of base classes with the list of base
- # classes taken from the .tex files
- fixed=0
- tofix=set()
- for classname in tree:
- theorical=getFullListOfBaseClasses(classname)
- real=tree[classname]
- # compare them
- if real!=theorical:
- print "* for class '%s' documented in '%s'" % (classname,treetex[classname])
- print " theorical list: %s" % theorical
- print " declared list: %s" % real
- if classname in EXCEPTIONS:
- tofix.add(treetex[classname])
- print " cannot fix automatically (blacklisted class!)\n"
- continue
- # fix it!
- file = open(treetex[classname], "r")
- content = file.readlines()
- #print "old content is:"
- #print ''.join(content)
- # remove old \helpref lines
- startidx = treepos[classname]
- count = 0
- while count < len(tree[classname]):
- # we want to remove n \helpref lines, where 'n' is the
- # number of base classes declared
- if content[startidx].startswith('\helpref'):
- del content[startidx]
- count = count+1
- else:
- startidx = startidx+1 # probably an empty line
- # insert new ones
- if len(theorical)>1:
- for j in range(len(theorical)-1):
- c = theorical[j]
- content.insert(startidx+j, "\helpref{%s}{%s}\\\\\n" % (c, c.lower()))
- else:
- j=-1
- c = theorical[j+1]
- content.insert(startidx+j+1, "\helpref{%s}{%s}\n" % (c, c.lower()))
- #print "new content is:"
- #print ''.join(content)
- # save the file
- file = open(treetex[classname], "w")
- file.write(''.join(content))
- file.flush()
- print " fixed the .tex file\n"
- fixed=fixed+1
- print "Total number of errors reported: %d" % fixed
- print "There are %d files to fix manually:\n%s" % (len(tofix), '\n'.join(tofix))
|