<sub>opt</sub> fix
[c-standard] / ann2html.sh
1 #!/bin/sh
2
3 export LC_ALL=C
4 awk '
5 BEGIN {
6         noteid = 1
7         sid = 1
8         ss[sid] = "<pre>"
9 }
10
11 {
12         gsub(/\&/, "\\&amp;")
13         gsub(/</, "\\&lt;")
14         gsub(/>/, "\\&gt;")
15 }
16
17 !title && /^[^@]/ {
18         title = $0
19         gsub(/  +/, "  ", title)
20         gsub(/Committee Draft --/, "", title)
21 }
22
23 /^@sect Contents/ {
24         ss[sid] = ss[sid] "</pre>\n"
25         seencontents = 1
26         level = 0
27 }
28
29 seencontents && !seenfore && /^[^@]/ {
30         id = $1
31         if (id ~ /Annex/)
32                 id = $2
33         sub(/\.$/, "", id)
34
35         s = $0
36         if (!sub(/ +\. .*/, "", s)) {
37                 getline
38                 sub(/^ */, " ")
39                 s = s $0
40                 sub(/ +\. .*/, "", s)
41         }
42
43         if (match(s, /&lt;[a-zA-Z0-9_]*\.h&gt;/)) {
44                 h = substr($0,RSTART,RLENGTH)
45                 if (!(h in header))
46                         header[h] = id
47         }
48
49         s = "<a href=\"#" id "\">" s "</a>\n"
50
51         s = "<li>" s
52         n = split(id, a, /\./)
53         while (n > level) {
54                 s = "<ul>\n" s
55                 level++
56         }
57         while (n < level) {
58                 s = "</ul>\n" s
59                 level--
60         }
61         ss[sid] = ss[sid] s
62         next
63 }
64
65 /^@sect Foreword/ {
66         while (level--)
67                 ss[sid] = ss[sid] "</ul>\n"
68         seenfore = 1
69 }
70
71 /^@sect Index/ {
72         seenindex = 1
73 }
74
75 /^@title/ {
76         if (!seencontents) {
77                 ss[sid] = ss[sid] "</pre>\n"
78         }
79         sid++
80         getline
81         ss[sid] = ss[sid] "<h1>" $0 "</h1>\n"
82         if (!seencontents) {
83                 ss[sid] = ss[sid] "<pre>\n"
84         }
85         next
86 }
87
88 /^@sect 3\./ {
89         markdef = 1
90 }
91
92 /^@sect/ {
93         sid++
94         slevel = split($2,a,/\./)+1
95         if (slevel > 5)
96                 slevel = 5
97         sect = $2
98         getline
99         # todo hX, back to top
100         ss[sid] = sprintf("<h%s><a name=\"%s\" href=\"#%s\">%s</a></h%s>\n", slevel, sect, sect, $0, slevel)
101         if ($0 == "Index")
102                 ss[sid] = ss[sid] "<pre>\n"
103         next
104 }
105
106 /^@ul/ {
107         ss[sid] = ss[sid] "<ul>\n"
108         next
109 }
110 /^@end ul/ {
111         ss[sid] = ss[sid] "</ul>\n"
112         next
113 }
114 /^@ol/ {
115         ss[sid] = ss[sid] "<ol>\n"
116         next
117 }
118 /^@end ol/ {
119         ss[sid] = ss[sid] "</ol>\n"
120         next
121 }
122
123 /^@li/ {
124         ss[sid] = ss[sid] "<li>"
125         next
126 }
127
128 /^@pre/ {
129         pre = "<pre>"
130         next
131 }
132
133 /^@end pre/ {
134         if (!pre)
135                 next
136         pre = pre "\n</pre>\n"
137         if (nn)
138                 note[nn] = note[nn] "\n" pre
139         else
140                 ss[sid] = ss[sid] pre
141         pre = ""
142         next
143 }
144
145 /^@note/ {
146         nn = $2+0
147         note[nn] = ""
148         next
149 }
150
151 /^@page/ {
152         nn = 0
153         p = $2
154         getline
155         ss[sid] = ss[sid] "<!--page " p " -->\n"
156         next
157 }
158
159 /^@para/ {
160         ss[sid] = ss[sid] "<p><!--para " $2 " -->\n"
161         next
162 }
163
164 /^ ?(Syntax|Semantics|Description|Constraints|Synopsis|Returns|Recommended practice|Implementation limits|Environmental limits)$/ {
165         ss[sid] = ss[sid] "<h6>" $0 "</h6>\n"
166         next
167 }
168
169 !seenfore {
170         ss[sid] = ss[sid] $0 "\n"
171         next
172 }
173
174 {
175         s = $0
176         p = ""
177         if (seenindex)
178                 r = " [A-Z1-9][0-9.]*"
179         else
180                 r = "[ ([][A-Z1-9]\\.[0-9.]*[0-9]"
181         # hack
182         s = " " s
183         while (match(s, r)) {
184                 p = p substr(s,1,RSTART)
185                 m = substr(s,RSTART+1,RLENGTH-1)
186                 if (m ~ /\.0$/ || m ~ /[4-9][0-9]/ || m ~ /[0-3][0-9][0-9]/ ||
187                     substr(s,RSTART+RLENGTH,1) ~ /[a-zA-Z_\-]/)
188                         p = p m
189                 else
190                         p = p "<a href=\"#" m "\">" m "</a>"
191                 s = substr(s,RSTART+RLENGTH)
192         }
193         s = p s
194         p = ""
195         while (match(s, /[Aa]nnex [A-Z]/)) {
196                 p = p substr(s,1,RSTART-1)
197                 m = substr(s,RSTART,RLENGTH)
198                 p = p "<a href=\"#" substr(m,RLENGTH,1) "\">" m "</a>"
199                 s = substr(s,RSTART+RLENGTH)
200         }
201         s = p s
202         p = ""
203         while (match(s, /&lt;[a-zA-Z0-9_]*\.h&gt;/)) {
204                 p = p substr(s,1,RSTART-1)
205                 m = substr(s,RSTART,RLENGTH)
206                 if (m in header)
207                         p = p "<a href=\"#" header[m] "\">" m "</a>"
208                 else
209                         p = p m
210                 s = substr(s,RSTART+RLENGTH)
211         }
212         s = p s
213         p = ""
214         # TODO: false positives..
215         while (match(s, /[a-z]opt[ )"]/))
216                 s = substr(s,1,RSTART) "<sub>opt</sub>" substr(s,RSTART+RLENGTH-1)
217         if (match(s, /[a-z]opt$/))
218                 s = substr(s,1,RSTART) "<sub>opt</sub>"
219         for (;;) {
220                 while (match(s, noteid-1 "\\)")) {
221                         p = p substr(s,1,RSTART-1)
222                         p = p "<sup><a href=\"#note" noteid-1 "\"><b>" noteid-1 ")</b></a></sup>"
223                         s = substr(s,RSTART+RLENGTH)
224                 }
225                 if (!match(s, noteid "\\)"))
226                         break
227                 if (noteid==1 && s !~ /\.1\)/)
228                         break
229                 p = p substr(s,1,RSTART-1)
230                 p = p "<sup><a href=\"#note" noteid "\"><b>" noteid ")</b></a></sup>"
231                 snote[sid] = snote[sid] " " noteid
232                 noteid++
233                 s = substr(s,RSTART+RLENGTH)
234         }
235         s = p s
236         sub(/^ *Forward references/, "<p><b>&</b>", s)
237         if (markdef) {
238                 s = "<b>" s "</b><br>"
239                 markdef = 0
240         }
241         if (pre)
242                 pre = pre "\n" s
243         else if (nn)
244                 note[nn] = note[nn] s "\n"
245         else
246                 ss[sid] = ss[sid] s "\n"
247 }
248
249 END {
250         ss[sid] = ss[sid] "</pre>"
251
252         print "<html><head><title>" title "</title></head><body>"
253
254         for (i = 1; i <= sid; i++) {
255                 print ss[i]
256                 n = split(snote[i],a)
257                 if (n > 0) {
258                         s = "<h6>footnotes</h6>\n"
259                         for (j = 1; j <= n; j++) {
260                                 s = s "<p><small><a name=\"note" a[j] "\" href=\"#note" a[j] "\">" a[j] ")</a>" note[a[j]+0] "</small>\n"
261                         }
262                         print s
263                 }
264         }
265
266         print "</body></html>"
267 }'