88import sys
99
1010
11+ bang_join = "!" .join
12+ null_join = "" .join
13+
14+
1115class Node :
1216 __rmjunk = re .compile ("<#\d+#>" )
1317
@@ -38,24 +42,24 @@ def cmp_entry(self, other):
3842 return c or cmp (self .key , other .key ) or cmp (self .text , other .text )
3943
4044 def __repr__ (self ):
41- return "<Node for %s (%s)>" % (string . join (self .text , '!' ), self .seqno )
45+ return "<Node for %s (%s)>" % (bang_join (self .text ), self .seqno )
4246
4347 def __str__ (self ):
44- return string . join (self .key , '!' )
48+ return bang_join (self .key )
4549
4650 def dump (self ):
4751 return "%s\1 %s###%s\n " \
4852 % (string .join (self .links , "\1 " ),
49- string . join (self .text , '!' ),
53+ bang_join (self .text ),
5054 self .seqno )
5155
5256
5357def cmp_part (s1 , s2 ):
5458 result = cmp (s1 , s2 )
5559 if result == 0 :
5660 return 0
57- l1 = string .lower (s1 )
58- l2 = string .lower (s2 )
61+ l1 = s1 .lower ()
62+ l2 = s2 .lower ()
5963 minlen = min (len (s1 ), len (s2 ))
6064 if len (s1 ) < len (s2 ) and l1 == l2 [:len (s1 )]:
6165 result = - 1
@@ -68,8 +72,8 @@ def cmp_part(s1, s2):
6872
6973def split_entry (str , which ):
7074 stuff = []
71- parts = string .split (str , '!' )
72- parts = map ( string .split , parts , [ '@' ] * len ( parts ))
75+ parts = str .split ('!' )
76+ parts = [ part .split ( '@' ) for part in parts ]
7377 for entry in parts :
7478 if len (entry ) != 1 :
7579 key = entry [which ]
@@ -88,9 +92,9 @@ def split_entry_key(str):
8892 for i in range (len (parts )):
8993 m = _rmtt .match (parts [i ])
9094 if m :
91- parts [i ] = string . join (m .group (1 , 2 , 3 ), '' )
95+ parts [i ] = null_join (m .group (1 , 2 , 3 ))
9296 else :
93- parts [i ] = string . lower ( parts [i ])
97+ parts [i ] = parts [i ]. lower ( )
9498 # remove '()' from the key:
9599 parts [i ] = _rmparens .sub ('' , parts [i ])
96100 return map (trim_ignored_letters , parts )
@@ -100,7 +104,7 @@ def split_entry_text(str):
100104 if '<' in str :
101105 m = _rmtt .match (str )
102106 if m :
103- str = string . join (m .group (1 , 2 , 3 ), '' )
107+ str = null_join (m .group (1 , 2 , 3 ))
104108 return split_entry (str , 1 )
105109
106110
@@ -121,14 +125,16 @@ def load(fp):
121125def trim_ignored_letters (s ):
122126 # ignore $ to keep environment variables with the
123127 # leading letter from the name
124- s = string .lower (s )
125- if s [0 ] == "$" :
126- return s [1 :]
128+ if s .startswith ("$" ):
129+ return s [1 :].lower ()
127130 else :
128- return s
131+ return s . lower ()
129132
130133def get_first_letter (s ):
131- return string .lower (trim_ignored_letters (s )[0 ])
134+ if s .startswith ("<tex2html_percent_mark>" ):
135+ return "%"
136+ else :
137+ return trim_ignored_letters (s )[0 ]
132138
133139
134140def split_letters (nodes ):
@@ -149,14 +155,24 @@ def split_letters(nodes):
149155 return letter_groups
150156
151157
158+ def group_symbols (groups ):
159+ entries = []
160+ ident_letters = string .ascii_letters + "_"
161+ while groups [0 ][0 ] not in ident_letters :
162+ entries += groups [0 ][1 ]
163+ del groups [0 ]
164+ if entries :
165+ groups .insert (0 , ("Symbols" , entries ))
166+
167+
152168# need a function to separate the nodes into columns...
153169def split_columns (nodes , columns = 1 ):
154170 if columns <= 1 :
155171 return [nodes ]
156172 # This is a rough height; we may have to increase to avoid breaks before
157173 # a subitem.
158- colheight = len (nodes ) / columns
159- numlong = len (nodes ) % columns
174+ colheight = int ( len (nodes ) / columns )
175+ numlong = int ( len (nodes ) % columns )
160176 if numlong :
161177 colheight = colheight + 1
162178 else :
@@ -169,7 +185,7 @@ def split_columns(nodes, columns=1):
169185 del nodes [:end ]
170186 colheight = colheight - 1
171187 try :
172- numshort = len (nodes ) / colheight
188+ numshort = int ( len (nodes ) / colheight )
173189 except ZeroDivisionError :
174190 cols = cols + (columns - len (cols )) * [[]]
175191 else :
@@ -235,18 +251,18 @@ def format_column(nodes):
235251 previous = current
236252 append ("\n " )
237253 append ("</dl>" * (level + 1 ))
238- return string . join (strings , '' )
254+ return null_join (strings )
239255
240256
241257def format_nodes (nodes , columns = 1 ):
242258 strings = []
243259 append = strings .append
244260 if columns > 1 :
245261 colnos = range (columns )
246- colheight = len (nodes ) / columns
262+ colheight = int ( len (nodes ) / columns )
247263 if len (nodes ) % columns :
248264 colheight = colheight + 1
249- colwidth = 100 / columns
265+ colwidth = int ( 100 / columns )
250266 append ('<table width="100%"><tr valign="top">' )
251267 for col in split_columns (nodes , columns ):
252268 append ('<td width="%d%%">\n ' % colwidth )
@@ -256,7 +272,7 @@ def format_nodes(nodes, columns=1):
256272 else :
257273 append (format_column (nodes ))
258274 append ("\n <p>\n " )
259- return string . join (strings , '' )
275+ return null_join (strings )
260276
261277
262278def format_letter (letter ):
@@ -265,13 +281,15 @@ def format_letter(letter):
265281 elif letter == '_' :
266282 lettername = "_ (underscore)"
267283 else :
268- lettername = string . upper ( letter )
284+ lettername = letter . capitalize ( )
269285 return "\n <hr>\n <h2><a name=\" letter-%s\" >%s</a></h2>\n \n " \
270286 % (letter , lettername )
271287
272288
273- def format_html_letters (nodes , columns = 1 ):
289+ def format_html_letters (nodes , columns , group_symbol_nodes ):
274290 letter_groups = split_letters (nodes )
291+ if group_symbol_nodes :
292+ group_symbols (letter_groups )
275293 items = []
276294 for letter , nodes in letter_groups :
277295 s = "<b><a href=\" #letter-%s\" >%s</a></b>" % (letter , letter )
@@ -280,7 +298,7 @@ def format_html_letters(nodes, columns=1):
280298 for letter , nodes in letter_groups :
281299 s .append (format_letter (letter ))
282300 s .append (format_nodes (nodes , columns ))
283- return string . join ( s , '' )
301+ return null_join ( s )
284302
285303def format_html (nodes , columns ):
286304 return format_nodes (nodes , columns )
@@ -308,11 +326,11 @@ def dump(nodes, fp):
308326 fp .write (node .dump ())
309327
310328
311- def process_nodes (nodes , columns , letters ):
329+ def process_nodes (nodes , columns , letters = 0 , group_symbol_nodes = 0 ):
312330 nodes .sort ()
313331 collapse (nodes )
314332 if letters :
315- return format_html_letters (nodes , columns )
333+ return format_html_letters (nodes , columns , group_symbol_nodes )
316334 else :
317335 return format_html (nodes , columns )
318336
@@ -323,22 +341,28 @@ def main():
323341 ofn = "-"
324342 columns = 1
325343 letters = 0
344+ group_symbol_nodes = 1
326345 opts , args = getopt .getopt (sys .argv [1 :], "c:lo:" ,
327- ["columns=" , "letters" , "output=" ])
346+ ["columns=" , "dont-group-symbols" ,
347+ "group-symbols" , "letters" , "output=" ])
328348 for opt , val in opts :
329349 if opt in ("-o" , "--output" ):
330350 ofn = val
331351 elif opt in ("-c" , "--columns" ):
332- columns = string . atoi (val )
352+ columns = int (val , 10 )
333353 elif opt in ("-l" , "--letters" ):
334354 letters = 1
355+ elif opt == "--group-symbols" :
356+ group_symbol_nodes = 1
357+ elif opt == "--dont-group-symbols" :
358+ group_symbol_nodes = 0
335359 if not args :
336360 args = [ifn ]
337361 nodes = []
338362 for fn in args :
339363 nodes = nodes + load (open (fn ))
340364 num_nodes = len (nodes )
341- html = process_nodes (nodes , columns , letters )
365+ html = process_nodes (nodes , columns , letters , group_symbol_nodes )
342366 program = os .path .basename (sys .argv [0 ])
343367 if ofn == "-" :
344368 sys .stdout .write (html )
0 commit comments