use strict; use warnings; package Text::Wrap; use warnings::register; BEGIN { require Exporter; *import = \&Exporter::import } our @EXPORT = qw( wrap fill ); our @EXPORT_OK = qw( $columns $break $huge ); our $VERSION = '2024.001'; our $SUBVERSION = 'modern'; # back-compat vestige BEGIN { eval sprintf 'sub REGEXPS_USE_BYTES () { %d }', scalar( pack('U*', 0x80) =~ /\xc2/ ) } my $brkspc = "\x{a0}\x{202f}" =~ /\s/ ? '[^\x{a0}\x{202f}\S]' : '\s'; our $columns = 76; # <= screen width our $break = '(?>\n|\r\n|'.$brkspc.'\pM*)'; our $huge = 'wrap'; # alternatively: 'die' or 'overflow' our $unexpand = 1; our $tabstop = 8; our $separator = "\n"; our $separator2 = undef; sub _xlen { $_[0] =~ /^\pM/ + ( () = $_[0] =~ /\PM/g ) } use Text::Tabs qw(expand unexpand); sub wrap { my ($ip, $xp, @t) = map +( defined $_ ? $_ : '' ), @_; local($Text::Tabs::tabstop) = $tabstop; my $r = ""; my $tail = pop(@t); my $t = expand(join("", (map { /\s+\z/ ? ( $_ ) : ($_, ' ') } @t), $tail)); my $lead = $ip; my $nll = $columns - _xlen(expand($xp)) - 1; if ($nll <= 0 && $xp ne '') { my $nc = _xlen(expand($xp)) + 2; warnings::warnif "Increasing \$Text::Wrap::columns from $columns to $nc to accommodate length of subsequent tab"; $columns = $nc; $nll = 1; } my $ll = $columns - _xlen(expand($ip)) - 1; $ll = 0 if $ll < 0; my $nl = ""; my $remainder = ""; use re 'taint'; pos($t) = 0; while ($t !~ /\G(?:$break)*\Z/gc) { if ($t =~ /\G((?>(?!\n)\PM\pM*|(?(?!\n)\PM\pM*|(?