Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3d42266

Browse files
committed
Make this do the right thing with entries which start with the percent sign,
in response to Skip's comments in SF bug #487165. Make use of string methods instead of string module functions in most places. Add (and make the default) a way to collapse symbol entries into a single "Symbols" section in the generated index. This is similar to what makeindex does, but does not include entries beginning with an underscore.
1 parent ef338ec commit 3d42266

1 file changed

Lines changed: 54 additions & 30 deletions

File tree

Doc/tools/buildindex.py

Lines changed: 54 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
import sys
99

1010

11+
bang_join = "!".join
12+
null_join = "".join
13+
14+
1115
class 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

5357
def 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

6973
def 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):
121125
def 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

130133
def 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

134140
def 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...
153169
def 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

241257
def 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

262278
def 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

285303
def 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

Comments
 (0)