ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/cvsroot/staticperl/perl/lib/Text/Wrap.pm
Revision: 1.1
Committed: Thu Jun 30 14:27:16 2005 UTC (21 years, 4 months ago) by root
Branch: MAIN
CVS Tags: PERL-5-8-7, HEAD
Branch point for: PERL
Log Message:
*** empty log message ***

File Contents

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