File Coverage

blib/lib/DTL/Fast/Filter/Truncatewords.pm
Criterion Covered Total %
statement 31 31 100.0
branch 7 8 87.5
condition n/a
subroutine 6 6 100.0
pod 0 2 0.0
total 44 47 93.6


line stmt bran cond sub pod time code
1             package DTL::Fast::Filter::Truncatewords;
2 3     3   1327 use strict; use utf8; use warnings FATAL => 'all';
  3     3   4  
  3     3   77  
  3         11  
  3         2  
  3         16  
  3         71  
  3         4  
  3         93  
3 3     3   8 use parent 'DTL::Fast::Filter';
  3         4  
  3         12  
4              
5             $DTL::Fast::FILTER_HANDLERS{'truncatewords'} = __PACKAGE__;
6              
7             #@Override
8             sub parse_parameters
9             {
10 4     4 0 5 my $self = shift;
11             die $self->get_parse_error("no max words number specified")
12 4 50       7 if not scalar @{$self->{'parameter'}};
  4         8  
13 4         6 $self->{'maxlen'} = $self->{'parameter'}->[0];
14 4         10 return $self;
15             }
16              
17             #@Override
18             sub filter
19             {
20 4     4 0 4 my($self, $filter_manager, $value, $context ) = @_;
21            
22 4         13 my $maxlen = $self->{'maxlen'}->render($context);
23 4         23 my @value = split /(\s+)/s, $value;
24 4         4 my $words = 0;
25 4         5 my @newvalue = ();
26            
27 4         3 foreach my $value (@value)
28             {
29 35 100       40 if( $words == $maxlen )
30             {
31 2         10 last;
32             }
33             else
34             {
35 33         31 push @newvalue, $value;
36 33 100       55 if( $value !~ /^\s+$/s )
37             {
38 18         17 $words++;
39             }
40             }
41             }
42              
43 4 100       8 if( scalar @newvalue < scalar @value )
44             {
45 2         2 push @newvalue, '...';
46             }
47            
48 4         19 return join '', @newvalue;
49             }
50              
51              
52             1;