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