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-03-19 04:03 am

[dw-free] suitable ALT text for userpics

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

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

More work on userpic alt text support and LJ::Userpic.

Patch by [personal profile] jadelennox.

Files modified:
  • cgi-bin/LJ/Userpic.pm
  • htdocs/allpics.bml
  • htdocs/allpics.bml.text
--------------------------------------------------------------------------------
diff -r faaadde483ad -r 3941a1599503 cgi-bin/LJ/Userpic.pm
--- a/cgi-bin/LJ/Userpic.pm	Wed Mar 18 19:03:07 2009 +0000
+++ b/cgi-bin/LJ/Userpic.pm	Thu Mar 19 04:03:21 2009 +0000
@@ -4,6 +4,31 @@ use Digest::MD5;
 use Digest::MD5;
 use Class::Autouse qw (LJ::Event::NewUserpic);
 
+##
+## Potential properties of an LJ::Userpic object
+##
+# picid		: (accessors picid, id) unique identifier for the object, generated 
+# userid	: (accessor userid) the userid  associated with the object
+# state		: state
+# comment	: user submitted descriptive comment
+# description	: user submitted description 
+# keywords	: user submitted keywords (all keywords in a single string)
+# dim		: (accessors width, height, dimensions) array:[width][height] 
+# pictime	: pictime
+# flags		: flags
+# md5base64	: md5sum of of the image bitstream to prevent duplication
+# ext		: file extension, corresponding to mime types
+# location	: whether the image is stored in database or mogile
+
+##
+## virtual accessors
+##
+# url		: returns a URL directly to the userpic
+# fullurl	: returns the URL used at upload time, it if exists
+# altext	: description with keyword fallback; keyword-recently-used dependent
+# u, owner	: return the user object indicated by the userid
+
+# legal image types
 my %MimeTypeMap = (
                    'image/gif'  => 'gif',
                    'G'          => 'gif',
@@ -13,12 +38,16 @@ my %MimeTypeMap = (
                    'P'          => 'png',
                    );
 
-my %singletons;  # userid -> picid -> LJ::Userpic
+# all LJ::Userpics in memory
+# userid -> picid -> LJ::Userpic
+my %singletons;  
 
 sub reset_singletons {
     %singletons = ();
 }
 
+# LJ::Userpic constructor. Returns a LJ::Userpic object.
+# Return existing with userid and picid populated, or make new.
 sub instance {
     my ($class, $u, $picid) = @_;
     my $up;
@@ -28,6 +57,7 @@ sub instance {
         return $up if $up = $us->{$picid};
     }
 
+    # otherwise construct a new one with the given picid
     $up = $class->_skeleton($u, $picid);
     $singletons{$u->{userid}}->{$picid} = $up;
     return $up;
@@ -115,24 +145,38 @@ sub absorb_row {
     return $self;
 }
 
-# accessors
+##
+## accessors
+##
 
-sub id {
+# FIXME: id and picid are identical. Eventually "id"
+# should go.
+
+# returns the picture ID associated with the object
+sub picid {
     return $_[0]->{picid};
 }
 
+*id = \&picid;
+
+#  returns the userid associated with the object
 sub userid {
     return $_[0]->{userid};
 }
 
+# FIXME: u and owner are identical in practice, since the method
+# userid returns the userid data element.  Eventually "owner" should
+# go.
+
+# given a userpic with a known userid, return the user object
 sub u {
-    my $self = shift;
-    return LJ::load_userid($self->userid);
+    return LJ::load_userid($_[0]->userid);
 }
 
+*owner = \&u;
+
 sub inactive {
-    my $self = shift;
-    return $self->state eq 'I';
+    return $_[0]->state eq 'I';
 }
 
 sub state {
@@ -169,20 +213,12 @@ sub height {
     return undef unless @dims;
     return $dims[1];
 }
-
-sub picid {
-    my $self = shift;
-    return $self->{picid};
-}
-
 sub pictime {
-    my $self = shift;
-    return $self->{pictime};
+    return $_[0]->{pictime};
 }
 
 sub flags {
-    my $self = shift;
-    return $self->{flags};
+    return $_[0]->{flags};
 }
 
 sub md5base64 {
@@ -226,11 +262,7 @@ sub max_allowed_bytes {
 }
 
 
-sub owner {
-    my $self = shift;
-    return LJ::load_userid($self->{userid});
-}
-
+# Returns the direct link to the uploaded userpic
 sub url {
     my $self = shift;
 
@@ -241,6 +273,10 @@ sub url {
     return "$LJ::USERPIC_ROOT/$self->{picid}/$self->{userid}";
 }
 
+# Returns original URL used if userpic was originally uploaded
+# via a URL.
+# FIXME: Is this ever used? If not, should be deleted. If so,
+# should be renamed to source_url
 sub fullurl {
     my $self = shift;
     return $self->{url} if $self->{url};
@@ -248,23 +284,55 @@ sub fullurl {
     return $self->{url};
 }
 
-# returns an image tag of this image
+# given a userpic and a keyword, return the alt text
+sub alttext {
+    my ( $self, $kw ) = @_;
+
+    # load the alttext.  use description by default, keyword as fallback,
+    # and all keywords as final fallback (should be for default icon only).
+
+    if ($self->description) {
+        return $self->description;
+    } elsif ($kw) {
+        return $kw;
+    } else {
+        return $self->keywords;
+    }
+
+}
+
+# returns an image tag of this userpic
+# optional parameters (which must be explicitly passed) include
+# width and keyword
 sub imgtag {
     my $self = shift;
     my %opts = @_;
 
+    # if the width and keyword have been passed in  as explicit
+    # parameters, set them. Otherwise, take what ever is set in
+    # the userpic
     my $width = $opts{width}+0 || $self->width;
+    my $keyword = $opts{keyword}+0 || $self->keywords;
+
+    # if no description is available for alttext, try to fall
+    # back to the keyword selected by the user (passed as a
+    # parameter to imgtag). Otherwise, use the entire keyword
+    # string from the userpic.
+
+    my $alttext = $self->alttext($keyword);
 
     return '<img src="' . $self->url . '" width="' . $width .
-        '" alt="' . LJ::ehtml(scalar $self->keywords) . '" class="userpic-img" />';
+        '" alt="' . $alttext . '" class="userpic-img" />';
 }
 
+# FIXME: should have alt text, if it should be kept
 sub imgtag_lite {
     my $self = shift;
     return '<img src="' . $self->url . '" width="' . $self->width . '" height="' . $self->height .
         '" class="userpic-img" />';
 }
 
+# FIXME: should have alt text, if it should be kept
 sub imgtag_nosize {
     my $self = shift;
     return '<img src="' . $self->url . '" class="userpic-img" />';
diff -r faaadde483ad -r 3941a1599503 htdocs/allpics.bml
--- a/htdocs/allpics.bml	Wed Mar 18 19:03:07 2009 +0000
+++ b/htdocs/allpics.bml	Thu Mar 19 04:03:21 2009 +0000
@@ -1,5 +1,8 @@
 <?_code
 {
+# This page displays all of the user's userpics along with all user-contributed text
+# FIXME: A lot more of this functionality should be coming from the Userpic.pm class
+
     use strict;
     use vars qw(%GET $title $body $head);
 
@@ -130,6 +133,9 @@
 
     foreach my $pic (@pics) {
 
+        #  load the userpic object for each pic
+        my $userpic = LJ::Userpic->new( $u, $pic->{picid} );
+
         if ($piccount++ == 0) {
             $body .= "<?h1 $ML{'.current'} h1?><?p ";
             if ($can_manage) {
@@ -163,19 +169,19 @@
             $apost = "</a>";
         }
 
-        $body .= "$apre<img src='$LJ::USERPIC_ROOT/$pic->{'picid'}/$u->{'userid'}' ";
-        $body .= "width='$pic->{'width'}' height='$pic->{'height'}' alt='' border='0'/>$apost</td><td class='desc'>";
+        # for each image, we know the picid, get the html imgtag
+        $body .= "$apre" . $userpic->imgtag . $apost . "</td><td class='desc'>";
 
         if ($u->{'defaultpicid'} == $pic->{'picid'}) {
             $body .= "$ML{'.default'}<br />";
         }
 
         if ($view_inactive && $pic->{'state'} eq 'I') {
-            $body .= "<i>[$ML{'userpic.inactive'}]</i>&nbsp;" . LJ::help_icon('userpic_inactive') . "<br />";
+            $body .= "<em>[$ML{'userpic.inactive'}]</em>&nbsp;" . LJ::help_icon('userpic_inactive') . "<br />";
         }
 
         if ($eh_keywords) {
-            $body .= "<b>$ML{'.keywords'}</b> $eh_keywords<br />";
+            $body .= "<strong>$ML{'.keywords'}</strong> $eh_keywords<br />";
         }
 
         # Comments
@@ -188,7 +194,7 @@
                 'mode' => 'deny',
             });
 
-            $body .= "$eh_comments<br />\n";
+            $body .= "<strong>$ML{'.comment'}</strong> $eh_comments<br />\n";
         }
         
         # Descriptions
@@ -201,7 +207,7 @@
                 mode => 'deny',
             });
             
-            $body .= "$eh_descriptions\n";
+            $body .= "<strong>$ML{'.description'}</strong> $eh_descriptions\n";
         }
 
         $body .= "</td>";
diff -r faaadde483ad -r 3941a1599503 htdocs/allpics.bml.text
--- a/htdocs/allpics.bml.text	Wed Mar 18 19:03:07 2009 +0000
+++ b/htdocs/allpics.bml.text	Thu Mar 19 04:03:21 2009 +0000
@@ -10,6 +10,10 @@
 .error.noparam=You need to specify a user parameter.
 
 .keywords=Keywords:
+
+.comment=Comment:
+
+.description=Description:
 
 .nopics.text.other=This user has not uploaded any user pictures.
 
--------------------------------------------------------------------------------

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