App-Basis-ConvertText2
view release on metacpan or search on metacpan
lib/App/Basis/ConvertText2/Plugin/Sparkline.pm view on Meta::CPAN
=head1 NAME
App::Basis::ConvertText2::Plugin::Sparkline
=head1 SYNOPSIS
my $content = "1,2,3,4,5,6,7,8" ;
my $params = {} ;
my $obj = App::Basis::ConvertText2::Plugin::Sparkline->new() ;
my $out = $obj->process( 'sparkline', $content, $params) ;
=head1 DESCRIPTION
Convert a text string of comma separated numbers into a sparkline image PNG
=cut
# ----------------------------------------------------------------------------
package App::Basis::ConvertText2::Plugin::Sparkline;
$App::Basis::ConvertText2::Plugin::Sparkline::VERSION = '0.4';
use 5.10.0;
use strict;
use warnings;
use GD::Sparkline;
use Path::Tiny;
use Capture::Tiny qw(capture);
use Moo;
use App::Basis::ConvertText2::Support;
use namespace::clean;
has handles => (
is => 'ro',
init_arg => undef,
default => sub {[qw{sparkline}]}
);
# -----------------------------------------------------------------------------
my %_colour_schemes = (
orange => { b => 'transparent', a => 'ffcc66', l => 'ff6000' },
blue => { b => 'transparent', a => 'ccffff', l => '3399cc' },
red => { b => 'transparent', a => 'ccaaaa', l => '990000' },
green => { b => 'transparent', a => '99ff99', l => '006600' },
mono => { b => 'ffffff', a => 'ffffff', l => '000000' }
);
# -----------------------------------------------------------------------------
=item color_schemes
return a list of the color schemes available
=cut
sub color_schemes {
my $self = shift;
my @schemes = sort keys %_colour_schemes;
return @schemes;
}
# -----------------------------------------------------------------------------
=item process (sparkline)
create a simple sparkline image, with some nice defaults
parameters
text - comma separated list of integers for the sparkline
filename - filename to save the created sparkline image as
hashref params of
bgcolor - background color in hex (123456) or transparent - optional
line - color or the line, in hex (abcdef) - optional
color - area under the line, in hex (abcdef) - optional
scheme - color scheme, only things in red blue green orange mono are valid - optional
size - size of image, default 80x20, widthxheight - optional
=cut
sub process {
my $self = shift;
my ( $tag, $content, $params, $cachedir ) = @_;
my $scheme = $params->{scheme};
my ( $b, $a, $l ) = ( $params->{bgcolor}, $params->{color}, $params->{line} );
$params->{size} ||= "80x20";
$params->{size} =~ /^\s*(\d+)\s*x\s*(\d+)\s*$/;
my ( $w, $h ) = ( $1, $2 );
if ( !$h ) {
$w = 80;
$h = 20;
}
die "Missing content" if ( !$content );
die "Does not appear to be comma separated integers" if ( $content !~ /^[,\d ]+$/ );
# we can use the cache or process everything ourselves
my $sig = create_sig( $content, $params );
my $filename = cachefile( $cachedir, "$sig.png" );
if ( !-f $filename ) {
$content =~ s/^\n*//gsm; # remove any leading new lines
if ( $content !~ /\n$/sm ) { # make sure we have a trailing new line
$content .= "\n";
}
if ($scheme) {
$scheme = lc $scheme;
if ( !$_colour_schemes{$scheme} ) {
warn "Unknown color scheme $params->{scheme}";
$scheme = ( sort keys %_colour_schemes )[0];
}
$b = $_colour_schemes{ $params->{scheme} }{b}; # background color
$a = $_colour_schemes{ $params->{scheme} }{a}; # area under line color
$l = $_colour_schemes{ $params->{scheme} }{l}; # top line color
}
else {
$b ||= 'transparent';
$a = 'cccccc';
$l = '333333';
}
my $args = { b => $b, a => $a, l => $l, s => $content, w => $w, h => $h };
my $spark = GD::Sparkline->new($args);
if ($spark) {
my $png = $spark->draw();
if ($png) {
path($filename)->spew_raw($png) ;
}
}
}
my $out;
if (-f $filename) {
# create something suitable for the HTML
$out = create_img_src( $filename, $params->{title} );
}
return $out;
}
# ----------------------------------------------------------------------------
1;
__END__
( run in 2.794 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )