From 19816aed54d014cd4ca6cb93e7bf3635da46142e Mon Sep 17 00:00:00 2001 From: "shogo82148-slim[bot]" <90079370+shogo82148-slim[bot]@users.noreply.github.com> Date: Wed, 7 Aug 2024 02:45:29 +0000 Subject: [PATCH] update cpm --- author/cpm/cpanfile.snapshot | 20 ++++++++++---------- bin/cpm | 14 +++++++------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/author/cpm/cpanfile.snapshot b/author/cpm/cpanfile.snapshot index c9fb13558..f2773b458 100644 --- a/author/cpm/cpanfile.snapshot +++ b/author/cpm/cpanfile.snapshot @@ -1071,16 +1071,16 @@ DISTRIBUTIONS Scalar::Util 1.14 perl 5.006 strict 0 - Term-Table-0.020 - pathname: E/EX/EXODIST/Term-Table-0.020.tar.gz - provides: - Term::Table 0.020 - Term::Table::Cell 0.020 - Term::Table::CellStack 0.020 - Term::Table::HashBase 0.020 - Term::Table::LineBreak 0.020 - Term::Table::Spacer 0.020 - Term::Table::Util 0.020 + Term-Table-0.022 + pathname: E/EX/EXODIST/Term-Table-0.022.tar.gz + provides: + Term::Table 0.022 + Term::Table::Cell 0.022 + Term::Table::CellStack 0.022 + Term::Table::HashBase 0.022 + Term::Table::LineBreak 0.022 + Term::Table::Spacer 0.022 + Term::Table::Util 0.022 requirements: Carp 0 ExtUtils::MakeMaker 0 diff --git a/bin/cpm b/bin/cpm index 330743258..1a18325e7 100755 --- a/bin/cpm +++ b/bin/cpm @@ -2181,31 +2181,31 @@ $fatpacked{"Sub/Exporter/Progressive.pm"} = '#line '.(1+__LINE__).' "'.__FILE__. SUB_EXPORTER_PROGRESSIVE $fatpacked{"Term/Table.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TERM_TABLE'; - package Term::Table;use strict;use warnings;our$VERSION='0.020';use Term::Table::Cell();use Term::Table::Util qw/term_size uni_length USE_GCS/;use Scalar::Util qw/blessed/;use List::Util qw/max sum/;use Carp qw/croak carp/;use Term::Table::HashBase qw/rows _columns collapse max_width mark_tail sanitize show_header auto_columns no_collapse header allow_overflow pad/;sub BORDER_SIZE() {4}sub DIV_SIZE() {3}sub CELL_PAD_SIZE() {2}sub init {my$self=shift;croak "You cannot have a table with no rows" unless$self->{+ROWS}&& @{$self->{+ROWS}};$self->{+MAX_WIDTH}||= term_size();$self->{+NO_COLLAPSE}||= {};if (ref($self->{+NO_COLLAPSE})eq 'ARRAY'){$self->{+NO_COLLAPSE}={map {($_=>1)}@{$self->{+NO_COLLAPSE}}}}if ($self->{+NO_COLLAPSE}&& $self->{+HEADER}){my$header=$self->{+HEADER};for(my$idx=0;$idx < @$header;$idx++){$self->{+NO_COLLAPSE}->{$idx}||= $self->{+NO_COLLAPSE}->{$header->[$idx]}}}$self->{+PAD}=4 unless defined$self->{+PAD};$self->{+COLLAPSE}=1 unless defined$self->{+COLLAPSE};$self->{+SANITIZE}=1 unless defined$self->{+SANITIZE};$self->{+MARK_TAIL}=1 unless defined$self->{+MARK_TAIL};if($self->{+HEADER}){$self->{+SHOW_HEADER}=1 unless defined$self->{+SHOW_HEADER}}else {$self->{+HEADER}=[];$self->{+AUTO_COLUMNS}=1;$self->{+SHOW_HEADER}=0}}sub columns {my$self=shift;$self->regen_columns unless$self->{+_COLUMNS};return$self->{+_COLUMNS}}sub regen_columns {my$self=shift;my$has_header=$self->{+SHOW_HEADER}&& @{$self->{+HEADER}};my%new_col=(width=>0,count=>$has_header ? -1 : 0);my$cols=[map {{%new_col}}@{$self->{+HEADER}}];my@rows=@{$self->{+ROWS}};for my$row ($has_header ? ($self->{+HEADER},@rows): (@rows)){for my$ci (0 .. max(@$cols - 1,@$row - 1)){$cols->[$ci]||= {%new_col}if$self->{+AUTO_COLUMNS};my$c=$cols->[$ci]or next;$c->{idx}||= $ci;$c->{rows}||= [];my$r=$row->[$ci];$r=Term::Table::Cell->new(value=>$r)unless blessed($r)&& ($r->isa('Term::Table::Cell')|| $r->isa('Term::Table::CellStack')|| $r->isa('Term::Table::Spacer'));$r->sanitize if$self->{+SANITIZE};$r->mark_tail if$self->{+MARK_TAIL};my$rs=$r->width;$c->{width}=$rs if$rs > $c->{width};$c->{count}++ if$rs;push @{$c->{rows}}=>$r}}@$cols=grep {$_->{count}> 0 || $self->{+NO_COLLAPSE}->{$_->{idx}}}@$cols if$self->{+COLLAPSE};my$current=sum(map {$_->{width}}@$cols);my$border=sum(BORDER_SIZE,$self->{+PAD},DIV_SIZE * (@$cols - 1));my$total=$current + $border;if ($total > $self->{+MAX_WIDTH}){my$fair=($self->{+MAX_WIDTH}- $border)/ @$cols;if ($fair < 1){return$self->{+_COLUMNS}=$cols if$self->{+ALLOW_OVERFLOW};croak "Table is too large ($total including $self->{+PAD} padding) to fit into max-width ($self->{+MAX_WIDTH})"}my$under=0;my@fix;for my$c (@$cols){if ($c->{width}> $fair){push@fix=>$c}else {$under += $c->{width}}}$fair=int(($self->{+MAX_WIDTH}- $border - $under)/ @fix);if ($fair < 1){return$self->{+_COLUMNS}=$cols if$self->{+ALLOW_OVERFLOW};croak "Table is too large ($total including $self->{+PAD} padding) to fit into max-width ($self->{+MAX_WIDTH})"}$_->{width}=$fair for@fix}$self->{+_COLUMNS}=$cols}sub render {my$self=shift;my$cols=$self->columns;for my$col (@$cols){for my$cell (@{$col->{rows}}){$cell->reset}}my$width=sum(BORDER_SIZE,$self->{+PAD},DIV_SIZE * @$cols,map {$_->{width}}@$cols);my$border='+' .join('+',map {'-' x ($_->{width}+ CELL_PAD_SIZE)}@$cols).'+';my$template='|' .join('|',map {my$w=$_->{width}+ CELL_PAD_SIZE;'%s'}@$cols).'|';my$spacer='|' .join('|',map {' ' x ($_->{width}+ CELL_PAD_SIZE)}@$cols).'|';my@out=($border);my ($row,$split,$found)=(0,0,0);while(1){my@row;my$is_spacer=0;for my$col (@$cols){my$r=$col->{rows}->[$row];unless($r){push@row=>'';next}my ($v,$vw);if ($r->isa('Term::Table::Cell')){my$lw=$r->border_left_width;my$rw=$r->border_right_width;$vw=$col->{width}- $lw - $rw;$v=$r->break->next($vw)}elsif ($r->isa('Term::Table::CellStack')){($v,$vw)=$r->break->next($col->{width})}elsif ($r->isa('Term::Table::Spacer')){$is_spacer=1}if ($is_spacer){last}elsif (defined$v){$found++;my$bcolor=$r->border_color || '';my$vcolor=$r->value_color || '';my$reset=$r->reset_color || '';if (my$need=$vw - uni_length($v)){$v .= ' ' x $need}my$rt="${reset}${bcolor}\%s${reset} ${vcolor}\%s${reset} ${bcolor}\%s${reset}";push@row=>sprintf($rt,$r->border_left || '',$v,$r->border_right || '')}else {push@row=>' ' x ($col->{width}+ 2)}}if (!grep {$_ && m/\S/}@row){last unless$found || $is_spacer;push@out=>$border if$row==0 && $self->{+SHOW_HEADER}&& @{$self->{+HEADER}};push@out=>$spacer if$split > 1 || $is_spacer;$row++;$split=0;$found=0;next}if ($split==1 && @out > 1 && $out[-2]ne $border && $out[-2]ne $spacer){my$last=pop@out;push@out=>($spacer,$last)}push@out=>sprintf($template,@row);$split++}pop@out while@out && $out[-1]eq $spacer;unless (USE_GCS){for my$row (@out){next unless$row =~ m/[^\x00-\x7F]/;unshift@out=>"Unicode::GCString is not installed, table may not display all unicode characters properly";last}}return (@out,$border)}sub display {my$self=shift;my ($fh)=@_;my@parts=map "$_\n",$self->render;print$fh @parts if$fh;print@parts}1; + package Term::Table;use strict;use warnings;our$VERSION='0.022';use Term::Table::Cell();use Term::Table::Util qw/term_size uni_length USE_GCS/;use Scalar::Util qw/blessed/;use List::Util qw/max sum/;use Carp qw/croak carp/;use Term::Table::HashBase qw/rows _columns collapse max_width mark_tail sanitize show_header auto_columns no_collapse header allow_overflow pad/;sub BORDER_SIZE() {4}sub DIV_SIZE() {3}sub CELL_PAD_SIZE() {2}sub init {my$self=shift;croak "You cannot have a table with no rows" unless$self->{+ROWS}&& @{$self->{+ROWS}};$self->{+MAX_WIDTH}||= term_size();$self->{+NO_COLLAPSE}||= {};if (ref($self->{+NO_COLLAPSE})eq 'ARRAY'){$self->{+NO_COLLAPSE}={map {($_=>1)}@{$self->{+NO_COLLAPSE}}}}if ($self->{+NO_COLLAPSE}&& $self->{+HEADER}){my$header=$self->{+HEADER};for(my$idx=0;$idx < @$header;$idx++){$self->{+NO_COLLAPSE}->{$idx}||= $self->{+NO_COLLAPSE}->{$header->[$idx]}}}$self->{+PAD}=4 unless defined$self->{+PAD};$self->{+COLLAPSE}=1 unless defined$self->{+COLLAPSE};$self->{+SANITIZE}=1 unless defined$self->{+SANITIZE};$self->{+MARK_TAIL}=1 unless defined$self->{+MARK_TAIL};if($self->{+HEADER}){$self->{+SHOW_HEADER}=1 unless defined$self->{+SHOW_HEADER}}else {$self->{+HEADER}=[];$self->{+AUTO_COLUMNS}=1;$self->{+SHOW_HEADER}=0}}sub columns {my$self=shift;$self->regen_columns unless$self->{+_COLUMNS};return$self->{+_COLUMNS}}sub regen_columns {my$self=shift;my$has_header=$self->{+SHOW_HEADER}&& @{$self->{+HEADER}};my%new_col=(width=>0,count=>$has_header ? -1 : 0);my$cols=[map {{%new_col}}@{$self->{+HEADER}}];my@rows=@{$self->{+ROWS}};for my$row ($has_header ? ($self->{+HEADER},@rows): (@rows)){for my$ci (0 .. max(@$cols - 1,@$row - 1)){$cols->[$ci]||= {%new_col}if$self->{+AUTO_COLUMNS};my$c=$cols->[$ci]or next;$c->{idx}||= $ci;$c->{rows}||= [];my$r=$row->[$ci];$r=Term::Table::Cell->new(value=>$r)unless blessed($r)&& ($r->isa('Term::Table::Cell')|| $r->isa('Term::Table::CellStack')|| $r->isa('Term::Table::Spacer'));$r->sanitize if$self->{+SANITIZE};$r->mark_tail if$self->{+MARK_TAIL};my$rs=$r->width;$c->{width}=$rs if$rs > $c->{width};$c->{count}++ if$rs;push @{$c->{rows}}=>$r}}@$cols=grep {$_->{count}> 0 || $self->{+NO_COLLAPSE}->{$_->{idx}}}@$cols if$self->{+COLLAPSE};my$current=sum(map {$_->{width}}@$cols);my$border=sum(BORDER_SIZE,$self->{+PAD},DIV_SIZE * (@$cols - 1));my$total=$current + $border;if ($total > $self->{+MAX_WIDTH}){my$fair=($self->{+MAX_WIDTH}- $border)/ @$cols;if ($fair < 1){return$self->{+_COLUMNS}=$cols if$self->{+ALLOW_OVERFLOW};croak "Table is too large ($total including $self->{+PAD} padding) to fit into max-width ($self->{+MAX_WIDTH})"}my$under=0;my@fix;for my$c (@$cols){if ($c->{width}> $fair){push@fix=>$c}else {$under += $c->{width}}}$fair=int(($self->{+MAX_WIDTH}- $border - $under)/ @fix);if ($fair < 1){return$self->{+_COLUMNS}=$cols if$self->{+ALLOW_OVERFLOW};croak "Table is too large ($total including $self->{+PAD} padding) to fit into max-width ($self->{+MAX_WIDTH})"}$_->{width}=$fair for@fix}$self->{+_COLUMNS}=$cols}sub render {my$self=shift;my$cols=$self->columns;for my$col (@$cols){for my$cell (@{$col->{rows}}){$cell->reset}}my$width=sum(BORDER_SIZE,$self->{+PAD},DIV_SIZE * @$cols,map {$_->{width}}@$cols);my$border='+' .join('+',map {'-' x ($_->{width}+ CELL_PAD_SIZE)}@$cols).'+';my$template='|' .join('|',map {my$w=$_->{width}+ CELL_PAD_SIZE;'%s'}@$cols).'|';my$spacer='|' .join('|',map {' ' x ($_->{width}+ CELL_PAD_SIZE)}@$cols).'|';my@out=($border);my ($row,$split,$found)=(0,0,0);while(1){my@row;my$is_spacer=0;for my$col (@$cols){my$r=$col->{rows}->[$row];unless($r){push@row=>'';next}my ($v,$vw);if ($r->isa('Term::Table::Cell')){my$lw=$r->border_left_width;my$rw=$r->border_right_width;$vw=$col->{width}- $lw - $rw;$v=$r->break->next($vw)}elsif ($r->isa('Term::Table::CellStack')){($v,$vw)=$r->break->next($col->{width})}elsif ($r->isa('Term::Table::Spacer')){$is_spacer=1}if ($is_spacer){last}elsif (defined$v){$found++;my$bcolor=$r->border_color || '';my$vcolor=$r->value_color || '';my$reset=$r->reset_color || '';if (my$need=$vw - uni_length($v)){$v .= ' ' x $need}my$rt="${reset}${bcolor}\%s${reset} ${vcolor}\%s${reset} ${bcolor}\%s${reset}";push@row=>sprintf($rt,$r->border_left || '',$v,$r->border_right || '')}else {push@row=>' ' x ($col->{width}+ 2)}}if (!grep {$_ && m/\S/}@row){last unless$found || $is_spacer;push@out=>$border if$row==0 && $self->{+SHOW_HEADER}&& @{$self->{+HEADER}};push@out=>$spacer if$split > 1 || $is_spacer;$row++;$split=0;$found=0;next}if ($split==1 && @out > 1 && $out[-2]ne $border && $out[-2]ne $spacer){my$last=pop@out;push@out=>($spacer,$last)}push@out=>sprintf($template,@row);$split++}pop@out while@out && $out[-1]eq $spacer;unless (USE_GCS){for my$row (@out){next unless$row =~ m/[[:^ascii:]]/;unshift@out=>"Unicode::GCString is not installed, table may not display all unicode characters properly";last}}return (@out,$border)}sub display {my$self=shift;my ($fh)=@_;my@parts=map "$_\n",$self->render;print$fh @parts if$fh;print@parts}1; TERM_TABLE $fatpacked{"Term/Table/Cell.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TERM_TABLE_CELL'; - package Term::Table::Cell;use strict;use warnings;our$VERSION='0.020';use Term::Table::LineBreak();use Term::Table::Util qw/uni_length/;use List::Util qw/sum/;use Term::Table::HashBase qw/value border_left border_right _break _widths border_color value_color reset_color/;my%CHAR_MAP=("\n"=>"\\n\n","\a"=>'\\a',"\b"=>'\\b',"\e"=>'\\e',"\f"=>'\\f',"\r"=>'\\r',"\t"=>'\\t'," "=>' ',);sub init {my$self=shift;$self->{+VALUE}=defined$self->{+VALUE}? "$self->{+VALUE}" : ''}sub char_id {my$class=shift;my ($char)=@_;return "\\N{U+" .sprintf("\%X",ord($char))."}"}sub show_char {my$class=shift;my ($char,%props)=@_;return$char if$props{no_newline}&& $char eq "\n";return$CHAR_MAP{$char}|| $class->char_id($char)}sub sanitize {my$self=shift;$self->{+VALUE}=~ s/([\s\t\p{Zl}\p{C}\p{Zp}])/$self->show_char($1)/ge}sub mark_tail {my$self=shift;$self->{+VALUE}=~ s/([\s\t\p{Zl}\p{C}\p{Zp}])$/$1 eq ' ' ? $self->char_id($1) : $self->show_char($1, no_newline => 1)/se}sub value_width {my$self=shift;my$w=$self->{+_WIDTHS}||= {};return$w->{value}if defined$w->{value};my@parts=split /(\n)/,$self->{+VALUE};my$max=0;while (@parts){my$text=shift@parts;my$sep=shift@parts || '';my$len=uni_length("$text");$max=$len if$len > $max}return$w->{value}=$max}sub border_left_width {my$self=shift;$self->{+_WIDTHS}->{left}||= uni_length($self->{+BORDER_LEFT}|| '')}sub border_right_width {my$self=shift;$self->{+_WIDTHS}->{right}||= uni_length($self->{+BORDER_RIGHT}|| '')}sub width {my$self=shift;$self->{+_WIDTHS}->{all}||= sum(map {$self->$_}qw/value_width border_left_width border_right_width/)}sub break {my$self=shift;$self->{+_BREAK}||= Term::Table::LineBreak->new(string=>$self->{+VALUE})}sub reset {my$self=shift;delete$self->{+_BREAK}}1; + package Term::Table::Cell;use strict;use warnings;our$VERSION='0.022';use Term::Table::LineBreak();use Term::Table::Util qw/uni_length/;use List::Util qw/sum/;use Term::Table::HashBase qw/value border_left border_right _break _widths border_color value_color reset_color/;my%CHAR_MAP=("\n"=>"\\n\n","\a"=>'\\a',"\b"=>'\\b',"\e"=>'\\e',"\f"=>'\\f',"\r"=>'\\r',"\t"=>'\\t'," "=>' ',);sub init {my$self=shift;$self->{+VALUE}=defined$self->{+VALUE}? "$self->{+VALUE}" : ''}sub char_id {my$class=shift;my ($char)=@_;return "\\N{U+" .sprintf("\%X",utf8::native_to_unicode(ord($char)))."}"}sub show_char {my$class=shift;my ($char,%props)=@_;return$char if$props{no_newline}&& $char eq "\n";return$CHAR_MAP{$char}|| $class->char_id($char)}sub sanitize {my$self=shift;$self->{+VALUE}=~ s/([\s\t\p{Zl}\p{C}\p{Zp}])/$self->show_char($1)/ge}sub mark_tail {my$self=shift;$self->{+VALUE}=~ s/([\s\t\p{Zl}\p{C}\p{Zp}])$/$1 eq ' ' ? $self->char_id($1) : $self->show_char($1, no_newline => 1)/se}sub value_width {my$self=shift;my$w=$self->{+_WIDTHS}||= {};return$w->{value}if defined$w->{value};my@parts=split /(\n)/,$self->{+VALUE};my$max=0;while (@parts){my$text=shift@parts;my$sep=shift@parts || '';my$len=uni_length("$text");$max=$len if$len > $max}return$w->{value}=$max}sub border_left_width {my$self=shift;$self->{+_WIDTHS}->{left}||= uni_length($self->{+BORDER_LEFT}|| '')}sub border_right_width {my$self=shift;$self->{+_WIDTHS}->{right}||= uni_length($self->{+BORDER_RIGHT}|| '')}sub width {my$self=shift;$self->{+_WIDTHS}->{all}||= sum(map {$self->$_}qw/value_width border_left_width border_right_width/)}sub break {my$self=shift;$self->{+_BREAK}||= Term::Table::LineBreak->new(string=>$self->{+VALUE})}sub reset {my$self=shift;delete$self->{+_BREAK}}1; TERM_TABLE_CELL $fatpacked{"Term/Table/CellStack.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TERM_TABLE_CELLSTACK'; - package Term::Table::CellStack;use strict;use warnings;our$VERSION='0.020';use Term::Table::HashBase qw/-cells -idx/;use List::Util qw/max/;sub init {my$self=shift;$self->{+CELLS}||= []}sub add_cell {my$self=shift;push @{$self->{+CELLS}}=>@_}sub add_cells {my$self=shift;push @{$self->{+CELLS}}=>@_}sub sanitize {my$self=shift;$_->sanitize(@_)for @{$self->{+CELLS}}}sub mark_tail {my$self=shift;$_->mark_tail(@_)for @{$self->{+CELLS}}}my@proxy=qw{border_left border_right border_color value_color reset_color border_left_width border_right_width};for my$meth (@proxy){no strict 'refs';*$meth=sub {my$self=shift;$self->{+CELLS}->[$self->{+IDX}]->$meth}}for my$meth (qw{value_width width}){no strict 'refs';*$meth=sub {my$self=shift;return max(map {$_->$meth}@{$self->{+CELLS}})}}sub next {my$self=shift;my ($cw)=@_;while ($self->{+IDX}< @{$self->{+CELLS}}){my$cell=$self->{+CELLS}->[$self->{+IDX}];my$lw=$cell->border_left_width;my$rw=$cell->border_right_width;my$vw=$cw - $lw - $rw;my$it=$cell->break->next($vw);return ($it,$vw)if$it;$self->{+IDX}++}return}sub break {$_[0]}sub reset {my$self=shift;$self->{+IDX}=0;$_->reset for @{$self->{+CELLS}}}1; + package Term::Table::CellStack;use strict;use warnings;our$VERSION='0.022';use Term::Table::HashBase qw/-cells -idx/;use List::Util qw/max/;sub init {my$self=shift;$self->{+CELLS}||= []}sub add_cell {my$self=shift;push @{$self->{+CELLS}}=>@_}sub add_cells {my$self=shift;push @{$self->{+CELLS}}=>@_}sub sanitize {my$self=shift;$_->sanitize(@_)for @{$self->{+CELLS}}}sub mark_tail {my$self=shift;$_->mark_tail(@_)for @{$self->{+CELLS}}}my@proxy=qw{border_left border_right border_color value_color reset_color border_left_width border_right_width};for my$meth (@proxy){no strict 'refs';*$meth=sub {my$self=shift;$self->{+CELLS}->[$self->{+IDX}]->$meth}}for my$meth (qw{value_width width}){no strict 'refs';*$meth=sub {my$self=shift;return max(map {$_->$meth}@{$self->{+CELLS}})}}sub next {my$self=shift;my ($cw)=@_;while ($self->{+IDX}< @{$self->{+CELLS}}){my$cell=$self->{+CELLS}->[$self->{+IDX}];my$lw=$cell->border_left_width;my$rw=$cell->border_right_width;my$vw=$cw - $lw - $rw;my$it=$cell->break->next($vw);return ($it,$vw)if$it;$self->{+IDX}++}return}sub break {$_[0]}sub reset {my$self=shift;$self->{+IDX}=0;$_->reset for @{$self->{+CELLS}}}1; TERM_TABLE_CELLSTACK $fatpacked{"Term/Table/HashBase.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TERM_TABLE_HASHBASE'; - package Term::Table::HashBase;use strict;use warnings;our$VERSION='0.020';{no warnings 'once';$Term::Table::HashBase::HB_VERSION='0.008';*Term::Table::HashBase::ATTR_SUBS=\%Object::HashBase::ATTR_SUBS;*Term::Table::HashBase::ATTR_LIST=\%Object::HashBase::ATTR_LIST;*Term::Table::HashBase::VERSION=\%Object::HashBase::VERSION;*Term::Table::HashBase::CAN_CACHE=\%Object::HashBase::CAN_CACHE}require Carp;{no warnings 'once';$Carp::Internal{+__PACKAGE__}=1}BEGIN {*_isa=($] >= 5.010 && require mro)? \&mro::get_linear_isa : sub {no strict 'refs';my@packages=($_[0]);my%seen;for my$package (@packages){push@packages,grep!$seen{$_}++,@{"$package\::ISA"}}return \@packages}}my%SPEC=('^'=>{reader=>1,writer=>0,dep_writer=>1,read_only=>0,strip=>1},'-'=>{reader=>1,writer=>0,dep_writer=>0,read_only=>1,strip=>1},'>'=>{reader=>0,writer=>1,dep_writer=>0,read_only=>0,strip=>1},'<'=>{reader=>1,writer=>0,dep_writer=>0,read_only=>0,strip=>1},'+'=>{reader=>0,writer=>0,dep_writer=>0,read_only=>0,strip=>1},);sub import {my$class=shift;my$into=caller;my$ver=$Term::Table::HashBase::HB_VERSION || $Term::Table::HashBase::VERSION;$Term::Table::HashBase::VERSION{$into}=$ver if!$Term::Table::HashBase::VERSION{$into}|| $Term::Table::HashBase::VERSION{$into}> $ver;my$isa=_isa($into);my$attr_list=$Term::Table::HashBase::ATTR_LIST{$into}||= [];my$attr_subs=$Term::Table::HashBase::ATTR_SUBS{$into}||= {};my%subs=(($into->can('new')? (): (new=>\&_new)),(map %{$Term::Table::HashBase::ATTR_SUBS{$_}|| {}},@{$isa}[1 .. $#$isa]),(map {my$p=substr($_,0,1);my$x=$_;my$spec=$SPEC{$p}|| {reader=>1,writer=>1};substr($x,0,1)='' if$spec->{strip};push @$attr_list=>$x;my ($sub,$attr)=(uc$x,$x);$attr_subs->{$sub}=sub() {$attr};my%out=($sub=>$attr_subs->{$sub});$out{$attr}=sub {$_[0]->{$attr}}if$spec->{reader};$out{"set_$attr"}=sub {$_[0]->{$attr}=$_[1]}if$spec->{writer};$out{"set_$attr"}=sub {Carp::croak("'$attr' is read-only")}if$spec->{read_only};$out{"set_$attr"}=sub {Carp::carp("set_$attr() is deprecated");$_[0]->{$attr}=$_[1]}if$spec->{dep_writer};%out}@_),);no strict 'refs';*{"$into\::$_"}=$subs{$_}for keys%subs}sub attr_list {my$class=shift;my$isa=_isa($class);my%seen;my@list=grep {!$seen{$_}++}map {my@out;if (0.004 > ($Term::Table::HashBase::VERSION{$_}|| 0)){Carp::carp("$_ uses an inlined version of Term::Table::HashBase too old to support attr_list()")}else {my$list=$Term::Table::HashBase::ATTR_LIST{$_};@out=$list ? @$list : ()}@out}reverse @$isa;return@list}sub _new {my$class=shift;my$self;if (@_==1){my$arg=shift;my$type=ref($arg);if ($type eq 'HASH'){$self=bless({%$arg},$class)}else {Carp::croak("Not sure what to do with '$type' in $class constructor")unless$type eq 'ARRAY';my%proto;my@attributes=attr_list($class);while (@$arg){my$val=shift @$arg;my$key=shift@attributes or Carp::croak("Too many arguments for $class constructor");$proto{$key}=$val}$self=bless(\%proto,$class)}}else {$self=bless({@_},$class)}$Term::Table::HashBase::CAN_CACHE{$class}=$self->can('init')unless exists$Term::Table::HashBase::CAN_CACHE{$class};$self->init if$Term::Table::HashBase::CAN_CACHE{$class};$self}1; + package Term::Table::HashBase;use strict;use warnings;our$VERSION='0.022';{no warnings 'once';$Term::Table::HashBase::HB_VERSION='0.008';*Term::Table::HashBase::ATTR_SUBS=\%Object::HashBase::ATTR_SUBS;*Term::Table::HashBase::ATTR_LIST=\%Object::HashBase::ATTR_LIST;*Term::Table::HashBase::VERSION=\%Object::HashBase::VERSION;*Term::Table::HashBase::CAN_CACHE=\%Object::HashBase::CAN_CACHE}require Carp;{no warnings 'once';$Carp::Internal{+__PACKAGE__}=1}BEGIN {*_isa=($] >= 5.010 && require mro)? \&mro::get_linear_isa : sub {no strict 'refs';my@packages=($_[0]);my%seen;for my$package (@packages){push@packages,grep!$seen{$_}++,@{"$package\::ISA"}}return \@packages}}my%SPEC=('^'=>{reader=>1,writer=>0,dep_writer=>1,read_only=>0,strip=>1},'-'=>{reader=>1,writer=>0,dep_writer=>0,read_only=>1,strip=>1},'>'=>{reader=>0,writer=>1,dep_writer=>0,read_only=>0,strip=>1},'<'=>{reader=>1,writer=>0,dep_writer=>0,read_only=>0,strip=>1},'+'=>{reader=>0,writer=>0,dep_writer=>0,read_only=>0,strip=>1},);sub import {my$class=shift;my$into=caller;my$ver=$Term::Table::HashBase::HB_VERSION || $Term::Table::HashBase::VERSION;$Term::Table::HashBase::VERSION{$into}=$ver if!$Term::Table::HashBase::VERSION{$into}|| $Term::Table::HashBase::VERSION{$into}> $ver;my$isa=_isa($into);my$attr_list=$Term::Table::HashBase::ATTR_LIST{$into}||= [];my$attr_subs=$Term::Table::HashBase::ATTR_SUBS{$into}||= {};my%subs=(($into->can('new')? (): (new=>\&_new)),(map %{$Term::Table::HashBase::ATTR_SUBS{$_}|| {}},@{$isa}[1 .. $#$isa]),(map {my$p=substr($_,0,1);my$x=$_;my$spec=$SPEC{$p}|| {reader=>1,writer=>1};substr($x,0,1)='' if$spec->{strip};push @$attr_list=>$x;my ($sub,$attr)=(uc$x,$x);$attr_subs->{$sub}=sub() {$attr};my%out=($sub=>$attr_subs->{$sub});$out{$attr}=sub {$_[0]->{$attr}}if$spec->{reader};$out{"set_$attr"}=sub {$_[0]->{$attr}=$_[1]}if$spec->{writer};$out{"set_$attr"}=sub {Carp::croak("'$attr' is read-only")}if$spec->{read_only};$out{"set_$attr"}=sub {Carp::carp("set_$attr() is deprecated");$_[0]->{$attr}=$_[1]}if$spec->{dep_writer};%out}@_),);no strict 'refs';*{"$into\::$_"}=$subs{$_}for keys%subs}sub attr_list {my$class=shift;my$isa=_isa($class);my%seen;my@list=grep {!$seen{$_}++}map {my@out;if (0.004 > ($Term::Table::HashBase::VERSION{$_}|| 0)){Carp::carp("$_ uses an inlined version of Term::Table::HashBase too old to support attr_list()")}else {my$list=$Term::Table::HashBase::ATTR_LIST{$_};@out=$list ? @$list : ()}@out}reverse @$isa;return@list}sub _new {my$class=shift;my$self;if (@_==1){my$arg=shift;my$type=ref($arg);if ($type eq 'HASH'){$self=bless({%$arg},$class)}else {Carp::croak("Not sure what to do with '$type' in $class constructor")unless$type eq 'ARRAY';my%proto;my@attributes=attr_list($class);while (@$arg){my$val=shift @$arg;my$key=shift@attributes or Carp::croak("Too many arguments for $class constructor");$proto{$key}=$val}$self=bless(\%proto,$class)}}else {$self=bless({@_},$class)}$Term::Table::HashBase::CAN_CACHE{$class}=$self->can('init')unless exists$Term::Table::HashBase::CAN_CACHE{$class};$self->init if$Term::Table::HashBase::CAN_CACHE{$class};$self}1; TERM_TABLE_HASHBASE $fatpacked{"Term/Table/LineBreak.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TERM_TABLE_LINEBREAK'; - package Term::Table::LineBreak;use strict;use warnings;our$VERSION='0.020';use Carp qw/croak/;use Scalar::Util qw/blessed/;use Term::Table::Util qw/uni_length/;use Term::Table::HashBase qw/string gcstring _len _parts idx/;sub init {my$self=shift;croak "string is a required attribute" unless defined$self->{+STRING}}sub columns {uni_length($_[0]->{+STRING})}sub break {my$self=shift;my ($len)=@_;$self->{+_LEN}=$len;$self->{+IDX}=0;my$str=$self->{+STRING}."";my@parts;my@chars=split //,$str;while (@chars){my$size=0;my$part='';until ($size==$len){my$char=shift@chars;$char='' unless defined$char;my$l=uni_length("$char");last unless$l;last if$char eq "\n";if ($size + $l > $len){unshift@chars=>$char;last}$size += $l;$part .= $char}shift@chars if$size==$len && @chars && $chars[0]eq "\n";until ($size==$len){$part .= ' ';$size += 1}push@parts=>$part}$self->{+_PARTS}=\@parts}sub next {my$self=shift;if (@_){my ($len)=@_;$self->break($len)if!$self->{+_LEN}|| $self->{+_LEN}!=$len}else {croak "String has not yet been broken" unless$self->{+_PARTS}}my$idx=$self->{+IDX}++;my$parts=$self->{+_PARTS};return undef if$idx >= @$parts;return$parts->[$idx]}1; + package Term::Table::LineBreak;use strict;use warnings;our$VERSION='0.022';use Carp qw/croak/;use Scalar::Util qw/blessed/;use Term::Table::Util qw/uni_length/;use Term::Table::HashBase qw/string gcstring _len _parts idx/;sub init {my$self=shift;croak "string is a required attribute" unless defined$self->{+STRING}}sub columns {uni_length($_[0]->{+STRING})}sub break {my$self=shift;my ($len)=@_;$self->{+_LEN}=$len;$self->{+IDX}=0;my$str=$self->{+STRING}."";my@parts;my@chars=split //,$str;while (@chars){my$size=0;my$part='';until ($size==$len){my$char=shift@chars;$char='' unless defined$char;my$l=uni_length("$char");last unless$l;last if$char eq "\n";if ($size + $l > $len){unshift@chars=>$char;last}$size += $l;$part .= $char}shift@chars if$size==$len && @chars && $chars[0]eq "\n";until ($size==$len){$part .= ' ';$size += 1}push@parts=>$part}$self->{+_PARTS}=\@parts}sub next {my$self=shift;if (@_){my ($len)=@_;$self->break($len)if!$self->{+_LEN}|| $self->{+_LEN}!=$len}else {croak "String has not yet been broken" unless$self->{+_PARTS}}my$idx=$self->{+IDX}++;my$parts=$self->{+_PARTS};return undef if$idx >= @$parts;return$parts->[$idx]}1; TERM_TABLE_LINEBREAK $fatpacked{"Term/Table/Spacer.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TERM_TABLE_SPACER'; - package Term::Table::Spacer;use strict;use warnings;our$VERSION='0.020';sub new {bless {},$_[0]}sub width {1}sub sanitize {}sub mark_tail {}sub reset {}1; + package Term::Table::Spacer;use strict;use warnings;our$VERSION='0.022';sub new {bless {},$_[0]}sub width {1}sub sanitize {}sub mark_tail {}sub reset {}1; TERM_TABLE_SPACER $fatpacked{"Term/Table/Util.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TERM_TABLE_UTIL'; - package Term::Table::Util;use strict;use warnings;use Config qw/%Config/;our$VERSION='0.020';use base 'Exporter';our@EXPORT_OK=qw/term_size USE_GCS USE_TERM_READKEY USE_TERM_SIZE_ANY uni_length/;sub DEFAULT_SIZE() {80}my$IO;BEGIN {open($IO,'>&',*STDOUT)or die "Could not clone STDOUT"}sub try(&) {my$code=shift;local ($@,$?,$!);my$ok=eval {$code->();1};my$err=$@;return ($ok,$err)}my ($tsa)=try {require Term::Size::Any;Term::Size::Any->import('chars')};my ($trk)=try {require Term::ReadKey};$trk &&= Term::ReadKey->can('GetTerminalSize');if (!-t $IO){*USE_TERM_READKEY=sub() {0};*USE_TERM_SIZE_ANY=sub() {0};*term_size=sub {return$ENV{TABLE_TERM_SIZE}if$ENV{TABLE_TERM_SIZE};return DEFAULT_SIZE}}elsif ($tsa){*USE_TERM_READKEY=sub() {0};*USE_TERM_SIZE_ANY=sub() {1};*_term_size=sub {my$size=chars($IO);return DEFAULT_SIZE if!$size;return DEFAULT_SIZE if$size < DEFAULT_SIZE;return$size}}elsif ($trk){*USE_TERM_READKEY=sub() {1};*USE_TERM_SIZE_ANY=sub() {0};*_term_size=sub {my$total;try {my@warnings;{local$SIG{__WARN__}=sub {push@warnings=>@_};($total)=Term::ReadKey::GetTerminalSize($IO)}@warnings=grep {$_ !~ m/Unable to get Terminal Size/}@warnings;warn@warnings if@warnings};return DEFAULT_SIZE if!$total;return DEFAULT_SIZE if$total < DEFAULT_SIZE;return$total}}else {*USE_TERM_READKEY=sub() {0};*USE_TERM_SIZE_ANY=sub() {0};*term_size=sub {return$ENV{TABLE_TERM_SIZE}if$ENV{TABLE_TERM_SIZE};return DEFAULT_SIZE}}if (USE_TERM_READKEY()|| USE_TERM_SIZE_ANY()){if (index($Config{sig_name},'WINCH')>= 0){my$changed=0;my$polled=-1;$SIG{WINCH}=sub {$changed++};my$size;*term_size=sub {return$ENV{TABLE_TERM_SIZE}if$ENV{TABLE_TERM_SIZE};unless ($changed==$polled){$polled=$changed;$size=_term_size()}return$size}}else {*term_size=sub {return$ENV{TABLE_TERM_SIZE}if$ENV{TABLE_TERM_SIZE};_term_size()}}}my ($gcs,$err)=try {require Unicode::GCString};if ($gcs){*USE_GCS=sub() {1};*uni_length=sub {Unicode::GCString->new($_[0])->columns}}else {*USE_GCS=sub() {0};*uni_length=sub {length($_[0])}}1; + package Term::Table::Util;use strict;use warnings;use Config qw/%Config/;our$VERSION='0.022';use base 'Exporter';our@EXPORT_OK=qw/term_size USE_GCS USE_TERM_READKEY USE_TERM_SIZE_ANY uni_length/;sub DEFAULT_SIZE() {80}my$IO;BEGIN {open($IO,'>&',*STDOUT)or die "Could not clone STDOUT"}sub try(&) {my$code=shift;local ($@,$?,$!);my$ok=eval {$code->();1};my$err=$@;return ($ok,$err)}my ($tsa)=try {require Term::Size::Any;Term::Size::Any->import('chars')};my ($trk)=try {require Term::ReadKey};$trk &&= Term::ReadKey->can('GetTerminalSize');if (!-t $IO){*USE_TERM_READKEY=sub() {0};*USE_TERM_SIZE_ANY=sub() {0};*term_size=sub {return$ENV{TABLE_TERM_SIZE}if$ENV{TABLE_TERM_SIZE};return DEFAULT_SIZE}}elsif ($tsa){*USE_TERM_READKEY=sub() {0};*USE_TERM_SIZE_ANY=sub() {1};*_term_size=sub {my$size=chars($IO);return DEFAULT_SIZE if!$size;return DEFAULT_SIZE if$size < DEFAULT_SIZE;return$size}}elsif ($trk){*USE_TERM_READKEY=sub() {1};*USE_TERM_SIZE_ANY=sub() {0};*_term_size=sub {my$total;try {my@warnings;{local$SIG{__WARN__}=sub {push@warnings=>@_};($total)=Term::ReadKey::GetTerminalSize($IO)}@warnings=grep {$_ !~ m/Unable to get Terminal Size/}@warnings;warn@warnings if@warnings};return DEFAULT_SIZE if!$total;return DEFAULT_SIZE if$total < DEFAULT_SIZE;return$total}}else {*USE_TERM_READKEY=sub() {0};*USE_TERM_SIZE_ANY=sub() {0};*term_size=sub {return$ENV{TABLE_TERM_SIZE}if$ENV{TABLE_TERM_SIZE};return DEFAULT_SIZE}}if (USE_TERM_READKEY()|| USE_TERM_SIZE_ANY()){if (index($Config{sig_name},'WINCH')>= 0){my$changed=0;my$polled=-1;$SIG{WINCH}=sub {$changed++};my$size;*term_size=sub {return$ENV{TABLE_TERM_SIZE}if$ENV{TABLE_TERM_SIZE};unless ($changed==$polled){$polled=$changed;$size=_term_size()}return$size}}else {*term_size=sub {return$ENV{TABLE_TERM_SIZE}if$ENV{TABLE_TERM_SIZE};_term_size()}}}my ($gcs,$err)=try {require Unicode::GCString};if ($gcs){*USE_GCS=sub() {1};*uni_length=sub {Unicode::GCString->new($_[0])->columns}}else {*USE_GCS=sub() {0};*uni_length=sub {length($_[0])}}1; TERM_TABLE_UTIL $fatpacked{"Tie/Handle/Offset.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TIE_HANDLE_OFFSET';