This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Upgrade to Pod-Simple-3.07
[perl5.git] / lib / Pod / Text.pm
CommitLineData
6055f9d4 1# Pod::Text -- Convert POD data to formatted ASCII text.
6055f9d4 2#
8f202758
SP
3# Copyright 1999, 2000, 2001, 2002, 2004, 2006
4# by Russ Allbery <rra@stanford.edu>
6055f9d4 5#
3c014959 6# This program is free software; you may redistribute it and/or modify it
6055f9d4
GS
7# under the same terms as Perl itself.
8#
5ec554fb
JH
9# This module converts POD to formatted text. It replaces the old Pod::Text
10# module that came with versions of Perl prior to 5.6.0 and attempts to match
11# its output except for some specific circumstances where other decisions
12# seemed to produce better output. It uses Pod::Parser and is designed to be
13# very easy to subclass.
3c014959
JH
14#
15# Perl core hackers, please note that this module is also separately
16# maintained outside of the Perl core as part of the podlators. Please send
17# me any patches at the address above in addition to sending them to the
18# standard Perl mailing lists.
6055f9d4 19
3c014959 20##############################################################################
6055f9d4 21# Modules and declarations
3c014959 22##############################################################################
69e00e79 23
6055f9d4 24package Pod::Text;
69e00e79 25
6055f9d4
GS
26require 5.004;
27
6055f9d4 28use strict;
2e20e14f 29use vars qw(@ISA @EXPORT %ESCAPES $VERSION);
6055f9d4 30
b7ae008f
SP
31use Carp qw(carp croak);
32use Exporter ();
33use Pod::Simple ();
34
35@ISA = qw(Pod::Simple Exporter);
6055f9d4 36
2e20e14f
GS
37# We have to export pod2text for backward compatibility.
38@EXPORT = qw(pod2text);
39
3c014959
JH
40# Don't use the CVS revision as the version, since this module is also in Perl
41# core and too many things could munge CVS magic revision strings. This
42# number should ideally be the same as the CVS revision in podlators, however.
42ae9e1d 43$VERSION = 3.08;
69e00e79 44
3c014959 45##############################################################################
6055f9d4 46# Initialization
3c014959 47##############################################################################
69e00e79 48
b7ae008f
SP
49# This function handles code blocks. It's registered as a callback to
50# Pod::Simple and therefore doesn't work as a regular method call, but all it
51# does is call output_code with the line.
52sub handle_code {
53 my ($line, $number, $parser) = @_;
54 $parser->output_code ($line . "\n");
55}
56
57# Initialize the object and set various Pod::Simple options that we need.
58# Here, we also process any additional options passed to the constructor or
59# set up defaults if none were given. Note that all internal object keys are
60# in all-caps, reserving all lower-case object keys for Pod::Simple and user
61# arguments.
62sub new {
63 my $class = shift;
64 my $self = $class->SUPER::new;
65
66 # Tell Pod::Simple to handle S<> by automatically inserting &nbsp;.
67 $self->nbsp_for_S (1);
68
69 # Tell Pod::Simple to keep whitespace whenever possible.
70 if ($self->can ('preserve_whitespace')) {
71 $self->preserve_whitespace (1);
72 } else {
73 $self->fullstop_space_harden (1);
74 }
69e00e79 75
b7ae008f
SP
76 # The =for and =begin targets that we accept.
77 $self->accept_targets (qw/text TEXT/);
78
79 # Ensure that contiguous blocks of code are merged together. Otherwise,
80 # some of the guesswork heuristics don't work right.
81 $self->merge_text (1);
82
83 # Pod::Simple doesn't do anything useful with our arguments, but we want
84 # to put them in our object as hash keys and values. This could cause
85 # problems if we ever clash with Pod::Simple's own internal class
86 # variables.
87 my %opts = @_;
88 my @opts = map { ("opt_$_", $opts{$_}) } keys %opts;
89 %$self = (%$self, @opts);
90
91 # Initialize various things from our parameters.
92 $$self{opt_alt} = 0 unless defined $$self{opt_alt};
93 $$self{opt_indent} = 4 unless defined $$self{opt_indent};
94 $$self{opt_margin} = 0 unless defined $$self{opt_margin};
95 $$self{opt_loose} = 0 unless defined $$self{opt_loose};
96 $$self{opt_sentence} = 0 unless defined $$self{opt_sentence};
97 $$self{opt_width} = 76 unless defined $$self{opt_width};
69e00e79 98
ab1f1d91 99 # Figure out what quotes we'll be using for C<> text.
b7ae008f
SP
100 $$self{opt_quotes} ||= '"';
101 if ($$self{opt_quotes} eq 'none') {
ab1f1d91 102 $$self{LQUOTE} = $$self{RQUOTE} = '';
b7ae008f
SP
103 } elsif (length ($$self{opt_quotes}) == 1) {
104 $$self{LQUOTE} = $$self{RQUOTE} = $$self{opt_quotes};
105 } elsif ($$self{opt_quotes} =~ /^(.)(.)$/
106 || $$self{opt_quotes} =~ /^(..)(..)$/) {
ab1f1d91
JH
107 $$self{LQUOTE} = $1;
108 $$self{RQUOTE} = $2;
109 } else {
b7ae008f 110 croak qq(Invalid quote specification "$$self{opt_quotes}");
ab1f1d91
JH
111 }
112
b7ae008f
SP
113 # If requested, do something with the non-POD text.
114 $self->code_handler (\&handle_code) if $$self{opt_code};
11f72409 115
b7ae008f
SP
116 # Return the created object.
117 return $self;
118}
69e00e79 119
b7ae008f
SP
120##############################################################################
121# Core parsing
122##############################################################################
59548eca 123
b7ae008f
SP
124# This is the glue that connects the code below with Pod::Simple itself. The
125# goal is to convert the event stream coming from the POD parser into method
126# calls to handlers once the complete content of a tag has been seen. Each
127# paragraph or POD command will have textual content associated with it, and
128# as soon as all of a paragraph or POD command has been seen, that content
129# will be passed in to the corresponding method for handling that type of
130# object. The exceptions are handlers for lists, which have opening tag
131# handlers and closing tag handlers that will be called right away.
132#
133# The internal hash key PENDING is used to store the contents of a tag until
134# all of it has been seen. It holds a stack of open tags, each one
135# represented by a tuple of the attributes hash for the tag and the contents
136# of the tag.
137
138# Add a block of text to the contents of the current node, formatting it
139# according to the current formatting instructions as we do.
140sub _handle_text {
141 my ($self, $text) = @_;
142 my $tag = $$self{PENDING}[-1];
143 $$tag[1] .= $text;
6055f9d4 144}
69e00e79 145
b7ae008f
SP
146# Given an element name, get the corresponding method name.
147sub method_for_element {
148 my ($self, $element) = @_;
149 $element =~ tr/-/_/;
150 $element =~ tr/A-Z/a-z/;
151 $element =~ tr/_a-z0-9//cd;
152 return $element;
153}
69e00e79 154
b7ae008f
SP
155# Handle the start of a new element. If cmd_element is defined, assume that
156# we need to collect the entire tree for this element before passing it to the
157# element method, and create a new tree into which we'll collect blocks of
158# text and nested elements. Otherwise, if start_element is defined, call it.
159sub _handle_element_start {
160 my ($self, $element, $attrs) = @_;
161 my $method = $self->method_for_element ($element);
162
163 # If we have a command handler, we need to accumulate the contents of the
164 # tag before calling it.
165 if ($self->can ("cmd_$method")) {
166 push (@{ $$self{PENDING} }, [ $attrs, '' ]);
167 } elsif ($self->can ("start_$method")) {
168 my $method = 'start_' . $method;
169 $self->$method ($attrs, '');
170 }
171}
6055f9d4 172
b7ae008f
SP
173# Handle the end of an element. If we had a cmd_ method for this element,
174# this is where we pass along the text that we've accumulated. Otherwise, if
175# we have an end_ method for the element, call that.
176sub _handle_element_end {
177 my ($self, $element) = @_;
178 my $method = $self->method_for_element ($element);
179
180 # If we have a command handler, pull off the pending text and pass it to
181 # the handler along with the saved attribute hash.
182 if ($self->can ("cmd_$method")) {
183 my $tag = pop @{ $$self{PENDING} };
184 my $method = 'cmd_' . $method;
185 my $text = $self->$method (@$tag);
186 if (defined $text) {
187 if (@{ $$self{PENDING} } > 1) {
188 $$self{PENDING}[-1][1] .= $text;
189 } else {
190 $self->output ($text);
191 }
192 }
193 } elsif ($self->can ("end_$method")) {
194 my $method = 'end_' . $method;
8f202758 195 $self->$method ();
ab1f1d91 196 }
6055f9d4 197}
69e00e79 198
b7ae008f
SP
199##############################################################################
200# Output formatting
201##############################################################################
202
203# Wrap a line, indenting by the current left margin. We can't use Text::Wrap
204# because it plays games with tabs. We can't use formline, even though we'd
205# really like to, because it screws up non-printing characters. So we have to
206# do the wrapping ourselves.
207sub wrap {
6055f9d4 208 my $self = shift;
6055f9d4 209 local $_ = shift;
b7ae008f
SP
210 my $output = '';
211 my $spaces = ' ' x $$self{MARGIN};
212 my $width = $$self{opt_width} - $$self{MARGIN};
213 while (length > $width) {
214 if (s/^([^\n]{0,$width})\s+// || s/^([^\n]{$width})//) {
215 $output .= $spaces . $1 . "\n";
216 } else {
217 last;
218 }
219 }
220 $output .= $spaces . $_;
221 $output =~ s/\s+$/\n\n/;
222 return $output;
6055f9d4 223}
69e00e79 224
b7ae008f
SP
225# Reformat a paragraph of text for the current margin. Takes the text to
226# reformat and returns the formatted text.
227sub reformat {
27f805f4 228 my $self = shift;
27f805f4 229 local $_ = shift;
6055f9d4 230
b7ae008f
SP
231 # If we're trying to preserve two spaces after sentences, do some munging
232 # to support that. Otherwise, smash all repeated whitespace.
233 if ($$self{opt_sentence}) {
234 s/ +$//mg;
235 s/\.\n/. \n/g;
236 s/\n/ /g;
237 s/ +/ /g;
6055f9d4 238 } else {
b7ae008f 239 s/\s+/ /g;
6055f9d4 240 }
b7ae008f 241 return $self->wrap ($_);
6055f9d4 242}
69e00e79 243
b7ae008f
SP
244# Output text to the output device.
245sub output {
246 my ($self, $text) = @_;
247 $text =~ tr/\240\255/ /d;
248 print { $$self{output_fh} } $text;
249}
bf202ccd 250
b7ae008f
SP
251# Output a block of code (something that isn't part of the POD text). Called
252# by preprocess_paragraph only if we were given the code option. Exists here
253# only so that it can be overridden by subclasses.
254sub output_code { $_[0]->output ($_[1]) }
69e00e79 255
b7ae008f
SP
256##############################################################################
257# Document initialization
258##############################################################################
259
260# Set up various things that have to be initialized on a per-document basis.
261sub start_document {
262 my $self = shift;
263 my $margin = $$self{opt_indent} + $$self{opt_margin};
264
265 # Initialize a few per-document variables.
266 $$self{INDENTS} = []; # Stack of indentations.
267 $$self{MARGIN} = $margin; # Default left margin.
268 $$self{PENDING} = [[]]; # Pending output.
269
270 return '';
271}
272
273##############################################################################
274# Text blocks
275##############################################################################
276
277# This method is called whenever an =item command is complete (in other words,
278# we've seen its associated paragraph or know for certain that it doesn't have
279# one). It gets the paragraph associated with the item as an argument. If
280# that argument is empty, just output the item tag; if it contains a newline,
281# output the item tag followed by the newline. Otherwise, see if there's
282# enough room for us to output the item tag in the margin of the text or if we
283# have to put it on a separate line.
284sub item {
285 my ($self, $text) = @_;
286 my $tag = $$self{ITEM};
287 unless (defined $tag) {
288 carp "Item called without tag";
289 return;
6055f9d4 290 }
b7ae008f 291 undef $$self{ITEM};
69e00e79 292
b7ae008f
SP
293 # Calculate the indentation and margin. $fits is set to true if the tag
294 # will fit into the margin of the paragraph given our indentation level.
295 my $indent = $$self{INDENTS}[-1];
296 $indent = $$self{opt_indent} unless defined $indent;
297 my $margin = ' ' x $$self{opt_margin};
298 my $fits = ($$self{MARGIN} - $indent >= length ($tag) + 1);
69e00e79 299
b7ae008f
SP
300 # If the tag doesn't fit, or if we have no associated text, print out the
301 # tag separately. Otherwise, put the tag in the margin of the paragraph.
302 if (!$text || $text =~ /^\s+$/ || !$fits) {
303 my $realindent = $$self{MARGIN};
304 $$self{MARGIN} = $indent;
305 my $output = $self->reformat ($tag);
306 $output =~ s/^$margin /$margin:/ if ($$self{opt_alt} && $indent > 0);
307 $output =~ s/\n*$/\n/;
308
309 # If the text is just whitespace, we have an empty item paragraph;
310 # this can result from =over/=item/=back without any intermixed
311 # paragraphs. Insert some whitespace to keep the =item from merging
312 # into the next paragraph.
313 $output .= "\n" if $text && $text =~ /^\s*$/;
314
315 $self->output ($output);
316 $$self{MARGIN} = $realindent;
317 $self->output ($self->reformat ($text)) if ($text && $text =~ /\S/);
318 } else {
319 my $space = ' ' x $indent;
320 $space =~ s/^$margin /$margin:/ if $$self{opt_alt};
321 $text = $self->reformat ($text);
322 $text =~ s/^$margin /$margin:/ if ($$self{opt_alt} && $indent > 0);
323 my $tagspace = ' ' x length $tag;
324 $text =~ s/^($space)$tagspace/$1$tag/ or warn "Bizarre space in item";
325 $self->output ($text);
6055f9d4 326 }
b7ae008f 327}
69e00e79 328
b7ae008f
SP
329# Handle a basic block of text. The only tricky thing here is that if there
330# is a pending item tag, we need to format this as an item paragraph.
331sub cmd_para {
332 my ($self, $attrs, $text) = @_;
333 $text =~ s/\s+$/\n/;
334 if (defined $$self{ITEM}) {
335 $self->item ($text . "\n");
336 } else {
337 $self->output ($self->reformat ($text . "\n"));
59548eca 338 }
b7ae008f 339 return '';
6055f9d4 340}
f02a87df 341
b7ae008f
SP
342# Handle a verbatim paragraph. Just print it out, but indent it according to
343# our margin.
344sub cmd_verbatim {
345 my ($self, $attrs, $text) = @_;
346 $self->item if defined $$self{ITEM};
347 return if $text =~ /^\s*$/;
348 $text =~ s/^(\n*)(\s*\S+)/$1 . (' ' x $$self{MARGIN}) . $2/gme;
349 $text =~ s/\s*$/\n\n/;
350 $self->output ($text);
351 return '';
6055f9d4 352}
3ec07288 353
b7ae008f
SP
354# Handle literal text (produced by =for and similar constructs). Just output
355# it with the minimum of changes.
356sub cmd_data {
357 my ($self, $attrs, $text) = @_;
358 $text =~ s/^\n+//;
359 $text =~ s/\n{0,2}$/\n/;
360 $self->output ($text);
361 return '';
362}
69e00e79 363
3c014959 364##############################################################################
b7ae008f 365# Headings
3c014959 366##############################################################################
f2506fb2 367
b7ae008f
SP
368# The common code for handling all headers. Takes the header text, the
369# indentation, and the surrounding marker for the alt formatting method.
370sub heading {
371 my ($self, $text, $indent, $marker) = @_;
372 $self->item ("\n\n") if defined $$self{ITEM};
373 $text =~ s/\s+$//;
374 if ($$self{opt_alt}) {
375 my $closemark = reverse (split (//, $marker));
376 my $margin = ' ' x $$self{opt_margin};
377 $self->output ("\n" . "$margin$marker $text $closemark" . "\n\n");
378 } else {
379 $text .= "\n" if $$self{opt_loose};
380 my $margin = ' ' x ($$self{opt_margin} + $indent);
381 $self->output ($margin . $text . "\n");
382 }
383 return '';
384}
69e00e79 385
6055f9d4
GS
386# First level heading.
387sub cmd_head1 {
b7ae008f
SP
388 my ($self, $attrs, $text) = @_;
389 $self->heading ($text, 0, '====');
6055f9d4 390}
69e00e79 391
6055f9d4
GS
392# Second level heading.
393sub cmd_head2 {
b7ae008f
SP
394 my ($self, $attrs, $text) = @_;
395 $self->heading ($text, $$self{opt_indent} / 2, '== ');
6055f9d4 396}
69e00e79 397
50a3fd2a
RA
398# Third level heading.
399sub cmd_head3 {
b7ae008f
SP
400 my ($self, $attrs, $text) = @_;
401 $self->heading ($text, $$self{opt_indent} * 2 / 3 + 0.5, '= ');
50a3fd2a
RA
402}
403
b7ae008f 404# Fourth level heading.
50a3fd2a 405sub cmd_head4 {
b7ae008f
SP
406 my ($self, $attrs, $text) = @_;
407 $self->heading ($text, $$self{opt_indent} * 3 / 4 + 0.5, '- ');
50a3fd2a
RA
408}
409
b7ae008f
SP
410##############################################################################
411# List handling
412##############################################################################
413
414# Handle the beginning of an =over block. Takes the type of the block as the
415# first argument, and then the attr hash. This is called by the handlers for
416# the four different types of lists (bullet, number, text, and block).
417sub over_common_start {
418 my ($self, $attrs) = @_;
b616daaf 419 $self->item ("\n\n") if defined $$self{ITEM};
b7ae008f
SP
420
421 # Find the indentation level.
422 my $indent = $$attrs{indent};
423 unless (defined ($indent) && $indent =~ /^\s*[-+]?\d{1,4}\s*$/) {
424 $indent = $$self{opt_indent};
425 }
426
427 # Add this to our stack of indents and increase our current margin.
6055f9d4 428 push (@{ $$self{INDENTS} }, $$self{MARGIN});
b7ae008f
SP
429 $$self{MARGIN} += ($indent + 0);
430 return '';
6055f9d4 431}
69e00e79 432
b7ae008f
SP
433# End an =over block. Takes no options other than the class pointer. Output
434# any pending items and then pop one level of indentation.
435sub over_common_end {
436 my ($self) = @_;
b616daaf 437 $self->item ("\n\n") if defined $$self{ITEM};
6055f9d4 438 $$self{MARGIN} = pop @{ $$self{INDENTS} };
b7ae008f 439 return '';
69e00e79 440}
441
b7ae008f
SP
442# Dispatch the start and end calls as appropriate.
443sub start_over_bullet { $_[0]->over_common_start ($_[1]) }
444sub start_over_number { $_[0]->over_common_start ($_[1]) }
445sub start_over_text { $_[0]->over_common_start ($_[1]) }
446sub start_over_block { $_[0]->over_common_start ($_[1]) }
447sub end_over_bullet { $_[0]->over_common_end }
448sub end_over_number { $_[0]->over_common_end }
449sub end_over_text { $_[0]->over_common_end }
450sub end_over_block { $_[0]->over_common_end }
451
452# The common handler for all item commands. Takes the type of the item, the
453# attributes, and then the text of the item.
454sub item_common {
455 my ($self, $type, $attrs, $text) = @_;
456 $self->item if defined $$self{ITEM};
69e00e79 457
b7ae008f
SP
458 # Clean up the text. We want to end up with two variables, one ($text)
459 # which contains any body text after taking out the item portion, and
460 # another ($item) which contains the actual item text. Note the use of
461 # the internal Pod::Simple attribute here; that's a potential land mine.
462 $text =~ s/\s+$//;
463 my ($item, $index);
464 if ($type eq 'bullet') {
465 $item = '*';
466 } elsif ($type eq 'number') {
467 $item = $$attrs{'~orig_content'};
27f805f4 468 } else {
b7ae008f
SP
469 $item = $text;
470 $item =~ s/\s*\n\s*/ /g;
471 $text = '';
27f805f4 472 }
b7ae008f 473 $$self{ITEM} = $item;
6055f9d4 474
b7ae008f
SP
475 # If body text for this item was included, go ahead and output that now.
476 if ($text) {
477 $text =~ s/\s*$/\n/;
478 $self->item ($text);
479 }
480 return '';
6055f9d4 481}
f2506fb2 482
b7ae008f
SP
483# Dispatch the item commands to the appropriate place.
484sub cmd_item_bullet { my $self = shift; $self->item_common ('bullet', @_) }
485sub cmd_item_number { my $self = shift; $self->item_common ('number', @_) }
486sub cmd_item_text { my $self = shift; $self->item_common ('text', @_) }
487sub cmd_item_block { my $self = shift; $self->item_common ('block', @_) }
69e00e79 488
3c014959 489##############################################################################
5ec554fb 490# Formatting codes
3c014959 491##############################################################################
69e00e79 492
b7ae008f
SP
493# The simple ones.
494sub cmd_b { return $_[0]{alt} ? "``$_[2]''" : $_[2] }
495sub cmd_f { return $_[0]{alt} ? "\"$_[2]\"" : $_[2] }
496sub cmd_i { return '*' . $_[2] . '*' }
497sub cmd_x { return '' }
3c014959
JH
498
499# Apply a whole bunch of messy heuristics to not quote things that don't
500# benefit from being quoted. These originally come from Barrie Slaymaker and
501# largely duplicate code in Pod::Man.
b7ae008f
SP
502sub cmd_c {
503 my ($self, $attrs, $text) = @_;
3c014959
JH
504
505 # A regex that matches the portion of a variable reference that's the
506 # array or hash index, separated out just because we want to use it in
507 # several places in the following regex.
508 my $index = '(?: \[.*\] | \{.*\} )?';
509
510 # Check for things that we don't want to quote, and if we find any of
511 # them, return the string with just a font change and no quoting.
b7ae008f 512 $text =~ m{
3c014959
JH
513 ^\s*
514 (?:
515 ( [\'\`\"] ) .* \1 # already quoted
516 | \` .* \' # `quoted'
517 | \$+ [\#^]? \S $index # special ($^Foo, $")
518 | [\$\@%&*]+ \#? [:\'\w]+ $index # plain var or func
519 | [\$\@%&*]* [:\'\w]+ (?: -> )? \(\s*[^\s,]\s*\) # 0/1-arg func call
f011ec7d 520 | [+-]? ( \d[\d.]* | \.\d+ ) (?: [eE][+-]?\d+ )? # a number
3c014959
JH
521 | 0x [a-fA-F\d]+ # a hex constant
522 )
523 \s*\z
b7ae008f 524 }xo && return $text;
3c014959
JH
525
526 # If we didn't return, go ahead and quote the text.
b7ae008f
SP
527 return $$self{opt_alt}
528 ? "``$text''"
529 : "$$self{LQUOTE}$text$$self{RQUOTE}";
69e00e79 530}
531
b7ae008f
SP
532# Links reduce to the text that we're given, wrapped in angle brackets if it's
533# a URL.
534sub cmd_l {
535 my ($self, $attrs, $text) = @_;
536 return $$attrs{type} eq 'url' ? "<$text>" : $text;
b616daaf
JH
537}
538
3c014959 539##############################################################################
27f805f4 540# Backwards compatibility
3c014959 541##############################################################################
27f805f4
GS
542
543# The old Pod::Text module did everything in a pod2text() function. This
544# tries to provide the same interface for legacy applications.
545sub pod2text {
546 my @args;
547
548 # This is really ugly; I hate doing option parsing in the middle of a
549 # module. But the old Pod::Text module supported passing flags to its
550 # entry function, so handle -a and -<number>.
551 while ($_[0] =~ /^-/) {
552 my $flag = shift;
553 if ($flag eq '-a') { push (@args, alt => 1) }
554 elsif ($flag =~ /^-(\d+)$/) { push (@args, width => $1) }
555 else {
556 unshift (@_, $flag);
557 last;
558 }
559 }
560
561 # Now that we know what arguments we're using, create the parser.
562 my $parser = Pod::Text->new (@args);
563
564 # If two arguments were given, the second argument is going to be a file
3c014959
JH
565 # handle. That means we want to call parse_from_filehandle(), which means
566 # we need to turn the first argument into a file handle. Magic open will
567 # handle the <&STDIN case automagically.
27f805f4 568 if (defined $_[1]) {
ab1f1d91 569 my @fhs = @_;
27f805f4 570 local *IN;
ab1f1d91
JH
571 unless (open (IN, $fhs[0])) {
572 croak ("Can't open $fhs[0] for reading: $!\n");
27f805f4
GS
573 return;
574 }
ab1f1d91 575 $fhs[0] = \*IN;
8f202758
SP
576 $parser->output_fh ($fhs[1]);
577 my $retval = $parser->parse_file ($fhs[0]);
578 my $fh = $parser->output_fh ();
579 close $fh;
580 return $retval;
27f805f4 581 } else {
b7ae008f 582 return $parser->parse_file (@_);
27f805f4
GS
583 }
584}
585
8f202758
SP
586# Reset the underlying Pod::Simple object between calls to parse_from_file so
587# that the same object can be reused to convert multiple pages.
588sub parse_from_file {
589 my $self = shift;
590 $self->reinit;
42ae9e1d
RGS
591
592 # Fake the old cutting option to Pod::Parser. This fiddings with internal
593 # Pod::Simple state and is quite ugly; we need a better approach.
594 if (ref ($_[0]) eq 'HASH') {
595 my $opts = shift @_;
596 if (defined ($$opts{-cutting}) && !$$opts{-cutting}) {
597 $$self{in_pod} = 1;
598 $$self{last_was_blank} = 1;
599 }
600 }
601
602 # Do the work.
8f202758 603 my $retval = $self->Pod::Simple::parse_from_file (@_);
42ae9e1d
RGS
604
605 # Flush output, since Pod::Simple doesn't do this. Ideally we should also
606 # close the file descriptor if we had to open one, but we can't easily
607 # figure this out.
8f202758
SP
608 my $fh = $self->output_fh ();
609 my $oldfh = select $fh;
610 my $oldflush = $|;
611 $| = 1;
612 print $fh '';
613 $| = $oldflush;
614 select $oldfh;
615 return $retval;
616}
617
fcf69717
SP
618# Pod::Simple failed to provide this backward compatibility function, so
619# implement it ourselves. File handles are one of the inputs that
620# parse_from_file supports.
621sub parse_from_filehandle {
622 my $self = shift;
623 $self->parse_from_file (@_);
624}
625
3c014959 626##############################################################################
6055f9d4 627# Module return value and documentation
3c014959 628##############################################################################
69e00e79 629
6055f9d4
GS
6301;
631__END__
69e00e79 632
6055f9d4 633=head1 NAME
69e00e79 634
6055f9d4 635Pod::Text - Convert POD data to formatted ASCII text
69e00e79 636
6055f9d4 637=head1 SYNOPSIS
69e00e79 638
6055f9d4
GS
639 use Pod::Text;
640 my $parser = Pod::Text->new (sentence => 0, width => 78);
69e00e79 641
6055f9d4
GS
642 # Read POD from STDIN and write to STDOUT.
643 $parser->parse_from_filehandle;
69e00e79 644
6055f9d4
GS
645 # Read POD from file.pod and write to file.txt.
646 $parser->parse_from_file ('file.pod', 'file.txt');
69e00e79 647
6055f9d4 648=head1 DESCRIPTION
5491a304 649
27f805f4
GS
650Pod::Text is a module that can convert documentation in the POD format (the
651preferred language for documenting Perl) into formatted ASCII. It uses no
652special formatting controls or codes whatsoever, and its output is therefore
653suitable for nearly any device.
69e00e79 654
b7ae008f
SP
655As a derived class from Pod::Simple, Pod::Text supports the same methods and
656interfaces. See L<Pod::Simple> for all the details; briefly, one creates a
657new parser with C<< Pod::Text->new() >> and then normally calls parse_file().
6055f9d4 658
27f805f4 659new() can take options, in the form of key/value pairs, that control the
6055f9d4
GS
660behavior of the parser. The currently recognized options are:
661
662=over 4
663
664=item alt
665
666If set to a true value, selects an alternate output format that, among other
667things, uses a different heading style and marks C<=item> entries with a
668colon in the left margin. Defaults to false.
669
59548eca
JH
670=item code
671
672If set to a true value, the non-POD parts of the input file will be included
673in the output. Useful for viewing code documented with POD blocks with the
674POD rendered and the code left intact.
675
6055f9d4
GS
676=item indent
677
678The number of spaces to indent regular text, and the default indentation for
679C<=over> blocks. Defaults to 4.
680
681=item loose
682
683If set to a true value, a blank line is printed after a C<=head1> heading.
684If set to false (the default), no blank line is printed after C<=head1>,
685although one is still printed after C<=head2>. This is the default because
686it's the expected formatting for manual pages; if you're formatting
687arbitrary text documents, setting this to true may result in more pleasing
688output.
689
11f72409
RA
690=item margin
691
692The width of the left margin in spaces. Defaults to 0. This is the margin
693for all text, including headings, not the amount by which regular text is
694indented; for the latter, see the I<indent> option. To set the right
695margin, see the I<width> option.
696
ab1f1d91
JH
697=item quotes
698
699Sets the quote marks used to surround CE<lt>> text. If the value is a
700single character, it is used as both the left and right quote; if it is two
701characters, the first character is used as the left quote and the second as
702the right quoted; and if it is four characters, the first two are used as
703the left quote and the second two as the right quote.
704
705This may also be set to the special value C<none>, in which case no quote
706marks are added around CE<lt>> text.
707
6055f9d4
GS
708=item sentence
709
27f805f4
GS
710If set to a true value, Pod::Text will assume that each sentence ends in two
711spaces, and will try to preserve that spacing. If set to false, all
6055f9d4
GS
712consecutive whitespace in non-verbatim paragraphs is compressed into a
713single space. Defaults to true.
714
715=item width
716
717The column at which to wrap text on the right-hand side. Defaults to 76.
718
719=back
720
b7ae008f
SP
721The standard Pod::Simple method parse_file() takes one argument, the file or
722file handle to read from, and writes output to standard output unless that
723has been changed with the output_fh() method. See L<Pod::Simple> for the
724specific details and for other alternative interfaces.
6055f9d4
GS
725
726=head1 DIAGNOSTICS
727
728=over 4
729
27f805f4
GS
730=item Bizarre space in item
731
59548eca
JH
732=item Item called without tag
733
734(W) Something has gone wrong in internal C<=item> processing. These
735messages indicate a bug in Pod::Text; you should never see them.
27f805f4
GS
736
737=item Can't open %s for reading: %s
738
739(F) Pod::Text was invoked via the compatibility mode pod2text() interface
740and the input file it was given could not be opened.
741
ab1f1d91
JH
742=item Invalid quote specification "%s"
743
744(F) The quote specification given (the quotes option to the constructor) was
745invalid. A quote specification must be one, two, or four characters long.
746
6055f9d4
GS
747=back
748
749=head1 NOTES
750
27f805f4 751This is a replacement for an earlier Pod::Text module written by Tom
b7ae008f 752Christiansen. It has a revamped interface, since it now uses Pod::Simple,
27f805f4
GS
753but an interface roughly compatible with the old Pod::Text::pod2text()
754function is still available. Please change to the new calling convention,
755though.
6055f9d4
GS
756
757The original Pod::Text contained code to do formatting via termcap
758sequences, although it wasn't turned on by default and it was problematic to
27f805f4 759get it to work at all. This rewrite doesn't even try to do that, but a
bf202ccd 760subclass of it does. Look for L<Pod::Text::Termcap>.
6055f9d4
GS
761
762=head1 SEE ALSO
763
b7ae008f 764L<Pod::Simple>, L<Pod::Text::Termcap>, L<pod2text(1)>
6055f9d4 765
fd20da51
JH
766The current version of this module is always available from its web site at
767L<http://www.eyrie.org/~eagle/software/podlators/>. It is also part of the
768Perl core distribution as of 5.6.0.
769
6055f9d4
GS
770=head1 AUTHOR
771
bf202ccd
JH
772Russ Allbery <rra@stanford.edu>, based I<very> heavily on the original
773Pod::Text by Tom Christiansen <tchrist@mox.perl.com> and its conversion to
b7ae008f
SP
774Pod::Parser by Brad Appleton <bradapp@enteract.com>. Sean Burke's initial
775conversion of Pod::Man to use Pod::Simple provided much-needed guidance on
776how to use Pod::Simple.
6055f9d4 777
3c014959
JH
778=head1 COPYRIGHT AND LICENSE
779
8f202758 780Copyright 1999, 2000, 2001, 2002, 2004, 2006 Russ Allbery <rra@stanford.edu>.
3c014959
JH
781
782This program is free software; you may redistribute it and/or modify it
783under the same terms as Perl itself.
784
6055f9d4 785=cut