File Coverage

blib/lib/Dallycot/Value/HTML.pm
Criterion Covered Total %
statement 15 72 20.8
branch 0 8 0.0
condition 0 23 0.0
subroutine 5 18 27.7
pod 0 13 0.0
total 20 134 14.9


line stmt bran cond sub pod time code
1             package Dallycot::Value::HTML;
2             our $AUTHORITY = 'cpan:JSMITH';
3              
4             # ABSTRACT: A string with an associated language
5              
6 23     23   40473 use strict;
  23         43  
  23         829  
7 23     23   95 use warnings;
  23         99  
  23         703  
8              
9 23     23   150 use utf8;
  23         42  
  23         179  
10 23     23   546 use parent 'Dallycot::Value::Any';
  23         45  
  23         251  
11              
12 23     23   1531 use Promises qw(deferred);
  23         40  
  23         110  
13              
14             sub new {
15 0     0 0   my ( $class, $value ) = @_;
16              
17 0   0       $class = ref $class || $class;
18              
19 0 0         if ( !blessed($value) ) {
20 0           my $parser = HTML::Parser->new( api_version => 3 );
21 0           $parser->parse($value);
22 0           $parser->eof;
23 0           $value = HTML::Parser->new->parse($value);
24             }
25              
26 0   0       return bless [ $value // '' ] => $class;
27             }
28              
29 0     0 0   sub lang { return shift->[1] }
30              
31             sub id {
32 0     0 0   my ($self) = @_;
33              
34 0           return $self->[0] . "@" . $self->[1] . "^^String";
35             }
36              
37             sub calculate_length {
38 0     0 0   my ( $self, $engine ) = @_;
39              
40 0           my $d = deferred;
41              
42 0           $d->resolve( Dallycot::Value::Numeric->new( length $self->[0] ) );
43              
44 0           return $d->promise;
45             }
46              
47             sub calculate_reverse {
48 0     0 0   my ( $self, $engine ) = @_;
49              
50 0           my $d = deferred;
51              
52 0           $d->resolve( $self->new( reverse( $self->value ), $self->lang ) );
53              
54 0           return $d->promise;
55             }
56              
57             sub take_range {
58 0     0 0   my ( $self, $engine, $offset, $length ) = @_;
59              
60 0           my $d = deferred;
61              
62 0 0         if ( abs($offset) > length( $self->[0] ) ) {
63 0           $d->resolve( $self->new( '', $self->lang ) );
64             }
65             else {
66 0           $d->resolve( $self->new( substr( $self->value, $offset - 1, $length - $offset + 1 ), $self->lang ) );
67             }
68              
69 0           return $d->promise;
70             }
71              
72             sub drop {
73 0     0 0   my ( $self, $engine, $offset ) = @_;
74              
75 0           my $d = deferred;
76              
77 0 0         if ( abs($offset) > length( $self->value ) ) {
78 0           $d->resolve( $self->new( '', $self->lang ) );
79             }
80             else {
81 0           $d->resolve( $self->new( substr( $self->value, $offset ), $self->lang ) );
82             }
83              
84 0           return $d->promise;
85             }
86              
87             sub value_at {
88 0     0 0   my ( $self, $engine, $index ) = @_;
89              
90 0           my $d = deferred;
91              
92 0 0 0       if ( !$index || abs($index) > length( $self->[0] ) ) {
93 0           $d->resolve( $self->new( '', $self->[1] ) );
94             }
95             else {
96 0           $d->resolve( $self->new( substr( $self->[0], $index - 1, 1 ), $self->[1] ) );
97             }
98              
99 0           return $d->promise;
100             }
101              
102             sub is_equal {
103 0     0 0   my ( $self, $engine, $other ) = @_;
104              
105 0           my $d = deferred;
106              
107 0   0       $d->resolve( $self->lang eq $other->lang && $self->value eq $other->value );
108              
109 0           return $d->promise;
110             }
111              
112             sub is_less {
113 0     0 0   my ( $self, $engine, $other ) = @_;
114              
115 0           my $d = deferred;
116              
117 0   0       $d->resolve( $self->lang lt $other->lang
118             || $self->lang eq $other->lang && $self->value lt $other->value );
119              
120 0           return $d->promise;
121             }
122              
123             sub is_less_or_equal {
124 0     0 0   my ( $self, $engine, $other ) = @_;
125              
126 0           my $d = deferred;
127              
128 0   0       $d->resolve( $self->lang lt $other->lang
129             || $self->lang eq $other->lang && $self->value le $other->value );
130              
131 0           return $d->promise;
132             }
133              
134             sub is_greater {
135 0     0 0   my ( $self, $engine, $other ) = @_;
136              
137 0           my $d = deferred;
138              
139 0   0       $d->resolve( $self->lang gt $other->lang
140             || $self->lang eq $other->lang && $self->value gt $other->value );
141              
142 0           return $d->promise;
143             }
144              
145             sub is_greater_or_equal {
146 0     0 0   my ( $self, $engine, $other ) = @_;
147              
148 0           my $d = deferred;
149              
150 0   0       $d->resolve( $self->lang gt $other->lang
151             || $self->lang eq $other->lang && $self->value ge $other->value );
152              
153 0           return $d->promise;
154             }
155              
156             1;