From 9c0812e2363e05974bc6b174c2db55129aca6f08 Mon Sep 17 00:00:00 2001 From: Tim Mann Date: Mon, 17 Nov 2003 07:40:25 +0000 Subject: [PATCH] Tool to generate man page from texinfo file. --- texi2man | 189 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 189 insertions(+), 0 deletions(-) create mode 100755 texi2man diff --git a/texi2man b/texi2man new file mode 100755 index 0000000..d9206ba --- /dev/null +++ b/texi2man @@ -0,0 +1,189 @@ +#!/usr/bin/perl +# $Id$ +# Written by Adrian Mariano, additional features by Eric Backus, +# yet more features by Tim Mann. + +# Script to translate a texinfo file into an nroff manual page. + +$version="1.01.tpm1"; + +$html=0; +$ignore=0; +$tex=0; +$doman=0; +$title=0; +$diditem=0; +$justdidlp=1; +$noman=0; +$info=0; +$manprefix=""; +$args=($#ARGV < 0) ? "stdin" : "@ARGV"; +$itemxcomma=0; + +printf(".\\\"Do not edit this file. It was created from %s\n", $args); +printf(".\\\"using texi2man version %s on %s", $version, `date`); +printf(".\\\"If you want a typeset version, you will get better\n"); +printf(".\\\"results with the original file.\n.\\\"\n"); + +sub parse +{ + if (s/\@c man //) { print; next; } + if (/\@c noman/) { $noman=1; next; } + if (/\@c end noman/) { $noman=0; next; } + if ($noman) { next; } + + if (/\@c ifman\s*(.*)/) { $doman=1; $manprefix = $1; next; } + if (/\@c end ifman/) { $doman=0; $manprefix = ""; next; } + + if (/^\\input/) { next; } + if (/^\*/) { next; } + if (/^INFO-DIR-SECTION/) { next; } + if (/^START-INFO-DIR-ENTRY/) { next; } + if (/^END-INFO-DIR-ENTRY/) { next; } + + if (/\@titlepage/) { $title=1; next; } + if (/\@end titlepage/) { $title=0; next; } + if (/\@tex/) { $tex=1; next; } + if (/\@end tex/) { $tex=0; next; } + if (/\@ignore/) { $ignore=1; next; } + if (/\@end ignore/) { $ignore=0; next; } + if (/\@ifinfo/) { $info=1; next; } + if (/\@end ifinfo/) { $info=0; next; } + if (/\@ifhtml/) { $html=1; next; } + if (/\@end ifhtml/) { $html=0; next; } + if (/\@ifnothtml/) { next; } + if (/\@end ifhtml/) { next; } + if (/\@iftex/) { $tex=1; next; } + if (/\@end iftex/) { $tex=0; next; } + if (/\@ifnottex/) { next; } + if (/\@end iftex/) { next; } + if (!$doman && ($ignore || $html || $title || $tex || $info)) { next; } + + s/\\/\\\\/g; + s/\@-/\\-/g; + s/\@cite\{([^}]*)}/\`$1\'/g; + s/\@code\{([^}]*)}/\`$1\'/g; + s/\@email\{([^}]*)}/\`$1\'/g; + s/\@file\{([^}]*)}/\`$1\'/g; + s/\@kbd\{([^}]*)}/\`$1\'/g; + s/\@samp\{([^}]*)}/\`$1\'/g; + s/\@url\{([^}]*)}/\`$1\'/g; + s/\@dfn\{([^}]*)}/\"$1\"/g; + s/\@key\{([^}]*)}/<$1>/g; + s/\@emph\{([^}]*)}/\\fI$1\\fR/g; + s/\@strong\{([^}]*)}/\\fB$1\\fR/g; + s/\@var\{([^}]*)}/\U$1\E/g; + s/\@sc\{([^}]*)}/\U$1\E/g; + s/\@w\{([^}]*)}/$1/g; + s/\@pxref\{([^}]*)}/See \\fI$1\\fR/g; + s/\@xref\{([^}]*)}/See \\fI$1\\fR/g; + s/\@ref\{([^}]*)}/\\fI$1\\fR/g; + s/\@footnote\{([^}]*)}/[$1]/g; + s/\@minus\{}/-/g; + s/\@copyright\{}/(C)/g; + s/\@noindent//; + s/\@\{/{/g; + s/\@}/}/g; + s/\@\@/@/g; + s/\\'\\'/\"/g; + s/\\`\\`/\"/g; + s/---/ -- /g; + + s/\@value\{([^\s]+)}/$value{$1}/eg; + if (/\@set\s+([^\s]+)\s+(.*)$/) { $value{$1} = $2; next; } + if (/\@clear\s+([^\s]+)\s+(.*)$/) { delete $value{$1}; next; } + + if ($itemxcomma) { + # If multiple items have the same description, put the items + # on one line, separated by commas + if (/\@itemx (.*)/) { printf(", $1"); $diditem=1; next; } + elsif ($diditem) { printf("\n"); $diditem=0; } + if (/\@item (.*)/) { + printf("%s.TP\n%s.B $1", $manprefix, $manprefix); + $diditem=1; + next; + } + } else { + # If multiple items have the same description, put the items + # on separate lines + if (/\@item (.*)/) { + printf("%s.TP\n%s.B $1\n", $manprefix, $manprefix); + next; + } + if (/\@itemx (.*)/) { + printf("%s.PD 0\n%s.TP\n%s.B $1\n%s.PD\n", + $manprefix, $manprefix, $manprefix, $manprefix); + next; + } + } + + if (s/\@chapter (.*)/.SH \U$1\E/) + { + printf("%s%s", $manprefix, $_); + $justdidlp=1; + next; + } + if (s/\@unnumbered (.*)/.SH \U$1\E/) + { + printf("%s%s", $manprefix, $_); + $justdidlp=1; + next; + } + if (s/\@section (.*)/$1/) + { + printf("%s.SS %s", $manprefix, $_); + $justdidlp=1; + next; + } + + if (/\@example/) { + printf("%s.nf\n", $manprefix); + $manprefix = $manprefix . " "; + $example=1; + next; + } + if (/\@end example/) { + $manprefix = substr($manprefix, 0, -4); + printf("%s.fi\n", $manprefix); + $example=0; + next; + } + + if (/\@display/) { printf("%s.nf\n", $manprefix); $example=1; next; } + if (/\@end display/) { printf("%s.fi\n", $manprefix); $example=0; next; } + if (/\@format/) { printf("%s.nf\n", $manprefix); $example=1; next; } + if (/\@end format/) { printf("%s.fi\n", $manprefix); $example=0; next; } + if (/\@smallexample/) { printf("%s.nf\n", $manprefix); $example=1; next; } + if (/\@end smallexample/) { printf("%s.fi\n", $manprefix); $example=0; next; } + if (!$example && /^\s*$/ && !$doman) + { + if ($justdidlp) { next; } +# printf(".PP\n"); + printf("\n"); + $justdidlp=1; + next; + } + if (/\@end table/) { + printf("%s.PP\n", $manprefix); + $justdidlp=1; + } + + if (/\@include (.*)/) { + open(my $INCL, $1) or open(my $INCL, "../$1") or die "$1: $!"; + while (<$INCL>) { + parse(); + } + next; + } + + if (/^\@/) { next; } + + printf("%s%s", $manprefix, $_); + + if (!$doman) { $justdidlp=0; } +} + +while(<>) +{ + parse(); +} -- 1.7.0.4