cosmetic change (h6 is small on modern browsers)
[c-standard] / ann2html.sh
index 7b3bcac..a4c127c 100755 (executable)
@@ -14,13 +14,57 @@ BEGIN {
        gsub(/>/, "\\>")
 }
 
+!title && /^[^@]/ {
+       title = $0
+       gsub(/  +/, "  ", title)
+       gsub(/Committee Draft --/, "", title)
+}
+
 /^@sect Contents/ {
        ss[sid] = ss[sid] "</pre>\n"
        seencontents = 1
+       level = 0
+}
+
+seencontents && !seenfore && /^[^@]/ {
+       id = $1
+       if (id ~ /Annex/)
+               id = $2
+       sub(/\.$/, "", id)
+
+       s = $0
+       if (!sub(/ +\. .*/, "", s)) {
+               getline
+               sub(/^ */, " ")
+               s = s $0
+               sub(/ +\. .*/, "", s)
+       }
+
+       if (match(s, /&lt;[a-zA-Z0-9_]*\.h&gt;/)) {
+               h = substr($0,RSTART,RLENGTH)
+               if (!(h in header))
+                       header[h] = id
+       }
+
+       s = "<a href=\"#" id "\">" s "</a>\n"
+
+       s = "<li>" s
+       n = split(id, a, /\./)
+       while (n > level) {
+               s = "<ul>\n" s
+               level++
+       }
+       while (n < level) {
+               s = "</ul>\n" s
+               level--
+       }
+       ss[sid] = ss[sid] s
+       next
 }
 
 /^@sect Foreword/ {
-       ss[sid] = ss[sid] "</pre>\n"
+       while (level--)
+               ss[sid] = ss[sid] "</ul>\n"
        seenfore = 1
 }
 
@@ -35,13 +79,16 @@ BEGIN {
        sid++
        getline
        ss[sid] = ss[sid] "<h1>" $0 "</h1>\n"
-       title = $0
        if (!seencontents) {
                ss[sid] = ss[sid] "<pre>\n"
        }
        next
 }
 
+/^@sect 3\./ {
+       markdef = 1
+}
+
 /^@sect/ {
        sid++
        slevel = split($2,a,/\./)+1
@@ -50,8 +97,8 @@ BEGIN {
        sect = $2
        getline
        # todo hX, back to top
-       ss[sid] = sprintf("<a name=\"%s\" href=\"#%s\"><h%s>%s</h%s></a>\n", sect, sect, slevel, $0, slevel)
-       if ($0 ~ /^(Index|Contents)/)
+       ss[sid] = sprintf("<h%s><a name=\"%s\" href=\"#%s\">%s</a></h%s>\n", slevel, sect, sect, $0, slevel)
+       if ($0 == "Index")
                ss[sid] = ss[sid] "<pre>\n"
        next
 }
@@ -86,7 +133,7 @@ BEGIN {
 /^@end pre/ {
        if (!pre)
                next
-       pre = pre "</pre>\n"
+       pre = pre "\n</pre>\n"
        if (nn)
                note[nn] = note[nn] "\n" pre
        else
@@ -105,18 +152,17 @@ BEGIN {
        nn = 0
        p = $2
        getline
-       i = $2
-       ss[sid] = ss[sid] "<!--page " p " indent " i "-->\n"
+       ss[sid] = ss[sid] "<!--page " p " -->\n"
        next
 }
 
 /^@para/ {
-       ss[sid] = ss[sid] "<p><!--para " $2 "-->\n"
+       ss[sid] = ss[sid] "<p><!--para " $2 " -->\n"
        next
 }
 
-/^ *(Syntax|Semantics|Description|Constraints|Synopsis|Returns)$/ {
-       ss[sid] = ss[sid] "<h6>" $0 "</h6>\n"
+/^ ?(Syntax|Semantics|Description|Constraints|Synopsis|Returns|Recommended practice|Implementation limits|Environmental limits)$/ {
+       ss[sid] = ss[sid] "<p><b>" $0 "</b>\n"
        next
 }
 
@@ -158,14 +204,26 @@ BEGIN {
                p = p substr(s,1,RSTART-1)
                m = substr(s,RSTART,RLENGTH)
                if (m in header)
-                       p = p "<a href=\"#" header "\">" m "</a>"
+                       p = p "<a href=\"#" header[m] "\">" m "</a>"
                else
                        p = p m
                s = substr(s,RSTART+RLENGTH)
        }
        s = p s
        p = ""
-       while (match(s, noteid "\\)")) {
+       # TODO: false positives..
+       while (match(s, /[a-z]opt[ )"]/))
+               s = substr(s,1,RSTART) "<sub>opt</sub>" substr(s,RSTART+RLENGTH-1)
+       if (match(s, /[a-z]opt$/))
+               s = substr(s,1,RSTART) "<sub>opt</sub>"
+       for (;;) {
+               while (match(s, noteid-1 "\\)")) {
+                       p = p substr(s,1,RSTART-1)
+                       p = p "<sup><a href=\"#note" noteid-1 "\"><b>" noteid-1 ")</b></a></sup>"
+                       s = substr(s,RSTART+RLENGTH)
+               }
+               if (!match(s, noteid "\\)"))
+                       break
                if (noteid==1 && s !~ /\.1\)/)
                        break
                p = p substr(s,1,RSTART-1)
@@ -175,11 +233,11 @@ BEGIN {
                s = substr(s,RSTART+RLENGTH)
        }
        s = p s
-#      if (s ~ /^ *[1-9][0-9]*\) /) {
-#              sub(/\)/,"",s)
-#              sub(/[0-9]+/,"<sup><a name=\"note&\" href=\"#note&\"><b>&)</b></a></sup>",s)
-#      }
-
+       sub(/^ *Forward references/, "<p><b>&</b>", s)
+       if (markdef) {
+               s = "<b>" s "</b><br>"
+               markdef = 0
+       }
        if (pre)
                pre = pre "\n" s
        else if (nn)
@@ -191,16 +249,15 @@ BEGIN {
 END {
        ss[sid] = ss[sid] "</pre>"
 
-       print "<html><head><title>C</title></head><body>"
+       print "<html><head><title>" title "</title></head><body>"
 
        for (i = 1; i <= sid; i++) {
                print ss[i]
-#              if (slev[i] < 4)
                n = split(snote[i],a)
                if (n > 0) {
-                       s = "<h6>footnotes</h6>\n"
+                       s = "<p><b>Footnotes</b>\n"
                        for (j = 1; j <= n; j++) {
-                               s = s "<p><a name=\"note" a[j] "\">" a[j] ")</a>" note[a[j]+0] "\n"
+                               s = s "<p><small><a name=\"note" a[j] "\" href=\"#note" a[j] "\">" a[j] ")</a>" note[a[j]+0] "</small>\n"
                        }
                        print s
                }