/** * 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; }