File Coverage

blib/lib/OpusVL/Text/Util.pm
Criterion Covered Total %
statement 64 70 91.4
branch 21 22 95.4
condition 5 5 100.0
subroutine 12 13 92.3
pod 8 8 100.0
total 110 118 93.2


line stmt bran cond sub pod time code
1             package OpusVL::Text::Util;
2              
3 4     4   471762 use 5.014;
  4         16  
4 4     4   21 use strict;
  4         6  
  4         110  
5 4     4   20 use warnings;
  4         10  
  4         394  
6              
7             our @ISA = qw/Exporter/;
8             our @EXPORT_OK = qw/truncate_text wrap_text string_to_id missing_array_items not_blank split_words line_split mask_text/;
9              
10 4     4   2477 use Array::Utils qw/intersect array_minus/;
  4         2033  
  4         810  
11 4     4   31 use Scalar::Util qw/looks_like_number/;
  4         6  
  4         3857  
12              
13             # ABSTRACT: Simple text utilities
14              
15             our $VERSION = '0.09';
16              
17              
18              
19             sub truncate_text
20             {
21 4     4 1 173 my $string = shift;
22 4         7 my $length = shift;
23              
24 4 100       18 return $string if length($string) < $length;
25 3 100       91 if($string =~ /^(.{0,$length}\w\b)/)
26             {
27 2         22 return $1 . '...';
28             }
29             else
30             {
31 1         9 return substr $string, 0, $length;
32             }
33             }
34              
35              
36             sub wrap_text
37             {
38 7     7 1 19 my $string = shift;
39 7         11 my $length = shift;
40 7   100     38 my $separator = shift || "\n";
41              
42 7 100       31 return $string if length($string) < $length;
43 6         144 my @lines = $string =~ /\G(.{0,$length}\w\b|.*\w\b)\s*/g;
44 6         60 return join $separator, @lines;
45             }
46              
47              
48             sub string_to_id
49             {
50 0     0 1 0 my $text = shift;
51 0         0 my $r = $text =~ s/\s+/_/gr;
52 0         0 $r =~ s/[^\w_]//g;
53 0         0 return lc $r;
54             }
55              
56              
57             sub line_split
58             {
59 9     9 1 10 my $text = shift;
60 9         54 my @lines = split /\r\n|\r|\n/, $text;
61             return @lines
62 9         29 }
63              
64              
65             sub missing_array_items
66             {
67 2     2 1 122 my ($mandatory_fields, $actual_fields) = @_;
68              
69 2         9 my @mand_found = intersect(@$mandatory_fields, @$actual_fields);
70 2 100       42 unless(scalar @mand_found == scalar @$mandatory_fields)
71             {
72 1         4 my @missing = array_minus(@$mandatory_fields, @mand_found);
73 1         19 return \@missing;
74             }
75 1         7 return;
76             }
77              
78              
79             sub not_blank
80             {
81 9     9 1 14 my $value = shift;
82 9 100       37 return 1 if $value;
83 5 100       19 if(looks_like_number($value))
84             {
85 2         8 return 1;
86             }
87 3         12 return 0;
88             }
89              
90              
91             sub split_words
92             {
93 5     5 1 7 my $value = shift;
94 5         31 return split /[\s,]+/, $value;
95             }
96              
97              
98             sub mask_text
99             {
100 4     4 1 187 my ($fill_char, $regex, $text) = @_;
101              
102             # fudge the regex.
103 4         85 my @values = $text =~ /$regex/s;
104 4 100       15 unless(@values)
105             {
106 1         7 return $fill_char x length($text);
107             }
108 3         4 my @chars;
109 3         5 my $group = 1;
110 3         5 my $group_inserted = 0;
111 3         11 my $start = $-[$group];
112 3         11 my $end = $+[$group];
113 3         13 for (my $i = 0; $i < length($text); $i++)
114             {
115 62 100       103 if($i > $end)
116             {
117 2         2 $group++;
118 2         5 $group_inserted = 0;
119 2 50       6 if($group > scalar @values)
120             {
121 0         0 $start = length($text) + 1;
122 0         0 $end = $start +1;
123             }
124             else
125             {
126 2         6 $start = $-[$group];
127 2         6 $end = $+[$group];
128             }
129             }
130 62 100 100     180 if($i >= $start && $i < $end)
131             {
132 46 100       104 unless($group_inserted)
133             {
134 5         7 $group_inserted = 1;
135 5         18 push @chars, $values[$group-1];
136             }
137             }
138             else
139             {
140 16         39 push @chars, $fill_char;
141             }
142             }
143 3         27 return join '', @chars;
144             }
145              
146              
147             1; # End of OpusVL::Text::Util
148              
149             __END__