File Coverage

blib/lib/HTML/Perlinfo/Common.pm
Criterion Covered Total %
statement 12 178 6.7
branch 0 120 0.0
condition 0 83 0.0
subroutine 4 29 13.7
pod 0 25 0.0
total 16 435 3.6


\n", $_[0], $_[1]); "; "; \n"; ~; " : ""; "; \n"; \n"; "; "; \n";
line stmt bran cond sub pod time code
1             package HTML::Perlinfo::Common;
2 1     1   6 use strict;
  1         2  
  1         28  
3 1     1   5 use warnings;
  1         2  
  1         80  
4              
5             our @ISA = qw(Exporter);
6             our @EXPORT = qw(initialize_globals print_table_colspan_header print_table_row print_table_color_start print_table_color_end print_color_box print_table_row_color print_table_start print_table_end print_box_start print_box_end print_hr print_table_header print_section print_license add_link check_path check_args check_module_args perl_version release_date process_args error_msg match_string);
7             require Exporter;
8              
9 1     1   7 use Carp ();
  1         2  
  1         54  
10              
11             our %links;
12              
13             %links = (
14             'all' => 1,
15             'local' => 0,
16             'docs' => 1,
17             );
18              
19              
20             ##### The following is lifted from File::Which 0.05 by Per Einar Ellefsen.
21             ##### The check_path sub uses the which sub.
22             #############
23 1     1   7 use File::Spec;
  1         1  
  1         2932  
24              
25             my $Is_VMS = ($^O eq 'VMS');
26             my $Is_MacOS = ($^O eq 'MacOS');
27             my $Is_DOSish = (($^O eq 'MSWin32') or
28             ($^O eq 'dos') or
29             ($^O eq 'os2'));
30              
31             # For Win32 systems, stores the extensions used for
32             # executable files
33             # For others, the empty string is used
34             # because 'perl' . '' eq 'perl' => easier
35             my @path_ext = ('');
36             if ($Is_DOSish) {
37             if ($ENV{PATHEXT} and $Is_DOSish) { # WinNT. PATHEXT might be set on Cygwin, but not used.
38             push @path_ext, split ';', $ENV{PATHEXT};
39             }
40             else {
41             push @path_ext, qw(.com .exe .bat); # Win9X or other: doesn't have PATHEXT, so needs hardcoded.
42             }
43             }
44             elsif ($Is_VMS) {
45             push @path_ext, qw(.exe .com);
46             }
47              
48             sub which {
49 0     0 0   my ($exec) = @_;
50              
51 0 0         return undef unless $exec;
52              
53 0           my $all = wantarray;
54 0           my @results = ();
55            
56             # check for aliases first
57 0 0         if ($Is_VMS) {
58 0           my $symbol = `SHOW SYMBOL $exec`;
59 0           chomp($symbol);
60 0 0         if (!$?) {
61 0 0         return $symbol unless $all;
62 0           push @results, $symbol;
63             }
64             }
65 0 0         if ($Is_MacOS) {
66 0           my @aliases = split /\,/, $ENV{Aliases};
67 0           foreach my $alias (@aliases) {
68             # This has not been tested!!
69             # PPT which says MPW-Perl cannot resolve `Alias $alias`,
70             # let's just hope it's fixed
71 0 0         if (lc($alias) eq lc($exec)) {
72 0           chomp(my $file = `Alias $alias`);
73 0 0         last unless $file; # if it failed, just go on the normal way
74 0 0         return $file unless $all;
75 0           push @results, $file;
76             # we can stop this loop as if it finds more aliases matching,
77             # it'll just be the same result anyway
78 0           last;
79             }
80             }
81             }
82              
83 0           my @path = File::Spec->path();
84 0 0 0       unshift @path, File::Spec->curdir if $Is_DOSish or $Is_VMS or $Is_MacOS;
      0        
85              
86 0           for my $base (map { File::Spec->catfile($_, $exec) } @path) {
  0            
87 0           for my $ext (@path_ext) {
88 0           my $file = $base.$ext;
89              
90 0 0 0       if ((-x $file or # executable, normal case
      0        
91             ($Is_MacOS || # MacOS doesn't mark as executable so we check -e
92             ($Is_DOSish and grep { $file =~ /$_$/i } @path_ext[1..$#path_ext])
93             # DOSish systems don't pass -x on non-exe/bat/com files.
94             # so we check -e. However, we don't want to pass -e on files
95             # that aren't in PATHEXT, like README.
96             and -e _)
97             ) and !-d _)
98             { # and finally, we don't want dirs to pass (as they are -x)
99              
100              
101 0 0         return $file unless $all;
102 0           push @results, $file; # Make list to return later
103             }
104             }
105             }
106            
107 0 0         if($all) {
108 0           return @results;
109             } else {
110 0           return undef;
111             }
112             }
113              
114             ## End File::Which code
115              
116             sub check_path {
117            
118 0 0   0 0   return add_link('local', which("$_[0]")) if which("$_[0]");
119 0           return "not in path";
120              
121             }
122              
123             sub match_string {
124 0     0 0   my($module_name, $string) = @_;
125            
126 0           my $result = 0;
127 0 0         my @string = (ref $string eq 'ARRAY') ? @$string : ($string);
128 0           foreach(@string) {
129 0           $result = index(lc($module_name), lc($_));
130 0 0         last if ($result != -1);
131             }
132 0 0         return ($result == -1) ? 0 : 1;
133              
134             }
135              
136             sub perl_version {
137 0     0 0   my $version;
138 0 0         if ($] >= 5.006) {
139 0           $version = sprintf "%vd", $^V;
140             }
141             else { # else time to update Perl!
142 0           $version = "$]";
143             }
144 0           return $version;
145             }
146              
147             sub release_date {
148              
149             # when things escaped
150 0     0 0   my %released = (
151             5.000 => '1994-10-17',
152             5.001 => '1995-03-14',
153             5.002 => '1996-02-96',
154             5.00307 => '1996-10-10',
155             5.004 => '1997-05-15',
156             5.005 => '1998-07-22',
157             5.00503 => '1999-03-28',
158             5.00405 => '1999-04-29',
159             5.006 => '2000-03-22',
160             5.006001 => '2001-04-08',
161             5.007003 => '2002-03-05',
162             5.008 => '2002-07-19',
163             5.008001 => '2003-09-25',
164             5.009 => '2003-10-27',
165             5.008002 => '2003-11-05',
166             5.006002 => '2003-11-15',
167             5.008003 => '2004-01-14',
168             5.00504 => '2004-02-23',
169             5.009001 => '2004-03-16',
170             5.008004 => '2004-04-21',
171             5.008005 => '2004-07-19',
172             5.008006 => '2004-11-27',
173             5.009002 => '2005-04-01',
174             5.008007 => '2005-05-30',
175             5.009003 => '2006-01-28',
176             5.008008 => '2006-01-31',
177             5.009004 => '2006-08-15',
178             5.009005 => '2007-07-07',
179             5.010000 => '2007-12-18',
180             );
181            
182             # Do we have Module::Corelist
183 0           eval{require Module::CoreList};
  0            
184 0 0         if ($@) { # no
185 0 0         return ($released{$]}) ? $released{$]} : "unknown";
186             }
187             else { # yes
188 0 0         return ($Module::CoreList::released{$]}) ? $Module::CoreList::released{$]} : "unknown";
189             }
190            
191             }
192              
193             sub check_args {
194              
195 0     0 0   my ($key, $value) = @_;
196 0           my ($message, %allowed);
197 0           @allowed{qw(docs local 0 1)} = ();
198              
199 0 0 0       if (not exists $allowed{$key}) {
    0          
200 0           $message = "$key is an invalid links parameter";
201             }
202             elsif ($key =~ /(?:docs|local)/ && $value !~ /^(?:0|1)$/i) {
203 0           $message = "$value is an invalid value for the $key parameter in the links attribute";
204             }
205              
206 0 0         error_msg("$message") if $message;
207              
208             }
209              
210             sub check_module_args {
211              
212 0     0 0   my ($key, $value) = @_;
213 0           my ($message, %allowed);
214 0           @allowed{qw(from columns sort_by color link show_only section full_page show_inc show_dir files_in)} = ();
215              
216 0 0 0       if (not exists $allowed{$key}) {
    0 0        
    0 0        
    0 0        
    0 0        
    0 0        
    0 0        
    0 0        
    0 0        
      0        
      0        
      0        
      0        
217 0           $message = "$key is an invalid print_modules parameter";
218             }
219             elsif ($key eq 'sort_by' && $value !~ /^(?:name|version)$/i) {
220 0           $message = "$value is an invalid sort";
221             }
222             elsif ($key =~ /^(?:color|link|columns|files_in)$/ && ref($value) ne 'ARRAY') {
223 0           $message = "The $key parameter value is not an array reference";
224             }
225 0           elsif ($key eq 'columns' && grep(!/^(?:name|version|desc|path|core)$/, @{$value})) {
226 0           $message = "Invalid column name in the $key parameter";
227             }
228 0           elsif ($key eq 'color' && @{$value} <= 1) {
229 0           $message = "You didn't specify a module to color";
230             }
231 0           elsif ($key eq 'link' && @{$value} <= 1 && $value->[0] != 0) {
232 0           $message = "You didn't provide a URL for the $key parameter";
233             }
234             elsif ($key eq 'show_only' && (ref($value) ne 'ARRAY') && lc $value ne 'core') {
235 0           $message = "$value is an invalid value for the $key parameter";
236             }
237             elsif ($key eq 'full_page' && $value != 0 && $value != 1 ) {
238 0           $message = "$value is an invalid value for the $key parameter";
239             }
240             elsif ($key eq 'link' && ($value->[0] ne 'all' && $value->[0] != 0 && ref($value->[0]) ne 'ARRAY')) {
241 0           $message = "Invalid first element in the $key parameter value";
242             }
243 0 0         error_msg("$message") if $message;
244             }
245              
246              
247              
248             sub process_args {
249             # This sub returns a hash ref containing param args
250 0     0 0   my %params;
251 0   0       my $sub = pop @_ || die "No coderef provided\n"; # get the sub
252 0 0         if (defined $_[0]) {
253 0           while(my($key, $value) = splice @_, 0, 2) {
254 0           $sub->($key, $value);
255 0 0         if (exists $params{$key}){
256 0 0         my @key_value = ref(${$params{$key}}[0]) eq 'ARRAY' ? @{$params{$key}} : $params{$key};
  0            
  0            
257 0           push @key_value,$value;
258 0           my $new_val = [@key_value];
259 0           $params{$key} = $new_val;
260             }
261             else {
262 0           $params{$key} = $value;
263             }
264             }
265             }
266 0           return \%params;
267             }
268              
269             sub error_msg {
270 0     0 0   local $Carp::CarpLevel = $Carp::CarpLevel + 1;
271 0           Carp::croak "User error: $_[0]";
272             }
273              
274             # HTML subs
275              
276             sub print_table_colspan_header {
277            
278 0     0 0   return sprintf("
%s
279              
280             }
281              
282             sub print_table_row {
283            
284            
285 0     0 0   my $num_cols = $_[0];
286 0           my $HTML = "
287              
288 0           for (my $i=0; $i<$num_cols; $i++) {
289              
290 0 0         $HTML .= sprintf("", ($i==0 ? "e" : "v" ));
291              
292 0           my $row_element = $_[$i+1];
293 0 0 0       if ((not defined ($row_element)) || ($row_element !~ /\S/)) {
294 0           $HTML .= "no value";
295             } else {
296 0           my $elem_esc = $row_element;
297 0           $HTML .= "$elem_esc";
298              
299             }
300              
301 0           $HTML .= "
302              
303             }
304              
305 0           $HTML .= "
306 0           return $HTML;
307            
308             }
309              
310              
311             sub print_table_color_start {
312              
313 0     0 0   return qq~\n~;
314             }
315              
316             sub print_table_color_end {
317              
318 0     0 0   return '
';
319             }
320              
321              
322             sub print_color_box {
323              
324 0     0 0   return qq ~
325            
326            
327            
328            
329            
330              
331            
332            
333            
334            
335            
$_[1]
336            
337            
338             }
339              
340             sub print_table_row_color {
341              
342 0     0 0   my $num_cols = $_[0];
343 0 0         my $HTML = $_[1] ? "
344              
345 0           for (my $i=0; $i<$num_cols; $i++) {
346              
347 0 0         $HTML .= $_[1] ? "" : sprintf("", ($i==0 ? "e" : "v" ));
    0          
348              
349 0           my $row_element = $_[$i+2]; # start at the 2nd element
350 0 0 0       if ((not defined ($row_element)) || ($row_element !~ /\S/)) {
351 0           $HTML .= "no value";
352             } else {
353 0           my $elem_esc = $row_element;
354 0           $HTML .= "$elem_esc";
355              
356             }
357              
358 0           $HTML .= "
359              
360             }
361              
362 0           $HTML .= "
363 0           return $HTML;
364             }
365            
366             sub print_table_start {
367              
368 0     0 0   return "\n";
369              
370             }
371             sub print_table_end {
372              
373 0     0 0   return "

\n";
374              
375             }
376             sub print_box_start {
377              
378 0     0 0   my $HTML = print_table_start();
379 0 0         $HTML .= ($_[0] == 1) ? "
\n" : "
\n";
380 0           return $HTML;
381             }
382              
383              
384             sub print_box_end {
385 0     0 0   my $HTML = "
386 0           $HTML .= print_table_end();
387 0           return $HTML;
388             }
389              
390             sub print_hr {
391 0     0 0   return "
\n";
392              
393             }
394              
395              
396             sub print_table_header {
397              
398 0     0 0   my($num_cols) = $_[0];
399 0           my $HTML = "
400              
401 0           my $i;
402 0           for ($i=0; $i<$num_cols; $i++) {
403 0           my $row_element = $_[$i+1];
404 0 0         $row_element = " " if (!$row_element);
405 0           $HTML .= "$row_element
406             }
407              
408 0           return "$HTML
409             }
410              
411              
412             sub print_section {
413              
414 0     0 0   return "

" . $_[0] . "

\n";
415              
416             }
417              
418            
419              
420             sub print_perl_license {
421              
422 0     0 0   return <<"END_OF_HTML";
423            

424             This program is free software; you can redistribute it and/or modify it under the terms of
425             either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit.
426            

427              
428            

429             This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
430            

431            

432             Complete documentation for Perl, including FAQ lists, should be found on
433             this system using `man perl' or `perldoc perl'. If you have access to the
434 0           Internet, point your browser at @{[ add_link('same', 'http://www.perl.org/')]}, the Perl directory.
435            

436             END_OF_HTML
437              
438             }
439              
440             sub print_license {
441              
442 0     0 0   return join '', print_section("Perl License"),
443             print_box_start(0),
444             print_perl_license(),
445             print_box_end();
446             }
447              
448              
449             sub add_link {
450              
451 0     0 0   my ($type, $value, $link) = @_;
452 0 0         return $value unless $links{'all'};
453            
454 0 0         if ($type eq "cpan") {
    0          
    0          
    0          
455              
456 0 0 0       return $value if $link && $link->[0] =~ /^[0]$/;
457            
458 0 0         if ($link) {
459 0 0 0       if (ref $link->[0] eq 'ARRAY' && ref $link->[1] ne 'ARRAY') {
    0 0        
    0 0        
460 0           foreach (@{$link->[0]}) {
  0            
461 0 0 0       if ($_ eq 'all' or match_string($value,$_)==1) {
462 0           return '[1] eq 'ARRAY'){
469 0           foreach my $lv (@$link) {
470 0 0         if (ref $lv->[0] eq 'ARRAY') {
471 0           foreach(@{$lv->[0]}) {
  0            
472 0 0 0       if ($_ eq 'all' or match_string($value,$_)==1) {
473 0           return '[0])==1) {
481 0           return '[0])==1) {
489 0           return '
499 0           my ($letter) = $value =~ /^(.)/;
500 0           return qq! $value !;
501             }
502             elsif ($type eq "local") {
503 0 0         return $value unless $links{'local'};
504 0           return qq~ $value ~;
505             }
506             elsif ($type eq "same") {
507 0           return qq~ $value ~;
508             }
509             }
510              
511             1;