HTML-Template-Compiled-Plugin-InlineImage

 view release on metacpan or  search on metacpan

lib/HTML/Template/Compiled/Plugin/InlineImage.pm  view on Meta::CPAN

package HTML::Template::Compiled::Plugin::InlineImage;
# $Id: InlineImage.pm,v 1.14 2006/09/14 10:28:35 tinita Exp $
use strict;
use warnings;
use Carp qw(croak carp);
use HTML::Template::Compiled::Expression qw(:expressions);
use HTML::Template::Compiled;
use MIME::Base64;
our $VERSION = '0.03';
HTML::Template::Compiled->register(__PACKAGE__);
our $SIZE_WARNING = 1;


sub register {
    my ($class) = @_;
    my %plugs = (
        escape => {
            # <img <%= gd_object escape="INLINE_IMG"%> alt="blah">
            INLINE_IMG => sub {
                HTML::Template::Compiled::Plugin::InlineImage::inline(
                    type => 'png',
                    image => $_[0],
                );
            },
            INLINE_IMG_PNG => sub {
                HTML::Template::Compiled::Plugin::InlineImage::inline(
                    type => 'png',
                    image => $_[0],
                );
            },
            INLINE_IMG_GIF => sub {
                HTML::Template::Compiled::Plugin::InlineImage::inline(
                    type => 'gif',
                    image => $_[0],
                );
            },
            INLINE_IMG_JPEG => sub {
                HTML::Template::Compiled::Plugin::InlineImage::inline(
                    type => 'jpeg',
                    image => $_[0],
                );
            },
        },
    );
    return \%plugs;
}

sub inline {
    my (%args) = @_;
    my $image = $args{image};
    my $type = $args{type};
    my ($binary, $width, $height);
    unless (ref $image) {
        # we have raw data, try guessing mime type
        require File::MMagic;
        my $mm = File::MMagic->new;
        my $mtype = $mm->checktype_contents($image)
            or croak "Could not determine mime type";
        my ($type_a,$type_b) = split m#/#, $mtype;
        $type = $type_b;
        $binary = $image;
    }
    else {
        ($binary, $width, $height) = ref $image eq 'GD::Image'
            ? gd_to_binary($image,$type)
            : croak "unknown image type " . ref $image;
    }
    my $base64 = encode_base64($binary);
    my $string = "data:image/$type;base64,$base64";
    my $l = length $string;
    if ($l > 1024 && $SIZE_WARNING) {
        carp "Image is too big ($l characters > 1024)";
    }
    my $attributes = qq{src="$string"};
    if (defined $width) { $attributes .= qq{ width="$width"} }
    if (defined $height) { $attributes .= qq{ height="$height"} }
    return $attributes;
}

sub gd_to_binary {
    my $binary;
    if ($_[1] eq 'png') { $binary = $_[0]->png }
    if ($_[1] eq 'gif') { $binary = $_[0]->gif }
    if ($_[1] eq 'jpeg') { $binary = $_[0]->jpeg }
    my ($width,$height) = $_[0]->getBounds();
    return ($binary, $width, $height);
}

1;

__END__

=pod

=head1 NAME

HTML::Template::Compiled::Plugin::InlineImage - Inline-Images with HTML::Template::Compiled

=head1 SYNOPSIS

The Perl code:

    use HTML::Template::Compiled::Plugin::InlineImage;

    my $htc = HTML::Template::Compiled->new(
        plugin => [qw(HTML::Template::Compiled::Plugin::InlineImage)],
        filename => "template.htc",
        tagstyle => [qw(+tt)],
    );
    $htc->param(gd_object => $gd);
    $htc->param(raw_data => $data_from_image_file);
    print $htc->output;

The Template:

    <html>
        <body>
        <img [%= gd_object escape="INLINE_IMG" %] alt="[Rendered GD Image]">
        <img [%= raw_data escape="INLINE_IMG" %] alt="[Rendered Image]">



( run in 2.133 seconds using v1.01-cache-2.11-cpan-71847e10f99 )