updated to Text::Wrap 98.112801 from CPAN; one published change
David Muir Sharnoff [Sat, 28 Nov 1998 04:34:17 +0000 (20:34 -0800)]
has happened without the authors knowledge or consent; the subversive
version (which is in 5.00502) breaks one of the tests in the
authors testsuite; attempts are being made to find a fix that
avoids breaking code already running with the 5.005_02 version
Message-Id: <199811281234.EAA03082@idiom.com>
Subject: Updated Text::Wrap, Time::ParseDate, File::Flock

p4raw-id: //depot/perl@2399

lib/Text/Wrap.pm
t/lib/textwrap.t

index 8566bb6..062354d 100644 (file)
@@ -1,86 +1,64 @@
 package Text::Wrap;
 
-use vars qw(@ISA @EXPORT @EXPORT_OK $VERSION $columns $debug $min_wrap_width);
-use strict;
-use Exporter;
+require Exporter;
 
-$VERSION = "97.03";
-@ISA = qw(Exporter);
+@ISA = (Exporter);
 @EXPORT = qw(wrap);
-@EXPORT_OK = qw($columns $tabstop $min_wrap_width fill);
+@EXPORT_OK = qw($columns $wraplong);
 
-use Text::Tabs qw(expand unexpand $tabstop);
+$VERSION = 98.112801;
 
+use vars qw($VERSION $columns $debug $break $huge);
+use strict;
 
 BEGIN  {
-    $columns = 76;  # <= screen width
-    $debug = 0;
-    # minimum wrap width (leaders will be shortened to accomodate this)
-    $min_wrap_width = int($columns/5);
+       $columns = 76;  # <= screen width
+       $debug = 0;
+       $break = '\s';
+       $huge = 'wrap'; # alternatively: 'die'
 }
 
+use Text::Tabs qw(expand unexpand);
+
 sub wrap
 {
-    my ($ip, $xp, @t) = @_;
-
-    my @rv;
-    my $t = expand(join(" ",@t));
-
-    my $xll = $columns - length(expand($xp)) - 1;
-    while ($xll < $min_wrap_width) {
-       chop $xp;
-       $xll = $columns - length(expand($xp)) - 1;
-    }
-
-    my $ll = $columns - length(expand($ip)) - 1;
-    while ($ll < $min_wrap_width) {
-       chop $ip;
-       $ll = $columns - length(expand($ip)) - 1;
-    }
-    my $lead = $ip;
-    my $nl = "";
-
-    $t =~ s/^\s+//;
-    while(length($t) > $ll) {
-       # remove up to a line length of things that
-       # aren't new lines and tabs.
-       if ($t =~ s/^([^\n]{0,$ll})(\s|\Z(?!\n))//) {
-           my ($l,$r) = ($1,$2);
-           $l =~ s/\s+$//;
-           print "WRAP  $lead$l..($r)\n" if $debug;
-           push @rv, unexpand($lead . $l), "\n";
-               
-       } elsif ($t =~ s/^([^\n]{$ll})//) {
-           print "SPLIT $lead$1..\n" if $debug;
-           push @rv, unexpand($lead . $1),"\n";
+       my ($ip, $xp, @t) = @_;
+
+       my $r = "";
+       my $t = expand(join(" ",@t));
+       my $lead = $ip;
+       my $ll = $columns - length(expand($ip)) - 1;
+       my $nll = $columns - length(expand($xp)) - 1;
+       my $nl = "";
+       my $remainder = "";
+
+       while ($t !~ /^\s*$/) {
+               if ($t =~ s/^([^\n]{0,$ll})($break|\Z(?!\n))//xm) {
+                       $r .= unexpand($nl . $lead . $1);
+                       $remainder = $2;
+               } elsif ($huge eq 'wrap' && $t =~ s/^([^\n]{$ll})//) {
+                       $r .= unexpand($nl . $lead . $1);
+                       $remainder = "\n";
+               } elsif ($huge eq 'die') {
+                       die "couldn't wrap '$t'";
+               } else {
+                       die "This shouldn't happen";
+               }
+                       
+               $lead = $xp;
+               $ll = $nll;
+               $nl = "\n";
        }
-       # reset the leader
-       $lead = $xp;
-       $ll = $xll;
-       $t =~ s/^\s+//;
-    } 
-    print "TAIL  $lead$t\n" if $debug;
-    push @rv, $lead.$t if $t ne "";
-    return join '', @rv;
-}
+       $r .= $remainder;
 
+       print "-----------$r---------\n" if $debug;
 
-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);
-       }
+       print "Finish up with '$lead', '$t'\n" if $debug;
 
-       # if paragraph_indent is the same as line_indent, 
-       # separate paragraphs with blank lines
+       $r .= $lead . $t if $t ne "";
 
-       return join ($ip eq $xp ? "\n\n" : "\n", @para);
+       print "-----------$r---------\n" if $debug;;
+       return $r;
 }
 
 1;
@@ -96,45 +74,34 @@ Text::Wrap - line wrapping to form simple paragraphs
 
        print wrap($initial_tab, $subsequent_tab, @text);
 
-       use Text::Wrap qw(wrap $columns $tabstop fill);
+       use Text::Wrap qw(wrap $columns $huge);
 
        $columns = 132;
-       $tabstop = 4;
-
-       print fill($initial_tab, $subsequent_tab, @text);
-       print fill("", "", `cat book`);
+       $huge = 'die';
+       $huge = 'wrap';
 
 =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 (default is 76).
-$Text::Wrap::min_wrap_width controls the minimum number of columns that
-are reserved for the wrapped text (default is 15).  Indentation will
-be reduced to accomodate this value.
-
-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().
+all subsquent lines ($subsequent_tab) independently.  
+
+Lines are wrapped at $Text::Wrap::columns columns.  
+$Text::Wrap::columns should be set to the full width of your output device.
+
+When words that are longer than $columns are encountered, they
+are broken up.  Previous versions of wrap() die()ed instead.
+To restore the old (dying) behavior, set $Text::Wrap::huge to
+'die'.
 
 =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 now split at line-length.
-
 =head1 AUTHOR
 
 David Muir Sharnoff <muir@idiom.com> with help from Tim Pierce and
-others. Updated by Jacqui Caren.
+many others.
 
-=cut
index 9c8d1b4..3b6a1ea 100755 (executable)
-#!./perl
+#!./perl -w
 
 BEGIN {
     chdir 't' if -d 't';
     @INC = '../lib';
 }
 
-print "1..5\n";
+@tests = (split(/\nEND\n/s, <<DONE));
+TEST1
+This 
+is
+a
+test
+END
+   This 
+ is
+ a
+ test
+END
+TEST2
+This is a test of a very long line.  It should be broken up and put onto multiple lines.
+This is a test of a very long line.  It should be broken up and put onto multiple lines.
 
-use Text::Wrap qw(wrap $columns);
+This is a test of a very long line.  It should be broken up and put onto multiple lines.
+END
+   This is a test of a very long line. It should be broken up and put onto
+ multiple lines.
+ This is a test of a very long line.  It should be broken up and put onto
+ multiple lines.
+ This is a test of a very long line.  It should be broken up and put onto
+ multiple lines.
+END
+TEST3
+This is a test of a very long line.  It should be broken up and put onto multiple lines.
+END
+   This is a test of a very long line. It should be broken up and put onto
+ multiple lines.
+END
+TEST4
+This is a test of a very long line.  It should be broken up and put onto multiple lines.
 
-$columns = 30;
+END
+   This is a test of a very long line. It should be broken up and put onto
+ multiple lines.
 
-$text = <<'EOT';
-Text::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.
-EOT
+END
+TEST5
+This is a test of a very long line. It should be broken up and put onto multiple This is a test of a very long line. It should be broken up and put
+END
+   This is a test of a very long line. It should be broken up and put onto
+ multiple This is a test of a very long line. It should be broken up and
+ put
+END
+TEST6
+11111111 22222222 33333333 44444444 55555555 66666666 77777777 888888888 999999999 aaaaaaaaa bbbbbbbbb ccccccccc ddddddddd eeeeeeeee ffffffff gggggggg hhhhhhhh iiiiiiii jjjjjjjj kkkkkkkk llllllll mmmmmmmmm nnnnnnnnn ooooooooo ppppppppp qqqqqqqqq rrrrrrrrr sssssssss
+END
+   11111111 22222222 33333333 44444444 55555555 66666666 77777777 888888888
+ 999999999 aaaaaaaaa bbbbbbbbb ccccccccc ddddddddd eeeeeeeee ffffffff
+ gggggggg hhhhhhhh iiiiiiii jjjjjjjj kkkkkkkk llllllll mmmmmmmmm nnnnnnnnn
+ ooooooooo ppppppppp qqqqqqqqq rrrrrrrrr sssssssss
+END
+TEST7
+c3t1d0s6 c4t1d0s6 c5t1d0s6 c6t1d0s6 c7t1d0s6 c8t1d0s6 c9t1d0s6 c10t1d0s6 c11t1d0s6 c12t1d0s6 c13t1d0s6 c14t1d0s6 c15t1d0s6 c16t1d0s6 c3t1d0s0 c4t1d0s0 c5t1d0s0 c6t1d0s0 c7t1d0s0 c8t1d0s0 c9t1d0s0 c10t1d0s0 c11t1d0s0 c12t1d0s0 c13t1d0s0 c14t1d0s0 c15t1d0s0 c16t1d0s0
+END
+   c3t1d0s6 c4t1d0s6 c5t1d0s6 c6t1d0s6 c7t1d0s6 c8t1d0s6 c9t1d0s6 c10t1d0s6
+ c11t1d0s6 c12t1d0s6 c13t1d0s6 c14t1d0s6 c15t1d0s6 c16t1d0s6 c3t1d0s0
+ c4t1d0s0 c5t1d0s0 c6t1d0s0 c7t1d0s0 c8t1d0s0 c9t1d0s0 c10t1d0s0 c11t1d0s0
+ c12t1d0s0 c13t1d0s0 c14t1d0s0 c15t1d0s0 c16t1d0s0
+END
+TEST8
+A test of a very very long word.
+a123456789b123456789c123456789d123456789e123456789f123456789g123456789g1234567
+END
+   A test of a very very long word.
+ a123456789b123456789c123456789d123456789e123456789f123456789g123456789g123
+ 4567
+END
+TEST9
+A test of a very very long word.  a123456789b123456789c123456789d123456789e123456789f123456789g123456789g1234567
+END
+   A test of a very very long word. 
+ a123456789b123456789c123456789d123456789e123456789f123456789g123456789g123
+ 4567
+END
+DONE
 
-$text =~ s/\n/ /g;
-$_ = wrap "|  ", "|", $text;
 
-#print "$_\n";
+$| = 1;
 
-print "not " unless /^\|  Text::Wrap is/;  # start is ok
-print "ok 1\n";
+print "1..";
+print @tests/2;
+print "\n";
 
-print "not " if /^.{31,}$/m;  # no line longer than 30 chars
-print "ok 2\n";
+use Text::Wrap;
 
-print "not " unless /^\|\w/m;  # other lines start with 
-print "ok 3\n";
+$rerun = $ENV{'PERL_DL_NONLAZY'} ? 0 : 1;
 
-print "not " unless /\bsubsquent\b/; # look for a random word
-print "ok 4\n";
+$tn = 1;
+while (@tests) {
+       my $in = shift(@tests);
+       my $out = shift(@tests);
 
-print "not " unless /\bdevice\./;  # look for last word
-print "ok 5\n";
+       $in =~ s/^TEST(\d+)?\n//;
+
+       my $back = wrap('   ', ' ', $in);
+
+       if ($back eq $out) {
+               print "ok $tn\n";
+       } elsif ($rerun) {
+               my $oi = $in;
+               foreach ($in, $back, $out) {
+                       s/\t/^I\t/gs;
+                       s/\n/\$\n/gs;
+               }
+               print "------------ input ------------\n";
+               print $in;
+               print "\n------------ output -----------\n";
+               print $back;
+               print "\n------------ expected ---------\n";
+               print $out;
+               print "\n-------------------------------\n";
+               $Text::Wrap::debug = 1;
+               wrap('   ', ' ', $oi);
+               exit(1);
+       } else {
+               print "not ok $tn\n";
+       }
+       $tn++;
+}