Php_Minify_Snippet

[ PHP - Snippet - Minify ]

Utilisation de la librairie Minify pour compresser une application HTML statique et ses fichiers CSS et Javascript attachés

Ce script prend en entrée une série de fichiers HTML présents dans un dossier, et compresse chacun de ces fichiers en les considérant chacun comme une application Javascript. C'est à dire que à chaque fichier HTML, sera attaché un fichier CSS composé de la réunion compressée de tous les fichiers CSS attachés, et un fichier Javascript composé de la réunion compressée de tous les fichiers Javascript attachés. Le fichier HTML est alors modifié pour pointer vers ces fichiers, et le fichier modifié est écrit dans un répertoire cible.

Ce système n'est pas conçu pour mettre en cache « à la volée ».

La librairie en question : http://code.google.com/p/minify/

<?php

require_once 'minify/min/lib/Minify/HTML.php';
require_once 'minify/min/lib/Minify/CSS.php';
require_once 'minify/min/lib/JSMin.php';

set_include_path(realpath('minify/min/lib') . PATH_SEPARATOR . get_include_path());

$source_dir = realpath(__DIR__ . '/../src/');
$compiled_dir = realpath(__DIR__ . '/../compiled/');

$min_documentRoot = realpath($source_dir);

chdir($source_dir);
$html_files = glob('*.html');
chdir($compiled_dir);

foreach ($html_files as $file)
{
  if (is_file($source_dir . '/' . $file))
  {
    $html_content = '';
    $css_content = '';
    $js_content = '';

    $dom = new DomDocument();
    $dom->load($source_dir . '/' . $file);

    $root_node = $dom->getElementsByTagName('head')->item(0);

    $css_tags = $root_node->getElementsByTagName('link');
    $css_content = '';
    for ($node_id = 0; $node_id < $css_tags->length; $node_id++)
    {
      $node = $css_tags->item($node_id);
      if ($node->getAttribute('rel') == 'stylesheet' && substr($node->getAttribute('href'), 0, 7) != 'http://')
      {
        $css_content .= file_get_contents($source_dir . '/' . $node->getAttribute('href'));
        $node->parentNode->removeChild($node);
        $node_id--;
      }
    }

    $js_tags = $root_node->getElementsByTagName('script');
    $js_content = '';
    for ($node_id = 0; $node_id < $js_tags->length; $node_id++)
    {
      $node = $js_tags->item($node_id);
      if ($node->getAttribute('type') == 'application/x-javascript' && $node->getAttribute('src') && substr($node->getAttribute('src'), 0, 7) != 'http://')
      {
        $js_content .= file_get_contents($source_dir . '/' . $node->getAttribute('src'));
        $node->parentNode->removeChild($node);
        $node_id--;
      }
    }

    $css_node = $dom->createElement('link');
    $css_node->setAttribute('rel', 'stylesheet');
    $css_node->setAttribute('type', 'text/css');
    $css_node->setAttribute('href', basename($file, '.html') . '.css');

    $js_node = $dom->createElement('script');
    $js_node->setAttribute('type', 'application/x-javascript');
    $js_node->setAttribute('src', basename($file, '.html') . '.js');

    $root_node->appendChild($css_node);
    $root_node->appendChild($js_node);

    $html_content = $dom->saveHTML();
    unset($dom);

    $output = fopen($compiled_dir . '/' . $file, 'w');
    $options = array(
      'cssMinifier' => array('Minify_CSS', 'minify'),
      'jsMinifier'  => array('JSMin', 'minify'),
    );
    fwrite($output, Minify_HTML::minify($html_content, $options));
    fclose($output);

    $output = fopen($compiled_dir . '/' . basename($file, '.html') . '.css', 'w');
    fwrite($output, Minify_CSS::minify($css_content));
    fclose($output);

    $output = fopen($compiled_dir . '/' . basename($file, '.html') . '.js', 'w');
    fwrite($output, JSMin::minify($js_content));
    fclose($output);
  }
}

?>
Creative Commons License