package Template::Plugin::Gravatar;
use base "Template::Plugin";
our $VERSION = "0.05";
use strict;
use Carp;
use Digest::MD5 ();
use URI::Escape ();
my $Gravatar_Base = "http://www.gravatar.com/avatar.php";
sub new {
my ( $class, $context, $instance_args ) = @_;
$instance_args ||= {}; # the USE'd object
my $config = $context->{CONFIG}{GRAVATAR} || {}; # from tt config
my %args;
$args{default} = $instance_args->{default} || $config->{default};
$args{rating} = $instance_args->{rating} || $config->{rating};
$args{border} = $instance_args->{border} || $config->{border};
$args{size} = $instance_args->{size} || $config->{size};
# overriding the base might be nice for some developers
$args{base} = $instance_args->{base} || $config->{base} ||
$Gravatar_Base;
return sub {
my $args = shift || {};
$args = {
%args,
%{$args}
};
$args->{email} || croak "Cannot generate a Gravatar URI without an email address";
if ( $args->{size} ) {
$args->{size} >= 1 and $args->{size} <= 80
or croak "Gravatar size must be 1 .. 80";
}
if ( $args->{rating} ) {
$args->{rating} =~ /\A(?:G|PG|R|X)\Z/
or croak "Gravatar rating can only be G, PG, R, or X";
}
if ( $args->{border} ) {
$args->{border} =~ /\A[0-9A-F]{3}(?:[0-9A-F]{3})?\Z/
or croak "Border must be a 3 or 6 digit hex number in caps";
}
$args->{gravatar_id} = Digest::MD5::md5_hex( $args->{email} );
$args->{default} = URI::Escape::uri_escape($args->{default})
if $args->{default};
my @pairs;
for my $key ( qw( gravatar_id rating size default border ) ) {
next unless $args->{$key};
push @pairs, join("=", $key, $args->{$key});
}
my $uri = join("?",
$args->{base},
join("&",
@pairs
)
);
return $uri;
}
}
1;
__END__
=head1 NAME
Template::Plugin::Gravatar - configurable TT2-based generation of Gravatar URLs from email addresses.
=head1 VERSION
0.05
=head1 SYNOPSIS
[% USE Gravatar %]
[% FOR user IN user_list %]
[% END %]
# OR a mini CGI example
use strict;
use CGI qw( header start_html end_html );
use Template;
my %config = ( # ... your other config stuff
GRAVATAR => { default => "http://myhost.moo/local/image.png",
size => 80,
rating => "R" },
);
# note the "default" must be an absolute URI to work correctly
my $tt2 = Template->new(\%config);
my $user = { email => 'whatever@wherever.whichever',
rating => "PG",
name => "Manamana",
size => 75 };
print header(), start_html();
$tt2->process(\*DATA, { user => $user })
or warn $Template::ERROR;
print end_html();
__DATA__
[% USE Gravatar %]
[% FILTER html %]
[% END %]
=head1 DESCRIPTION
Please see L for more on the
service interface and L for information
about Gravatars (globally recognized avatars) in general.
All of the options supported in Gravatars--default, rating, size, and
border--can be used here. The gravatar_id is generated from a given
email.
=head1 INTERFACE/SETTINGS
=head2 new
Not called directly. Called when you C