<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package Term::Table::Cell;
use strict;
use warnings;

our $VERSION = '0.018';

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 = (
    # Special case, \n should render as \n, but also actually do the newline thing
    "\n" =&gt; "\\n\n",

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

sub init {
    my $self = shift;

    # Stringify
    $self-&gt;{+VALUE} = defined $self-&gt;{+VALUE} ? "$self-&gt;{+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} &amp;&amp; $char eq "\n";
    return $CHAR_MAP{$char} || $class-&gt;char_id($char);
}

sub sanitize {
    my $self = shift;
    $self-&gt;{+VALUE} =~ s/([\s\t\p{Zl}\p{C}\p{Zp}])/$self-&gt;show_char($1)/ge; # All whitespace except normal space
}

sub mark_tail {
    my $self = shift;
    $self-&gt;{+VALUE} =~ s/([\s\t\p{Zl}\p{C}\p{Zp}])$/$1 eq ' ' ? $self-&gt;char_id($1) : $self-&gt;show_char($1, no_newline =&gt; 1)/se;
}

sub value_width {
    my $self = shift;

    my $w = $self-&gt;{+_WIDTHS} ||= {};
    return $w-&gt;{value} if defined $w-&gt;{value};

    my @parts = split /(\n)/, $self-&gt;{+VALUE};

    my $max = 0;
    while (@parts) {
        my $text = shift @parts;
        my $sep  = shift @parts || '';
        my $len = uni_length("$text");
        $max = $len if $len &gt; $max;
    }

    return $w-&gt;{value} = $max;
}

sub border_left_width {
    my $self = shift;
    $self-&gt;{+_WIDTHS}-&gt;{left} ||= uni_length($self-&gt;{+BORDER_LEFT} || '');
}

sub border_right_width {
    my $self = shift;
    $self-&gt;{+_WIDTHS}-&gt;{right} ||= uni_length($self-&gt;{+BORDER_RIGHT} || '');
}

sub width {
    my $self = shift;
    $self-&gt;{+_WIDTHS}-&gt;{all} ||= sum(map { $self-&gt;$_ } qw/value_width border_left_width border_right_width/);
}

sub break {
    my $self = shift;
    $self-&gt;{+_BREAK} ||= Term::Table::LineBreak-&gt;new(string =&gt; $self-&gt;{+VALUE});
}

sub reset {
    my $self = shift;
    delete $self-&gt;{+_BREAK};
}

1;

__END__

=pod

=encoding UTF-8

=head1 NAME

Term::Table::Cell - Representation of a cell in a table.

=head1 DESCRIPTION

This package is used to represent a cell in a table.

=head1 SOURCE

The source code repository for Term-Table can be found at
F&lt;http://github.com/exodist/Term-Table/&gt;.

=head1 MAINTAINERS

=over 4

=item Chad Granum E&lt;lt&gt;exodist@cpan.orgE&lt;gt&gt;

=back

=head1 AUTHORS

=over 4

=item Chad Granum E&lt;lt&gt;exodist@cpan.orgE&lt;gt&gt;

=back

=head1 COPYRIGHT

Copyright 2016 Chad Granum E&lt;lt&gt;exodist@cpan.orgE&lt;gt&gt;.

This program is free software; you can redistribute it and/or
modify it under the same terms as Perl itself.

See F&lt;http://dev.perl.org/licenses/&gt;

=cut
</pre></body></html>