7267
|
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
|