Blob Blame History Raw
<?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');