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)
