Blame doc/mdoc2wiki.awk

Packit Service 1d0348
#!/usr/bin/awk
Packit Service 1d0348
#
Packit Service 1d0348
# Copyright (c) 2003 Peter Stuge <stuge-mdoc2man@cdy.org>
Packit Service 1d0348
#
Packit Service 1d0348
# Permission to use, copy, modify, and distribute this software for any
Packit Service 1d0348
# purpose with or without fee is hereby granted, provided that the above
Packit Service 1d0348
# copyright notice and this permission notice appear in all copies.
Packit Service 1d0348
#
Packit Service 1d0348
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
Packit Service 1d0348
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
Packit Service 1d0348
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
Packit Service 1d0348
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
Packit Service 1d0348
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
Packit Service 1d0348
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Packit Service 1d0348
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Packit Service 1d0348
Packit Service 1d0348
# Dramatically overhauled by Tim Kientzle.  This version almost
Packit Service 1d0348
# handles library-style pages with Fn, Ft, etc commands.  Still
Packit Service 1d0348
# a lot of problems...
Packit Service 1d0348
Packit Service 1d0348
BEGIN {
Packit Service 1d0348
  displaylines = 0
Packit Service 1d0348
  listdepth = 0
Packit Service 1d0348
  trailer = ""
Packit Service 1d0348
  out = ""
Packit Service 1d0348
  sep = ""
Packit Service 1d0348
  nextsep = " "
Packit Service 1d0348
  spaces = "                    "
Packit Service 1d0348
Packit Service 1d0348
  NORMAL_STATE = 0
Packit Service 1d0348
  PRETAG_STATE = 1
Packit Service 1d0348
  STATE = NORMAL_STATE
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
# Add a word with appropriate preceding whitespace
Packit Service 1d0348
# Maintain a short queue of the expected upcoming word separators.
Packit Service 1d0348
function add(str) {
Packit Service 1d0348
  out=out sep str
Packit Service 1d0348
  sep = nextsep
Packit Service 1d0348
  nextsep = " "
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
# Add a word with no following whitespace
Packit Service 1d0348
# Use for opening punctuation such as '('
Packit Service 1d0348
function addopen(str) {
Packit Service 1d0348
  add(str)
Packit Service 1d0348
  sep = ""
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
# Add a word with no preceding whitespace
Packit Service 1d0348
# Use for closing punctuation such as ')' or '.'
Packit Service 1d0348
function addclose(str) {
Packit Service 1d0348
  sep = ""
Packit Service 1d0348
  add(str)
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
# Add a word with no space before or after
Packit Service 1d0348
# Use for separating punctuation such as '='
Packit Service 1d0348
function addpunct(str) {
Packit Service 1d0348
  sep = ""
Packit Service 1d0348
  add(str)
Packit Service 1d0348
  sep = ""
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
# Emit the current line so far
Packit Service 1d0348
function endline() {
Packit Service 1d0348
  addclose(trailer)
Packit Service 1d0348
  trailer = ""
Packit Service 1d0348
  if(length(out) > 0) {
Packit Service 1d0348
    if (STATE == PRETAG_STATE) {
Packit Service 1d0348
      print out
Packit Service 1d0348
    } else {
Packit Service 1d0348
      print out " "
Packit Service 1d0348
    }
Packit Service 1d0348
    out=""
Packit Service 1d0348
  }
Packit Service 1d0348
  if(displaylines > 0) {
Packit Service 1d0348
    displaylines = displaylines - 1
Packit Service 1d0348
    if (displaylines == 0)
Packit Service 1d0348
      dispend()
Packit Service 1d0348
  }
Packit Service 1d0348
  # First word on next line has no preceding whitespace
Packit Service 1d0348
  sep = ""
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
function linecmd(cmd) {
Packit Service 1d0348
  endline()
Packit Service 1d0348
  add(cmd)
Packit Service 1d0348
  endline()
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
function breakline() {
Packit Service 1d0348
  linecmd("
")
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
function crossref(name, sect, other) {
Packit Service 1d0348
  if (name == "cpio" && sect == 1) {
Packit Service 1d0348
    n = "ManPageBsdcpio1"
Packit Service 1d0348
  } else if (name == "cpio" && sect == 5) {
Packit Service 1d0348
    n = "ManPageCpio5"
Packit Service 1d0348
  } else if (name == "mtree" && sect == 5) {
Packit Service 1d0348
    n = "ManPageMtree5"
Packit Service 1d0348
  } else if (name == "tar" && sect == 1) {
Packit Service 1d0348
    n = "ManPageBsdtar1"
Packit Service 1d0348
  } else if (name == "tar" && sect == 5) {
Packit Service 1d0348
    n = "ManPageTar5"
Packit Service 1d0348
  } else if (!match(name, "^archive") && !match(name, "^libarchive")) {
Packit Service 1d0348
    n = name "(" sect ")|http://www.freebsd.org/cgi/man.cgi?query=" name "&sektion=" sect
Packit Service 1d0348
  } else {
Packit Service 1d0348
    n = "ManPage"
Packit Service 1d0348
    numbits = split(name, namebits, "[_-]")
Packit Service 1d0348
    for (i = 1; i <= numbits; ++i) {
Packit Service 1d0348
      p = namebits[i]
Packit Service 1d0348
      n = n toupper(substr(p, 0, 1)) substr(p, 2)
Packit Service 1d0348
    }
Packit Service 1d0348
    n = n sect
Packit Service 1d0348
  }
Packit Service 1d0348
  n = "[[" n "]]"
Packit Service 1d0348
  if (length other > 0)
Packit Service 1d0348
    n = n other
Packit Service 1d0348
  return n
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
# Start an indented display
Packit Service 1d0348
function dispstart() {
Packit Service 1d0348
  endline()
Packit Service 1d0348
  print "```text"
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
# End an indented display
Packit Service 1d0348
function dispend() {
Packit Service 1d0348
  endline()
Packit Service 1d0348
  print "```"
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
# Collect rest of input line
Packit Service 1d0348
function wtail() {
Packit Service 1d0348
  retval=""
Packit Service 1d0348
  while(w
Packit Service 1d0348
    if(length(retval))
Packit Service 1d0348
      retval=retval " "
Packit Service 1d0348
    retval=retval words[++w]
Packit Service 1d0348
  }
Packit Service 1d0348
  return retval
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
function splitwords(l, dest, n, o, w) {
Packit Service 1d0348
  n = 1
Packit Service 1d0348
  delete dest
Packit Service 1d0348
  while (length(l) > 0) {
Packit Service 1d0348
    sub("^[ \t]*", "", l)
Packit Service 1d0348
    if (match(l, "^\"")) {
Packit Service 1d0348
      l = substr(l, 2)
Packit Service 1d0348
      o = index(l, "\"")
Packit Service 1d0348
      if (o > 0) {
Packit Service 1d0348
        w = substr(l, 1, o-1)
Packit Service 1d0348
        l = substr(l, o+1)
Packit Service 1d0348
        dest[n++] = w
Packit Service 1d0348
      } else {
Packit Service 1d0348
        dest[n++] = l
Packit Service 1d0348
        l = ""
Packit Service 1d0348
      }
Packit Service 1d0348
    } else {
Packit Service 1d0348
      o = match(l, "[ \t]")
Packit Service 1d0348
      if (o > 0) {
Packit Service 1d0348
        w = substr(l, 1, o-1)
Packit Service 1d0348
        l = substr(l, o+1)
Packit Service 1d0348
        dest[n++] = w
Packit Service 1d0348
      } else {
Packit Service 1d0348
        dest[n++] = l
Packit Service 1d0348
        l = ""
Packit Service 1d0348
      }
Packit Service 1d0348
    }
Packit Service 1d0348
  }
Packit Service 1d0348
  return n-1
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
! /^\./ {
Packit Service 1d0348
  out = $0
Packit Service 1d0348
  endline()
Packit Service 1d0348
  next
Packit Service 1d0348
}
Packit Service 1d0348
Packit Service 1d0348
/^\.\\"/ { next }
Packit Service 1d0348
Packit Service 1d0348
{
Packit Service 1d0348
  gsub("\\\\e", "\\")
Packit Service 1d0348
  sub("^\\.","")
Packit Service 1d0348
  nwords=splitwords($0, words)
Packit Service 1d0348
  # TODO: Instead of iterating 'w' over the array, have a separate
Packit Service 1d0348
  # function that returns 'next word' and use that.  This will allow
Packit Service 1d0348
  # proper handling of double-quoted arguments as well.
Packit Service 1d0348
  for(w=1;w<=nwords;w++) {
Packit Service 1d0348
    if(match(words[w],"^Li$")) { # Literal; rest of line is unformatted
Packit Service 1d0348
      dispstart()
Packit Service 1d0348
      displaylines = 1
Packit Service 1d0348
    } else if(match(words[w],"^Dl$")) { # Display literal
Packit Service 1d0348
      dispstart()
Packit Service 1d0348
      displaylines = 1
Packit Service 1d0348
    } else if(match(words[w],"^Bd$")) { # Begin display
Packit Service 1d0348
      STATE = PRETAG_STATE
Packit Service 1d0348
      if(match(words[w+1],"-literal")) {
Packit Service 1d0348
        dispstart()
Packit Service 1d0348
        displaylines=10000
Packit Service 1d0348
        w=nwords
Packit Service 1d0348
      }
Packit Service 1d0348
    } else if(match(words[w],"^Ed$")) { # End display
Packit Service 1d0348
      displaylines = 0
Packit Service 1d0348
      dispend()
Packit Service 1d0348
      STATE = NORMAL_STATE
Packit Service 1d0348
    } else if(match(words[w],"^Ns$")) { # Suppress space before next word
Packit Service 1d0348
      sep=""
Packit Service 1d0348
    } else if(match(words[w],"^No$")) { # Normal text
Packit Service 1d0348
      add(words[++w])
Packit Service 1d0348
    } else if(match(words[w],"^Dq$")) { # Quote
Packit Service 1d0348
      addopen("\"")
Packit Service 1d0348
      add(words[++w])
Packit Service 1d0348
      while(w
Packit Service 1d0348
        add(words[++w])
Packit Service 1d0348
      addclose("\"")
Packit Service 1d0348
    } else if(match(words[w],"^Do$")) {
Packit Service 1d0348
      addopen("\"")
Packit Service 1d0348
    } else if(match(words[w],"^Dc$")) {
Packit Service 1d0348
      addclose("\"")
Packit Service 1d0348
    } else if(match(words[w],"^Oo$")) {
Packit Service 1d0348
      addopen("<nowiki>[</nowiki>")
Packit Service 1d0348
    } else if(match(words[w],"^Oc$")) {
Packit Service 1d0348
      addclose("<nowiki>]</nowiki>")
Packit Service 1d0348
    } else if(match(words[w],"^Ao$")) {
Packit Service 1d0348
      addopen("<")
Packit Service 1d0348
    } else if(match(words[w],"^Ac$")) {
Packit Service 1d0348
      addclose(">")
Packit Service 1d0348
    } else if(match(words[w],"^Dd$")) {
Packit Service 1d0348
      date=wtail()
Packit Service 1d0348
      next
Packit Service 1d0348
    } else if(match(words[w],"^Dt$")) {
Packit Service 1d0348
      id=words[++w] "(" words[++w] ")"
Packit Service 1d0348
      next
Packit Service 1d0348
    } else if(match(words[w],"^Ox$")) {
Packit Service 1d0348
      add("OpenBSD")
Packit Service 1d0348
    } else if(match(words[w],"^Fx$")) {
Packit Service 1d0348
      add("FreeBSD")
Packit Service 1d0348
    } else if(match(words[w],"^Bx$")) {
Packit Service 1d0348
      add("BSD")
Packit Service 1d0348
    } else if(match(words[w],"^Nx$")) {
Packit Service 1d0348
      add("NetBSD")
Packit Service 1d0348
    } else if(match(words[w],"^St$")) {
Packit Service 1d0348
      if (match(words[w+1], "^-p1003.1$")) {
Packit Service 1d0348
         w++
Packit Service 1d0348
         add("<nowiki>IEEE Std 1003.1 (``POSIX.1'')</nowiki>")
Packit Service 1d0348
      } else if(match(words[w+1], "^-p1003.1-96$")) {
Packit Service 1d0348
         w++
Packit Service 1d0348
         add("<nowiki>ISO/IEC 9945-1:1996 (``POSIX.1'')</nowiki>")
Packit Service 1d0348
      } else if(match(words[w+1], "^-p1003.1-88$")) {
Packit Service 1d0348
         w++
Packit Service 1d0348
         add("<nowiki>IEEE Std 1003.1-1988 (``POSIX.1'')</nowiki>")
Packit Service 1d0348
      } else if(match(words[w+1], "^-p1003.1-2001$")) {
Packit Service 1d0348
         w++
Packit Service 1d0348
         add("<nowiki>IEEE Std 1003.1-2001 (``POSIX.1'')</nowiki>")
Packit Service 1d0348
      } else if(match(words[w+1], "^-susv2$")) {
Packit Service 1d0348
         w++
Packit Service 1d0348
         add("<nowiki>Version 2 of the Single UNIX Specification (``SUSv2'')</nowiki>")
Packit Service 1d0348
      }
Packit Service 1d0348
    } else if(match(words[w],"^Ex$")) {
Packit Service 1d0348
      if (match(words[w+1], "^-std$")) {
Packit Service 1d0348
         w++
Packit Service 1d0348
         add("The '''" name "''' utility exits 0 on success, and >0 if an error occurs.")
Packit Service 1d0348
      }
Packit Service 1d0348
    } else if(match(words[w],"^Os$")) {
Packit Service 1d0348
      add(id " manual page")
Packit Service 1d0348
    } else if(match(words[w],"^Sh$")) {
Packit Service 1d0348
      section=wtail()
Packit Service 1d0348
      linecmd("== " section " ==")
Packit Service 1d0348
    } else if(match(words[w],"^Xr$")) {
Packit Service 1d0348
      add(crossref(words[w+1], words[w+2], words[w+3]))
Packit Service 1d0348
      w = w + 3
Packit Service 1d0348
    } else if(match(words[w],"^Nm$")) {
Packit Service 1d0348
      if(match(section,"SYNOPSIS"))
Packit Service 1d0348
        breakline()
Packit Service 1d0348
      if(w >= nwords)
Packit Service 1d0348
        n=name
Packit Service 1d0348
      else if (match(words[w+1], "^[A-Z][a-z]$"))
Packit Service 1d0348
        n=name
Packit Service 1d0348
      else if (match(words[w+1], "^[.,;:]$"))
Packit Service 1d0348
        n=name
Packit Service 1d0348
      else {
Packit Service 1d0348
        n=words[++w]
Packit Service 1d0348
        if(!length(name))
Packit Service 1d0348
          name=n
Packit Service 1d0348
      }
Packit Service 1d0348
      if(!length(n))
Packit Service 1d0348
        n=name
Packit Service 1d0348
      if (displaylines == 0)
Packit Service 1d0348
        add("'''" n "'''")
Packit Service 1d0348
      else
Packit Service 1d0348
        add(n)
Packit Service 1d0348
    } else if(match(words[w],"^Nd$")) {
Packit Service 1d0348
      add("- " wtail())
Packit Service 1d0348
    } else if(match(words[w],"^Fl$")) {
Packit Service 1d0348
      addopen("-")
Packit Service 1d0348
    } else if(match(words[w],"^Ar$")) {
Packit Service 1d0348
      if(w==nwords)
Packit Service 1d0348
        add("''file ...''")
Packit Service 1d0348
      else {
Packit Service 1d0348
        ++w
Packit Service 1d0348
        gsub("<", "\\<", words[w])
Packit Service 1d0348
        if (displaylines > 0)
Packit Service 1d0348
          add(words[w])
Packit Service 1d0348
        else
Packit Service 1d0348
          add("''" words[w] "''")
Packit Service 1d0348
      }
Packit Service 1d0348
    } else if(match(words[w],"^Cm$")) {
Packit Service 1d0348
      ++w
Packit Service 1d0348
      if (displaylines == 0) {
Packit Service 1d0348
        add("'''" words[w] "'''")
Packit Service 1d0348
      } else
Packit Service 1d0348
        add(words[w])
Packit Service 1d0348
    } else if(match(words[w],"^Op$")) {
Packit Service 1d0348
      addopen("<nowiki>[</nowiki>")
Packit Service 1d0348
      option=1
Packit Service 1d0348
      trailer="<nowiki>]</nowiki>" trailer
Packit Service 1d0348
    } else if(match(words[w],"^Pp$")) {
Packit Service 1d0348
      ++w
Packit Service 1d0348
      endline()
Packit Service 1d0348
      print ""
Packit Service 1d0348
    } else if(match(words[w],"^An$")) {
Packit Service 1d0348
      if (match(words[w+1],"-nosplit"))
Packit Service 1d0348
        ++w
Packit Service 1d0348
      endline()
Packit Service 1d0348
    } else if(match(words[w],"^Ss$")) {
Packit Service 1d0348
      add("===")
Packit Service 1d0348
      trailer="==="
Packit Service 1d0348
    } else if(match(words[w],"^Ft$")) {
Packit Service 1d0348
      if (match(section, "SYNOPSIS")) {
Packit Service 1d0348
        breakline()
Packit Service 1d0348
      }
Packit Service 1d0348
      l = wtail()
Packit Service 1d0348
      add("''" l "''")
Packit Service 1d0348
      if (match(section, "SYNOPSIS")) {
Packit Service 1d0348
        breakline()
Packit Service 1d0348
      }
Packit Service 1d0348
    } else if(match(words[w],"^Fn$")) {
Packit Service 1d0348
      ++w
Packit Service 1d0348
      F = "'''" words[w] "'''("
Packit Service 1d0348
      Fsep = ""
Packit Service 1d0348
      while(w
Packit Service 1d0348
        ++w
Packit Service 1d0348
        if (match(words[w], "^[.,:]$")) {
Packit Service 1d0348
          --w
Packit Service 1d0348
          break
Packit Service 1d0348
        }
Packit Service 1d0348
        F = F Fsep "''"  words[w] "''"
Packit Service 1d0348
        Fsep = ", "
Packit Service 1d0348
      }
Packit Service 1d0348
      add(F ")")
Packit Service 1d0348
      if (match(section, "SYNOPSIS")) {
Packit Service 1d0348
        addclose(";")
Packit Service 1d0348
      }
Packit Service 1d0348
    } else if(match(words[w],"^Fo$")) {
Packit Service 1d0348
      w++
Packit Service 1d0348
      F = "'''" words[w] "'''("
Packit Service 1d0348
      Fsep = ""
Packit Service 1d0348
    } else if(match(words[w],"^Fa$")) {
Packit Service 1d0348
      w++
Packit Service 1d0348
      F = F Fsep "''"  words[w] "''"
Packit Service 1d0348
      Fsep = ", "
Packit Service 1d0348
    } else if(match(words[w],"^Fc$")) {
Packit Service 1d0348
      add(F ")")
Packit Service 1d0348
      if (match(section, "SYNOPSIS")) {
Packit Service 1d0348
        addclose(";")
Packit Service 1d0348
      }
Packit Service 1d0348
    } else if(match(words[w],"^Va$")) {
Packit Service 1d0348
      w++
Packit Service 1d0348
      add("''" words[w] "''")
Packit Service 1d0348
    } else if(match(words[w],"^In$")) {
Packit Service 1d0348
      w++
Packit Service 1d0348
      add("'''<nowiki>#include <" words[w] "></nowiki>'''")
Packit Service 1d0348
    } else if(match(words[w],"^Pa$")) {
Packit Service 1d0348
      w++
Packit Service 1d0348
#      if(match(words[w],"^\\."))
Packit Service 1d0348
#       add("\\&")
Packit Service 1d0348
      if (displaylines == 0)
Packit Service 1d0348
        add("''" words[w] "''")
Packit Service 1d0348
      else
Packit Service 1d0348
        add(words[w])
Packit Service 1d0348
    } else if(match(words[w],"^Dv$")) {
Packit Service 1d0348
      linecmd()
Packit Service 1d0348
    } else if(match(words[w],"^Em|Ev$")) {
Packit Service 1d0348
      add(".IR")
Packit Service 1d0348
    } else if(match(words[w],"^Pq$")) {
Packit Service 1d0348
      addopen("(")
Packit Service 1d0348
      trailer=")" trailer
Packit Service 1d0348
    } else if(match(words[w],"^Aq$")) {
Packit Service 1d0348
      addopen(" <")
Packit Service 1d0348
      trailer=">" trailer
Packit Service 1d0348
    } else if(match(words[w],"^Brq$")) {
Packit Service 1d0348
      addopen("<nowiki>{</nowiki>")
Packit Service 1d0348
      trailer="<nowiki>}</nowiki>" trailer
Packit Service 1d0348
    } else if(match(words[w],"^S[xy]$")) {
Packit Service 1d0348
      add(".B " wtail())
Packit Service 1d0348
    } else if(match(words[w],"^Tn$")) {
Packit Service 1d0348
      n=wtail()
Packit Service 1d0348
      add("'''" n "'''")
Packit Service 1d0348
    } else if(match(words[w],"^Ic$")) {
Packit Service 1d0348
      add("''")
Packit Service 1d0348
      trailer="''" trailer
Packit Service 1d0348
    } else if(match(words[w],"^Bl$")) {
Packit Service 1d0348
      ++listdepth
Packit Service 1d0348
      listnext[listdepth]=""
Packit Service 1d0348
      if(match(words[w+1],"-bullet")) {
Packit Service 1d0348
        optlist[listdepth]=1
Packit Service 1d0348
        addopen("
    ")
Packit Service 1d0348
        listclose[listdepth]=""
Packit Service 1d0348
      } else if(match(words[w+1],"-enum")) {
Packit Service 1d0348
        optlist[listdepth]=2
Packit Service 1d0348
        enum=0
Packit Service 1d0348
        addopen("
    ")
Packit Service 1d0348
        listclose[listdepth]=""
Packit Service 1d0348
      } else if(match(words[w+1],"-tag")) {
Packit Service 1d0348
        optlist[listdepth]=3
Packit Service 1d0348
        addopen("
")
Packit Service 1d0348
        listclose[listdepth]=""
Packit Service 1d0348
      } else if(match(words[w+1],"-item")) {
Packit Service 1d0348
        optlist[listdepth]=4
Packit Service 1d0348
        addopen("
    ")
Packit Service 1d0348
        listclose[listdepth]=""
Packit Service 1d0348
      }
Packit Service 1d0348
      w=nwords
Packit Service 1d0348
    } else if(match(words[w],"^El$")) {
Packit Service 1d0348
      addclose(listnext[listdepth])
Packit Service 1d0348
      addclose(listclose[listdepth])
Packit Service 1d0348
      listclose[listdepth]=""
Packit Service 1d0348
      listdepth--
Packit Service 1d0348
    } else if(match(words[w],"^It$")) {
Packit Service 1d0348
      addclose(listnext[listdepth])
Packit Service 1d0348
      if(optlist[listdepth]==1) {
Packit Service 1d0348
        addpunct("
  • ")
  • Packit Service 1d0348
            listnext[listdepth] = ""
    Packit Service 1d0348
          } else if(optlist[listdepth]==2) {
    Packit Service 1d0348
            addpunct("
  • ")
  • Packit Service 1d0348
            listnext[listdepth] = ""
    Packit Service 1d0348
          } else if(optlist[listdepth]==3) {
    Packit Service 1d0348
            addpunct("
    ")
    Packit Service 1d0348
            listnext[listdepth] = ""
    Packit Service 1d0348
            if(match(words[w+1],"^Xo$")) {
    Packit Service 1d0348
              # Suppress trailer
    Packit Service 1d0348
              w++
    Packit Service 1d0348
            } else if(match(words[w+1],"^Pa$|^Ev$")) {
    Packit Service 1d0348
              addopen("'''")
    Packit Service 1d0348
              w++
    Packit Service 1d0348
              add(words[++w] "'''")
    Packit Service 1d0348
              trailer = listnext[listdepth] "
    " trailer
    Packit Service 1d0348
              listnext[listdepth] = ""
    Packit Service 1d0348
            } else {
    Packit Service 1d0348
              trailer = listnext[listdepth] "
    " trailer
    Packit Service 1d0348
              listnext[listdepth] = ""
    Packit Service 1d0348
            }
    Packit Service 1d0348
          } else if(optlist[listdepth]==4) {
    Packit Service 1d0348
            addpunct("
  • ")
  • Packit Service 1d0348
            listnext[listdepth] = ""
    Packit Service 1d0348
          }
    Packit Service 1d0348
        } else if(match(words[w], "^Vt$")) {
    Packit Service 1d0348
          w++
    Packit Service 1d0348
          add("''" words[w] "''")
    Packit Service 1d0348
        } else if(match(words[w],"^Xo$")) {
    Packit Service 1d0348
          # TODO: Figure out how to handle this
    Packit Service 1d0348
        } else if(match(words[w],"^Xc$")) {
    Packit Service 1d0348
          # TODO: Figure out how to handle this
    Packit Service 1d0348
          if (optlist[listdepth] == 3) {
    Packit Service 1d0348
            addclose(listnext[listdepth])
    Packit Service 1d0348
            addopen("
    ")
    Packit Service 1d0348
            listnext[listdepth] = ""
    Packit Service 1d0348
          }
    Packit Service 1d0348
        } else if(match(words[w],"^[=]$")) {
    Packit Service 1d0348
          addpunct(words[w])
    Packit Service 1d0348
        } else if(match(words[w],"^[[{(]$")) {
    Packit Service 1d0348
          addopen(words[w])
    Packit Service 1d0348
        } else if(match(words[w],"^[\\])}.,;:]$")) {
    Packit Service 1d0348
          addclose(words[w])
    Packit Service 1d0348
        } else {
    Packit Service 1d0348
          sub("\\\\&", "", words[w])
    Packit Service 1d0348
          add(words[w])
    Packit Service 1d0348
        }
    Packit Service 1d0348
      }
    Packit Service 1d0348
      if(match(out,"^\\.[^a-zA-Z]"))
    Packit Service 1d0348
        sub("^\\.","",out)
    Packit Service 1d0348
      endline()
    Packit Service 1d0348
    }