<?php
/**
* ---------------------------------------------------------------------
* GLPI - Gestionnaire Libre de Parc Informatique
* Copyright (C) 2015-2017 Teclib' and contributors.
*
* http://glpi-project.org
*
* based on GLPI - Gestionnaire Libre de Parc Informatique
* Copyright (C) 2003-2014 by the INDEPNET Development Team.
*
* ---------------------------------------------------------------------
*
* LICENSE
*
* This file is part of GLPI.
*
* GLPI is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* GLPI is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GLPI. If not, see <http://www.gnu.org/licenses/>.
* ---------------------------------------------------------------------
*/
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');