This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Change perlgpl.pod to GPL 1 to match README
[perl5.git] / pod / pod2text.PL
CommitLineData
cb1a09d0
AD
1#!/usr/local/bin/perl
2
c07a80fd 3use Config;
4use File::Basename qw(&basename &dirname);
3b5ca523 5use Cwd;
cb1a09d0 6
c07a80fd 7# List explicitly here the variables you want Configure to
8# generate. Metaconfig only looks for shell variables, so you
9# have to mention them as if they were shell variables, not
10# %Config entries. Thus you write
11# $startperl
12# to ensure Configure will look for $Config{startperl}.
cb1a09d0 13
3b5ca523
GS
14# This forces PL files to create target in same directory as PL file.
15# This is so that make depend always knows where to find PL derivatives.
16$origdir = cwd;
17chdir dirname($0);
44a8e56a 18$file = basename($0, '.PL');
774d564b 19$file .= '.com' if $^O eq 'VMS';
cb1a09d0 20
c07a80fd 21open OUT,">$file" or die "Can't create $file: $!";
cb1a09d0 22
c07a80fd 23print "Extracting $file (with variable substitutions)\n";
cb1a09d0 24
c07a80fd 25# In this section, perl variables will be expanded during extraction.
26# You can use $Config{...} to use Configure variables.
cb1a09d0 27
c07a80fd 28print OUT <<"!GROK!THIS!";
5f05dabc 29$Config{startperl}
30 eval 'exec $Config{perlpath} -S \$0 \${1+"\$@"}'
9741dab0 31 if \$running_under_some_shell;
c07a80fd 32!GROK!THIS!
cb1a09d0 33
c07a80fd 34# In the following, perl variables are not expanded during extraction.
cb1a09d0 35
c07a80fd 36print OUT <<'!NO!SUBS!';
cb1a09d0 37
6055f9d4 38# pod2text -- Convert POD data to formatted ASCII text.
9741dab0 39#
0e4e3f6e 40# Copyright 1999, 2000, 2001, 2004, 2006, 2008 Russ Allbery <rra@stanford.edu>
6055f9d4 41#
3c014959 42# This program is free software; you may redistribute it and/or modify it
6055f9d4
GS
43# under the same terms as Perl itself.
44#
9741dab0
GS
45# The driver script for Pod::Text, Pod::Text::Termcap, and Pod::Text::Color,
46# invoked by perldoc -t among other things.
6055f9d4
GS
47
48require 5.004;
49
50use Getopt::Long qw(GetOptions);
51use Pod::Text ();
52use Pod::Usage qw(pod2usage);
53
54use strict;
6055f9d4 55
59548eca
JH
56# Silence -w warnings.
57use vars qw($running_under_some_shell);
58
6055f9d4
GS
59# Take an initial pass through our options, looking for one of the form
60# -<number>. We turn that into -w <number> for compatibility with the
61# original pod2text script.
62for (my $i = 0; $i < @ARGV; $i++) {
63 last if $ARGV[$i] =~ /^--$/;
64 if ($ARGV[$i] =~ /^-(\d+)$/) {
65 splice (@ARGV, $i++, 1, '-w', $1);
66 }
67}
68
46bce7d0 69# Insert -- into @ARGV before any single dash argument to hide it from
b7ae008f 70# Getopt::Long; we want to interpret it as meaning stdin (which Pod::Simple
46bce7d0
GS
71# does correctly).
72my $stdin;
73@ARGV = map { $_ eq '-' && !$stdin++ ? ('--', $_) : $_ } @ARGV;
74
9741dab0
GS
75# Parse our options. Use the same names as Pod::Text for simplicity, and
76# default to sentence boundaries turned off for compatibility.
6055f9d4 77my %options;
6055f9d4
GS
78$options{sentence} = 0;
79Getopt::Long::config ('bundling');
59548eca 80GetOptions (\%options, 'alt|a', 'code', 'color|c', 'help|h', 'indent|i=i',
11f72409 81 'loose|l', 'margin|left-margin|m=i', 'overstrike|o',
9f2f055a
SH
82 'quotes|q=s', 'sentence|s', 'stderr', 'termcap|t', 'utf8|u',
83 'width|w=i')
bc9c7511 84 or exit 1;
6055f9d4
GS
85pod2usage (1) if $options{help};
86
87# Figure out what formatter we're going to use. -c overrides -t.
88my $formatter = 'Pod::Text';
89if ($options{color}) {
90 $formatter = 'Pod::Text::Color';
9741dab0
GS
91 eval { require Term::ANSIColor };
92 if ($@) { die "-c (--color) requires Term::ANSIColor be installed\n" }
6055f9d4
GS
93 require Pod::Text::Color;
94} elsif ($options{termcap}) {
95 $formatter = 'Pod::Text::Termcap';
96 require Pod::Text::Termcap;
73849855
RA
97} elsif ($options{overstrike}) {
98 $formatter = 'Pod::Text::Overstrike';
99 require Pod::Text::Overstrike;
cb1a09d0 100}
73849855 101delete @options{'color', 'termcap', 'overstrike'};
6055f9d4
GS
102
103# Initialize and run the formatter.
8f202758 104my $parser = $formatter->new (%options);
b7ae008f 105do {
b7ae008f 106 my ($input, $output) = splice (@ARGV, 0, 2);
8f202758 107 $parser->parse_from_file ($input, $output);
b7ae008f 108} while (@ARGV);
6055f9d4
GS
109
110__END__
111
112=head1 NAME
113
114pod2text - Convert POD data to formatted ASCII text
115
0e4e3f6e 116=for stopwords
9f2f055a
SH
117-aclostu --alt --stderr Allbery --overstrike overstrike --termcap --utf8
118UTF-8
0e4e3f6e 119
6055f9d4
GS
120=head1 SYNOPSIS
121
9f2f055a 122pod2text [B<-aclostu>] [B<--code>] [B<-i> I<indent>] S<[B<-q> I<quotes>]>
bc9c7511 123 [B<--stderr>] S<[B<-w> I<width>]> [I<input> [I<output> ...]]
6055f9d4
GS
124
125pod2text B<-h>
126
127=head1 DESCRIPTION
128
9741dab0
GS
129B<pod2text> is a front-end for Pod::Text and its subclasses. It uses them
130to generate formatted ASCII text from POD source. It can optionally use
131either termcap sequences or ANSI color escape sequences to format the text.
6055f9d4
GS
132
133I<input> is the file to read for POD source (the POD can be embedded in
0e4e3f6e
SH
134code). If I<input> isn't given, it defaults to C<STDIN>. I<output>, if
135given, is the file to which to write the formatted output. If I<output>
136isn't given, the formatted output is written to C<STDOUT>. Several POD
137files can be processed in the same B<pod2text> invocation (saving module
138load and compile times) by providing multiple pairs of I<input> and
139I<output> files on the command line.
6055f9d4
GS
140
141=head1 OPTIONS
142
143=over 4
144
145=item B<-a>, B<--alt>
146
147Use an alternate output format that, among other things, uses a different
148heading style and marks C<=item> entries with a colon in the left margin.
149
59548eca
JH
150=item B<--code>
151
152Include any non-POD text from the input file in the output as well. Useful
153for viewing code documented with POD blocks with the POD rendered and the
154code left intact.
155
6055f9d4
GS
156=item B<-c>, B<--color>
157
158Format the output with ANSI color escape sequences. Using this option
159requires that Term::ANSIColor be installed on your system.
160
161=item B<-i> I<indent>, B<--indent=>I<indent>
162
163Set the number of spaces to indent regular text, and the default indentation
164for C<=over> blocks. Defaults to 4 spaces if this option isn't given.
165
9741dab0
GS
166=item B<-h>, B<--help>
167
168Print out usage information and exit.
169
6055f9d4
GS
170=item B<-l>, B<--loose>
171
172Print a blank line after a C<=head1> heading. Normally, no blank line is
9741dab0
GS
173printed after C<=head1>, although one is still printed after C<=head2>,
174because this is the expected formatting for manual pages; if you're
175formatting arbitrary text documents, using this option is recommended.
6055f9d4 176
11f72409
RA
177=item B<-m> I<width>, B<--left-margin>=I<width>, B<--margin>=I<width>
178
179The width of the left margin in spaces. Defaults to 0. This is the margin
180for all text, including headings, not the amount by which regular text is
181indented; for the latter, see B<-i> option.
182
73849855
RA
183=item B<-o>, B<--overstrike>
184
0e4e3f6e 185Format the output with overstrike printing. Bold text is rendered as
73849855
RA
186character, backspace, character. Italics and file names are rendered as
187underscore, backspace, character. Many pagers, such as B<less>, know how
188to convert this to bold or underlined text.
189
ab1f1d91
JH
190=item B<-q> I<quotes>, B<--quotes>=I<quotes>
191
192Sets the quote marks used to surround CE<lt>> text to I<quotes>. If
193I<quotes> is a single character, it is used as both the left and right
194quote; if I<quotes> is two characters, the first character is used as the
195left quote and the second as the right quoted; and if I<quotes> is four
196characters, the first two are used as the left quote and the second two as
197the right quote.
198
199I<quotes> may also be set to the special value C<none>, in which case no
200quote marks are added around CE<lt>> text.
201
6055f9d4
GS
202=item B<-s>, B<--sentence>
203
9741dab0 204Assume each sentence ends with two spaces and try to preserve that spacing.
6055f9d4
GS
205Without this option, all consecutive whitespace in non-verbatim paragraphs
206is compressed into a single space.
207
bc9c7511
NC
208=item B<--stderr>
209
210By default, B<pod2text> puts any errors detected in the POD input in a POD
211ERRORS section in the output manual page. If B<--stderr> is given, errors
212are sent to standard error instead and the POD ERRORS section is
213suppressed.
214
6055f9d4
GS
215=item B<-t>, B<--termcap>
216
217Try to determine the width of the screen and the bold and underline
218sequences for the terminal from termcap, and use that information in
219formatting the output. Output will be wrapped at two columns less than the
220width of your terminal device. Using this option requires that your system
46bce7d0
GS
221have a termcap file somewhere where Term::Cap can find it and requires that
222your system support termios. With this option, the output of B<pod2text>
223will contain terminal control sequences for your current terminal type.
6055f9d4 224
9f2f055a
SH
225=item B<-u>, B<--utf8>
226
227By default, B<pod2text> tries to use the same output encoding as its input
228encoding (to be backward-compatible with older versions). This option
229says to instead force the output encoding to UTF-8.
230
231Be aware that, when using this option, the input encoding of your POD
232source must be properly declared unless it is US-ASCII or Latin-1. POD
233input without an C<=encoding> command will be assumed to be in Latin-1,
234and if it's actually in UTF-8, the output will be double-encoded. See
235L<perlpod(1)> for more information on the C<=encoding> command.
236
6055f9d4
GS
237=item B<-w>, B<--width=>I<width>, B<->I<width>
238
239The column at which to wrap text on the right-hand side. Defaults to 76,
240unless B<-t> is given, in which case it's two columns less than the width of
241your terminal device.
242
243=back
244
9741dab0
GS
245=head1 DIAGNOSTICS
246
b7ae008f 247If B<pod2text> fails with errors, see L<Pod::Text> and L<Pod::Simple> for
9741dab0
GS
248information about what those errors might mean. Internally, it can also
249produce the following diagnostics:
250
251=over 4
252
253=item -c (--color) requires Term::ANSIColor be installed
254
255(F) B<-c> or B<--color> were given, but Term::ANSIColor could not be
256loaded.
257
258=item Unknown option: %s
259
260(F) An unknown command line option was given.
261
262=back
263
b7ae008f
SP
264In addition, other L<Getopt::Long> error messages may result from invalid
265command-line options.
9741dab0 266
6055f9d4
GS
267=head1 ENVIRONMENT
268
269=over 4
270
271=item COLUMNS
272
273If B<-t> is given, B<pod2text> will take the current width of your screen
274from this environment variable, if available. It overrides terminal width
275information in TERMCAP.
276
277=item TERMCAP
278
279If B<-t> is given, B<pod2text> will use the contents of this environment
280variable if available to determine the correct formatting sequences for your
281current terminal device.
282
283=back
284
6055f9d4
GS
285=head1 SEE ALSO
286
fd20da51 287L<Pod::Text>, L<Pod::Text::Color>, L<Pod::Text::Overstrike>,
9f2f055a 288L<Pod::Text::Termcap>, L<Pod::Simple>, L<perlpod(1)>
fd20da51
JH
289
290The current version of this script is always available from its web site at
291L<http://www.eyrie.org/~eagle/software/podlators/>. It is also part of the
292Perl core distribution as of 5.6.0.
6055f9d4
GS
293
294=head1 AUTHOR
295
3c014959
JH
296Russ Allbery <rra@stanford.edu>.
297
298=head1 COPYRIGHT AND LICENSE
299
0e4e3f6e
SH
300Copyright 1999, 2000, 2001, 2004, 2006, 2008 Russ Allbery
301<rra@stanford.edu>.
3c014959
JH
302
303This program is free software; you may redistribute it and/or modify it
304under the same terms as Perl itself.
cb1a09d0 305
6055f9d4 306=cut
c07a80fd 307!NO!SUBS!
cb1a09d0 308
c07a80fd 309close OUT or die "Can't close $file: $!";
310chmod 0755, $file or die "Can't reset permissions for $file: $!\n";
311exec("$Config{'eunicefix'} $file") if $Config{'eunicefix'} ne ':';
3b5ca523 312chdir $origdir;