File Coverage

blib/lib/File/Assets/Filter/Minifier.pm
Criterion Covered Total %
statement 54 55 98.1
branch 6 8 75.0
condition 1 3 33.3
subroutine 14 14 100.0
pod 0 4 0.0
total 75 84 89.2


line stmt bran cond sub pod time code
1             package File::Assets::Filter::Minifier;
2              
3 9     9   29263 use strict;
  9         24  
  9         1469  
4 9     9   54 use warnings;
  9         19  
  9         442  
5              
6 9     9   63 use base qw/File::Assets::Filter::Collect/;
  9         19  
  9         983  
7 9     9   58 use File::Assets::Carp;
  9         18  
  9         105  
8              
9 9     9   9407 use File::Assets::Filter::Minifier::CSS;
  9         28  
  9         156  
10 9     9   6996 use File::Assets::Filter::Minifier::JavaScript;
  9         29  
  9         123  
11 9     9   7856 use File::Assets::Filter::Minifier::CSS::XS;
  9         29  
  9         114  
12 9     9   7579 use File::Assets::Filter::Minifier::JavaScript::XS;
  9         27  
  9         119  
13              
14             sub signature {
15 15     15 0 101 return "minifier";
16             }
17              
18             sub new {
19 8     8 0 17 my $class = shift;
20 8         61 my $self = $class->SUPER::new(@_);
21              
22 8         57 return $self;
23             }
24              
25             sub build_content {
26 7     7 0 12 my $self = shift;
27              
28 7         25 my $matched = $self->matched;
29 7         27 my $output_asset = $self->output_asset;
30 7         23 my $file = $output_asset->file;
31              
32 7         42 my $input = "";
33 7         18 for my $match (@$matched) {
34 17         34 my $asset = $match->{asset};
35 17         46 $input .= ${ $asset->content };
  17         63  
36             }
37              
38 7         43 my $minifier = $self->minifier;
39 7         10 my $output;
40 7         44 $output = $minifier->($input);
41              
42 7 50       15870 $file->parent->mkpath unless -d $file->parent;
43 7         390 $file->openw->print("$output\n");
44              
45 7         2385 return undef; # We already put the content in the asset file, so we return undef here.
46             }
47              
48             sub minifier {
49 7     7 0 16 my $self = shift;
50 7   33     23 return $self->stash->{minifier} ||= do { # Only kept around in the stash
51 7         9 my $minifier;
52 7 100       86 if ($minifier = $self->can(qw/minify/)) {
53             }
54             else {
55 6         17 my $kind = $self->kind;
56 6 100       41 if ($kind->extension eq "css") {
    50          
57 3         35 $minifier = $self->_css_minifier;
58             }
59             elsif ($kind->extension eq "js") {
60 3         38 $minifier = $self->_js_minifier;
61             }
62             else {
63 0         0 croak "Don't know how to minify for type ", $kind->type->type, " (", $kind->kind, ")";
64             }
65             }
66 7         35 $minifier;
67             };
68             }
69              
70             sub _css_minifier {
71 1     1   3 return \&File::Assets::Filter::Minifier::CSS::minify;
72             }
73              
74             sub _js_minifier {
75 1     1   5 return \&File::Assets::Filter::Minifier::JavaScript::minify;
76             }
77              
78             1;
79              
80             __END__
81             use File::Temp;
82             my $tmp_io = File::Temp->new;
83             for my $match (@$matched) {
84             my $asset = $match->{asset};
85             my $asset_io = $asset->file->openr or die $!;
86             $tmp_io->print($_) while <$asset_io>;
87             $tmp_io->print("\n");
88             close $asset_io or warn $!;
89             }
90             $tmp_io->flush;
91              
92             my $file_io = $file->openw or die $!;
93             seek $tmp_io, 0, 0;
94              
95             my $minifier = $self->minifier;
96             my $output $minifier->($tmp_io, $file_io);