diff --git a/misc/scripts/update_doc_baseclasses.py b/misc/scripts/update_doc_baseclasses.py index 857155d46c..6618a1856e 100644 --- a/misc/scripts/update_doc_baseclasses.py +++ b/misc/scripts/update_doc_baseclasses.py @@ -1,130 +1,130 @@ -############################################################################## -# 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 -# RCS-ID: $Id: makeunixtags.sh 46320 2007-06-04 11:02:29Z VZ $ -# 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)) +############################################################################## +# 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 +# RCS-ID: $Id: makeunixtags.sh 46320 2007-06-04 11:02:29Z VZ $ +# 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)) diff --git a/misc/scripts/update_doc_libs.py b/misc/scripts/update_doc_libs.py index fbedee375e..0cec00f9d7 100755 --- a/misc/scripts/update_doc_libs.py +++ b/misc/scripts/update_doc_libs.py @@ -1,100 +1,100 @@ -############################################################################## -# Name: misc/scripts/update_doc_libs.py -# Purpose: Automatically insert \Library{} headers in the doc files -# Created: 2007-07-28 -# RCS-ID: $Id: makeunixtags.sh 46320 2007-06-04 11:02:29Z VZ $ -# Copyright: (c) 2007 Francesco Montorsi -# Licence: wxWindows licence -############################################################################## - -from update_doc_utils import scanTexFiles - -INCLUDE_PATH="../../include" - -def myCallback(classname, texFileName, content, i): - tofix.add(texFileName) # consider this .tex broken - - # now search the include file for this class - include = "" - for j in range(i,len(content)): - line = content[j] - if "wx/" in line and ".h" in line: - include = line[line.find("wx/"):line.find(".h")+2] - break - if include == "": - print " no include file declared for class %s" % classname - return True # go on with next \class - - include = include.replace("\\_", "_") - print " the include file for %s is %s" % (classname, include) - - # does this .tex already contains the \wxheading{Library} section nearby the include file? - for k in range(j,min(len(content), j+3)): - line = content[k] - if "\wxheading{Library}" in line: - print " this \class section already has its \wxheading{Library} section... skipping" - tofix.remove(texFileName) # was a valid .tex (at least for current class) - return True # go on with next \class - - # now try to understand which lib contains this class - include = INCLUDE_PATH + "/" + include - header = open(include, "r") - if not header: - print " could not open %s" % include - return True # go on with next \class - - decl = "" - content2 = header.readlines() - - # if they exist append port-specific headers contents - for c in ["wx/gtk/", "wx/msw/", "wx/mac/", "wx/generic/"]: - try: - temp = include.replace("wx/", c) - print " trying to open %s..." % temp - header = open(temp, "r") - headercontents = header.readlines() - content2 = content2 + headercontents - print " added %d lines from %s" % (len(headercontents), temp) - except: - pass - - # now search for the export-declaration associated with this class - for line in content2: - if "class " in line and classname in line: - if line.find("class") < line.find(classname): # could be a comment - if "_" in line: - decl = line[line.find("_")+1:] - decl = decl[:decl.find(" ")] - decl = decl.replace("FWD_", "") - decl = decl[0:1].upper() + decl[1:].lower() - break - elif " WXDLLEXPORT " in line: - decl = "Core" - break - - if decl == "": - print " no declaration associated with %s" % classname - return True # go on with next \class - - print " the declaration associated with %s is %s" % (classname, decl) - tofix.remove(texFileName) # was a valid .tex (at least for current class) - - # now modify the .tex file - content.insert(j+2, "\wxheading{Library}\n\n\helpref{wx%s}{librarieslist}\n\n" % decl) - - # write it - file = open(texFileName, "w") - file.write(''.join(content)) - file.flush() - - print " updated %s" % texFileName - fixed = fixed+1 - - return True - -fixed = 0 -tofix = set() -count = scanTexFiles(myCallback) - -print "\nProcessed %d files, automatically fixed %d files." % (count, fixed) -print "There are %d files to fix manually:\n%s" % (len(tofix), '\n'.join(tofix)) +############################################################################## +# Name: misc/scripts/update_doc_libs.py +# Purpose: Automatically insert \Library{} headers in the doc files +# Created: 2007-07-28 +# RCS-ID: $Id: makeunixtags.sh 46320 2007-06-04 11:02:29Z VZ $ +# Copyright: (c) 2007 Francesco Montorsi +# Licence: wxWindows licence +############################################################################## + +from update_doc_utils import scanTexFiles + +INCLUDE_PATH="../../include" + +def myCallback(classname, texFileName, content, i): + tofix.add(texFileName) # consider this .tex broken + + # now search the include file for this class + include = "" + for j in range(i,len(content)): + line = content[j] + if "wx/" in line and ".h" in line: + include = line[line.find("wx/"):line.find(".h")+2] + break + if include == "": + print " no include file declared for class %s" % classname + return True # go on with next \class + + include = include.replace("\\_", "_") + print " the include file for %s is %s" % (classname, include) + + # does this .tex already contains the \wxheading{Library} section nearby the include file? + for k in range(j,min(len(content), j+3)): + line = content[k] + if "\wxheading{Library}" in line: + print " this \class section already has its \wxheading{Library} section... skipping" + tofix.remove(texFileName) # was a valid .tex (at least for current class) + return True # go on with next \class + + # now try to understand which lib contains this class + include = INCLUDE_PATH + "/" + include + header = open(include, "r") + if not header: + print " could not open %s" % include + return True # go on with next \class + + decl = "" + content2 = header.readlines() + + # if they exist append port-specific headers contents + for c in ["wx/gtk/", "wx/msw/", "wx/mac/", "wx/generic/"]: + try: + temp = include.replace("wx/", c) + print " trying to open %s..." % temp + header = open(temp, "r") + headercontents = header.readlines() + content2 = content2 + headercontents + print " added %d lines from %s" % (len(headercontents), temp) + except: + pass + + # now search for the export-declaration associated with this class + for line in content2: + if "class " in line and classname in line: + if line.find("class") < line.find(classname): # could be a comment + if "_" in line: + decl = line[line.find("_")+1:] + decl = decl[:decl.find(" ")] + decl = decl.replace("FWD_", "") + decl = decl[0:1].upper() + decl[1:].lower() + break + elif " WXDLLEXPORT " in line: + decl = "Core" + break + + if decl == "": + print " no declaration associated with %s" % classname + return True # go on with next \class + + print " the declaration associated with %s is %s" % (classname, decl) + tofix.remove(texFileName) # was a valid .tex (at least for current class) + + # now modify the .tex file + content.insert(j+2, "\wxheading{Library}\n\n\helpref{wx%s}{librarieslist}\n\n" % decl) + + # write it + file = open(texFileName, "w") + file.write(''.join(content)) + file.flush() + + print " updated %s" % texFileName + fixed = fixed+1 + + return True + +fixed = 0 +tofix = set() +count = scanTexFiles(myCallback) + +print "\nProcessed %d files, automatically fixed %d files." % (count, fixed) +print "There are %d files to fix manually:\n%s" % (len(tofix), '\n'.join(tofix)) diff --git a/misc/scripts/update_doc_utils.py b/misc/scripts/update_doc_utils.py index 7b8382e41a..abd51b7588 100755 --- a/misc/scripts/update_doc_utils.py +++ b/misc/scripts/update_doc_utils.py @@ -1,49 +1,49 @@ -############################################################################## -# Name: misc/scripts/update_doc_utils.py -# Purpose: base utilities for others update_doc_*.py scripts -# Created: 2007-08-1 -# RCS-ID: $Id: makeunixtags.sh 46320 2007-06-04 11:02:29Z VZ $ -# Copyright: (c) 2007 Francesco Montorsi -# Licence: wxWindows licence -############################################################################## - -import sys, os, glob, distutils.file_util - -DOCS_PATH="../../docs/latex/wx" - -# Calls the given callback with the name of a documented class, its .tex related file, -# the content of that .tex file and the number of the line of the relative \class tag, -# for all documented class in DOCS_PATH. If the callback returns false the processing is stopped. -# Returns the number of .tex files processed. -def scanTexFiles(callback): - count = 0 - for f in glob.glob(DOCS_PATH + '/*.tex'): - file = open(f, "r") - if not file: - print "could not open %s" % f - continue - print "opened file %s" % f - count = count + 1 - - # search \class tags - content = file.readlines() - classdecl = 0 - for i in range(len(content)): - line = content[i] - if "\class{" in line: - classdecl = classdecl + 1 - - # polish the class name - classname = line - classname = classname[classname.find("\class{"):] - classname = classname[classname.find("{")+1:classname.find("}")] - print " the class declared is named '%s'" % classname - - # process this \class - if not callback(classname, f, content, i): - return count - - print " file %s contains %d class declarations" % (f, classdecl) - - return count - +############################################################################## +# Name: misc/scripts/update_doc_utils.py +# Purpose: base utilities for others update_doc_*.py scripts +# Created: 2007-08-1 +# RCS-ID: $Id: makeunixtags.sh 46320 2007-06-04 11:02:29Z VZ $ +# Copyright: (c) 2007 Francesco Montorsi +# Licence: wxWindows licence +############################################################################## + +import sys, os, glob, distutils.file_util + +DOCS_PATH="../../docs/latex/wx" + +# Calls the given callback with the name of a documented class, its .tex related file, +# the content of that .tex file and the number of the line of the relative \class tag, +# for all documented class in DOCS_PATH. If the callback returns false the processing is stopped. +# Returns the number of .tex files processed. +def scanTexFiles(callback): + count = 0 + for f in glob.glob(DOCS_PATH + '/*.tex'): + file = open(f, "r") + if not file: + print "could not open %s" % f + continue + print "opened file %s" % f + count = count + 1 + + # search \class tags + content = file.readlines() + classdecl = 0 + for i in range(len(content)): + line = content[i] + if "\class{" in line: + classdecl = classdecl + 1 + + # polish the class name + classname = line + classname = classname[classname.find("\class{"):] + classname = classname[classname.find("{")+1:classname.find("}")] + print " the class declared is named '%s'" % classname + + # process this \class + if not callback(classname, f, content, i): + return count + + print " file %s contains %d class declarations" % (f, classdecl) + + return count +