Mojo-PDF

 view release on metacpan or  search on metacpan

lib/Mojo/PDF/Primitive/Table.pm  view on Meta::CPAN

package Mojo::PDF::Primitive::Table;

our $VERSION = '1.005003'; # VERSION

use List::AllUtils qw/sum uniq/;
use Types::Standard qw/
    HashRef ArrayRef  Tuple  InstanceOf  StrictNum  Str  CodeRef  Optional
/;
use Types::Common::Numeric qw/PositiveInt  PositiveOrZeroNum  PositiveNum/;
use Moo 2.000002;
use Tie::RangeHash 1.05;
use namespace::clean;

$Carp::Internal{ (__PACKAGE__) }++;

##### Required
has at => (
    is       => 'ro',
    required => 1,
    isa      => Tuple[ StrictNum, StrictNum ],
);
has data       => ( is => 'ro',   required => 1,  isa => ArrayRef,       );
has pdf => (
    is       => 'ro',
    required => 1,
    isa      => InstanceOf['Mojo::PDF'],
);

##### Defaults/Optional
has header => (
    is => 'ro',
    isa => Str,
);
has border => (
    is      => 'ro',
    default => sub { [.5, '#ccc'] },
    isa     => Tuple[PositiveOrZeroNum, Str],
);
has max_height => (
    is      => 'ro',
    default => '+Inf',
    coerce  => sub { ref $_[0] ? $_[0]->[0] : $_[0] },
    isa     => PositiveOrZeroNum,
);
has min_width      => ( is => 'ro',   default  => 0,  isa =>PositiveOrZeroNum);
has padding        => (
    is      => 'ro',
    default => sub { [3, 6] },
    isa     => Tuple[PositiveOrZeroNum,Optional[PositiveOrZeroNum],Optional[PositiveOrZeroNum],Optional[PositiveOrZeroNum]],
    coerce => sub {
        my $v = shift;
        return @$v == 4 ? [@$v]
            : @$v == 3 ? [ $v->[0], $v->[1], $v->[2], $v->[1] ]
            : @$v == 2 ? [ $v->[0], $v->[1], $v->[0], $v->[1] ]
            : [ (@$v) x 4 ];
    },
);
has row_height     => ( is => 'ro',   default  => 12, isa => PositiveNum,    );
has str_width_mult => (
    is => 'ro',
    default  => 1,
    isa => HashRef,
    coerce => sub {
        my ( $v ) = @_;

        tie my %widths, 'Tie::RangeHash';
        unless ( ref $v ) { $widths{'0,'} = $v; return \%widths; }

        my $prev = -1;
        for ( uniq map sprintf('%.f', $_), sort { $a <=> $b } keys %$v ) {
            $widths{"$prev.1,$_"} = $v->{$_};
            $prev = $_;
        }

        return \%widths;
    },
);
##### Internal
has _extra_row_h   => ( is => 'rw',   default  => 0,                         );
has _row_lines     => ( is => 'rw',   default  => 0,                         );
has _border_color  => ( is => 'lazy', builder  => sub { shift->border->[1]  });
has _border_width  => ( is => 'lazy', builder  => sub { shift->border->[0]  });



( run in 2.471 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )