summaryrefslogtreecommitdiff
path: root/lib/Text/Wrap.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Text/Wrap.pm')
-rw-r--r--lib/Text/Wrap.pm184
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);
+}
+