. * --------------------------------------------------------------------- */ require '/usr/share/php/natxet/CssMin/autoload.php'; require '/usr/share/php/Patchwork/autoload-jsqueeze.php'; class Task { private function taskMinifyCSS($srce, $dest) { $l = strlen(dirname(__DIR__))+1; $in = file_get_contents($srce); $out = \CssMin::minify($in); if ($out && strlen($out) < strlen($in)) { file_put_contents($dest, $out); printf("+ minify from %-40s to %-40s: %2d%% of %6d\n", substr($srce, $l), substr($dest, $l), round(strlen($out)*100/strlen($in)), strlen($in)); } else { printf("- minify from %40s to %40s: skipped", substr($srce, $l), substr($dest, $l)); } } private function taskMinifyJS($srce, $dest) { $l = strlen(dirname(__DIR__))+1; $in = file_get_contents($srce); $jsqueeze = new \Patchwork\JSqueeze(); $out = $jsqueeze->squeeze($in); if ($out && strlen($out) < strlen($in)) { file_put_contents($dest, $out); printf("+ minify from %-40s to %-40s: %2d%% of %6d\n", substr($srce, $l), substr($dest, $l), round(strlen($out)*100/strlen($in)), strlen($in)); } else { printf("- minify from %40s to %40s: skipped", substr($srce, $l), substr($dest, $l)); } } /** * Minify CSS stylesheets * * @param string $css_dir path of CSS files * * @return this */ public function minifyCSS($css_dir) { if (is_dir($css_dir)) { $it = new RegexIterator( new RecursiveIteratorIterator( new RecursiveDirectoryIterator($css_dir) ), "/\\.css\$/i" ); foreach ($it as $css_file) { if (!$this->endsWith($css_file->getFilename(), 'min.css')) { $this->taskMinifyCSS($css_file->getRealpath(), str_replace('.css', '.min.css', $css_file->getRealpath())); } } } return $this; } /** * Minify JavaScript files stylesheets * * @param string $js_dir path of CSS files * * @return this */ public function minifyJS($js_dir) { if (is_dir($js_dir)) { $it = new RegexIterator( new RecursiveIteratorIterator( new RecursiveDirectoryIterator($js_dir) ), "/\\.js\$/i" ); foreach ($it as $js_file) { if (!$this->endsWith($js_file->getFilename(), 'min.js')) { $this->taskMinifyJS($js_file->getRealpath(), str_replace('.js', '.min.js', $js_file->getRealpath())); } } } return $this; } /** * Checks if a string ends with another string * * @param string $haystack Full string * @param string $needle Ends string * * @return boolean * @see http://stackoverflow.com/a/834355 */ private function endsWith($haystack, $needle) { $length = strlen($needle); if ($length == 0) { return true; } return (substr($haystack, -$length) === $needle); } } $task = new Task(); $task->minifyCSS( __DIR__ . '/../css')->minifyJS( __DIR__ . '/../js');