title 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/ {
89         sid++
90         slevel = split($2,a,/\./)+1
91         if (slevel > 5)
92                 slevel = 5
93         sect = $2
94         getline
95         # todo hX, back to top
96         ss[sid] = sprintf("<a name=\"%s\" href=\"#%s\"><h%s>%s</h%s></a>\n", sect, sect, slevel, $0, slevel)
97         if ($0 == "Index")
98                 ss[sid] = ss[sid] "<pre>\n"
99         next
100 }
101
102 /^@ul/ {
103         ss[sid] = ss[sid] "<ul>\n"
104         next
105 }
106 /^@end ul/ {
107         ss[sid] = ss[sid] "</ul>\n"
108         next
109 }
110 /^@ol/ {
111         ss[sid] = ss[sid] "<ol>\n"
112         next
113 }
114 /^@end ol/ {
115         ss[sid] = ss[sid] "</ol>\n"
116         next
117 }
118
119 /^@li/ {
120         ss[sid] = ss[sid] "<li>"
121         next
122 }
123
124 /^@pre/ {
125         pre = "<pre>"
126         next
127 }
128
129 /^@end pre/ {
130         if (!pre)
131                 next
132         pre = pre "</pre>\n"
133         if (nn)
134                 note[nn] = note[nn] "\n" pre
135         else
136                 ss[sid] = ss[sid] pre
137         pre = ""
138         next
139 }
140
141 /^@note/ {
142         nn = $2+0
143         note[nn] = ""
144         next
145 }
146
147 /^@page/ {
148         nn = 0
149         p = $2
150         getline
151         i = $2
152         ss[sid] = ss[sid] "<!--page " p " indent " i "-->\n"
153         next
154 }
155
156 /^@para/ {
157         ss[sid] = ss[sid] "<p><!--para " $2 "-->\n"
158         next
159 }
160
161 /^ *(Syntax|Semantics|Description|Constraints|Synopsis|Returns)$/ {
162         ss[sid] = ss[sid] "<h6>" $0 "</h6>\n"
163         next
164 }
165
166 !seenfore {
167         ss[sid] = ss[sid] $0 "\n"
168         next
169 }
170
171 {
172         s = $0
173         p = ""
174         if (seenindex)
175                 r = " [A-Z1-9][0-9.]*"
176         else
177                 r = "[ ([][A-Z1-9]\\.[0-9.]*[0-9]"
178         # hack
179         s = " " s
180         while (match(s, r)) {
181                 p = p substr(s,1,RSTART)
182                 m = substr(s,RSTART+1,RLENGTH-1)
183                 if (m ~ /\.0$/ || m ~ /[4-9][0-9]/ || m ~ /[0-3][0-9][0-9]/ ||
184                     substr(s,RSTART+RLENGTH,1) ~ /[a-zA-Z_\-]/)
185                         p = p m
186                 else
187                         p = p "<a href=\"#" m "\">" m "</a>"
188                 s = substr(s,RSTART+RLENGTH)
189         }
190         s = p s
191         p = ""
192         while (match(s, /[Aa]nnex [A-Z]/)) {
193                 p = p substr(s,1,RSTART-1)
194                 m = substr(s,RSTART,RLENGTH)
195                 p = p "<a href=\"#" substr(m,RLENGTH,1) "\">" m "</a>"
196                 s = substr(s,RSTART+RLENGTH)
197         }
198         s = p s
199         p = ""
200         while (match(s, /&lt;[a-zA-Z0-9_]*\.h&gt;/)) {
201                 p = p substr(s,1,RSTART-1)
202                 m = substr(s,RSTART,RLENGTH)
203                 if (m in header)
204                         p = p "<a href=\"#" header[m] "\">" m "</a>"
205                 else
206                         p = p m
207                 s = substr(s,RSTART+RLENGTH)
208         }
209         s = p s
210         p = ""
211         while (match(s, noteid "\\)")) {
212                 if (noteid==1 && s !~ /\.1\)/)
213                         break
214                 p = p substr(s,1,RSTART-1)
215                 p = p "<sup><a href=\"#note" noteid "\"><b>" noteid ")</b></a></sup>"
216                 snote[sid] = snote[sid] " " noteid
217                 noteid++
218                 s = substr(s,RSTART+RLENGTH)
219         }
220         s = p s
221         sub(/^ *Forward references/, "<p><b>&</b>", s)
222         if (pre)
223                 pre = pre "\n" s
224         else if (nn)
225                 note[nn] = note[nn] s "\n"
226         else
227                 ss[sid] = ss[sid] s "\n"
228 }
229
230 END {
231         ss[sid] = ss[sid] "</pre>"
232
233         print "<html><head><title>" title "</title></head><body>"
234
235         for (i = 1; i <= sid; i++) {
236                 print ss[i]
237                 n = split(snote[i],a)
238                 if (n > 0) {
239                         s = "<h6>footnotes</h6>\n"
240                         for (j = 1; j <= n; j++) {
241                                 s = s "<p><small><a name=\"note" a[j] "\" href=\"#note" a[j] "\">" a[j] ")</a>" note[a[j]+0] "</small>\n"
242                         }
243                         print s
244                 }
245         }
246
247         print "</body></html>"
248 }'