X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FPod%2FText.pm;h=549bab5a8e2e92769663bd4e89b7926f8a46298e;hb=bdbd2f2228a5f903eac5af514b0686141570617f;hp=9d6636a82f35e2594a46e5ece13bee95c25e09e2;hpb=8c634b6ed8dff69ce029df1386a301fb7f8b3062;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/Pod/Text.pm b/lib/Pod/Text.pm index 9d6636a..549bab5 100644 --- a/lib/Pod/Text.pm +++ b/lib/Pod/Text.pm @@ -1,7 +1,5 @@ package Pod::Text; -# Version 1.02 - =head1 NAME Pod::Text - convert POD data to formatted ASCII text @@ -14,7 +12,7 @@ Pod::Text - convert POD data to formatted ASCII text Also: - pod2text < input.pod + pod2text [B<-a>] [B<->I] < input.pod =head1 DESCRIPTION @@ -27,7 +25,9 @@ will be used to simulate bold and underlined text. A separate F program is included that is primarily a wrapper for Pod::Text. -The single function C can take one or two arguments. The first +The single function C can take the optional options B<-a> +for an alternative output format, then a B<->I option with the +max terminal width, followed by one or two arguments. The first should be the name of a file to read the pod from, or "E&STDIN" to read from STDIN. A second argument, if provided, should be a filehandle glob where output should be sent. @@ -49,8 +49,15 @@ require Exporter; @ISA = Exporter; @EXPORT = qw(pod2text); +use vars qw($VERSION); +$VERSION = "1.0203"; + +use locale; # make \w work right in non-ASCII lands + $termcap=0; +$opt_alt_format = 0; + #$use_format=1; $UNDL = "\x1b[4m"; @@ -59,8 +66,7 @@ $BOLD = "\x1b[1m"; $NORM = "\x1b[0m"; sub pod2text { -local($file,*OUTPUT) = @_; -*OUTPUT = *STDOUT if @_<2; +shift if $opt_alt_format = ($_[0] eq '-a'); if($termcap and !$setuptermcap) { $setuptermcap=1; @@ -75,9 +81,16 @@ if($termcap and !$setuptermcap) { $SCREEN = ($_[0] =~ /^-(\d+)/ && (shift, $1)) || $ENV{COLUMNS} || ($ENV{TERMCAP} =~ /co#(\d+)/)[0] - || (`stty -a 2>/dev/null` =~ /(\d+) columns/)[0] + || ($^O ne 'MSWin32' && $^O ne 'dos' && (`stty -a 2>/dev/null` =~ /(\d+) columns/)[0]) || 72; +@_ = ("<&STDIN") unless @_; +local($file,*OUTPUT) = @_; +*OUTPUT = *STDOUT if @_<2; + +local $: = $:; +$: = " \n" if $opt_alt_format; # Do not break ``-L/lib/'' into ``- L/lib/''. + $/ = ""; $FANCY = 0; @@ -100,7 +113,7 @@ POD_DIRECTIVE: while () { $begun = ""; } elsif ($begun eq "text") { - print STDOUT $_; + print OUTPUT $_; } next; } @@ -111,23 +124,22 @@ POD_DIRECTIVE: while () { }me; # Translate verbatim paragraph if (/^\s/) { - $needspace = 1; output($_); next; } - if (/^=for\s+(\S+)\s*/s) { + if (/^=for\s+(\S+)\s*(.*)/s) { if ($1 eq "text") { - print STDOUT $',""; + print OUTPUT $2,""; } else { # ignore unknown for } next; } - elsif (/^=begin\s+(\S+)\s*/s) { + elsif (/^=begin\s+(\S+)\s*(.*)/s) { $begun = $1; if ($1 eq "text") { - print STDOUT $'.""; + print OUTPUT $2.""; } next; } @@ -142,7 +154,12 @@ sub prepare_for_output { $maxnest = 10; while ($maxnest-- && /[A-Z]/`$1'/sg; + if ($opt_alt_format) { + s/[BC]<(.*?)>/``$1''/sg; + s/F<(.*?)>/"$1"/sg; + } else { + s/C<(.*?)>/`$1'/sg; + } } else { s/C<(.*?)>/noremap("E${1}E")/sge; } @@ -150,6 +167,10 @@ sub prepare_for_output { s/I<(.*?)>/*$1*/sg; # s/[CB]<(.*?)>/bold($1)/ge; s/X<.*?>//sg; + + # LREF: a la HREF L + s:L<([^|>]+)\|[^>]+>:$1:g; + # LREF: a manpage(3f) s:L<([a-zA-Z][^\s\/]+)(\([^\)]+\))?>:the $1$2 manpage:g; # LREF: an =item on another manpage @@ -210,10 +231,18 @@ sub prepare_for_output { if ($Cmd eq 'cut') { $cutting = 1; } + elsif ($Cmd eq 'pod') { + $cutting = 0; + } elsif ($Cmd eq 'head1') { makespace(); + if ($opt_alt_format) { + print OUTPUT "\n"; + s/^(.+?)[ \t]*$/==== $1 ====/; + } print OUTPUT; # print OUTPUT uc($_); + $needspace = $opt_alt_format; } elsif ($Cmd eq 'head2') { makespace(); @@ -221,7 +250,13 @@ sub prepare_for_output { #print ' ' x $DEF_INDENT, $_; # print "\xA7"; s/(\w)/\xA7 $1/ if $FANCY; - print OUTPUT ' ' x ($DEF_INDENT/2), $_, "\n"; + if ($opt_alt_format) { + s/^(.+?)[ \t]*$/== $1 ==/; + print OUTPUT "\n", $_; + } else { + print OUTPUT ' ' x ($DEF_INDENT/2), $_, "\n"; + } + $needspace = $opt_alt_format; } elsif ($Cmd eq 'over') { push(@indent,$indent); @@ -230,7 +265,6 @@ sub prepare_for_output { elsif ($Cmd eq 'back') { $indent = pop(@indent); warn "Unmatched =back\n" unless defined $indent; - $needspace = 1; } elsif ($Cmd eq 'item') { makespace(); @@ -241,15 +275,15 @@ sub prepare_for_output { my $paratag = $_; $_ = ; if (/^=/) { # tricked! - local($indent) = $indent[$#index - 1] || $DEF_INDENT; + local($indent) = $indent[$#indent - 1] || $DEF_INDENT; output($paratag); redo POD_DIRECTIVE; } &prepare_for_output; IP_output($paratag, $_); } else { - local($indent) = $indent[$#index - 1] || $DEF_INDENT; - output($_); + local($indent) = $indent[$#indent - 1] || $DEF_INDENT; + output($_, 0); } } } @@ -336,14 +370,16 @@ sub fill { sub IP_output { local($tag, $_) = @_; - local($tag_indent) = $indent[$#index - 1] || $DEF_INDENT; + local($tag_indent) = $indent[$#indent - 1] || $DEF_INDENT; $tag_cols = $SCREEN - $tag_indent; $cols = $SCREEN - $indent; $tag =~ s/\s*$//; s/\s+/ /g; s/^ //; $str = "format OUTPUT = \n" - . (" " x ($tag_indent)) + . (($opt_alt_format && $tag_indent > 1) + ? ":" . " " x ($tag_indent - 1) + : " " x ($tag_indent)) . '@' . ('<' x ($indent - $tag_indent - 1)) . "^" . ("<" x ($cols - 1)) . "\n" . '$tag, $_' @@ -371,6 +407,7 @@ sub output { } else { s/^/' ' x $indent/gem; s/^\s+\n$/\n/gm; + s/^ /: /s if defined($reformat) && $opt_alt_format; print OUTPUT; } } @@ -409,7 +446,7 @@ sub clear_noremap { defined $HTML_Escapes{$3} ? do { $HTML_Escapes{$3} } : do { - warn "Unknown escape: $& in $_"; + warn "Unknown escape: E<$1> in $_"; "E<$1>"; } }