kareila: (Default)
kareila ([personal profile] kareila) wrote in [site community profile] changelog2009-09-17 07:22 pm

[dw-free] Warning for Bad Markup

[commit: http://hg.dwscoalition.org/dw-free/rev/a4902f1ac6c8]

http://bugs.dwscoalition.org/show_bug.cgi?id=1579

Hide bad markup errors behind cut text on reading lists.

Patch by [personal profile] afuna.

Files modified:
  • cgi-bin/cleanhtml.pl
--------------------------------------------------------------------------------
diff -r 61ed759bef12 -r a4902f1ac6c8 cgi-bin/cleanhtml.pl
--- a/cgi-bin/cleanhtml.pl	Thu Sep 17 12:00:46 2009 -0500
+++ b/cgi-bin/cleanhtml.pl	Thu Sep 17 14:22:20 2009 -0500
@@ -193,14 +193,22 @@ sub clean
     # till after $good_until bytes into the text).
     my $extra_text;
     my $total_fail = sub {
-        my $tag = LJ::ehtml(@_);
+        my ( $cuturl, $tag ) = @_;
+        $tag = LJ::ehtml( $tag );
 
         my $edata = LJ::ehtml($$data);
         $edata =~ s/\r?\n/<br \/>/g if $addbreaks;
 
-        $extra_text = "<div class='ljparseerror'>[<b>Error:</b> Irreparable invalid markup ('&lt;$tag&gt;') in entry.  ".
+        if ( $cuturl ) {
+            $extra_text = "<b>&nbsp;(<a href=\"" . LJ::ehtml( $cuturl ) . "\">Error: Irreparable invalid markup in entry. Raw contents behind the cut.</a>&nbsp;)</b>";
+        }
+        else {
+            $extra_text = "[<b>Error:</b> Irreparable invalid markup ('&lt;$tag&gt;') in entry.  ".
                       "Owner must fix manually.  Raw contents below.]<br /><br />" .
-                      '<div style="width: 95%; overflow: auto">' . $edata . '</div></div>';
+                      '<div style="width: 95%; overflow: auto">' . $edata . '</div>';
+        }
+
+        $extra_text = "<div class='ljparseerror'>$extra_text</div>";
     };
 
     my $htmlcleaner = HTMLCleaner->new(valid_stylesheet => \&LJ::valid_stylesheet_url);
@@ -357,7 +365,7 @@ sub clean
             $slashclose = 1 if ($tag =~ s!/$!!);
 
             unless ($tag =~ /^\w([\w\-:_]*\w)?$/) {
-                $total_fail->($tag);
+                $total_fail->($cut, $tag);
                 last TOKEN;
             }
 
@@ -569,13 +577,13 @@ sub clean
                         # is returned by HTML::Parser as P_tag("='" => "='") Text( onmouseover...)
                         # which leads to reconstruction of valid HTML.  Clever!
                         # detect this, and fail.
-                        $total_fail->("$tag $attr");
+                        $total_fail->($cut, "$tag $attr");
                         last TOKEN;
                     }
 
                     # ignore attributes that do not fit this strict scheme
                     unless ($attr =~ /^[\w_:-]+$/) {
-                        $total_fail->("$tag " . (%$hash > 1 ? "[...] " : "") . "$attr");
+                        $total_fail->($cut, "$tag " . (%$hash > 1 ? "[...] " : "") . "$attr");
                         last TOKEN;
                     }
 
--------------------------------------------------------------------------------