From 3d6f4d76bc68b1550d88549f168782436663c112 Mon Sep 17 00:00:00 2001 From: Zack Weinberg Date: Sun, 19 Nov 2000 19:02:50 +0000 Subject: texi2pod.pl: - Add real command line parsing. * texi2pod.pl: - Add real command line parsing. - Support @ifset, @ifclear, @set, @value, -D switch. - Support @sc. Improve handling of @ref and friends. - Discard @subsection, @need, @node lines. - Un-nest font changes to match texinfo semantics. - Handle @{ and @}. Oops. - Don't emit E<> directives inside verbatim blocks. From-SVN: r37569 --- contrib/texi2pod.pl | 159 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 120 insertions(+), 39 deletions(-) (limited to 'contrib/texi2pod.pl') diff --git a/contrib/texi2pod.pl b/contrib/texi2pod.pl index bb26fb2..420625b 100755 --- a/contrib/texi2pod.pl +++ b/contrib/texi2pod.pl @@ -4,64 +4,147 @@ # markup to Perl POD format. It's intended to be used to extract # something suitable for a manpage from a Texinfo document. -$in = $ARGV[0]; -$out = "x"; -die "usage: $0 infile outfile\n" unless defined $in && defined $out; - -close STDIN; -open(IN,$in); - $output = 0; $ignore = 0; +$skipping = 0; %sects = (); $section = ""; @icstack = (); @endwstack = (); +@skstack = (); $shift = ""; +%defs = (); -while() +while($_ = shift) +{ + if (/^-D(.*)$/) { + if ($1 ne "") { + $flag = $1; + } else { + $flag = shift; + } + die "no flag specified for -D\n" + unless $flag ne ""; + die "flags may only contain letters, digits, hyphens, and underscores\n" + unless $flag =~ /^[a-zA-Z0-9_-]+$/; + $defs{$flag} = ""; + } elsif (/^-/) { + usage(); + } else { + $in = $_, next unless defined $in; + $out = $_, next unless defined $out; + usage(); + } +} + +if (defined $in) { + open(STDIN, $in) or die "opening \"$in\": $!\n"; +} +if (defined $out) { + open(STDOUT, ">$out") or die "opening \"$out\": $!\n"; +} + +while() { chomp; - /^\@end ignore/ and $ignore = 0, next; - next if $ignore; /^\@c man begin ([A-Z]+)/ and $sect = $1, $output = 1, next; /^\@c man end/ and do { $_ = $section; - s//>/g; s/\@(?:dfn|var|emph|cite)\{([^\}]*)\}/I<$1>/g; s/\@(?:code|kbd)\{([^\}]*)\}/C<$1>/g; s/\@(?:samp|strong|key)\{([^\}]*)\}/B<$1>/g; + s/\@value\{([a-zA-Z0-9_-]+)\}/$defs{$1}/g; + s/\@sc\{([^\}]*)\}/\U$1/g; s/\@file\{([^\}]*)\}/F<$1>/g; s/\@(?:url|email)\{([^\}]*)\}/EC<$1>E/g; - s/\@[a-z]?ref\{(?:[^\}]*)\}.?//g; - s/\(\@p[a-z]?ref\{(?:[^\}]*)\}\).?//g; + s/\@xref\{(?:[^\}]*)\}[^.]*.//g; + s/\s+\(\@p[a-z]?ref\{(?:[^\}]*)\}\)//g; s/\@copyright\{\}//g; s/\@noindent\s*//g; s/\@refill//g; s/\@\././g; - s/</E/g; - s/>/E/g; + # Turn B blah> into B I B to + # match Texinfo semantics of @emph inside @samp. + s/<//g; + 1 while (s/B<([^<>]*)I<([^>]+)>/B<$1>I<$2>B]*)B<([^>]+)>/I<$1>B<$2>I//g; + s/([BI])<(\s+)([^>]+)>/$2$1<$3>/g; + s/([BI])<([^>]+?)(\s+)>/$1<$2>$3/g; + + s/</E/g; + s/>/E/g; + s/{/\{/g; + s/}/\}/g; $sects{$sect} = $_; $section = ""; $output = 0; next; }; - + /^\@(c|[a-z]+index)\b/ and next; + /^\@subsection/ and next; + /^\@need/ and next; + /^\@node/ and next; /^\@setfilename\s+([^.]+)/ and $fn = $1, next; /^\@settitle\s+([^.]+)/ and $tl = $1, next; next unless $output; + /^\@end\s+([a-z]+)/ and do { + if(defined $endw) + { + die "\@$endw ended by \@end $1 at line $.\n" + unless $1 eq $endw; + + if($endw =~ /example$/) + { + $shift = ""; + $_ = ""; + } + elsif($endw =~ /^if/) + { + $skipping = pop @skstack; + $_ = ""; + } + else + { + $_ = "\n=back\n"; + $ic = pop @icstack; + } + $endw = pop @endwstack; + } + }; + + /^\@end ignore/ and $ignore = 0, next; + next if $ignore; + next if $skipping; + /^\@ignore/ and $ignore = 1, next; + /^\@set\s+([a-zA-Z0-9_-]+)\s*(.*)$/ and $defs{$1} = $2, next; + /^\@clear\s+([a-zA-Z0-9_-]+)/ and delete $defs{$1}, next; + + /^\@ifset\s+([a-zA-Z0-9_-]+)/ and do { + push @endwstack, $endw; + push @skstack, $skipping; + $endw = "ifset"; + $skipping = 1 unless exists $defs{$1}; + }; + + /^\@ifclear\s+([a-zA-Z0-9_-]+)/ and do { + push @endwstack, $endw; + push @skstack, $skipping; + $endw = "ifset"; + $skipping = 1 if exists $defs{$1}; + }; + /^\@itemize (\@[a-z]+)/ and do { push @endwstack, $endw; push @icstack, $ic; @@ -99,27 +182,6 @@ while() next; }; - /^\@end\s+([a-z]+)/ and do { - if(defined $endw) - { - die "\@$endw ended by \@end $1 at line $.\n" - unless $1 eq $endw; - - if($endw =~ /example$/) - { - $shift = ""; - $_ = ""; - } - else - { - $_ = "\n=back\n"; - undef $endw; - $ic = pop @icstack; - } - $endw = pop @endwstack; - } - }; - /^\@itemx?\s*(.+)?$/ and do { if(defined $1) { @@ -131,7 +193,21 @@ while() $ic =~ y/A-Ya-y1-8/B-Zb-z2-9/; } }; - + + /^\@section\s+(.+)$/ and do { + $_ = "\n=head2 $1\n"; + }; + + # POD doesn't interpret E<> inside a verbatim block. + if ($shift eq "") { + s//>/g; + } else { + s//>/g; + } + s/\@\{/{/g; + s/\@\}/}/g; $section .= $shift.$_."\n"; } @@ -149,3 +225,8 @@ for $sect (qw(NAME SYNOPSIS DESCRIPTION OPTIONS ENVIRONMENT FILES print "\n"; } } + +sub usage +{ + die "usage: $0 [-D toggle...] [infile [outfile]]\n"; +} -- cgit v1.1