This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Integrate:
[perl5.git] / lib / Text / Wrap.pm
CommitLineData
4633a7c4
LW
1package Text::Wrap;
2
9a09eeb5 3require Exporter;
4633a7c4 4
0c5a43b5
GS
5@ISA = qw(Exporter);
6@EXPORT = qw(wrap fill);
7@EXPORT_OK = qw($columns $break $huge);
4633a7c4 8
a7afab75 9$VERSION = 2005.0824_01;
b1a524cb 10
37a581db 11use vars qw($VERSION $columns $debug $break $huge $unexpand $tabstop
a7afab75 12 $separator $separator2);
9a09eeb5 13use strict;
b1a524cb 14
4633a7c4 15BEGIN {
9a09eeb5
DMS
16 $columns = 76; # <= screen width
17 $debug = 0;
18 $break = '\s';
3e2ea5df 19 $huge = 'wrap'; # alternatively: 'die' or 'overflow'
37a581db
JH
20 $unexpand = 1;
21 $tabstop = 8;
22 $separator = "\n";
a7afab75 23 $separator2 = undef;
4633a7c4
LW
24}
25
9a09eeb5
DMS
26use Text::Tabs qw(expand unexpand);
27
4633a7c4
LW
28sub wrap
29{
9a09eeb5
DMS
30 my ($ip, $xp, @t) = @_;
31
37a581db 32 local($Text::Tabs::tabstop) = $tabstop;
9a09eeb5 33 my $r = "";
3e2ea5df 34 my $tail = pop(@t);
37a581db 35 my $t = expand(join("", (map { /\s+\z/ ? ( $_ ) : ($_, ' ') } @t), $tail));
9a09eeb5
DMS
36 my $lead = $ip;
37 my $ll = $columns - length(expand($ip)) - 1;
5b7ea690 38 $ll = 0 if $ll < 0;
9a09eeb5
DMS
39 my $nll = $columns - length(expand($xp)) - 1;
40 my $nl = "";
41 my $remainder = "";
42
37a581db
JH
43 use re 'taint';
44
3e2ea5df
JH
45 pos($t) = 0;
46 while ($t !~ /\G\s*\Z/gc) {
5e7a2366 47 if ($t =~ /\G([^\n]{0,$ll})($break|\n*\z)/xmgc) {
37a581db
JH
48 $r .= $unexpand
49 ? unexpand($nl . $lead . $1)
50 : $nl . $lead . $1;
9a09eeb5 51 $remainder = $2;
3e2ea5df 52 } elsif ($huge eq 'wrap' && $t =~ /\G([^\n]{$ll})/gc) {
37a581db
JH
53 $r .= $unexpand
54 ? unexpand($nl . $lead . $1)
55 : $nl . $lead . $1;
a7afab75 56 $remainder = defined($separator2) ? $separator2 : $separator;
37a581db
JH
57 } elsif ($huge eq 'overflow' && $t =~ /\G([^\n]*?)($break|\z)/xmgc) {
58 $r .= $unexpand
59 ? unexpand($nl . $lead . $1)
60 : $nl . $lead . $1;
3e2ea5df 61 $remainder = $2;
9a09eeb5
DMS
62 } elsif ($huge eq 'die') {
63 die "couldn't wrap '$t'";
64 } else {
65 die "This shouldn't happen";
66 }
67
68 $lead = $xp;
69 $ll = $nll;
a7afab75
NC
70 $nl = defined($separator2)
71 ? ($remainder eq "\n"
72 ? "\n"
73 : $separator2)
74 : $separator;
9b599b2a 75 }
9a09eeb5 76 $r .= $remainder;
b1a524cb 77
9a09eeb5 78 print "-----------$r---------\n" if $debug;
b1a524cb 79
3e2ea5df 80 print "Finish up with '$lead'\n" if $debug;
b1a524cb 81
3e2ea5df
JH
82 $r .= $lead . substr($t, pos($t), length($t)-pos($t))
83 if pos($t) ne length($t);
b1a524cb 84
9a09eeb5 85 print "-----------$r---------\n" if $debug;;
3e2ea5df 86
9a09eeb5 87 return $r;
4633a7c4
LW
88}
89
0c5a43b5
GS
90sub fill
91{
92 my ($ip, $xp, @raw) = @_;
93 my @para;
94 my $pp;
95
96 for $pp (split(/\n\s+/, join("\n",@raw))) {
97 $pp =~ s/\s+/ /g;
98 my $x = wrap($ip, $xp, $pp);
99 push(@para, $x);
100 }
101
102 # if paragraph_indent is the same as line_indent,
103 # separate paragraphs with blank lines
104
3e2ea5df
JH
105 my $ps = ($ip eq $xp) ? "\n\n" : "\n";
106 return join ($ps, @para);
0c5a43b5
GS
107}
108
4633a7c4 1091;
68e56a55 110__END__
b1a524cb 111
112=head1 NAME
113
114Text::Wrap - line wrapping to form simple paragraphs
115
116=head1 SYNOPSIS
117
3e2ea5df
JH
118B<Example 1>
119
b1a524cb 120 use Text::Wrap
121
3e2ea5df
JH
122 $initial_tab = "\t"; # Tab before first line
123 $subsequent_tab = ""; # All other lines flush left
124
b1a524cb 125 print wrap($initial_tab, $subsequent_tab, @text);
0c5a43b5 126 print fill($initial_tab, $subsequent_tab, @text);
b1a524cb 127
611e9550 128 $lines = wrap($initial_tab, $subsequent_tab, @text);
3e2ea5df
JH
129
130 @paragraphs = fill($initial_tab, $subsequent_tab, @text);
131
132B<Example 2>
133
9a09eeb5 134 use Text::Wrap qw(wrap $columns $huge);
b1a524cb 135
3e2ea5df 136 $columns = 132; # Wrap at 132 characters
9a09eeb5
DMS
137 $huge = 'die';
138 $huge = 'wrap';
3e2ea5df 139 $huge = 'overflow';
b1a524cb 140
3e2ea5df 141B<Example 3>
bbc7dcd2 142
3e2ea5df 143 use Text::Wrap
b1a524cb 144
3e2ea5df
JH
145 $Text::Wrap::columns = 72;
146 print wrap('', '', @text);
9a09eeb5 147
3e2ea5df 148=head1 DESCRIPTION
9a09eeb5 149
37a581db 150C<Text::Wrap::wrap()> is a very simple paragraph formatter. It formats a
3e2ea5df
JH
151single paragraph at a time by breaking lines at word boundries.
152Indentation is controlled for the first line (C<$initial_tab>) and
5b7ea690 153all subsequent lines (C<$subsequent_tab>) independently. Please note:
3e2ea5df
JH
154C<$initial_tab> and C<$subsequent_tab> are the literal strings that will
155be used: it is unlikley you would want to pass in a number.
156
37a581db
JH
157Text::Wrap::fill() is a simple multi-paragraph formatter. It formats
158each paragraph separately and then joins them together when it's done. It
5e7a2366 159will destroy any whitespace in the original text. It breaks text into
37a581db
JH
160paragraphs by looking for whitespace after a newline. In other respects
161it acts like wrap().
162
163=head1 OVERRIDES
164
165C<Text::Wrap::wrap()> has a number of variables that control its behavior.
166Because other modules might be using C<Text::Wrap::wrap()> it is suggested
167that you leave these variables alone! If you can't do that, then
168use C<local($Text::Wrap::VARIABLE) = YOURVALUE> when you change the
169values so that the original value is restored. This C<local()> trick
170will not work if you import the variable into your own namespace.
171
3e2ea5df
JH
172Lines are wrapped at C<$Text::Wrap::columns> columns. C<$Text::Wrap::columns>
173should be set to the full width of your output device. In fact,
174every resulting line will have length of no more than C<$columns - 1>.
175
37a581db
JH
176It is possible to control which characters terminate words by
177modifying C<$Text::Wrap::break>. Set this to a string such as
178C<'[\s:]'> (to break before spaces or colons) or a pre-compiled regexp
179such as C<qr/[\s']/> (to break before spaces or apostrophes). The
180default is simply C<'\s'>; that is, words are terminated by spaces.
181(This means, among other things, that trailing punctuation such as
182full stops or commas stay with the word they are "attached" to.)
183
3e2ea5df
JH
184Beginner note: In example 2, above C<$columns> is imported into
185the local namespace, and set locally. In example 3,
186C<$Text::Wrap::columns> is set in its own namespace without importing it.
187
37a581db
JH
188C<Text::Wrap::wrap()> starts its work by expanding all the tabs in its
189input into spaces. The last thing it does it to turn spaces back
190into tabs. If you do not want tabs in your results, set
5e7a2366 191C<$Text::Wrap::unexpand> to a false value. Likewise if you do not
37a581db
JH
192want to use 8-character tabstops, set C<$Text::Wrap::tabstop> to
193the number of characters you do want for your tabstops.
194
195If you want to separate your lines with something other than C<\n>
a7afab75
NC
196then set C<$Text::Wrap::separator> to your preference. This replaces
197all newlines with C<$Text::Wrap::separator>. If you just to preserve
198existing newlines but add new breaks with something else, set
199C<$Text::Wrap::separator2> instead.
37a581db 200
3e2ea5df
JH
201When words that are longer than C<$columns> are encountered, they
202are broken up. C<wrap()> adds a C<"\n"> at column C<$columns>.
203This behavior can be overridden by setting C<$huge> to
204'die' or to 'overflow'. When set to 'die', large words will cause
205C<die()> to be called. When set to 'overflow', large words will be
206left intact.
9b599b2a 207
37a581db 208Historical notes: 'die' used to be the default value of
3e2ea5df
JH
209C<$huge>. Now, 'wrap' is the default value.
210
b1a524cb 211=head1 EXAMPLE
212
213 print wrap("\t","","This is a bit of text that forms
214 a normal book-style paragraph");
215
a7afab75 216=head1 LICENSE
b1a524cb 217
4fc6b8d8 218David Muir Sharnoff <muir@idiom.com> with help from Tim Pierce and
a7afab75
NC
219many many others. Copyright (C) 1996-2002 David Muir Sharnoff.
220This module may be modified, used, copied, and redistributed at
221your own risk. Publicly redistributed modified versions must use
222a different name.
b1a524cb 223