Mojolicious-Plugin-AssetPack
view release on metacpan or search on metacpan
lib/Mojolicious/Plugin/AssetPack/Guides/Tutorial.pod
lib/Mojolicious/Plugin/AssetPack/Pipe.pm
lib/Mojolicious/Plugin/AssetPack/Pipe/CoffeeScript.pm
lib/Mojolicious/Plugin/AssetPack/Pipe/Combine.pm
lib/Mojolicious/Plugin/AssetPack/Pipe/Css.pm
lib/Mojolicious/Plugin/AssetPack/Pipe/Favicon.pm
lib/Mojolicious/Plugin/AssetPack/Pipe/Fetch.pm
lib/Mojolicious/Plugin/AssetPack/Pipe/JavaScript.pm
lib/Mojolicious/Plugin/AssetPack/Pipe/Jpeg.pm
lib/Mojolicious/Plugin/AssetPack/Pipe/Less.pm
lib/Mojolicious/Plugin/AssetPack/Pipe/Png.pm
lib/Mojolicious/Plugin/AssetPack/Pipe/require.js
lib/Mojolicious/Plugin/AssetPack/Pipe/riot.js
lib/Mojolicious/Plugin/AssetPack/Pipe/Riotjs.pm
lib/Mojolicious/Plugin/AssetPack/Pipe/RollupJs.pm
lib/Mojolicious/Plugin/AssetPack/Pipe/Sass.pm
lib/Mojolicious/Plugin/AssetPack/Pipe/typescript.js
lib/Mojolicious/Plugin/AssetPack/Pipe/TypeScript.pm
lib/Mojolicious/Plugin/AssetPack/Pipe/Vuejs.pm
lib/Mojolicious/Plugin/AssetPack/Store.pm
lib/Mojolicious/Plugin/AssetPack/Util.pm
lib/Mojolicious/Plugin/AssetPack/Guides/Tutorial.pod view on Meta::CPAN
=item * L<Mojolicious::Plugin::AssetPack::Pipe::Jpeg>
Used to crush "jpeg" image files.
=item * L<Mojolicious::Plugin::AssetPack::Pipe::Less>
Process Less CSS files. Should be loaded before
L<Mojolicious::Plugin::AssetPack::Pipe::Css>.
=item * L<Mojolicious::Plugin::AssetPack::Pipe::Png>
Used to crush "png" image files.
=item * L<Mojolicious::Plugin::AssetPack::Pipe::Riotjs>
Process L<http://riotjs.com/> tag files. Should be loaded before
L<Mojolicious::Plugin::AssetPack::Pipe::JavaScript>.
=item * L<Mojolicious::Plugin::AssetPack::Pipe::Sass>
lib/Mojolicious/Plugin/AssetPack/Pipe/Png.pm view on Meta::CPAN
package Mojolicious::Plugin::AssetPack::Pipe::Png;
use Mojo::Base 'Mojolicious::Plugin::AssetPack::Pipe';
use Mojolicious::Plugin::AssetPack::Util qw(diag DEBUG);
has app => 'pngquant';
has app_args => sub {
my $self = shift;
return [DEBUG ? () : ('-quiet'), qw(-clobber -preserve $input)] if $self->app eq 'optipng';
return [DEBUG ? ('-v') : (), qw(--speed 2 -)] if $self->app eq 'pngquant';
return [];
lib/Mojolicious/Plugin/AssetPack/Pipe/Png.pm view on Meta::CPAN
my $app = $^O eq 'darwin' ? 'brew' : 'apt-get'; # not very nice
die "$class requires https://pngquant.org/ '$app install pngquant'";
}
1;
=encoding utf8
=head1 NAME
Mojolicious::Plugin::AssetPack::Pipe::Png - Crush PNG image files
=head1 SYNOPSIS
=head2 Application
plugin AssetPack => {pipes => ["Png"]};
# Forces the use of "optipng -clobber -preserve $input"
app->asset->pipe("Png")->app("optipng");
# Forces the use of "pngquant --speed 2 -"
app->asset->pipe("Png")->app("pngquant");
# Set custom application arguments:
app->asset->pipe("Png")->app("pngquant")->app_args([qw(--speed 10 --ordered -)]);
=head1 DESCRIPTION
L<Mojolicious::Plugin::AssetPack::Pipe::Png> can be used to crush "png" image
files.
This plugin has default settings for "pngquant" (default) and "optipng". Which
will be the default in the future is unknown, so force the one you want in case
that matters.
This pipe is EXPERIMENTAL. Feedback wanted.
TODO: Detect which application is installed and use the best available.
use lib '.';
use t::Helper;
# This part does not required optipng
my $t = t::Helper->t(pipes => [qw(Png Combine)]);
$t->app->asset->process('test.png' => '/image/sample.png');
$t->get_ok('/')->status_is(200)->element_exists(qq(img[src="/asset/348b799a81/sample.png"]));
$t->get_ok($t->tx->res->dom->at('img')->{src})->status_is(200)->header_is('Content-Type' => 'image/png');
my $len = $t->tx->res->headers->content_length;
diag "original size: $len";
if ($ENV{TEST_PNG}) {
$ENV{MOJO_MODE} = 'production';
for my $app (qw(pngquant optipng)) {
$t = t::Helper->t(pipes => [qw(Png Combine)]);
$t->app->asset->pipe('Png')->app($app);
$t->app->asset->process('test.png' => '/image/sample.png');
$t->get_ok('/')->status_is(200)->element_exists(qq(img[src="/asset/348b799a81/sample.png"]));
$t->get_ok($t->tx->res->dom->at('img')->{src})->status_is(200)->header_is('Content-Type' => 'image/png')
->header_isnt('Content-Length' => $len);
my $len2 = $t->tx->res->headers->content_length;
diag "$app size: $len2";
}
}
done_testing;
( run in 0.607 second using v1.01-cache-2.11-cpan-0a6323c29d9 )