You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
wiki-map/HexGrid/Image.pm

53 lines
1.4 KiB

package HexGrid::Image;
use v5.30;
use Moo;
use MooX::Aliases;
use LWP::UserAgent;
use MIME::Base64;
use feature "signatures";
no warnings "experimental::signatures";
my $DEBUG = 0;
my $USER_AGENT;
has source => (is => 'rw', required => 1, alias => [qw(src url source_url)]);
has fetch => (is => 'rw', default => 0);
has id => (is => 'rw', required => 1);
has width => (is => 'rw', required => 1);
has height => (is => 'rw', required => 1);
has _cached_data => (is => 'rw', default => undef);
sub render($this, $container)
{
say STDERR $this->{_cached_data} if $DEBUG;
my $image_element = $container->image(id => $this->{id});
my $href = $this->{source};
if ($this->{fetch})
{
$this->_fetch_base64 unless defined($this->{_cached_data});
$href = $this->{_cached_data};
}
$image_element->{href} = $href;
$image_element->{width} = $this->{width} if defined($this->{width});
$image_element->{height} = $this->{height} if defined($this->{height});
return $image_element;
}
sub _fetch_base64($this)
{
$USER_AGENT // ($USER_AGENT = LWP::UserAgent->new(timeout => 10));
say STDERR "Fetching $this->{source}";
my $response = $USER_AGENT->get($this->{source});
my $content_type = $response->headers->content_type;
my $encoded_content = encode_base64($response->content);
$this->{_cached_data} = "data:$content_type;base64, $encoded_content";
return $this->{_cached_data};
}
sub DEBUG { $DEBUG = 1; }
1;