Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
emscripten-core
GitHub Repository: emscripten-core/emscripten
Path: blob/main/third_party/ply/doc/makedoc.py
6162 views
1
#!/usr/local/bin/python
2
3
###############################################################################
4
# Takes a chapter as input and adds internal links and numbering to all
5
# of the H1, H2, H3, H4 and H5 sections.
6
#
7
# Every heading HTML tag (H1, H2 etc) is given an autogenerated name to link
8
# to. However, if the name is not an autogenerated name from a previous run,
9
# it will be kept. If it is autogenerated, it might change on subsequent runs
10
# of this program. Thus if you want to create links to one of the headings,
11
# then change the heading link name to something that does not look like an
12
# autogenerated link name.
13
###############################################################################
14
15
import sys
16
import re
17
import string
18
19
###############################################################################
20
# Functions
21
###############################################################################
22
23
# Regexs for <a name="..."></a>
24
alink = re.compile(r"<a *name *= *\"(.*)\"></a>", re.IGNORECASE)
25
heading = re.compile(r"(_nn\d)", re.IGNORECASE)
26
27
def getheadingname(m):
28
autogeneratedheading = True;
29
if m.group(1) != None:
30
amatch = alink.match(m.group(1))
31
if amatch:
32
# A non-autogenerated heading - keep it
33
headingname = amatch.group(1)
34
autogeneratedheading = heading.match(headingname)
35
if autogeneratedheading:
36
# The heading name was either non-existent or autogenerated,
37
# We can create a new heading / change the existing heading
38
headingname = "%s_nn%d" % (filenamebase, nameindex)
39
return headingname
40
41
###############################################################################
42
# Main program
43
###############################################################################
44
45
if len(sys.argv) != 2:
46
print "usage: makedoc.py filename"
47
sys.exit(1)
48
49
filename = sys.argv[1]
50
filenamebase = string.split(filename,".")[0]
51
52
section = 0
53
subsection = 0
54
subsubsection = 0
55
subsubsubsection = 0
56
nameindex = 0
57
58
name = ""
59
60
# Regexs for <h1>,... <h5> sections
61
62
h1 = re.compile(r".*?<H1>(<a.*a>)*[\d\.\s]*(.*?)</H1>", re.IGNORECASE)
63
h2 = re.compile(r".*?<H2>(<a.*a>)*[\d\.\s]*(.*?)</H2>", re.IGNORECASE)
64
h3 = re.compile(r".*?<H3>(<a.*a>)*[\d\.\s]*(.*?)</H3>", re.IGNORECASE)
65
h4 = re.compile(r".*?<H4>(<a.*a>)*[\d\.\s]*(.*?)</H4>", re.IGNORECASE)
66
h5 = re.compile(r".*?<H5>(<a.*a>)*[\d\.\s]*(.*?)</H5>", re.IGNORECASE)
67
68
data = open(filename).read() # Read data
69
open(filename+".bak","w").write(data) # Make backup
70
71
lines = data.splitlines()
72
result = [ ] # This is the result of postprocessing the file
73
index = "<!-- INDEX -->\n<div class=\"sectiontoc\">\n" # index contains the index for adding at the top of the file. Also printed to stdout.
74
75
skip = 0
76
skipspace = 0
77
78
for s in lines:
79
if s == "<!-- INDEX -->":
80
if not skip:
81
result.append("@INDEX@")
82
skip = 1
83
else:
84
skip = 0
85
continue;
86
if skip:
87
continue
88
89
if not s and skipspace:
90
continue
91
92
if skipspace:
93
result.append("")
94
result.append("")
95
skipspace = 0
96
97
m = h2.match(s)
98
if m:
99
prevheadingtext = m.group(2)
100
nameindex += 1
101
section += 1
102
headingname = getheadingname(m)
103
result.append("""<H2><a name="%s"></a>%d. %s</H2>""" % (headingname,section, prevheadingtext))
104
105
if subsubsubsection:
106
index += "</ul>\n"
107
if subsubsection:
108
index += "</ul>\n"
109
if subsection:
110
index += "</ul>\n"
111
if section == 1:
112
index += "<ul>\n"
113
114
index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
115
subsection = 0
116
subsubsection = 0
117
subsubsubsection = 0
118
skipspace = 1
119
continue
120
m = h3.match(s)
121
if m:
122
prevheadingtext = m.group(2)
123
nameindex += 1
124
subsection += 1
125
headingname = getheadingname(m)
126
result.append("""<H3><a name="%s"></a>%d.%d %s</H3>""" % (headingname,section, subsection, prevheadingtext))
127
128
if subsubsubsection:
129
index += "</ul>\n"
130
if subsubsection:
131
index += "</ul>\n"
132
if subsection == 1:
133
index += "<ul>\n"
134
135
index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
136
subsubsection = 0
137
skipspace = 1
138
continue
139
m = h4.match(s)
140
if m:
141
prevheadingtext = m.group(2)
142
nameindex += 1
143
subsubsection += 1
144
subsubsubsection = 0
145
headingname = getheadingname(m)
146
result.append("""<H4><a name="%s"></a>%d.%d.%d %s</H4>""" % (headingname,section, subsection, subsubsection, prevheadingtext))
147
148
if subsubsubsection:
149
index += "</ul>\n"
150
if subsubsection == 1:
151
index += "<ul>\n"
152
153
index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
154
skipspace = 1
155
continue
156
m = h5.match(s)
157
if m:
158
prevheadingtext = m.group(2)
159
nameindex += 1
160
subsubsubsection += 1
161
headingname = getheadingname(m)
162
result.append("""<H5><a name="%s"></a>%d.%d.%d.%d %s</H5>""" % (headingname,section, subsection, subsubsection, subsubsubsection, prevheadingtext))
163
164
if subsubsubsection == 1:
165
index += "<ul>\n"
166
167
index += """<li><a href="#%s">%s</a>\n""" % (headingname,prevheadingtext)
168
skipspace = 1
169
continue
170
171
result.append(s)
172
173
if subsubsubsection:
174
index += "</ul>\n"
175
176
if subsubsection:
177
index += "</ul>\n"
178
179
if subsection:
180
index += "</ul>\n"
181
182
if section:
183
index += "</ul>\n"
184
185
index += "</div>\n<!-- INDEX -->\n"
186
187
data = "\n".join(result)
188
189
data = data.replace("@INDEX@",index) + "\n";
190
191
# Write the file back out
192
open(filename,"w").write(data)
193
194
195
196