avoid MakeMaker setting $^W=1
[p5sagit/p5-mst-13.2.git] / lib / Text / Wrap.pm
index b665752..5f95edb 100644 (file)
-
 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>
+require Exporter;
 
-=cut
+@ISA = qw(Exporter);
+@EXPORT = qw(wrap fill);
+@EXPORT_OK = qw($columns $break $huge);
 
-require Exporter;
+$VERSION = 98.112902;
 
-@ISA = (Exporter);
-@EXPORT = qw(wrap);
-@EXPORT_OK = qw($columns);
+use vars qw($VERSION $columns $debug $break $huge);
+use strict;
 
 BEGIN  {
-       $Text::Wrap::columns = 76;  # <= screen width
+       $columns = 76;  # <= screen width
+       $debug = 0;
+       $break = '\s';
+       $huge = 'wrap'; # alternatively: 'die'
 }
 
-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");
-               $lead = $xp;
-               my $ll = $Text::Wrap::columns - length(expand($lead)) - 1;
-               while ($t =~ s/^([^\n]{0,$ll})\s//) {
-                       $r .= unexpand($lead . $1 . "\n");
+       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";
                }
-       } 
-       die "couldn't wrap '$t'" 
-               if length($t) > $ll;
-       $r .= $t;
+                       
+               $lead = $xp;
+               $ll = $nll;
+               $nl = "\n";
+       }
+       $r .= $remainder;
+
+       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;
 }
 
+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);
+}
+
 1;
+__END__
+
+=head1 NAME
+
+Text::Wrap - line wrapping to form simple paragraphs
+
+=head1 SYNOPSIS 
+
+       use Text::Wrap
+
+       print wrap($initial_tab, $subsequent_tab, @text);
+       print fill($initial_tab, $subsequent_tab, @text);
+
+       use Text::Wrap qw(wrap $columns $huge);
+
+       $columns = 132;
+       $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 boundaries.
+Indentation is controlled for the first line ($initial_tab) and
+all subsequent 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'.
+
+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 destroy 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().
+
+=head1 EXAMPLE
+
+       print wrap("\t","","This is a bit of text that forms 
+               a normal book-style paragraph");
+
+=head1 AUTHOR
+
+David Muir Sharnoff <muir@idiom.com> with help from Tim Pierce and
+many many others.  
+