@@ -2,18 +2,24 @@ package Term::Table::Util;
22use strict;
33use warnings;
44
5+ use List::Util qw/ max/ ;
56use Config qw/ %Config/ ;
67
7- our $VERSION = ' 0.025 ' ;
8+ our $VERSION = ' 0.027 ' ;
89
910use base ' Exporter' ;
1011our @EXPORT_OK = qw/ term_size USE_GCS USE_TERM_READKEY USE_TERM_SIZE_ANY uni_length/ ;
1112
1213sub DEFAULT_SIZE () { 80 }
1314
14- my $IO ;
15+ my @IO ;
16+ my @TIO ;
1517BEGIN {
16- open ($IO , ' >&' , *STDOUT ) or die " Could not clone STDOUT" ;
18+ for my $fh (\*STDOUT , \*STDERR , \*STDIN ) {
19+ open (my $io , ' >&' , $fh ) or next ;
20+ push @IO => $io ;
21+ push @TIO => $io if -t $io ;
22+ }
1723}
1824
1925sub try (&) {
@@ -28,40 +34,44 @@ my ($tsa) = try { require Term::Size::Any; Term::Size::Any->import('chars') };
2834my ($trk ) = try { require Term::ReadKey };
2935$trk &&= Term::ReadKey-> can(' GetTerminalSize' );
3036
31- if (!-t $IO ) {
32- *USE_TERM_READKEY = sub () { 0 };
33- *USE_TERM_SIZE_ANY = sub () { 0 };
34- *term_size = sub {
35- return $ENV {TABLE_TERM_SIZE } if $ENV {TABLE_TERM_SIZE };
36- return DEFAULT_SIZE;
37- };
38- }
39- elsif ($tsa ) {
37+ if ($tsa ) {
4038 *USE_TERM_READKEY = sub () { 0 };
4139 *USE_TERM_SIZE_ANY = sub () { 1 };
4240 *_term_size = sub {
43- my $size = chars($IO );
44- return DEFAULT_SIZE if !$size ;
45- return DEFAULT_SIZE if $size < DEFAULT_SIZE;
41+ my $size = max map { chars($_ ) // DEFAULT_SIZE } @IO ;
42+
43+ if (!$size || $size < DEFAULT_SIZE) {
44+ return $ENV {COLUMNS } if $ENV {COLUMNS } && $ENV {COLUMNS } > DEFAULT_SIZE;
45+ return DEFAULT_SIZE;
46+ }
47+
4648 return $size ;
4749 };
4850}
49- elsif ($trk ) {
51+ elsif ($trk && @TIO ) {
5052 *USE_TERM_READKEY = sub () { 1 };
5153 *USE_TERM_SIZE_ANY = sub () { 0 };
5254 *_term_size = sub {
53- my $total ;
55+ my @totals ;
5456 try {
5557 my @warnings ;
5658 {
5759 local $SIG {__WARN__ } = sub { push @warnings => @_ };
58- ($total ) = Term::ReadKey::GetTerminalSize($IO );
60+ for my $io (@TIO ) {
61+ my ($total ) = Term::ReadKey::GetTerminalSize($io );
62+ push @totals => $total ;
63+ }
5964 }
6065 @warnings = grep { $_ !~ m / Unable to get Terminal Size/ } @warnings ;
6166 warn @warnings if @warnings ;
6267 };
63- return DEFAULT_SIZE if !$total ;
64- return DEFAULT_SIZE if $total < DEFAULT_SIZE;
68+ my $total = @totals ? max(@totals ) : 0;
69+
70+ if (!$total || $total < DEFAULT_SIZE) {
71+ return $ENV {COLUMNS } if $ENV {COLUMNS } && $ENV {COLUMNS } > DEFAULT_SIZE;
72+ return DEFAULT_SIZE;
73+ }
74+
6575 return $total ;
6676 };
6777}
7080 *USE_TERM_SIZE_ANY = sub () { 0 };
7181 *term_size = sub {
7282 return $ENV {TABLE_TERM_SIZE } if $ENV {TABLE_TERM_SIZE };
83+ return $ENV {COLUMNS } if $ENV {COLUMNS } && $ENV {COLUMNS } > DEFAULT_SIZE;
7384 return DEFAULT_SIZE;
7485 };
7586}
0 commit comments