- From: Olivier Thereaux <ot@dev.w3.org>
- Date: Wed, 02 Jun 2004 07:49:17 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/perl/modules/W3C/LogValidator/lib/W3C/LogValidator In directory hutz:/tmp/cvs-serv6598 Added Files: CSSValidator.pm Log Message: new CSS validator interface - thanks to Bjoern Hoehrmann's WebService::Validator::CSS::W3C --- NEW FILE: CSSValidator.pm --- # Copyright (c) YYYY the World Wide Web Consortium : # Keio University, # European Research Consortium for Informatics and Mathematics # Massachusetts Institute of Technology. # written by olivier Thereaux <ot@w3.org> for W3C # # $Id: CSSValidator.pm,v 1.1 2004/06/02 07:49:15 ot Exp $ package W3C::LogValidator::CSSValidator; use strict; use warnings; use WebService::Validator::CSS::W3C; require Exporter; our @ISA = qw(Exporter); our %EXPORT_TAGS = ( 'all' => [ qw() ] ); our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); our @EXPORT = qw(); our $VERSION = '0.1'; ########################### # usual package interface # ########################### our $verbose = 1; our %config; sub new { my $self = {}; my $proto = shift; my $class = ref($proto) || $proto; # mandatory vars for the API $self->{URIS} = undef; # internal stuff here # don't change this if (@_) {%config = %{(shift)};} if (exists $config{verbose}) {$verbose = $config{verbose}} if (exists $config{AuthorizedExtensions}) { $self->{AUTH_EXT} = $config{AuthorizedExtensions}; } else { $self->{AUTH_EXT} = ".html .xhtml .phtml .htm .css .svg /"; } bless($self, $class); return $self; } # internal routines sub new_doc{ my $self=shift; $self->{VALID} = undef; $self->{VALID_ERR_NUM} = undef; $self->{VALID_SUCCESS} = undef; } sub auth_ext { my $self=shift; if (@_) { $self->{AUTH_EXT} = shift} return $self->{AUTH_EXT}; } sub valid { my $self = shift; if (@_) { $self->{VALID} = shift } return $self->{VALID}; } sub valid_err_num { my $self = shift; if (@_) { $self->{VALID_ERR_NUM} = shift } return $self->{VALID_ERR_NUM}; } sub valid_success { my $self = shift; if (@_) { $self->{VALID_SUCCESS} = shift } return $self->{VALID_SUCCESS}; } ######################################### # Actual subroutine to check the list of uris # ######################################### sub process_list { my $self = shift; my $max_invalid = undef; if (exists $config{MaxInvalid}) {$max_invalid = $config{MaxInvalid}} print "Now Using the CSS Validation module :\n" if $verbose; use DB_File; my $tmp_file = $config{tmpfile}; my %hits; tie (%hits, 'DB_File', "$tmp_file", O_RDONLY) || die ("Cannot create or open $tmp_file"); my @uris = sort { $hits{$b} <=> $hits{$a} } keys %hits; my $name = ""; if (exists $config{ServerName}) {$name = $config{ServerName}} # do what pleases you! my @trimmed_uris; my @result; my @result_head; push @result_head, "Rank"; push @result_head, "Hits"; push @result_head, "#Error(s)"; push @result_head, "Address"; my $intro="Here are the <census> most popular invalid document(s) that I could find in the logs for $name."; my $outro; foreach my $uri (@uris) { my @authorized_extensions = split(" ", $self->auth_ext); foreach my $ext (@authorized_extensions) { if ($uri=~ /$ext$/ ) { push @trimmed_uris,$uri } } } @uris = @trimmed_uris; my $invalid_census = 0; # number of invalid docs my $last_invalid_position = 0; # latest position at which we found an invalid doc my $total_census = 0; # number of documents checked my $uri = undef; # bulk of validation while ( (@uris) and (($invalid_census < $max_invalid) or (!$max_invalid)) ) # if $max_invalid is 0, process everything { $uri = shift (@uris); my $uri_orig = $uri; $self->new_doc(); $total_census++; print " processing #$total_census $uri..." if ($verbose > 1); my $val = WebService::Validator::CSS::W3C->new; $val->validate(uri => $uri); $self->valid_success($val->success); $self->valid($val->is_valid); my @errors = $val->errors; $self->{VALID_ERR_NUM} = int( @errors ); if (! $self->valid_success) { print " Could not validate!" if ($verbose > 1); } else { if ($self->valid) # success, valid { print "Valid!" if ($verbose > 1); } else # success - not valid -> invalid { printf ("Invalid, %s error(s)!",$self->valid_err_num) if ($verbose > 1);; my @result_tmp; push @result_tmp, $total_census; push @result_tmp, $hits{$uri_orig}; push @result_tmp, $self->valid_err_num; push @result_tmp, $uri_orig; push @result, [@result_tmp]; $invalid_census++; $last_invalid_position = $total_census; } } print "\n" if ($verbose > 1); } print "Done!\n" if $verbose; print "invalid_census $invalid_census \n" if ($verbose > 2 ); if ($invalid_census) # we found invalid docs { if ($invalid_census eq 1) # let's repect grammar here { $intro=~ s/are/is/; $intro=~ s/<census> //; $intro=~ s/document\(s\)/document/; } $intro =~s/<census>/$invalid_census/; my $ratio = 10000*$invalid_census/$total_census; $ratio = int($ratio)/100; if ($last_invalid_position eq $total_census ) # usual case { $outro="Conclusion : I had to check $last_invalid_position document(s) in order to find $invalid_census invalid CSS documents or documents with stylesheets. This means that about $ratio\% of your most popular documents were invalid."; } else # we didn't find as many invalid docs as requested { $outro="Conclusion : You asked for $max_invalid invalid HTML document but I could only find $invalid_census by processing (all the) $total_census document(s) in your logs. This means that about $ratio\% of your most popular documents were invalid."; } } elsif (!$total_census) { $intro="There was nothing to validate in this log."; $outro=""; } else # everything was actually valid! { $intro=~s/<census> //; $outro="I couldn't find any invalid document in this log. Congratulations!"; } untie %hits; # Here is what the module will return. The hash will be sent to # the output module my %returnhash; # the name of the module $returnhash{"name"}="CSSValidator"; #intro $returnhash{"intro"}=$intro; #Headers for the result table @{$returnhash{"thead"}}= @result_head; # data for the results table @{$returnhash{"trows"}}= @result; # #outro $returnhash{"outro"}=$outro; return %returnhash; } package W3C::LogValidator::CSSValidator; 1; __END__ =head1 NAME W3C::LogValidator::CSSValidator - =head1 SYNOPSIS =head1 DESCRIPTION This module is part of the W3C::LogValidator suite, and is used as an interface to the W3C CSS validation service. =head1 AUTHOR Olivier Thereaux <ot@w3.org> =head1 SEE ALSO W3C::LogValidator::LogProcessor, perl(1). Up-to-date complete info at http://www.w3.org/QA/Tools/LogValidator/ =cut
Received on Wednesday, 2 June 2004 03:49:17 UTC