package Module::CPANTS::Generator::Pod; use strict; use Clone qw(clone); use File::Find::Rule; use Module::CPANTS::Generator; use Pod::Simple::Checker; use Pod::Simple::TextContent; use base 'Module::CPANTS::Generator'; sub generate { my $self = shift; my $cpants = $self->grab_cpants; foreach my $dist (sort grep { -d } <*>) { next if $dist =~ /^\./; if (not exists $cpants->{$dist}->{lines}) { print "* $dist\n"; my ($lines, $pod, $with_comments, $pod_errors) = (0, 0, 0, 0); for my $file (find( file => name => '*.{pod,pm}', in => $dist )) { # Count the number of POD errors my $parser = Pod::Simple::Checker->new; my $errata; $parser->output_string(\$errata); $parser->parse_file($file); my $errors = () = $errata =~ /Around line /g; $pod_errors += $errors; # Count the number of lines of POD $parser = Pod::Simple::TextContent->new; my $podtext; $parser->output_string(\$podtext); $parser->parse_file($file); $pod += (split /\n/, $podtext); # Count comments & total lines of code open my $fh, "$file" or next; # worlds stupidest pod parser - incorrect but quick my $inpod = 0; while (<$fh>) { s/\r$//g; /^=/ and $inpod = 1; /^=cut$/ and $inpod = 0; # $pod++ if $inpod; $with_comments++ if (not $inpod) && /#/ && (not /(\b([ysmq]|q[qrxw]|tr))#/); $lines++; } } $cpants->{$dist}{lines} = { total => $lines, with_comments => $with_comments, pod => $pod, pod_errors => $pod_errors, nonpod => $lines - $pod, }; print " $pod_errors pod errors\n" if $pod_errors; } $cpants->{cpants}->{$dist}->{lines} = clone($cpants->{$dist}->{lines}); } $self->save_cpants($cpants); } 1;