File Coverage

blib/lib/CGI/Echo.pm
Criterion Covered Total %
statement 9 62 14.5
branch 0 18 0.0
condition 0 17 0.0
subroutine 3 11 27.2
pod 3 3 100.0
total 15 111 13.5


line stmt bran cond sub pod time code
1             package CGI::Echo;
2              
3             # Name:
4             # CGI::Echo.
5             #
6             # Purpose:
7             # Let students input data to a form, and echo it back to them.
8             #
9             # Documentation:
10             # POD-style documentation is at the end. Extract it with pod2html.*.
11             #
12             # Note:
13             # o tab = 4 spaces || die
14             #
15             # V 1.00 1-Oct-2002
16             # -----------------
17             # o Original version
18             #
19             # Author:
20             # Ron Savage
21             # http://savage.net.au/index.html
22              
23 1     1   21124 use warnings;
  1         3  
  1         26  
24 1     1   4 use strict;
  1         1  
  1         28  
25              
26 1     1   5 use Carp;
  1         5  
  1         1142  
27              
28             require 5.005_62;
29              
30             require Exporter;
31              
32             our @ISA = qw(Exporter);
33              
34             # Items to export into callers namespace by default. Note: do not export
35             # names by default without a very good reason. Use EXPORT_OK instead.
36             # Do not simply export all your public functions/methods/constants.
37              
38             # This allows declaration use CGI::DBI ':all';
39             # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
40             # will save memory.
41             our %EXPORT_TAGS = ( 'all' => [ qw() ] );
42              
43             our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );
44              
45             our @EXPORT = qw();
46              
47             our $VERSION = '1.08';
48              
49             # -----------------------------------------------
50              
51             # Preloaded methods go here.
52              
53             # -----------------------------------------------
54              
55             # Encapsulated class data.
56              
57             {
58             my(%_attr_data) =
59             (
60             _css => '',
61             _q => '',
62             _title => 'Echo Test',
63             );
64              
65             sub _clean_form_data
66             {
67 0     0     my($self) = @_;
68 0           $$self{'_data'} = {};
69 0           my(@param) = $$self{'_q'} -> param();
70              
71 0           for my $field (@param)
72             {
73 0           @{$$self{'_data'}{$field} } = $$self{'_q'} -> param($field);
  0            
74 0           $$self{'_data'}{$field}[$_] = $self -> _clean_form_field($$self{'_data'}{$field}[$_], 200, 0) for (0 .. $#{$$self{'_data'}{$field} });
  0            
75             }
76              
77 0           scalar keys %{$$self{'_data'} };
  0            
78              
79             } # End of _clean_form_data.
80              
81             sub _clean_form_field
82             {
83 0     0     my($self, $data, $max_length, $integer) = @_;
84 0 0 0       $data = '' if (! defined($data) || ($data !~ /^([^`\x00-\x1F\x7F-\x9F]+)$/) || (length($1) == 0) || (length($1) > $max_length) );
      0        
      0        
85 0 0         $data = '' if ($data =~ /.+<\s*\/?\s*script\s*>/i); # http://www.perl.com/pub/a/2002/02/20/css.html.
86 0 0         $data = '' if ($data =~ /<(.+)\s*>.*<\s*\/?\s*\1\s*>/i); # Ditto, but much more strict.
87 0 0 0       $data = 0 if ($integer && (! $data || ($data !~ /^[0-9]+$/) ) );
      0        
88              
89 0           $data;
90              
91             } # End of _clean_form_field.
92              
93             sub _default_for
94             {
95 0     0     my($self, $attr_name) = @_;
96              
97 0           $_attr_data{$attr_name};
98             }
99              
100             sub _standard_keys
101             {
102 0     0     sort keys %_attr_data;
103             }
104              
105             sub _validate_options
106             {
107 0     0     my($self) = @_;
108 0   0       $$self{'_title'} ||= 'Echo Test';
109              
110 0 0         croak(__PACKAGE__ . ". You must supply a value for the parameter 'q'") if (! $$self{'_q'});
111              
112             # # Reset empty parameters to their defaults.
113             # # This could be optional, depending on another option.
114             #
115             # for my $attr_name ($self -> _standard_keys() )
116             # {
117             # $$self{$attr_name} = $self -> _default_for($attr_name) if (! $$self{$attr_name});
118             # }
119              
120             } # End of _validate_options.
121              
122             } # End of Encapsulated class data.
123              
124             # -----------------------------------------------
125              
126             sub new
127             {
128 0     0 1   my($class, %arg) = @_;
129 0           my($self) = bless({}, $class);
130              
131 0           for my $attr_name ($self -> _standard_keys() )
132             {
133 0           my($arg_name) = $attr_name =~ /^_(.*)/;
134              
135 0 0         if (exists($arg{$arg_name}) )
136             {
137 0           $$self{$attr_name} = $arg{$arg_name};
138             }
139             else
140             {
141 0           $$self{$attr_name} = $self -> _default_for($attr_name);
142             }
143             }
144              
145 0           return $self;
146              
147             } # End of new.
148              
149             # -----------------------------------------------
150              
151             sub print
152             {
153 0     0 1   my($self, %arg) = @_;
154              
155             # Give the user one last chance to set some parameters.
156              
157 0           $self -> set(%arg);
158 0           $self -> _validate_options();
159              
160 0           my(@html);
161              
162 0           push(@html, $$self{'_q'} -> th('Title') . $$self{'_q'} -> td($$self{'_title'}) );
163 0           push(@html, $$self{'_q'} -> th(' ') . $$self{'_q'} -> td(' ') );
164              
165 0 0         if ($self -> _clean_form_data() )
166             {
167 0           my($param, $index);
168              
169 0           for $param (sort keys %{$$self{'_data'} })
  0            
170             {
171 0           push(@html, $$self{'_q'} -> th('Parameter') . $$self{'_q'} -> th('Value') );
172              
173 0           for $index (0 .. $#{$$self{'_data'}{$param} })
  0            
174             {
175 0           push(@html, $$self{'_q'} -> th( ($index + 1) . ": $param") . $$self{'_q'} -> td($$self{'_data'}{$param}[$index]) );
176             }
177              
178 0           push(@html, $$self{'_q'} -> th(' ') . $$self{'_q'} -> td(' ') );
179             }
180             }
181             else
182             {
183 0           push(@html, $$self{'_q'} -> th('Status') . $$self{'_q'} -> td('Form does not contain any data') );
184 0           push(@html, $$self{'_q'} -> th(' ') . $$self{'_q'} -> td(' ') );
185             }
186              
187 0           my($style) = {};
188 0 0         $style = {style => {src => $$self{'_css'} } } if ($$self{'_css'});
189              
190 0           print $$self{'_q'} -> header({type => 'text/html;charset=ISO-8859-1'}) .
191             $$self{'_q'} -> start_html($style, title => $$self{'_title'}) .
192             $$self{'_q'} -> h1({align => 'center'}, $$self{'_title'}) .
193             $$self{'_q'} -> table
194             (
195             {align => 'center', border => 1, class => 'submit'},
196             $$self{'_q'} -> Tr([@html])
197             ) .
198             $$self{'_q'} -> end_html();
199              
200             } # End of print.
201              
202             # -----------------------------------------------
203              
204             sub set
205             {
206 0     0 1   my($self, %arg) = @_;
207              
208 0           for my $arg (keys %arg)
209             {
210 0 0         $$self{"_$arg"} = $arg{$arg} if (exists($$self{"_$arg"}) );
211             }
212              
213             } # End of set.
214              
215             # -----------------------------------------------
216              
217             1;
218              
219             __END__