Fix things.  Blame Andy Eskilsson <andy.eskilsson@telelogic.se>.

But I'm not giving this or the info files out until Andy (or anyone else)
agrees to take over the maintenance of this script!  Hah!
diff --git a/Doc/tools/partparse.py b/Doc/tools/partparse.py
index ebd1b95..bf3c78d 100644
--- a/Doc/tools/partparse.py
+++ b/Doc/tools/partparse.py
@@ -1001,6 +1001,7 @@
     hist.cindex = []
     hist.inargs = 0
     hist.enumeratenesting, hist.itemizenesting = 0, 0
+    hist.this_module = None
 
     out.doublenodes = []
     out.doublecindeces = []
@@ -1025,11 +1026,18 @@
 for name in ('url', 'module', 'function', 'cfunction',
 	     'keyword', 'method', 'exception', 'constant',
 	     'email', 'class', 'member', 'cdata', 'ctype',
-	     'member', 'sectcode', 'verb'):
+	     'member', 'sectcode', 'verb',
+             'cfunction', 'cdata', 'ctype',
+             ):
     d[name] = chunk_type[CSNAME], 'code', 0
 for name in ('emph', 'var', 'strong', 'code', 'kbd', 'key',
 	     'dfn', 'samp', 'file', 'r', 'i', 't'):
     d[name] = chunk_type[CSNAME], name, 0
+d['character'] = chunk_type[CSNAME], 'samp', 0
+d['url'] = chunk_type[CSNAME], 'code', 0
+d['email'] = chunk_type[CSNAME], 'code', 0
+d['mimetype'] = chunk_type[CSNAME], 'code', 0
+d['newsgroup'] = chunk_type[CSNAME], 'code', 0
 d['program'] = chunk_type[CSNAME], 'strong', 0
 d['\\'] = chunk_type[CSNAME], '*', 0
 # add stuff that converts to text:
@@ -1101,24 +1109,11 @@
     length = length - (newi-i)
 
     idxsi = hist.indexsubitem	# words
-    command = ''
-    cat_class = ''
-    if idxsi and idxsi[-1] in ('method', 'protocol', 'attribute'):
-	command = 'defmethod'
-	cat_class = string.join(idxsi[:-1])
-    elif len(idxsi) == 2 and idxsi[1] == 'function':
-	command = 'deffn'
-	cat_class = string.join(idxsi)
-    elif len(idxsi) == 3 and idxsi[:2] == ['in', 'module']:
-	command = 'deffn'
-	cat_class = 'function of ' + string.join(idxsi[1:])
-    elif len(idxsi) > 3 and idxsi[:2] == ['in', 'modules']:
-	command = 'deffn'
-	cat_class = 'function of ' + string.join(idxsi[1:])
-
-    if not command:
-	raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
-
+    command = 'deffn'
+    if hist.this_module:
+        cat_class = 'function of ' + hist.this_module
+    else:
+        cat_class = 'built-in function'
     ch.chtype = chunk_type[CSLINE]
     ch.data = command
 
@@ -1151,22 +1146,12 @@
     command = ''
     cat_class = ''
     class_class = ''
-    if len(idxsi) == 2 and idxsi[1] == 'exception':
-	command = 'defvr'
-	cat_class = string.join(idxsi)
-    elif len(idxsi) == 3 and idxsi[:2] == ['in', 'module']:
-	command = 'defcv'
-	cat_class = 'exception'
-	class_class = string.join(idxsi[1:])
-    elif len(idxsi) == 4 and idxsi[:3] == ['exception', 'in', 'module']:
-	command = 'defcv'
-	cat_class = 'exception'
-	class_class = string.join(idxsi[2:])
-    elif idxsi == ['built-in', 'exception', 'base', 'class']:
+    if idxsi == ['built-in', 'exception', 'base', 'class']:
 	command = 'defvr'
 	cat_class = 'exception base class'
     else:
-	raise error, 'don\'t know what to do with indexsubitem ' + `idxsi`
+	command = 'defcv'
+	cat_class = 'exception'
 
     ch.chtype = chunk_type[CSLINE]
     ch.data = command
@@ -1248,6 +1233,46 @@
     return length, i
 
 
+def add_module_index(pp, length, i, buf, ch, extra, ref=1):
+    ch.chtype = chunk_type[CSLINE]
+    ch.data = 'pindex'
+    length, newi = getnextarg(length, buf, pp, i)
+    ingroupch = pp[i:newi]
+    del pp[i:newi]
+    length = length - (newi-i)
+    if not ref:
+        if len(ingroupch) == 1:
+            hist.this_module = s(buf, ch.data)
+        else:
+            hist.this_module = None
+            print 'add_module_index() error ==>', ingroupch
+
+    if extra:
+        ingroupch.append(chunk(PLAIN, ch.where, ' '))
+        ingroupch.append(chunk(CSNAME, ch.where, 'r'))
+        ingroupch.append(chunk(GROUP, ch.where, [
+            chunk(PLAIN, ch.where, extra)]))
+
+    pp.insert(i, chunk(GROUP, ch.where, ingroupch))
+    return length+1, i+1
+
+
+def yank_indexsubitem(pp, length, i, buf, ch, cmdname):
+    stuff = pp[i].data
+    if len(stuff) != 1:
+        raise error, "first parameter to \\%s too long" % cmdname
+    if pp[i].chtype != chunk_type[GROUP]:
+        raise error, "bad chunk type following \\%s" \
+              "\nexpected GROUP, got %s" + (cmdname, str(ch.chtype))
+    text = s(buf, stuff[0].data)
+    if text[:1] != '(' or text[-1:] != ')':
+        raise error, \
+              'expected indexsubitem enclosed in parenteses'
+    hist.indexsubitem = string.split(text[1:-1])
+    del pp[i-1:i+1]
+    return length - 2, i - 1
+
+
 # regular indices: those that are not set in tt font by default....
 regindices = ('cindex', )
 
@@ -1462,6 +1487,28 @@
 		if length != len(pp):
 		    raise 'STILL, SOMETHING wrong', `i`
 
+            elif envname in ('methoddesc', 'methoddescni'):
+		length, newi = getoptarg(length, buf, pp, i)
+		ingroupch = pp[i:newi]
+		del pp[i:newi]
+		length = length - (newi-i)
+                #
+		pp.insert(i, chunk(PLAIN, ch.where, ''))
+		i, length = i+1, length+1
+		length, i = do_funcdesc(length, buf, pp, i,
+					envname[-2:] != "ni")
+
+	    elif envname in ('memberdesc', 'memberdescni'):
+		length, newi = getoptarg(length, buf, pp, i)
+		ingroupch = pp[i:newi]
+		del pp[i:newi]
+		length = length - (newi-i)
+                #
+		pp.insert(i, chunk(PLAIN, ch.where, ''))
+		i, length = i+1, length+1
+		length, i = do_datadesc(length, buf, pp, i,
+					envname[-2:] != "ni")
+
 	    elif envname in ('funcdesc', 'funcdescni', 'classdesc'):
 		pp.insert(i, chunk(PLAIN, ch.where, ''))
 		i, length = i+1, length+1
@@ -1540,7 +1587,10 @@
 		i, length = i+1, length+1
 
 	    elif envname in ('funcdesc', 'excdesc', 'datadesc', 'classdesc',
-			     'funcdescni', 'datadescni'):
+			     'funcdescni', 'datadescni',
+                             'methoddesc', 'memberdesc',
+                             'methoddescni', 'memberdescni',
+                             ):
 		pp[i:i] = [chunk(CSLINE, ch.where, 'end'),
 			   chunk(GROUP, ch.where, [
 			       chunk(PLAIN, ch.where, hist.command)])]
@@ -1623,21 +1673,28 @@
 		ch.chtype = chunk_type[PLAIN]
 
 	    elif s_buf_data == 'setindexsubitem':
-		stuff = pp[i].data
-		if len(stuff) != 1:
-		    raise error, "parameter to \\setindexsubitem{} too long"
-		if pp[i].chtype != chunk_type[GROUP]:
-		    raise error, "bad chunk type following \\setindexsubitem" \
-			  "\nexpected GROUP, got " + str(ch.chtype)
-		text = s(buf, stuff[0].data)
-		if text[:1] != '(' or text[-1:] != ')':
-		    raise error, \
-			  'expected indexsubitem enclosed in parenteses'
-		hist.indexsubitem = string.split(text[1:-1])
-		del stuff, text
-		del pp[i-1:i+1]
-		i = i - 1
-		length = length - 2
+                length, i = yank_indexsubitem(pp, length, i, buf, ch,
+                                              'setindexsubitem')
+
+            elif s_buf_data == 'withsubitem':
+                oldsubitem = hist.indexsubitem
+                try:
+                    length, i = yank_indexsubitem(pp, length, i, buf, ch,
+                                                  'withsubitem')
+                    stuff = pp[i].data
+                    del pp[i]
+                    length = length - 1
+                    changeit(buf, stuff)
+                    stuff = None
+                finally:
+                    hist.indexsubitem = oldsubitem
+
+            elif s_buf_data in ('textrm', 'pytype'):
+                stuff = pp[i].data
+                pp[i-1:i+1] = stuff
+                length = length - 2 + len(stuff)
+                stuff = None
+                i = i - 1
 
 	    elif s_buf_data == 'newcommand':
 		print "ignoring definition of \\" + s(buf, pp[i].data[0].data)
@@ -1657,6 +1714,7 @@
 		pp[i-1:i+1] = stuff
 		i = i - 1
 		length = length + len(stuff) - 2
+                stuff = None
 
 	    elif s_buf_data == 'version':
 		ch.chtype = chunk_type[PLAIN]
@@ -1684,13 +1742,15 @@
 		    command = 'vindex'
 		elif len(idxsi) == 3 and idxsi[:2] == ['in', 'module']:
 		    command = 'cindex'
+                elif len(idxsi) == 3 and idxsi[:2] == ['class', 'in']:
+                    command = 'findex'
 		else:
 		    print 'WARNING: can\'t categorize ' + `idxsi` \
 			  + ' for \'ttindex\' command'
 		    command = 'cindex'
 
 		if not cat_class:
-		    cat_class = '('+string.join(idxsi)+')'
+		    cat_class = '(%s)' % string.join(idxsi)
 
 		ch.chtype = chunk_type[CSLINE]
 		ch.data = command
@@ -1737,20 +1797,25 @@
 		    del pp[i]
 		    length = length-1
 
-## 	    elif s_buf_data == 'copyright':
-## 		if (pp[i].chtype == chunk_type[GROUP]
-## 		    and not pp[i].data):
-## 		    del pp[i]
-## 		    length = length - 1
-## 		del pp[i-1]
-## 		i, length = i-1, length-1
-
 	    elif s_buf_data == 'manpage':
 		ch.data = 'emph'
 		sect = s(buf, pp[i+1].data[0].data)
 		pp[i+1].data = "(%s)" % sect
 		pp[i+1].chtype = chunk_type[PLAIN]
 
+            elif s_buf_data == 'envvar':
+                # this should do stuff in the index, too...
+                ch.data = "$"
+                ch.chtype = chunk_type[PLAIN]
+                pp[i] = pp[i].data[0]
+
+            elif s_buf_data == 'regexp':
+                ch.data = 'code'
+                pp.insert(i+1, chunk(PLAIN, ch.where, '"'))
+                pp.insert(i-1, chunk(PLAIN, ch.where, '"'))
+                length = length + 2
+                i = i + 1
+
 	    elif s_buf_data in ('lineiii', 'lineii'):
 		# This is the most tricky one
 		# \lineiii{a1}{a2}[{a3}] -->
@@ -1790,6 +1855,7 @@
 		# @node A, , ,
 		# @xxxsection A
 		## also: remove commas and quotes
+                hist.this_module = None
 		if s_buf_data == "chapter":
 		    ch.data = hist.chaptertype
 		ch.chtype = chunk_type[CSLINE]
@@ -1913,68 +1979,24 @@
 		length, i = length+1, i+1
 
 	    elif s_buf_data in ('bimodindex', 'refbimodindex'):
-		ch.chtype = chunk_type[CSLINE]
-		ch.data = 'pindex'
-		length, newi = getnextarg(length, buf, pp, i)
-		ingroupch = pp[i:newi]
-		del pp[i:newi]
-		length = length - (newi-i)
+                length, i = add_module_index(
+                    pp, length, i, buf, ch, '(built-in)',
+                    (s_buf_data[:3] == 'ref'))
 
-		ingroupch.append(chunk(PLAIN, ch.where, ' '))
-		ingroupch.append(chunk(CSNAME, ch.where, 'r'))
-		ingroupch.append(chunk(GROUP, ch.where, [
-			  chunk(PLAIN, ch.where,
-			  '(built-in)')]))
-
-		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
-		length, i = length+1, i+1
-
-	    elif s_buf_data == 'refmodindex':
-		ch.chtype = chunk_type[CSLINE]
-		ch.data = 'pindex'
-		length, newi = getnextarg(length, buf, pp, i)
-		ingroupch = pp[i:newi]
-		del pp[i:newi]
-		length = length - (newi-i)
-
-		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
-		length, i = length+1, i+1
+	    elif s_buf_data in ('modindex', 'refmodindex'):
+                length, i = add_module_index(
+                    pp, length, i, buf, ch, '',
+                    (s_buf_data[:3] == 'ref'))
 
 	    elif s_buf_data in ('stmodindex', 'refstmodindex'):
-		ch.chtype = chunk_type[CSLINE]
-		# use the program index as module index
-		ch.data = 'pindex'
-		length, newi = getnextarg(length, buf, pp, i)
-		ingroupch = pp[i:newi]
-		del pp[i:newi]
-		length = length - (newi-i)
+                length, i = add_module_index(
+                    pp, length, i, buf, ch, '(standard)',
+                    (s_buf_data[:3] == 'ref'))
 
-		ingroupch.append(chunk(PLAIN, ch.where, ' '))
-		ingroupch.append(chunk(CSNAME, ch.where, 'r'))
-		ingroupch.append(chunk(GROUP, ch.where, [
-			  chunk(PLAIN, ch.where,
-			  '(standard)')]))
-
-		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
-		length, i = length+1, i+1
-
-	    elif s_buf_data in ('stmodindex', 'refstmodindex'):
-		ch.chtype = chunk_type[CSLINE]
-		# use the program index as module index
-		ch.data = 'pindex'
-		length, newi = getnextarg(length, buf, pp, i)
-		ingroupch = pp[i:newi]
-		del pp[i:newi]
-		length = length - (newi-i)
-
-		ingroupch.append(chunk(PLAIN, ch.where, ' '))
-		ingroupch.append(chunk(CSNAME, ch.where, 'r'))
-		ingroupch.append(chunk(GROUP, ch.where, [
-			  chunk(PLAIN, ch.where,
-			  '(standard)')]))
-
-		pp.insert(i, chunk(GROUP, ch.where, ingroupch))
-		length, i = length+1, i+1
+	    elif s_buf_data in ('exmodindex', 'refexmodindex'):
+                length, i = add_module_index(
+                    pp, length, i, buf, ch, '(extension)',
+                    (s_buf_data[:3] == 'ref'))
 
 	    elif s_buf_data == 'stindex':
 		# XXX must actually go to newindex st
@@ -2130,13 +2152,15 @@
 		i, length = i+2, length+2
 
 	    elif s_buf_data == 'seemodule':
+                # discard optional arg first:
+		length, newi = getoptarg(length, buf, pp, i)
+		ingroupch = pp[i:newi]
+		del pp[i:newi]
+		length = length - (newi-i)
+                #
 		ch.data = "code"
-		# this is needed for just one of the input files... -sigh-
-		while pp[i+1].chtype == chunk_type[COMMENT]:
-		    i = i + 1
 		data = pp[i+1].data
-		oparen = chunk(PLAIN, ch.where, " (")
-		data.insert(0, oparen)
+		data.insert(0, chunk(PLAIN, ch.where, " ("))
 		data.append(chunk(PLAIN, ch.where, ")"))
 		pp[i+1:i+2] = data
 		length = length + len(data) - 1
@@ -2162,6 +2186,7 @@
 			  chunk(GROUP, ch.where, stuff),
 			  chunk(PLAIN, ch.where, '  ')] + action \
 			  + [chunk(DENDLINE, ch.where, '\n')]
+                stuff = None
 		i = i - 1
 		pp[i:i] = chunks
 		length = length + len(chunks)
@@ -2295,7 +2320,9 @@
 		    pos = re_newline.search(text)
 		    if pos < 0:
 			break
-		    print 'WARNING: found newline in csline arg'
+                    # these seem to be completely harmless, so don't warn:
+## 		    print 'WARNING: found newline in csline arg (%s)' \
+##                           % s(buf, ch.data)
 		    wm(text[:pos] + ' ')
 		    text = text[pos+1:]
 		wm(text)