Mojolicious-Plugin-AssetPack

 view release on metacpan or  search on metacpan

MANIFEST  view on Meta::CPAN

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.

t/png.t  view on Meta::CPAN

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 )