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.3 KiB

1 year ago
package HexGrid::Image;
use v5.30;
use Moo;
use MooX::Aliases;
1 year ago
use LWP::UserAgent;
use MIME::Base64;
1 year ago
use feature "signatures";
no warnings "experimental::signatures";
1 year ago
my $DEBUG = 0;
my $USER_AGENT;
1 year ago
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);
1 year ago
has _cached_data => (is => 'rw', default => undef);
1 year ago
sub render($this, $container)
{
1 year ago
say STDERR $this->{_cached_data} if $DEBUG;
1 year ago
my $image_element = $container->image(id => $this->{id});
1 year ago
my $href = $this->{source};
if ($this->{fetch})
{
$href = $this->{_cached_data} // $this->_fetch_base64;
1 year ago
}
$image_element->{href} = $href;
$image_element->{width} = $this->{width};
$image_element->{height} = $this->{height};
1 year ago
return $image_element;
}
1 year ago
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);
1 year ago
$this->{_cached_data} = "data:$content_type;base64, $encoded_content";
return $this->{_cached_data};
1 year ago
}
sub DEBUG { $DEBUG = 1; }
1 year ago
1;