File Coverage

blib/lib/XML/XPath/Helper/String.pm
Criterion Covered Total %
statement 56 56 100.0
branch 24 30 80.0
condition n/a
subroutine 10 10 100.0
pod 3 3 100.0
total 93 99 93.9


line stmt bran cond sub pod time code
1             package XML::XPath::Helper::String;
2            
3 3     3   208232 use 5.008;
  3         35  
4 3     3   16 use strict;
  3         6  
  3         75  
5 3     3   16 use warnings;
  3         6  
  3         128  
6            
7 3     3   19 use Exporter 'import';
  3         6  
  3         253  
8            
9             our $VERSION = '1.03';
10            
11             our @EXPORT_OK = qw(quoted_string one_of_quoted not_one_of_quoted);
12            
13             our %EXPORT_TAGS = (all => \@EXPORT_OK);
14            
15 3     3   20 use Carp;
  3         7  
  3         2340  
16            
17            
18            
19             sub quoted_string {
20 15 100   15 1 2117 @_ == 1 or croak("Wrong number of arguments");
21 14         24 my $arg = shift;
22 14         22 my $arg_scalar;
23 14 100       35 if (ref($arg)) {
24 10 100       199 croak("Argument must be a string or a reference to an array") unless ref($arg) eq 'ARRAY';
25             } else {
26 4         7 $arg_scalar = 1;
27 4 100       9 $arg = "" if !defined($arg);
28 4         10 $arg = [$arg];
29             }
30 13         21 my @result;
31 13         20 foreach my $string (@{$arg}) {
  13         32  
32 21 100       51 if (index($string, "'") >= 0) {
33 10         21 my @array;
34 10         54 foreach my $substr (grep{length($_)} split(/('+)/, $string)) {
  37         65  
35 32 100       68 my $q = substr($substr, 0, 1) eq "'" ? '"' : "'";
36 32         71 push(@array, "${q}${substr}${q}");
37             }
38 10         38 push(@result, 'concat(' . join(',', @array) . ')');
39             } else {
40 11         32 push(@result, "'$string'");
41             }
42             }
43 13 100       79 return ($arg_scalar ? $result[0] : \@result);
44             }
45            
46            
47             sub one_of_quoted {
48 3 50   3 1 91 @_ > 0 or croak("Too few arguments");
49 3         9 my ($array, $name) = @_;
50 3 50       9 ref($array) eq 'ARRAY' or croak("Argument 1 must be an ARRAY ref");
51 3 100       9 if (defined($name)) {
52 2 50       5 ref($name) and croak("Argument 2 must be a scalar");
53 2         6 return "$name=" . join(" or $name=", @{quoted_string($array)});
  2         6  
54             } else {
55 1         3 my $values = quoted_string($array);
56 1     2   7 return sub { return "$_[0]=" . join(" or $_[0]=", @{$values}); };
  2         383  
  2         12  
57             }
58             }
59            
60            
61             sub not_one_of_quoted {
62 3 50   3 1 517 @_ > 0 or croak("Too few arguments");
63 3         7 my ($array, $name) = @_;
64 3 50       10 ref($array) eq 'ARRAY' or croak("Argument 1 must be an ARRAY ref");
65 3 100       9 if (defined($name)) {
66 2 50       5 ref($name) and croak("Argument 2 must be a scalar");
67 2         7 return "$name!=" . join(" and $name!=", @{quoted_string($array)});
  2         4  
68             } else {
69 1         3 my $values = quoted_string($array);
70 1     1   7 return sub { return "$_[0]!=" . join(" and $_[0]!=", @{$values}); };
  1         348  
  1         6  
71             }
72             }
73            
74            
75            
76             1; # End of XML::XPath::Helper::String
77            
78            
79            
80             __END__