markup-validator commit: Improve error location info to include URI for non-doc resources.

changeset:   3115:237e5cb768d9
tag:         tip
user:        Ville Skyttä <ville.skytta@iki.fi>
date:        Sun Jul 04 11:31:14 2010 +0300
files:       htdocs/whatsnew.html httpd/cgi-bin/check share/templates/en_US/error_loop.tmpl share/templates/en_US/error_loop_grouped.tmpl
description:
Improve error location info to include URI for non-doc resources.

http://www.w3.org/Bugs/Public/show_bug.cgi?id=9933


diff -r 1e4cf1d7ea99 -r 237e5cb768d9 htdocs/whatsnew.html
--- a/htdocs/whatsnew.html	Sun Jul 04 11:11:29 2010 +0300
+++ b/htdocs/whatsnew.html	Sun Jul 04 11:31:14 2010 +0300
@@ -42,6 +42,12 @@
           </li>
           <li>
             Enhancement: improved error output performance.
+          </li>
+          <li>
+            Enhancement: error/warning location information now
+            <a href="http://www.w3.org/Bugs/Public/show_bug.cgi?id=9933">makes
+              it clearer</a> whether the error occurred in the validated
+            document or an external resource related to it.
           </li>
         </ul>
       </dd>
diff -r 1e4cf1d7ea99 -r 237e5cb768d9 httpd/cgi-bin/check
--- a/httpd/cgi-bin/check	Sun Jul 04 11:11:29 2010 +0300
+++ b/httpd/cgi-bin/check	Sun Jul 04 11:31:14 2010 +0300
@@ -1144,7 +1144,9 @@
                     elsif ($attribute->name eq "last-line") {
                         $err->{line} = $attribute->getValue();
                     }
-
+                    elsif ($attribute->name eq "url") {
+                        $err->{uri} = $attribute->getValue();
+                    }
                 }
             }
             my @child_nodes = $message_node->childNodes;
@@ -1291,6 +1293,7 @@
         my $err_obj = $@;
         while ($err_obj) {
             my $err;
+            $err->{uri} = $err_obj->file();
             $err->{src} = '...';    # do this with show_open_entities()?
             $err->{line} = $err_obj->line();
             $err->{char} = $err_obj->column();
@@ -1391,6 +1394,7 @@
 
                 # formatting the error message for output
                 my $err;
+                # TODO: $err->{uri} (need test case)
                 $err->{src} = '...';    # do this with show_open_entities()?
                 $err->{line} = $xmlwf_error_line;
                 $err->{char} = $xmlwf_error_col;
@@ -2327,6 +2331,30 @@
         foreach my $err (@{$File->{Errors}}) {
             my $line;
             my $col = 0;
+
+            # We want errors in the doc that was validated to appear without
+            # $err->{uri}, and non-doc errors with it pointing to the external
+            # entity or the like where the error is.  This usually works as
+            # long as we're passing docs to parsers as strings, but S::P::O
+            # (at least as of 0.994) seems to give us "3" as the FileName in
+            # those cases so we try to filter out everything that doesn't look
+            # like a useful URI.
+            if ($err->{uri}) {
+                if ($err->{uri} !~ m|/|) {
+                    delete $err->{uri};
+                }
+                else {
+                    # Mask local file paths
+                    my $uri = URI->new($err->{uri});
+                    if (!$uri->scheme() || $uri->scheme() eq 'file') {
+                        $err->{uri_is_file} = TRUE;
+                        $err->{uri} = ($uri->path_segments())[-1];
+                    }
+                    else {
+                        $err->{uri} = $uri->canonical();
+                    }
+                }
+            }
 
             # avoid truncating lines that do not exist
             if (defined($err->{line}) && $File->{Content}->[$err->{line} - 1])
@@ -3430,6 +3458,7 @@
         # but not present
         my $err;
         my $location = $self->{_parser}->get_location();
+        $err->{uri} = $location->{FileName};
         $err->{src} = '...';    # do this with show_open_entities()?
         $err->{line} = $location->{LineNumber};
         $err->{char} = $location->{ColumnNumber};
@@ -3451,6 +3480,7 @@
         # whine if root xmlns element is not the one specificed by the spec
         my $err;
         my $location = $self->{_parser}->get_location();
+        $err->{uri} = $location->{FileName};
         $err->{src} = '...';    # do this with show_open_entities()?
         $err->{line} = $location->{LineNumber};
         $err->{char} = $location->{ColumnNumber};
@@ -3479,10 +3509,9 @@
     }
     my $File = $self->{_file};
 
-    # TODO: this does not filter out errors in DTDs.
-
     my $err;
 
+    $err->{uri} = $self->{_parser}->get_location()->{FileName};
     $err->{src} = '...';    # do this with show_open_entities()?
     $err->{line} = $mess->{primary_message}{LineNumber};
     $err->{char} = $mess->{primary_message}{ColumnNumber} + 1;
diff -r 1e4cf1d7ea99 -r 237e5cb768d9 share/templates/en_US/error_loop.tmpl
--- a/share/templates/en_US/error_loop.tmpl	Sun Jul 04 11:11:29 2010 +0300
+++ b/share/templates/en_US/error_loop.tmpl	Sun Jul 04 11:31:14 2010 +0300
@@ -2,7 +2,8 @@
 <TMPL_LOOP NAME="file_errors">
   <li<TMPL_IF NAME="class"> class="<TMPL_VAR NAME="class">"</TMPL_IF>>
     <span class="err_type"><TMPL_IF NAME="err_type_info"><img src="images/info_icons/info.png" alt="Info" title="Info" /></TMPL_IF><TMPL_IF NAME="err_type_warn"><img src="images/info_icons/warning.png" alt="Warning" title="Warning" /></TMPL_IF><TMPL_IF NAME="err_type_err"><img src="images/info_icons/error.png" alt="Error" title="Error" /></TMPL_IF></span>
-    <TMPL_IF NAME="line"><em>Line <TMPL_IF NAME="opt_show_source"><a href="#line-<TMPL_VAR NAME="line" ESCAPE="HTML">"></TMPL_IF><TMPL_VAR NAME="line" ESCAPE="HTML"><TMPL_IF NAME="opt_show_source"></a></TMPL_IF><TMPL_IF NAME="char">,
+    <TMPL_IF NAME="uri">(<TMPL_IF NAME="uri_is_file">Validator local file "<TMPL_VAR NAME="uri" ESCAPE="HTML">"<TMPL_ELSE><a href="<TMPL_VAR NAME="uri" ESCAPE="HTML">"><TMPL_VAR NAME="uri" ESCAPE="HTML"></a></TMPL_IF>)</TMPL_IF>
+    <TMPL_IF NAME="line"><em>Line <TMPL_IF NAME="opt_show_source"><TMPL_UNLESS NAME="uri"><a href="#line-<TMPL_VAR NAME="line" ESCAPE="HTML">"></TMPL_UNLESS></TMPL_IF><TMPL_VAR NAME="line" ESCAPE="HTML"><TMPL_IF NAME="opt_show_source"><TMPL_UNLESS NAME="uri"></a></TMPL_UNLESS></TMPL_IF><TMPL_IF NAME="char">,
         Column <TMPL_VAR NAME="char" ESCAPE="HTML"></TMPL_IF></em>:</TMPL_IF>
     <span class="msg"><TMPL_VAR NAME="msg" ESCAPE="HTML"></span>
     <TMPL_IF NAME="src"><pre><code class="input"><TMPL_VAR NAME="src"></code></pre></TMPL_IF>
diff -r 1e4cf1d7ea99 -r 237e5cb768d9 share/templates/en_US/error_loop_grouped.tmpl
--- a/share/templates/en_US/error_loop_grouped.tmpl	Sun Jul 04 11:11:29 2010 +0300
+++ b/share/templates/en_US/error_loop_grouped.tmpl	Sun Jul 04 11:31:14 2010 +0300
@@ -9,8 +9,9 @@
         <ul>
         <TMPL_LOOP NAME="instances">
                         <li>
-                          <em>Line <TMPL_IF NAME="opt_show_source"><a href="#line-<TMPL_VAR NAME="line" 
-                              ESCAPE="HTML">"></TMPL_IF><TMPL_VAR NAME="line" ESCAPE="HTML"><TMPL_IF NAME="opt_show_source"></a></TMPL_IF>,
+                          <TMPL_IF NAME="uri">(<TMPL_IF NAME="uri_is_file">Validator local file "<TMPL_VAR NAME="uri" ESCAPE="HTML">"<TMPL_ELSE><a href="<TMPL_VAR NAME="uri" ESCAPE="HTML">"><TMPL_VAR NAME="uri" ESCAPE="HTML"></a></TMPL_IF>)</TMPL_IF>
+                          <em>Line <TMPL_IF NAME="opt_show_source"><TMPL_UNLESS NAME="uri"><a href="#line-<TMPL_VAR NAME="line" 
+                              ESCAPE="HTML">"></TMPL_UNLESS></TMPL_IF><TMPL_VAR NAME="line" ESCAPE="HTML"><TMPL_IF NAME="opt_show_source"><TMPL_UNLESS NAME="uri"></a></TMPL_UNLESS></TMPL_IF>,
                               column <TMPL_VAR NAME="char" ESCAPE="HTML"></em>:
                               <span><TMPL_VAR NAME="msg" ESCAPE="HTML"></span> 
                               <TMPL_IF NAME="src"><pre><code class="input"><TMPL_VAR NAME="src"></code></pre></TMPL_IF>

Received on Sunday, 4 July 2010 08:31:28 UTC