added a script to automaitcally fix 'Derived from' doc sections; updated the 'Library' sections script to be able to run it on files already having these functions (patch 1765640)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@48100 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
130
misc/scripts/update_doc_baseclasses.py
Normal file
130
misc/scripts/update_doc_baseclasses.py
Normal file
@@ -0,0 +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))
|
179
misc/scripts/update_doc_libs.py
Normal file → Executable file
179
misc/scripts/update_doc_libs.py
Normal file → Executable file
@@ -7,103 +7,94 @@
|
|||||||
# Licence: wxWindows licence
|
# Licence: wxWindows licence
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
import sys, os, glob, distutils.file_util
|
from update_doc_utils import scanTexFiles
|
||||||
|
|
||||||
tofix = set()
|
INCLUDE_PATH="../../include"
|
||||||
count = 0
|
|
||||||
for f in glob.glob('*.tex'):
|
def myCallback(classname, texFileName, content, i):
|
||||||
file = open(f, "r")
|
tofix.add(texFileName) # consider this .tex broken
|
||||||
if not file:
|
|
||||||
print "could not open %s" % f
|
# now search the include file for this class
|
||||||
continue
|
include = ""
|
||||||
print "opened file %s" % f
|
for j in range(i,len(content)):
|
||||||
count = count + 1
|
line = content[j]
|
||||||
|
if "wx/" in line and ".h" in line:
|
||||||
# search \class
|
include = line[line.find("wx/"):line.find(".h")+2]
|
||||||
content = file.readlines()
|
break
|
||||||
classdecl = 0
|
if include == "":
|
||||||
for i in range(len(content)):
|
print " no include file declared for class %s" % classname
|
||||||
line = content[i]
|
return True # go on with next \class
|
||||||
if "\class{" in line:
|
|
||||||
classdecl = classdecl + 1
|
include = include.replace("\\_", "_")
|
||||||
|
print " the include file for %s is %s" % (classname, include)
|
||||||
classname = line
|
|
||||||
classname = classname[classname.find("\class{"):]
|
# does this .tex already contains the \wxheading{Library} section nearby the include file?
|
||||||
classname = classname[classname.find("{")+1:classname.find("}")]
|
for k in range(j,min(len(content), j+3)):
|
||||||
print " the class declared is named '%s'" % classname
|
line = content[k]
|
||||||
|
if "\wxheading{Library}" in line:
|
||||||
tofix.add(f) # consider this .tex broken
|
print " this \class section already has its \wxheading{Library} section... skipping"
|
||||||
|
tofix.remove(texFileName) # was a valid .tex (at least for current class)
|
||||||
# now search the include file for this class
|
return True # go on with next \class
|
||||||
include = ""
|
|
||||||
for j in range(i,len(content)):
|
# now try to understand which lib contains this class
|
||||||
line = content[j]
|
include = INCLUDE_PATH + "/" + include
|
||||||
if "wx/" in line and ".h" in line:
|
header = open(include, "r")
|
||||||
include = line[line.find("wx/"):line.find(".h")+2]
|
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
|
break
|
||||||
if include == "":
|
|
||||||
print " no include file declared for class %s" % classname
|
|
||||||
continue
|
|
||||||
|
|
||||||
include = include.replace("\\_", "_")
|
|
||||||
print " the include file for %s is %s" % (classname, include)
|
|
||||||
|
|
||||||
# now try to understand which libs contains this class
|
|
||||||
include = "../../../include/" + include
|
|
||||||
header = open(include, "r")
|
|
||||||
if not file:
|
|
||||||
print " could not open %s" % include
|
|
||||||
continue
|
|
||||||
|
|
||||||
decl = ""
|
if decl == "":
|
||||||
content2 = header.readlines()
|
print " no declaration associated with %s" % classname
|
||||||
|
return True # go on with next \class
|
||||||
# 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
|
|
||||||
|
|
||||||
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
|
|
||||||
continue
|
|
||||||
|
|
||||||
print " the declaration associated with %s is %s" % (classname, decl)
|
|
||||||
tofix.remove(f) # 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(f, "w")
|
|
||||||
file.write(''.join(content))
|
|
||||||
file.flush()
|
|
||||||
|
|
||||||
file = open(f, "r")
|
|
||||||
|
|
||||||
print " updated %s" % f
|
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
|
||||||
print " file %s contains %d class declarations" % (f, classdecl)
|
content.insert(j+2, "\wxheading{Library}\n\n\helpref{wx%s}{librarieslist}\n\n" % decl)
|
||||||
|
|
||||||
print "\nProcessed %d files." % count
|
# write it
|
||||||
print "There are %d files to fix:\n%s" % (len(tofix), '\n'.join(tofix))
|
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))
|
||||||
|
49
misc/scripts/update_doc_utils.py
Executable file
49
misc/scripts/update_doc_utils.py
Executable file
@@ -0,0 +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
|
||||||
|
|
Reference in New Issue
Block a user