diff options
Diffstat (limited to 'lib/Text/Wrap.pm')
-rw-r--r-- | lib/Text/Wrap.pm | 184 |
1 files changed, 118 insertions, 66 deletions
diff --git a/lib/Text/Wrap.pm b/lib/Text/Wrap.pm index b665752f94..0910a2ab34 100644 --- a/lib/Text/Wrap.pm +++ b/lib/Text/Wrap.pm @@ -1,93 +1,145 @@ - package Text::Wrap; -# -# This is a very simple paragraph formatter. It formats one -# paragraph at a time by wrapping and indenting text. -# -# Usage: -# -# use Text::Wrap; -# -# print wrap($initial_tab,$subsequent_tab,@text); -# -# You can also set the number of columns to wrap before: -# -# $Text::Wrap::columns = 135; # <= width of screen -# -# use Text::Wrap qw(wrap $columns); -# $columns = 70; -# -# -# The first line will be printed with $initial_tab prepended. All -# following lines will have $subsequent_tab prepended. -# -# Example: -# -# print wrap("\t","","This is a bit of text that ..."); -# -# David Muir Sharnoff <muir@idiom.com> -# Version: 9/21/95 -# - -=head1 NAME - -Text::Wrap -- wrap text into a paragraph - -=head1 SYNOPSIS - - use Text::Wrap; - - $Text::Wrap::columns = 20; # Default - print wrap("\t","",Hello, world, it's a nice day, isn't it?"); - -=head1 DESCRIPTION - -This module is a simple paragraph formatter that wraps text into a paragraph -and indents each line. The single exported function, wrap(), takes three -arguments. The first is included before the first output line, and the -second argument is included before each subsequest output line. The third -argument is the text to be wrapped. - -=head1 AUTHOR - -David Muir Sharnoff <muir@idiom.com> - -=cut - require Exporter; @ISA = (Exporter); @EXPORT = qw(wrap); @EXPORT_OK = qw($columns); +$VERSION = 97.011701; + +use vars qw($VERSION $columns $debug); +use strict; + BEGIN { - $Text::Wrap::columns = 76; # <= screen width + $columns = 76; # <= screen width + $debug = 0; } -use Text::Tabs; -use strict; +use Text::Tabs qw(expand unexpand); sub wrap { my ($ip, $xp, @t) = @_; - my $r; + my $r = ""; my $t = expand(join(" ",@t)); my $lead = $ip; - my $ll = $Text::Wrap::columns - length(expand($lead)) - 1; - if ($t =~ s/^([^\n]{0,$ll})\s//) { - $r .= unexpand($lead . $1 . "\n"); + my $ll = $columns - length(expand($lead)) - 1; + my $nl = ""; + + # remove up to a line length of things that aren't + # new lines and tabs. + + if ($t =~ s/^([^\n]{0,$ll})(\s|\Z(?!\n))//xm) { + + # accept it. + $r .= unexpand($lead . $1); + + # recompute the leader $lead = $xp; - my $ll = $Text::Wrap::columns - length(expand($lead)) - 1; - while ($t =~ s/^([^\n]{0,$ll})\s//) { - $r .= unexpand($lead . $1 . "\n"); + $ll = $columns - length(expand($lead)) - 1; + $nl = $2; + + # repeat the above until there's none left + while ($t) { + if ( $t =~ s/^([^\n]{0,$ll})(\s|\Z(?!\n))//xm ) { + print "\$2 is '$2'\n" if $debug; + $nl = $2; + $r .= unexpand("\n" . $lead . $1); + } elsif ($t =~ s/^([^\n]{$ll})//) { + $nl = "\n"; + $r .= unexpand("\n" . $lead . $1); + } } + $r .= $nl; } + die "couldn't wrap '$t'" if length($t) > $ll; - $r .= $t; + + print "-----------$r---------\n" if $debug; + + print "Finish up with '$lead', '$t'\n" if $debug; + + $r .= $lead . $t if $t ne ""; + + print "-----------$r---------\n" if $debug;; return $r; } 1; +__END__ + +=head1 NAME + +Text::Wrap - line wrapping to form simple paragraphs + +=head1 SYNOPSIS + + use Text::Wrap + + print wrap($initial_tab, $subsequent_tab, @text); + + use Text::Wrap qw(wrap $columns); + + $columns = 132; + +=head1 DESCRIPTION + +Text::Wrap::wrap() is a very simple paragraph formatter. It formats a +single paragraph at a time by breaking lines at word boundries. +Indentation is controlled for the first line ($initial_tab) and +all subsquent lines ($subsequent_tab) independently. $Text::Wrap::columns +should be set to the full width of your output device. + +=head1 EXAMPLE + + print wrap("\t","","This is a bit of text that forms + a normal book-style paragraph"); + +=head1 BUGS + +It's not clear what the correct behavior should be when Wrap() is +presented with a word that is longer than a line. The previous +behavior was to die. Now the word is split at line-length. + +=head1 AUTHOR + +David Muir Sharnoff <muir@idiom.com> with help from Tim Pierce and +others. + +=cut + +Latest change by Andreas Koenig <k@anna.in-berlin.de> - 1/17/97 + + print fill($initial_tab, $subsequent_tab, @text); + + print fill("", "", `cat book`); + +Text::Wrap::fill() is a simple multi-paragraph formatter. It formats +each paragraph separately and then joins them together when it's done. It +will destory any whitespace in the original text. It breaks text into +paragraphs by looking for whitespace after a newline. In other respects +it acts like wrap(). + +# Tim Pierce did a faster version of this: + +sub fill +{ + my ($ip, $xp, @raw) = @_; + my @para; + my $pp; + + for $pp (split(/\n\s+/, join("\n",@raw))) { + $pp =~ s/\s+/ /g; + my $x = wrap($ip, $xp, $pp); + push(@para, $x); + } + + # if paragraph_indent is the same as line_indent, + # separate paragraphs with blank lines + + return join ($ip eq $xp ? "\n\n" : "\n", @para); +} + |