File Coverage

blib/lib/Pinwheel/Helpers/Text.pm
Criterion Covered Total %
statement 54 54 100.0
branch 16 16 100.0
condition 3 3 100.0
subroutine 14 14 100.0
pod 0 9 0.0
total 87 96 90.6


line stmt bran cond sub pod time code
1             package Pinwheel::Helpers::Text;
2              
3 5     5   34735 use strict;
  5         11  
  5         192  
4 5     5   25 use warnings;
  5         10  
  5         138  
5              
6 5     5   25 use Exporter;
  5         10  
  5         221  
7              
8 5     5   646 use Pinwheel::Context;
  5         9  
  5         239  
9 5     5   575 use Pinwheel::View::String;
  5         11  
  5         4029  
10              
11             our @ISA = qw(Exporter);
12             our @EXPORT_OK = qw(h p lc uc tc join simple_format cycle pluralize ordinal_text);
13              
14              
15             sub h
16             {
17 1     1 0 13 return $_[0];
18             }
19              
20             sub lc
21             {
22 1     1 0 6 return CORE::lc($_[0]);
23             }
24              
25             sub uc
26             {
27 1     1 0 500 return CORE::uc($_[0]);
28             }
29              
30             sub tc
31             {
32 5     5 0 13 my $t = CORE::lc($_[0]);
33 5         24 $t =~ s/\b(\w)/CORE::uc $1/eg;
  7         27  
34 5         23 $t;
35             }
36              
37             sub join
38             {
39 10     10 0 672 my ($array, $s1, $s2) = @_;
40 10         14 my ($last);
41              
42 10 100       32 return '' unless @$array > 0;
43 8         11 $last = pop @$array;
44 8 100       26 return $last unless @$array > 0;
45              
46 6 100       15 $s2 = $s1 if !defined($s2);
47 6         33 return CORE::join($s2, CORE::join($s1, @$array), $last);
48             }
49              
50             sub simple_format
51             {
52 16     16 0 37 my ($s) = @_;
53 16         18 my ($parts, $p, $line, $i, $j);
54              
55 16         38 $s =~ s{^\s+}{};
56 16         41 $s =~ s{\s+$}{};
57              
58 16         39 $parts = [['

']];

59 16         96 foreach $p (split(/ *(?:\r?\n *){2,} */, $s)) {
60 22 100       59 push @$parts, ["

\n

"] if $i++;

61 22         26 $j = 0;
62 22         113 foreach $line (split(/(?<=[^\r\n])\r?\n(?=[^\r\n])/, $p)) {
63 28 100       56 push @$parts, ["
\n"] if $j++;
64 28         1725 push @$parts, $line;
65             }
66             }
67 16         36 push @$parts, ['

'];
68              
69 16         60 return Pinwheel::View::String->new($parts);
70             }
71             *p = *simple_format;
72              
73             sub cycle
74             {
75 7     7 0 499 my ($ctx, $key, $i);
76 7         33 $key = (caller)[2] . "\t" . CORE::join("\t", @_);
77 7         20 $ctx = Pinwheel::Context::get('render');
78 7         18 $i = $ctx->{cycle}{$key}++;
79 7         27 return $_[$i % scalar(@_)];
80             }
81              
82             sub pluralize
83             {
84 4     4 0 530 my ($count, $singular, $plural) = @_;
85 4 100       16 return $singular if $count == 1;
86 2 100       11 return $plural if defined($plural);
87 1         6 return $singular . 's';
88             }
89              
90             sub ordinal_text
91             {
92 11     11 0 607 my $i = (0 + shift) % 100;
93 11 100 100     60 return 'th' if ($i >= 10 && $i < 20);
94 8         42 return qw(th st nd rd th th th th th th)[$i % 10];
95             }
96              
97             =head1 SYNOPSIS
98              
99             use Pinwheel::Helpers::Text;
100              
101             # The following are listed in @EXPORT_OK, but nothing is exported by default
102              
103             $text = h($text); # ?
104              
105             $text = uc($text); # UPPER CASE
106             $text = lc($text); # lower case
107             $text = tc($text); # Title Case (uses \b to detect words)
108              
109             # Joins the items of @list using $sep, except for the last item which is
110             # joined using $last_sep
111             $text = join(\@list, $sep, $last_sep);
112             join(["Dave Dee", "Dozy", "Beaky", "Mick", "Tich"], ", ", " & ") -> "Dave Dee, Dozy, Beaky, Mick & Tich"
113              
114             simple_format; # ?
115             # p is an alias for simple_format
116              
117             cycle; # ?
118              
119             $text = pluralize($count, $singular[, $plural]);
120             pluralize(1, "mouse", "mice") -> "mouse"
121             pluralize(2, "mouse", "mice") -> "mice"
122             pluralize(1, "dog") -> "dog"
123             pluralize(2, "dog") -> "dogs"
124              
125             $text = ordinal_text($n); # One of: st nd rd th
126             # depending on $n
127              
128             =pod
129              
130             1;