package File::Assets::Filter::Concat;
use strict;
use warnings;
use base qw/File::Assets::Filter::Collect/;
sub signature {
return "concat";
}
sub build_content {
my $self = shift;
my $matched = $self->matched;
my $content = "";
for my $match (@$matched) {
$content .= ${ $match->{asset}->content };
}
return \$content;
}
1;
__END__
use Digest;
use base qw/File::Assets::Filter/;
sub post_process {
my $self = shift;
my $assets = shift;
my $matched = shift;
return unless @$matched;
return if 1 == @$matched;
my $top_match = $matched->[0];
my $top_asset = $top_match->{asset};
for my $match (reverse @$matched) {
my $rank = $match->{rank};
splice @$assets, $rank, 1, ();
}
my $content = "";
for my $match (@$matched) {
$content .= ${ $match->{asset}->content };
}
my $type = $top_asset->type;
my $path;
if ($self->package) {
$path = $self->package->path;
}
if (! defined $path) {
my $digest = Digest->new("MD5");
$digest->add($content);
$path = $digest->hexdigest;
}
$path .= "." . ($type->extensions)[0] if $path =~ m/(?:^|\/)[^\.]+/;
my $asset = File::Assets->_parse_asset_by_path(
path => $path,
type => $type,
base => $top_asset->resource->base,
);
my $file = $asset->file;
my $dir = $file->parent;
$dir->mkpath unless -d $dir;
$file->openw->print($content);
splice @$assets, $top_match->{rank}, 0, $asset;
}
1;