First real attempt to convert all mdoc manpages to Wiki syntax.

Including the awk script I'm using and updates to the doc generator
to produce the Wiki versions as part of the regular deployment.

SVN-Revision: 974
This commit is contained in:
Tim Kientzle 2009-04-13 17:08:53 -04:00
parent de8e87b206
commit 2039e354d9
4 changed files with 487 additions and 14 deletions

2
doc/html/.ignore_me Normal file
View File

@ -0,0 +1,2 @@
*** PLEASE DO NOT DELETE THIS FILE! ***
This file is used to track an otherwise empty directory in git.

423
doc/mdoc2wiki.awk Executable file
View File

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

View File

@ -5,24 +5,22 @@
# the mdoc man pages stored in each project.
#
# Remove existing manpages from the doc tree
chmod -R +w man text
rm -f man/*.[135]
rm -f text/*.txt
rm -f pdf/*.pdf
if false; then
# Build Makefile in 'man' directory
cd man
rm -f *.[135]
echo > Makefile
echo "default: all" >>Makefile
echo >>Makefile
all="all:"
for d in libarchive tar cpio; do
for f in ../../$d/*.[135]; do
outname="`basename $f`"
echo >> Makefile
echo `basename $f`: ../mdoc2man.awk $f >> Makefile
echo " awk -f ../mdoc2man.awk < $f > `basename $f`" >> Makefile
all="$all `basename $f`"
echo $outname: ../mdoc2man.awk $f >> Makefile
echo " awk -f ../mdoc2man.awk < $f > $outname" >> Makefile
all="$all $outname"
done
done
echo $all >>Makefile
@ -30,16 +28,18 @@ cd ..
# Rebuild Makefile in 'text' directory
cd text
rm -f *.txt
echo > Makefile
echo "default: all" >>Makefile
echo >>Makefile
all="all:"
for d in libarchive tar cpio; do
for f in ../../$d/*.[135]; do
outname="`basename $f`.txt"
echo >> Makefile
echo `basename $f`.txt: $f >> Makefile
echo " nroff -mdoc $f | col -b > `basename $f`.txt" >> Makefile
all="$all `basename $f`.txt"
echo $outname: $f >> Makefile
echo " nroff -mdoc $f | col -b > $outname" >> Makefile
all="$all $outname"
done
done
echo $all >>Makefile
@ -47,16 +47,58 @@ cd ..
# Rebuild Makefile in 'pdf' directory
cd pdf
rm -f *.pdf
echo > Makefile
echo "default: all" >>Makefile
echo >>Makefile
all="all:"
for d in libarchive tar cpio; do
for f in ../../$d/*.[135]; do
outname="`basename $f`.pdf"
echo >> Makefile
echo `basename $f`.pdf: $f >> Makefile
echo " groff -mdoc -T ps $f | ps2pdf - - > `basename $f`.pdf" >> Makefile
all="$all `basename $f`.pdf"
echo $outname: $f >> Makefile
echo " groff -mdoc -T ps $f | ps2pdf - - > $outname" >> Makefile
all="$all $outname"
done
done
echo $all >>Makefile
cd ..
# Build Makefile in 'html' directory
cd html
rm -f *.html
echo > Makefile
echo "default: all" >>Makefile
echo >>Makefile
all="all:"
for d in libarchive tar cpio; do
for f in ../../$d/*.[135]; do
outname="`basename $f`.html"
echo >> Makefile
echo $outname: ../mdoc2man.awk $f >> Makefile
echo " groff -mdoc -T html $f > $outname" >> Makefile
all="$all $outname"
done
done
echo $all >>Makefile
cd ..
fi
# Build Makefile in 'wiki' directory
cd wiki
rm -f *.wiki
echo > Makefile
echo "default: all" >>Makefile
echo >>Makefile
all="all:"
for d in libarchive tar cpio; do
for f in ../../$d/*.[135]; do
outname="`basename $f | awk '{ac=split($0,a,"[_.-]");o="ManPage";for(w=0;w<=ac;++w){o=o toupper(substr(a[w],1,1)) substr(a[w],2)};print o}'`.wiki"
echo >> Makefile
echo $outname: ../mdoc2wiki.awk $f >> Makefile
echo " awk -f ../mdoc2wiki.awk < $f > $outname" >> Makefile
all="$all $outname"
done
done
echo $all >>Makefile
@ -68,3 +110,7 @@ cd ..
(cd text && make)
# Format all of the manpages to PDF
(cd pdf && make)
# Format all of the manpages to HTML
(cd html && make)
# Format all of the manpages to Google Wiki syntax
(cd wiki && make)

2
doc/wiki/.ignore_me Normal file
View File

@ -0,0 +1,2 @@
*** PLEASE DO NOT DELETE THIS FILE! ***
This file is used to track an otherwise empty directory in git.