- From: Olivier Thereaux via cvs-syncmail <cvsmail@w3.org>
- Date: Fri, 13 Feb 2009 21:04:17 +0000
- To: www-validator-cvs@w3.org
Update of /sources/public/validator/httpd/cgi-bin
In directory hutz:/tmp/cvs-serv5853/httpd/cgi-bin
Modified Files:
check
Log Message:
using fuzzy matching to suggest replacement in case of unknown/ill-cased element or attribute - http://www.w3.org/Bugs/Public/show_bug.cgi?id=4412. Requires String::Approx perl library for Levenshtein edit distance matching/computing.
Index: check
===================================================================
RCS file: /sources/public/validator/httpd/cgi-bin/check,v
retrieving revision 1.646
retrieving revision 1.647
diff -u -d -r1.646 -r1.647
--- check 10 Feb 2009 13:53:01 -0000 1.646
+++ check 13 Feb 2009 21:04:15 -0000 1.647
@@ -15,7 +15,6 @@
# http://www.w3.org/Consortium/Legal/copyright-software
#
# $Id$
-
#
# Disable buffering on STDOUT!
$| = 1;
@@ -63,6 +62,7 @@
use URI qw();
use URI::Escape qw(uri_escape);
use XML::LibXML qw();
+use String::Approx qw(amatch adist adistr);
###############################################################################
#### Constant definitions. ####################################################
@@ -2992,6 +2992,38 @@
# in that case the error message will be #344
}
+ if ( ($err->{num} eq '108') or ($err->{num} eq '76') )
+ # element or attribute does not exist? Let's try and fuzzy-match it
+ {
+ my $bogus_elt_attr = $err->{msg};
+ $bogus_elt_attr =~ s/.*"(.+)".*/$1/;
+
+ if (
+ ((exists $self->{CFG}->{Attributes}->{lc($bogus_elt_attr)}) and ($err->{num} eq '108'))
+ or
+ ((exists $self->{CFG}->{Elements}->{lc($bogus_elt_attr)}) and ($err->{num} eq '76'))
+ )
+ {
+ $err->{msg} .= '. Maybe you meant "'.lc($bogus_elt_attr).'"?';
+ }
+ else {
+ my @matches;
+ @matches = String::Approx::amatch($bogus_elt_attr, ["3i"], keys %{$self->{CFG}->{Attributes}});
+ if (@matches){
+ my %distances;
+ @distances{@matches} = map { abs } String::Approx::adistr(lc($bogus_elt_attr), @matches);
+ my @matches_sorted = sort { $distances{$a} <=> $distances{$b} } @matches;
+ if (@matches > 1){
+ $err->{msg} .= '. Maybe you meant "'.$matches_sorted[0].'" or "'.$matches_sorted[1].'"?';
+
+ }
+ else {
+ $err->{msg} .= '. Maybe you meant "'.$matches_sorted[0].'"?';
+ }
+ }
+ }
+ }
+
if (($err->{num} eq '113') and ($err->{msg} =~ /xml:space/)) {
# FIXME
# this is a problem with some of the "flattened" W3C DTDs, filtering them out to not confuse users.
Received on Friday, 13 February 2009 21:04:26 UTC