summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorTim Kientzle <kientzle@gmail.com>2009-04-13 17:08:53 -0400
committerTim Kientzle <kientzle@gmail.com>2009-04-13 17:08:53 -0400
commit2039e354d9ce878a406c8a7797f05096528363cb (patch)
tree51fabeef9dd0e18c64320150bfea7783b9e8b87d /doc
parentde8e87b206471e738e236ee601d751889fe27f3c (diff)
downloadlibarchive-2039e354d9ce878a406c8a7797f05096528363cb.tar.gz
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
Diffstat (limited to 'doc')
-rw-r--r--doc/html/.ignore_me2
-rwxr-xr-xdoc/mdoc2wiki.awk423
-rwxr-xr-xdoc/update.sh74
-rw-r--r--doc/wiki/.ignore_me2
4 files changed, 487 insertions, 14 deletions
diff --git a/doc/html/.ignore_me b/doc/html/.ignore_me
new file mode 100644
index 00000000..d285484d
--- /dev/null
+++ b/doc/html/.ignore_me
@@ -0,0 +1,2 @@
+*** PLEASE DO NOT DELETE THIS FILE! ***
+This file is used to track an otherwise empty directory in git.
diff --git a/doc/mdoc2wiki.awk b/doc/mdoc2wiki.awk
new file mode 100755
index 00000000..91ac1d77
--- /dev/null
+++ b/doc/mdoc2wiki.awk
@@ -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()
+}
diff --git a/doc/update.sh b/doc/update.sh
index 925e09b6..0ac8f813 100755
--- a/doc/update.sh
+++ b/doc/update.sh
@@ -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)
diff --git a/doc/wiki/.ignore_me b/doc/wiki/.ignore_me
new file mode 100644
index 00000000..d285484d
--- /dev/null
+++ b/doc/wiki/.ignore_me
@@ -0,0 +1,2 @@
+*** PLEASE DO NOT DELETE THIS FILE! ***
+This file is used to track an otherwise empty directory in git.