File Coverage

blib/lib/Waft/JS.pm
Criterion Covered Total %
statement 34 34 100.0
branch 2 4 50.0
condition 1 3 33.3
subroutine 6 6 100.0
pod 0 2 0.0
total 43 49 87.7


line stmt bran cond sub pod time code
1             package Waft::JS;
2              
3 2     2   73087 use 5.005;
  2         4  
4 2     2   6 use strict;
  2         2  
  2         35  
5 2     2   6 use vars qw( $VERSION );
  2         5  
  2         91  
6 2 50   2   2 BEGIN { eval { require warnings } ? 'warnings'->import : ( $^W = 1 ) }
  2         677  
7              
8             require NEXT;
9              
10             $VERSION = '0.00_01';
11             $VERSION = eval $VERSION;
12              
13             $Waft::JS::Name = 'Waft.JS';
14              
15             sub convert_text_part {
16 1     1 0 11 my ($self, $text_part, $break) = @_;
17              
18             my @text_parts
19 1         15 = split /\b \Q$Waft::JS::Name\E \. /xms, $text_part;
20              
21 1         8 my $code = $self->NEXT::convert_text_part( shift(@text_parts), $break );
22              
23 1         108 while ( @text_parts ) {
24 1         2 my $text_part = shift @text_parts;
25              
26 1         3 ( my $method, $text_part ) = split / \b /xms, $text_part, 2;
27              
28 1 50 33     6 if ($method eq 'make_url' or $method eq 'url') {
29 1         2 $code .= q{$Waft::Self->output_js_make_url_script;};
30             }
31              
32 1         5 $code .= $self->NEXT::convert_text_part($text_part, $break);
33             }
34              
35 1         73 return $code;
36             }
37              
38             sub output_js_make_url_script {
39 1     1 0 497 my ($self) = @_;
40              
41 1         4 my $base_url = $self->jsstr_escape($self->get_base_url);
42 1         34 my $page = $self->jsstr_escape($self->page);
43              
44 1         17 my $v = q{};
45 1         2 my $value_hashref = $self->value_hashref;
46 1         7 while ( my ($key, $values_arrayref) = each %$value_hashref ) {
47 2         4 $key = $self->jsstr_escape($key);
48 2         15 my @values = map { qq{'$_'} } $self->jsstr_escape(@$values_arrayref);
  3         26  
49 2         11 $v .= q{v['} . $key . q{'] = [} . join(q{, }, @values) . q{];};
50             }
51              
52 1         11 my $javascript = qq{( function (page, keys, data) {
53             var base_url = '$base_url';
54             var query_string = '';
55              
56             if (page == undefined) page = 'default.html';
57             else if (page == 'CURRENT') page = '$page';
58              
59             if (page != 'default.html') {
60             query_string
61             = '?p=' + encodeURIComponent(page).replace(/%20/g, '+');
62             }
63              
64             var v = {}; $v
65              
66             if (keys == undefined)
67             return base_url + query_string;
68              
69             if (keys.constructor == Object) {
70             data = keys;
71             keys = [];
72             }
73             else if (keys == 'ALL_VALUES') {
74             keys = [];
75             for ( var key in v ) {
76             keys.push(key);
77             }
78             }
79              
80             var keep = {};
81              
82             for ( var i = 0; i < keys.length; i++ ) {
83             if ( v[ keys[i] ] != undefined )
84             keep[ keys[i] ] = v[ keys[i] ];
85             }
86              
87             if ( data ) {
88             for ( var key in data ) {
89             keep[key] = data[key];
90             }
91             }
92              
93             var escape_space_percent_hyphen = function (val) {
94             if ( typeof val != 'string' )
95             return val;
96              
97             val = val.replace(/%/g, '%25');
98             val = val.replace(/ /g, '%20');
99             val = val.replace(/-/g, '%2D');
100              
101             return val;
102             };
103              
104             keys = [];
105              
106             for ( var key in keep ) {
107             keys.push(key);
108              
109             if (keep[key].constructor == Array) {
110             var val = '';
111              
112             for ( var i = 0; i < keep[key].length; i++ ) {
113             val += '-' + escape_space_percent_hyphen(keep[key][i]);
114             }
115              
116             keep[key] = val;
117             }
118             else {
119             keep[key] = '-' + escape_space_percent_hyphen(keep[key]);
120             }
121             }
122              
123             keys.sort();
124              
125             var joined_values = '';
126              
127             for ( var i = 0; i < keys.length; i++ ) {
128             if (joined_values != '') joined_values += ' ';
129              
130             joined_values += escape_space_percent_hyphen(keys[i])
131             + keep[ keys[i] ];
132             }
133              
134             if (joined_values == '')
135             return base_url + query_string;
136              
137             query_string += query_string == '' ? '?' : '&';
138              
139             query_string
140             += 'v=' + encodeURIComponent(joined_values).replace(/%20/g, '+');
141              
142             return base_url + query_string;
143             } )};
144              
145 1         137 $javascript =~ s/ (?: \x0D\x0A | [\x0A\x0D] ) \s* / /gxms;
146              
147 1         3 $self->output($javascript);
148              
149 1         4 return;
150             }
151              
152             1;
153             __END__