Annotation of embedaddon/tmux/mdoc2man.awk, revision 1.1.1.1

1.1       misho       1: #!/usr/bin/awk
                      2: #
                      3: # $Id: mdoc2man.awk,v 1.9 2009/10/24 00:52:42 dtucker Exp $
                      4: #
                      5: # Version history:
                      6: #  v4+ Adapted for OpenSSH Portable (see cvs Id and history)
                      7: #  v3, I put the program under a proper license
                      8: #      Dan Nelson <dnelson@allantgroup.com> added .An, .Aq and fixed a typo
                      9: #  v2, fixed to work on GNU awk --posix and MacOS X
                     10: #  v1, first attempt, didn't work on MacOS X
                     11: #
                     12: # Copyright (c) 2003 Peter Stuge <stuge-mdoc2man@cdy.org>
                     13: #
                     14: # Permission to use, copy, modify, and distribute this software for any
                     15: # purpose with or without fee is hereby granted, provided that the above
                     16: # copyright notice and this permission notice appear in all copies.
                     17: #
                     18: # THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
                     19: # WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
                     20: # MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
                     21: # ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
                     22: # WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
                     23: # ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
                     24: # OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
                     25: 
                     26: 
                     27: BEGIN {
                     28:   optlist=0
                     29:   oldoptlist=0
                     30:   nospace=0
                     31:   synopsis=0
                     32:   reference=0
                     33:   block=0
                     34:   ext=0
                     35:   extopt=0
                     36:   literal=0
                     37:   prenl=0
                     38:   breakw=0
                     39:   line=""
                     40: }
                     41: 
                     42: function wtail() {
                     43:   retval=""
                     44:   while(w<nwords) {
                     45:     if(length(retval))
                     46:       retval=retval OFS
                     47:     retval=retval words[++w]
                     48:   }
                     49:   return retval
                     50: }
                     51: 
                     52: function add(str) {
                     53:   for(;prenl;prenl--)
                     54:     line=line "\n"
                     55:   line=line str
                     56: }
                     57: 
                     58: ! /^\./ {
                     59:   for(;prenl;prenl--)
                     60:     print ""
                     61:   print
                     62:   if(literal)
                     63:     print ".br"
                     64:   next
                     65: }
                     66: 
                     67: /^\.\\"/ { next }
                     68: 
                     69: {
                     70:   option=0
                     71:   parens=0
                     72:   angles=0
                     73:   sub("^\\.","")
                     74:   nwords=split($0,words)
                     75:   for(w=1;w<=nwords;w++) {
                     76:     skip=0
                     77:     if(match(words[w],"^Li|Pf$")) {
                     78:       skip=1
                     79:     } else if(match(words[w],"^Xo$")) {
                     80:       skip=1
                     81:       ext=1
                     82:       if(length(line)&&!(match(line," $")||prenl))
                     83:        add(OFS)
                     84:     } else if(match(words[w],"^Xc$")) {
                     85:       skip=1
                     86:       ext=0
                     87:       if(!extopt)
                     88:        prenl++
                     89:       w=nwords
                     90:     } else if(match(words[w],"^Bd$")) {
                     91:       skip=1
                     92:       if(match(words[w+1],"-literal")) {
                     93:        literal=1
                     94:        prenl++
                     95:        w=nwords
                     96:       }
                     97:     } else if(match(words[w],"^Ed$")) {
                     98:       skip=1
                     99:       literal=0
                    100:     } else if(match(words[w],"^Ns$")) {
                    101:       skip=1
                    102:       if(!nospace)
                    103:        nospace=1
                    104:       sub(" $","",line)
                    105:     } else if(match(words[w],"^No$")) {
                    106:       skip=1
                    107:       sub(" $","",line)
                    108:       add(words[++w])
                    109:     } else if(match(words[w],"^Dq$")) {
                    110:       skip=1
                    111:       add("``")
                    112:       add(words[++w])
                    113:       while(w<nwords&&!match(words[w+1],"^[\\.,]"))
                    114:        add(OFS words[++w])
                    115:       add("''")
                    116:       if(!nospace&&match(words[w+1],"^[\\.,]"))
                    117:        nospace=1
                    118:     } else if(match(words[w],"^Sq|Ql$")) {
                    119:       skip=1
                    120:       add("`" words[++w] "'")
                    121:       if(!nospace&&match(words[w+1],"^[\\.,]"))
                    122:        nospace=1
                    123:     } else if(match(words[w],"^Oo$")) {
                    124:       skip=1
                    125:       extopt=1
                    126:       if(!nospace)
                    127:        nospace=1
                    128:       add("[")
                    129:     } else if(match(words[w],"^Oc$")) {
                    130:       skip=1
                    131:       extopt=0
                    132:       add("]")
                    133:     }
                    134:     if(!skip) {
                    135:       if(!nospace&&length(line)&&!(match(line," $")||prenl))
                    136:        add(OFS)
                    137:       if(nospace==1)
                    138:        nospace=0
                    139:     }
                    140:     if(match(words[w],"^Dd$")) {
                    141:       if(match(words[w+1],"^\\$Mdocdate:")) {
                    142:         w++;
                    143:         if(match(words[w+4],"^\\$$")) {
                    144:           words[w+4] = ""
                    145:         }
                    146:       }
                    147:       date=wtail()
                    148:       next
                    149:     } else if(match(words[w],"^Dt$")) {
                    150:       id=wtail()
                    151:       next
                    152:     } else if(match(words[w],"^Ux$")) {
                    153:       add("UNIX")
                    154:       skip=1
                    155:     } else if(match(words[w],"^Ox$")) {
                    156:       add("OpenBSD")
                    157:       skip=1
                    158:     } else if(match(words[w],"^Os$")) {
                    159:       add(".TH " id " \"" date "\" \"" wtail() "\"")
                    160:     } else if(match(words[w],"^Sh$")) {
                    161:       add(".SH")
                    162:       synopsis=match(words[w+1],"SYNOPSIS")
                    163:     } else if(match(words[w],"^Xr$")) {
                    164:       add("\\fB" words[++w] "\\fP(" words[++w] ")" words[++w])
                    165:     } else if(match(words[w],"^Rs$")) {
                    166:       split("",refauthors)
                    167:       nrefauthors=0
                    168:       reftitle=""
                    169:       refissue=""
                    170:       refdate=""
                    171:       refopt=""
                    172:       refreport=""
                    173:       reference=1
                    174:       next
                    175:     } else if(match(words[w],"^Re$")) {
                    176:       prenl++
                    177:       for(i=nrefauthors-1;i>0;i--) {
                    178:        add(refauthors[i])
                    179:        if(i>1)
                    180:          add(", ")
                    181:       }
                    182:       if(nrefauthors>1)
                    183:        add(" and ")
                    184:       if(nrefauthors>0)
                    185:         add(refauthors[0] ", ")
                    186:       add("\\fI" reftitle "\\fP")
                    187:       if(length(refissue))
                    188:        add(", " refissue)
                    189:       if(length(refreport)) {
                    190:        add(", " refreport)
                    191:       }
                    192:       if(length(refdate))
                    193:        add(", " refdate)
                    194:       if(length(refopt))
                    195:        add(", " refopt)
                    196:       add(".")
                    197:       reference=0
                    198:     } else if(reference) {
                    199:       if(match(words[w],"^%A$")) { refauthors[nrefauthors++]=wtail() }
                    200:       if(match(words[w],"^%T$")) {
                    201:        reftitle=wtail()
                    202:        sub("^\"","",reftitle)
                    203:        sub("\"$","",reftitle)
                    204:       }
                    205:       if(match(words[w],"^%N$")) { refissue=wtail() }
                    206:       if(match(words[w],"^%D$")) { refdate=wtail() }
                    207:       if(match(words[w],"^%O$")) { refopt=wtail() }
                    208:       if(match(words[w],"^%R$")) { refreport=wtail() }
                    209:     } else if(match(words[w],"^Nm$")) {
                    210:       if(synopsis) {
                    211:        add(".br")
                    212:        prenl++
                    213:       }
                    214:       n=words[++w]
                    215:       if(!length(name))
                    216:        name=n
                    217:       if(!length(n))
                    218:        n=name
                    219:       add("\\fB" n "\\fP")
                    220:       if(!nospace&&match(words[w+1],"^[\\.,]"))
                    221:        nospace=1
                    222:     } else if(match(words[w],"^Nd$")) {
                    223:       add("\\- " wtail())
                    224:     } else if(match(words[w],"^Fl$")) {
                    225:       add("\\fB\\-" words[++w] "\\fP")
                    226:       if(!nospace&&match(words[w+1],"^[\\.,]"))
                    227:        nospace=1
                    228:     } else if(match(words[w],"^Ar$")) {
                    229:       add("\\fI")
                    230:       if(w==nwords)
                    231:        add("file ...\\fP")
                    232:       else {
                    233:        add(words[++w] "\\fP")
                    234:        while(match(words[w+1],"^\\|$"))
                    235:          add(OFS words[++w] " \\fI" words[++w] "\\fP")
                    236:       }
                    237:       if(!nospace&&match(words[w+1],"^[\\.,]"))
                    238:        nospace=1
                    239:     } else if(match(words[w],"^Cm$")) {
                    240:       add("\\fB" words[++w] "\\fP")
                    241:       while(w<nwords&&match(words[w+1],"^[\\.,:;)]"))
                    242:        add(words[++w])
                    243:     } else if(match(words[w],"^Op$")) {
                    244:       option=1
                    245:       if(!nospace)
                    246:        nospace=1
                    247:       add("[")
                    248:     } else if(match(words[w],"^Pp$")) {
                    249:       prenl++
                    250:     } else if(match(words[w],"^An$")) {
                    251:       prenl++
                    252:     } else if(match(words[w],"^Ss$")) {
                    253:       add(".SS")
                    254:     } else if(match(words[w],"^Pa$")&&!option) {
                    255:       add("\\fI")
                    256:       w++
                    257:       if(match(words[w],"^\\."))
                    258:        add("\\&")
                    259:       add(words[w] "\\fP")
                    260:       while(w<nwords&&match(words[w+1],"^[\\.,:;)]"))
                    261:        add(words[++w])
                    262:     } else if(match(words[w],"^Dv$")) {
                    263:       add(".BR")
                    264:     } else if(match(words[w],"^Em|Ev$")) {
                    265:       add(".IR")
                    266:     } else if(match(words[w],"^Pq$")) {
                    267:       add("(")
                    268:       nospace=1
                    269:       parens=1
                    270:     } else if(match(words[w],"^Aq$")) {
                    271:       add("<")
                    272:       nospace=1
                    273:       angles=1
                    274:     } else if(match(words[w],"^S[xy]$")) {
                    275:       add(".B " wtail())
                    276:     } else if(match(words[w],"^Ic$")) {
                    277:       plain=1
                    278:       add("\\fB")
                    279:       while(w<nwords) {
                    280:        w++
                    281:        if(match(words[w],"^Op$")) {
                    282:          w++
                    283:          add("[")
                    284:          words[nwords]=words[nwords] "]"
                    285:        }
                    286:        if(match(words[w],"^Ar$")) {
                    287:          add("\\fI" words[++w] "\\fP")
                    288:        } else if(match(words[w],"^[\\.,]")) {
                    289:          sub(" $","",line)
                    290:          if(plain) {
                    291:            add("\\fP")
                    292:            plain=0
                    293:          }
                    294:          add(words[w])
                    295:        } else {
                    296:          if(!plain) {
                    297:            add("\\fB")
                    298:            plain=1
                    299:          }
                    300:          add(words[w])
                    301:        }
                    302:        if(!nospace)
                    303:          add(OFS)
                    304:       }
                    305:       sub(" $","",line)
                    306:       if(plain)
                    307:        add("\\fP")
                    308:     } else if(match(words[w],"^Bl$")) {
                    309:       oldoptlist=optlist
                    310:       if(match(words[w+1],"-bullet"))
                    311:        optlist=1
                    312:       else if(match(words[w+1],"-enum")) {
                    313:        optlist=2
                    314:        enum=0
                    315:       } else if(match(words[w+1],"-tag"))
                    316:        optlist=3
                    317:       else if(match(words[w+1],"-item"))
                    318:        optlist=4
                    319:       else if(match(words[w+1],"-bullet"))
                    320:        optlist=1
                    321:       w=nwords
                    322:     } else if(match(words[w],"^El$")) {
                    323:       optlist=oldoptlist
                    324:     } else if(match(words[w],"^Bk$")) {
                    325:       if(match(words[w+1],"-words")) {
                    326:        w++
                    327:        breakw=1
                    328:       }
                    329:     } else if(match(words[w],"^Ek$")) {
                    330:       breakw=0
                    331:     } else if(match(words[w],"^It$")&&optlist) {
                    332:       if(optlist==1)
                    333:        add(".IP \\(bu")
                    334:       else if(optlist==2)
                    335:        add(".IP " ++enum ".")
                    336:       else if(optlist==3) {
                    337:        add(".TP")
                    338:        prenl++
                    339:        if(match(words[w+1],"^Pa$|^Ev$")) {
                    340:          add(".B")
                    341:          w++
                    342:        }
                    343:       } else if(optlist==4)
                    344:        add(".IP")
                    345:     } else if(match(words[w],"^Sm$")) {
                    346:       if(match(words[w+1],"off"))
                    347:        nospace=2
                    348:       else if(match(words[w+1],"on"))
                    349:        nospace=0
                    350:       w++
                    351:     } else if(!skip) {
                    352:       add(words[w])
                    353:     }
                    354:   }
                    355:   if(match(line,"^\\.[^a-zA-Z]"))
                    356:     sub("^\\.","",line)
                    357:   if(parens)
                    358:     add(")")
                    359:   if(angles)
                    360:     add(">")
                    361:   if(option)
                    362:     add("]")
                    363:   if(ext&&!extopt&&!match(line," $"))
                    364:     add(OFS)
                    365:   if(!ext&&!extopt&&length(line)) {
                    366:     print line
                    367:     prenl=0
                    368:     line=""
                    369:   }
                    370: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>