Annotation of embedaddon/tmux/mdoc2man.awk, revision 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>