/**
* minify each file in a collection
* @param $collection
* @return mixed
*/
public function minify($collection)
{
$web = \Web::instance();
// check final path
$public_path = $this->f3->get('ASSETS.minify.public_path');
if (!is_dir($public_path)) {
mkdir($public_path, 0777, true);
}
$type = false;
$inline_stack = array();
foreach ($collection as $i => &$asset) {
$type = $asset['type'];
if ($asset['origin'] == 'inline') {
$slot = $asset['slot'] ?: 'default';
$inline_stack[$slot][] = $asset['data'];
unset($collection[$i]);
unset($asset);
continue;
}
$path = $asset['path'];
$exclude = $this->f3->get('ASSETS.minify.exclude');
// skip external files
if ($asset['origin'] == 'external') {
continue;
} elseif (is_file($path) && ((!isset($asset['exclude']) || !in_array('minify', $this->f3->split($asset['exclude']))) && (empty($exclude) || !preg_match('/' . $exclude . '/i', $path)))) {
// proceed
$path_parts = pathinfo($path);
$filename = $path_parts['filename'] . '.min.' . $type;
if (!is_file($public_path . $filename) || filemtime($path) > filemtime($public_path . $filename)) {
$min = $web->minify($path_parts['basename'], null, false, $path_parts['dirname'] . '/');
if ($type == 'css') {
$min = $this->fixRelativePaths($min, $path_parts['dirname'] . '/');
}
$this->f3->write($public_path . $filename, $min);
}
$asset['path'] = $public_path . $filename;
}
unset($asset);
}
if (!empty($inline_stack)) {
foreach ($inline_stack as $slotGroup => $inlineData) {
$data = implode($inlineData);
if ($this->f3->get('ASSETS.minify.inline')) {
// this is probably pretty slow
$hash = $this->f3->hash($data);
$filename = $hash . '.min.' . $type;
if (!is_file($public_path . $filename)) {
$this->f3->write($public_path . $filename, $data);
$min = $web->minify($filename, null, false, $public_path);
$this->f3->write($public_path . $filename, $min);
}
$collection[] = array('path' => $public_path . $filename, 'type' => $type, 'origin' => 'internal', 'slot' => $slotGroup);
} else {
$collection[] = array('data' => $data, 'type' => $type, 'origin' => 'inline', 'slot' => $slotGroup);
}
}
}
return $collection;
}