File: Cell.pm

package info (click to toggle)
libtest2-suite-perl 0.000063-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 1,044 kB
  • ctags: 418
  • sloc: perl: 4,504; makefile: 2
file content (96 lines) | stat: -rw-r--r-- 2,239 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package Test2::Util::Table::Cell;
use strict;
use warnings;

our $VERSION = '0.000063';

use Test2::Util::Table::LineBreak();
use Test2::Util::Term qw/uni_length/;

use List::Util qw/sum/;

use Test2::Util::HashBase qw/value border_left border_right _break _widths border_color value_color reset_color/;

my %CHAR_MAP = (
    # Special case, \n should render as \n, but also actually do the newline thing
    "\n" => "\\n\n",

    "\a" => '\\a',
    "\b" => '\\b',
    "\e" => '\\e',
    "\f" => '\\f',
    "\r" => '\\r',
    "\t" => '\\t',
    " "  => ' ',
);

sub init {
    my $self = shift;

    # Stringify
    $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; # All whitespace except normal space
}

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$sep");
        $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} ||= Test2::Util::Table::LineBreak->new(string => $self->{+VALUE});
}

1;