mark: A photo of Mark kneeling on top of the Taal Volcano in the Philippines. It was a long hike. (Default)
Mark Smith ([staff profile] mark) wrote in [site community profile] changelog2009-04-06 05:16 am

[dw-free] LJ chokes on user tags in our feeds

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

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

Don't set the class on outgoing ljuser HTML. This is to work around a
presentation bug on LJ sites as well as to preserve our variable site tags.

Patch by [personal profile] afuna.

Files modified:
  • cgi-bin/DW/External/User.pm
  • cgi-bin/LJ/User.pm
  • cgi-bin/cleanhtml.pl
  • cgi-bin/ljfeed.pl
--------------------------------------------------------------------------------
diff -r 87229f3e4dff -r 223133988313 cgi-bin/DW/External/User.pm
--- a/cgi-bin/DW/External/User.pm	Mon Apr 06 05:13:35 2009 +0000
+++ b/cgi-bin/DW/External/User.pm	Mon Apr 06 05:16:34 2009 +0000
@@ -59,14 +59,15 @@ sub site {
 
 # return the ljuser_display block
 sub ljuser_display {
-    my $self = $_[0];
+    my ( $self, %opts ) = @_;
 
     my $user = $self->user;
     my $profile_url = $self->site->profile_url( $self );
     my $journal_url = $self->site->journal_url( $self );
     my $badge_image_url = $self->site->badge_image_url( $self );
+    my $display_class = $opts{no_ljuser_class} ? "" : "class='ljuser'";
 
-    return "<span class='ljuser' lj:user='$user' style='white-space: nowrap;'><a href='$profile_url'>" .
+    return "<span $display_class lj:user='$user' style='white-space: nowrap;'><a href='$profile_url'>" .
            "<img src='$badge_image_url' alt='[info]' style='vertical-align: bottom; border: 0; padding-right: 1px;' />" .
            "</a><a href='$journal_url'><b>$user</b></a></span>";
 }
diff -r 87229f3e4dff -r 223133988313 cgi-bin/LJ/User.pm
--- a/cgi-bin/LJ/User.pm	Mon Apr 06 05:13:35 2009 +0000
+++ b/cgi-bin/LJ/User.pm	Mon Apr 06 05:16:34 2009 +0000
@@ -2256,6 +2256,7 @@ sub ljuser_display {
     my $strike = $opts->{'del'} ? ' text-decoration: line-through;' : '';
     my $profile_url = $opts->{'profile_url'} || '';
     my $journal_url = $opts->{'journal_url'} || '';
+    my $display_class = $opts->{no_ljuser_class} ? "" : "class='ljuser'";
 
     my ($url, $name);
 
@@ -2287,7 +2288,7 @@ sub ljuser_display {
 
         my $profile = $profile_url ne '' ? $profile_url : "$LJ::SITEROOT/userinfo.bml?userid=$u->{userid}&amp;t=I$andfull";
 
-        return "<span class='ljuser' lj:user='$name' style='white-space: nowrap;$strike'><a href='$profile'><img src='$imgurl' alt='[info]' width='$width' height='$height' style='vertical-align: bottom; border: 0; padding-right: 1px;' /></a><a href='$url' rel='nofollow'><b>$name</b></a></span>";
+        return "<span $display_class lj:user='$name' style='white-space: nowrap;$strike'><a href='$profile'><img src='$imgurl' alt='[info]' width='$width' height='$height' style='vertical-align: bottom; border: 0; padding-right: 1px;' /></a><a href='$url' rel='nofollow'><b>$name</b></a></span>";
 
     } else {
         return "<b>????</b>";
@@ -6587,13 +6588,13 @@ sub get_timezone {
 # </LJFUNC>
 sub ljuser
 {
-    my $user = shift;
-    my $opts = shift;
+    my ( $user, $opts ) = @_;
 
     my $andfull = $opts->{'full'} ? "?mode=full" : "";
     my $img = $opts->{'imgroot'} || $LJ::IMGPREFIX;
     my $profile_url = $opts->{'profile_url'} || '';
     my $journal_url = $opts->{'journal_url'} || '';
+    my $display_class = $opts->{no_ljuser_class} ? "" : "class='ljuser'";
     my $profile;
 
     my $make_tag = sub {
@@ -6614,7 +6615,7 @@ sub ljuser
         $profile = $profile_url ne '' ? $profile_url : $profile . $andfull;
         $url = $journal_url ne '' ? $journal_url : $url;
 
-        return "<span class='ljuser' lj:user='$user' style='white-space: nowrap;$strike'><a href='$profile'><img src='$img/$fil' alt='[info]' width='$x' height='$y' style='vertical-align: bottom; border: 0; padding-right: 1px;' /></a><a href='$url'$link_color>$ljusername</a></span>";
+        return "<span $display_class lj:user='$user' style='white-space: nowrap;$strike'><a href='$profile'><img src='$img/$fil' alt='[info]' width='$x' height='$y' style='vertical-align: bottom; border: 0; padding-right: 1px;' /></a><a href='$url'$link_color>$ljusername</a></span>";
     };
 
     my $u = isu($user) ? $user : LJ::load_user($user);
diff -r 87229f3e4dff -r 223133988313 cgi-bin/cleanhtml.pl
--- a/cgi-bin/cleanhtml.pl	Mon Apr 06 05:13:35 2009 +0000
+++ b/cgi-bin/cleanhtml.pl	Mon Apr 06 05:16:34 2009 +0000
@@ -63,6 +63,7 @@ package LJ::CleanHTML;
 #        'transform_embed_wmode' => <value>, # define a wmode value for videos (usually 'transparent' is the value you want)
 #        'blocked_links' => [ qr/evil\.com/, qw/spammer\.com/ ], # list of sites which URL's will be blocked
 #        'blocked_link_substitute' => 'http://domain.com/error.html' # blocked links will be replaced by this URL
+#        'to_external_site' => 0, # flag for when the content is going to be fed to external sites, so it can be special-cased. e.g., feeds
 #     });
 
 sub helper_preload
@@ -143,6 +144,7 @@ sub clean
         ($LJ::BLOCKED_LINK_SUBSTITUTE) ? $LJ::BLOCKED_LINK_SUBSTITUTE : '#';
     my $suspend_msg = $opts->{'suspend_msg'} || 0;
     my $unsuspend_supportid = $opts->{'unsuspend_supportid'} || 0;
+    my $to_external_site = $opts->{to_external_site} || 0;
 
     my @canonical_urls; # extracted links
     my %action = ();
@@ -497,7 +499,7 @@ sub clean
                             # FIXME: need a textonly way of identifying users better?  "user@LJ"?
                             $newdata .= $user;
                         } else {
-                            $newdata .= $ext_u->ljuser_display;
+                            $newdata .= $ext_u->ljuser_display( no_ljuser_class => $to_external_site );
                         }
 
                     # if we hit the else, then we know that this user doesn't appear
@@ -516,7 +518,7 @@ sub clean
                         if ($opts->{'textonly'}) {
                             $newdata .= $user;
                         } else {
-                            $newdata .= LJ::ljuser($user);
+                            $newdata .= LJ::ljuser( $user, { no_ljuser_class => $to_external_site } );
                         }
                     } else {
                         $orig_user = LJ::no_utf8_flag($orig_user);
@@ -852,7 +854,12 @@ sub clean
             if ( $eating_ljuser_span ) {
                 if ( $tag eq "span" ) {
                     $eating_ljuser_span = 0;
-                    $newdata .= $opts->{'textonly'} ? $ljuser_text_node : LJ::ljuser($ljuser_text_node);
+                    
+                    if ( $opts->{textonly} ) {
+                        $newdata .= $ljuser_text_node;
+                    } else {
+                        $newdata .= LJ::ljuser( $ljuser_text_node, { no_ljuser_class => $to_external_site } );
+                    }
                 }
 
                 next TOKEN;
@@ -1325,6 +1332,7 @@ sub clean_event
         'transform_embed_wmode' => $opts->{'transform_embed_wmode'},
         'suspend_msg' => $opts->{'suspend_msg'} ? 1 : 0,
         'unsuspend_supportid' => $opts->{'unsuspend_supportid'},
+        to_external_site => $opts->{to_external_site} ? 1 : 0,
     });
 }
 
diff -r 87229f3e4dff -r 223133988313 cgi-bin/ljfeed.pl
--- a/cgi-bin/ljfeed.pl	Mon Apr 06 05:13:35 2009 +0000
+++ b/cgi-bin/ljfeed.pl	Mon Apr 06 05:16:34 2009 +0000
@@ -208,8 +208,12 @@ sub make_feed
             }
 
             LJ::CleanHTML::clean_event(\$event,
-                                       { 'wordlength' => 0, 'preformatted' => $logprops{$itemid}->{'opt_preformatted'}, 'cuturl' => $u->{'opt_synlevel'} eq 'ljcut' ? "$journalinfo->{link}$ditemid.html" : "" });
-
+                                       { 
+                                        wordlength => 0, 
+                                        preformatted => $logprops{$itemid}->{opt_preformatted}, 
+                                        cuturl => $u->{opt_synlevel} eq 'ljcut' ? "$journalinfo->{link}$ditemid.html" : "", 
+                                        to_external_site => 1,
+                                       });
             # do this after clean so we don't have to about know whether or not
             # the event is preformatted
             if ($u->{'opt_synlevel'} eq 'summary') {
--------------------------------------------------------------------------------

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

If you are unable to use this captcha for any reason, please contact us by email at support@dreamwidth.org