-#! /usr/bin/perl -w
+#!/usr/bin/env perl
# Copyright (C) 1999, 2000, 2001 Free Software Foundation, Inc.
# You should have received a copy of the GNU General Public License
# along with GNU CC; see the file COPYING. If not, write to
-# the Free Software Foundation, 59 Temple Place - Suite 330,
-# Boston MA 02111-1307, USA.
+# the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301 USA
# This does trivial (and I mean _trivial_) conversion of Texinfo
# markup to Perl POD format. It's intended to be used to extract
# something suitable for a manpage from a Texinfo document.
+use warnings;
+
$output = 0;
$skipping = 0;
%sects = ();
+@sects_sequence = ();
$section = "";
@icstack = ();
@endwstack = ();
%defs = ();
$fnno = 1;
$inf = "";
-$ibase = "";
+@ibase = ();
while ($_ = shift) {
if (/^-D(.*)$/) {
die "flags may only contain letters, digits, hyphens, dashes and underscores\n"
unless $flag =~ /^[a-zA-Z0-9_-]+$/;
$defs{$flag} = $value;
+ } elsif (/^-I(.*)$/) {
+ push @ibase, $1 ne "" ? $1 : shift;
} elsif (/^-/) {
usage();
} else {
}
}
+push @ibase, ".";
+
if (defined $in) {
$inf = gensym();
open($inf, "<$in") or die "opening \"$in\": $!\n";
- $ibase = $1 if $in =~ m|^(.+)/[^/]+$|;
+ push @ibase, $1 if $in =~ m|^(.+)/[^/]+$|;
} else {
$inf = \*STDIN;
}
}
while(defined $inf) {
-while(<$inf>) {
+INF: while(<$inf>) {
# Certain commands are discarded without further processing.
/^\@(?:
[a-z]+index # @*index: useful only in complete manual
next;
};
+ /^\@include\s+(.+)$/ and do {
+ push @instack, $inf;
+ $inf = gensym();
+
+ for (@ibase) {
+ open($inf, "<" . $_ . "/" . $1) and next INF;
+ }
+ die "cannot open $1: $!\n";
+ };
+
# Look for blocks surrounded by @c man begin SECTION ... @c man end.
# This really oughta be @ifman ... @end ifman and the like, but such
# would require rev'ing all other Texinfo translators.
- /^\@c\s+man\s+begin\s+([A-Z]+)\s+([A-Za-z0-9-]+)/ and do {
- $output = 1 if exists $defs{$2};
- $sect = $1;
- next;
- };
- /^\@c\s+man\s+begin\s+([A-Z]+)/ and $sect = $1, $output = 1, next;
+ /^\@c\s+man\s+begin\s+([A-Za-z ]+)/ and $sect = $1, push (@sects_sequence, $sect), $output = 1, next;
/^\@c\s+man\s+end/ and do {
$sects{$sect} = "" unless exists $sects{$sect};
$sects{$sect} .= postprocess($section);
} elsif ($ended =~ /^(?:example|smallexample|display)$/) {
$shift = "";
$_ = ""; # need a paragraph break
- } elsif ($ended =~ /^(?:itemize|enumerate|[fv]?table)$/) {
+ } elsif ($ended =~ /^(?:itemize|enumerate|(?:multi|[fv])?table)$/) {
$_ = "\n=back\n";
$ic = pop @icstack;
} else {
# Single line command handlers.
- /^\@include\s+(.+)$/ and do {
- push @instack, $inf;
- $inf = gensym();
-
- # Try cwd and $ibase.
- open($inf, "<" . $1)
- or open($inf, "<" . $ibase . "/" . $1)
- or die "cannot open $1 or $ibase/$1: $!\n";
- next;
- };
-
- /^\@(?:section|unnumbered|unnumberedsec|center)\s+(.+)$/
+ /^\@(?:section|unnumbered|unnumberedsec|center|heading)\s+(.+)$/
and $_ = "\n=head2 $1\n";
- /^\@subsection\s+(.+)$/
+ /^\@(?:subsection|subheading)\s+(.+)$/
and $_ = "\n=head3 $1\n";
+ /^\@(?:subsubsection|subsubheading)\s+(.+)$/
+ and $_ = "\n=head4 $1\n";
# Block command handlers:
- /^\@itemize\s+(\@[a-z]+|\*|-)/ and do {
+ /^\@itemize\s*(\@[a-z]+|\*|-)?/ and do {
push @endwstack, $endw;
push @icstack, $ic;
- $ic = $1;
+ $ic = $1 ? $1 : "*";
$_ = "\n=over 4\n";
$endw = "itemize";
};
$endw = "enumerate";
};
- /^\@([fv]?table)\s+(\@[a-z]+)/ and do {
+ /^\@((?:multi|[fv])?table)\s+(\@[a-z]+)/ and do {
push @endwstack, $endw;
push @icstack, $ic;
$endw = $1;
$ic =~ s/\@(?:code|kbd)/C/;
$ic =~ s/\@(?:dfn|var|emph|cite|i)/I/;
$ic =~ s/\@(?:file)/F/;
+ $ic =~ s/\@(?:columnfractions)//;
+ $_ = "\n=over 4\n";
+ };
+
+ /^\@(multitable)\s+{.*/ and do {
+ push @endwstack, $endw;
+ push @icstack, $ic;
+ $endw = $1;
+ $ic = "";
$_ = "\n=over 4\n";
};
$_ = ""; # need a paragraph break
};
+ /^\@item\s+(.*\S)\s*$/ and $endw eq "multitable" and do {
+ my $columns = $1;
+ $columns =~ s/\@tab/ : /;
+
+ $_ = "\n=item B<". $columns .">\n";
+ };
+
+ /^\@tab\s+(.*\S)\s*$/ and $endw eq "multitable" and do {
+ my $columns = $1;
+ $columns =~ s/\@tab//;
+
+ $_ = $columns;
+ $section =~ s/$//;
+ };
+
/^\@itemx?\s*(.+)?$/ and do {
if (defined $1) {
# Entity escapes prevent munging by the <> processing below.
die "No filename or title\n" unless defined $fn && defined $tl;
+# always use utf8
+print "=encoding utf8\n\n";
+
$sects{NAME} = "$fn \- $tl\n";
$sects{FOOTNOTES} .= "=back\n" if exists $sects{FOOTNOTES};
-for $sect (qw(NAME SYNOPSIS DESCRIPTION OPTIONS EXAMPLES ENVIRONMENT FILES
- BUGS NOTES FOOTNOTES SEEALSO AUTHOR COPYRIGHT)) {
+unshift @sects_sequence, "NAME";
+for $sect (@sects_sequence) {
if(exists $sects{$sect}) {
$head = $sect;
$head =~ s/SEEALSO/SEE ALSO/;
# @* is also impossible in .pod; we discard it and any newline that
# follows it. Similarly, our macro @gol must be discarded.
+ s/\@anchor\{(?:[^\}]*)\}//g;
s/\(?\@xref\{(?:[^\}]*)\}(?:[^.<]|(?:<[^<>]*>))*\.\)?//g;
s/\s+\(\@pxref\{(?:[^\}]*)\}\)//g;
s/;\s+\@pxref\{(?:[^\}]*)\}//g;
+ s/\@ref\{([^\}]*)\}/$1/g;
s/\@noindent\s*//g;
s/\@refill//g;
s/\@gol//g;