08-03-2013, 08:48 PM
Code PHP :
<?php
/**
* @file
* Fichier de concaténation de scripts javascripts.
* Composante de l'API Reinom (http://www.reinom.com)
* Version pré-beta.
*
* @licence CeCILL (GNU GPL)
* @version 0.000.00
* @author Xenos
* @date 19:34 08/03/2013
*/
/**
* Analyse un dossier pour en récupérer la liste des noms des fichiers javascript.
* Ces fichiers doivent utiliser l'extension '*.js'.
*
* @param string $path
* Chemin du dossier à scanner
* @param array &$files
* Tableau dans lequel injecter les noms trouvés
*
* @note
* Le scan est récursif: on analyse les fichiers du dossier spécifié par $path,
* mais on applique également la fonction Scan() aux dossiers de $path.
*
* @version 1.000.00
* @author Xenos
* @date 19:39 08/03/2013
*/
function Scan($path, &$files)
{
$content = scandir($path);
foreach ($content as $name)
{
if ($name != '.' and $name != '..')
{
$fullname = $path . '/' . $name;
if (is_dir($fullname))
Scan($fullname, $files);
else if (substr($fullname, -3) == '.js')
$files[] = $fullname;
}
}
}
/**
* Analyse un dossier pour en récupérer tous les fichiers javascript, puis les concatène.
* Le fichier javascript concaténé porte le même nom que le dossier dans lequel les
* javascript ont été piochés, avec l'extension '.js' en plus
*
* Exemple:
* Browse("/home/www/JS")
* Concatènera l'intégralité des fichiers du dossier '/home/www/JS' et de l'ensemble de ses sous-dossiers
* dans le fichier de sortie '/home/www/JS.js'.
*
* @warn
* Si vous utilisez des commandes 'libres', c'est à dire des commandes qui ne sont
* pas encapsulées dans des fonctions, alors ces commandes apparaitront n'import où dans le
* code javascript concaténé. Par exemple, si vous avez des fichiers javascript qui définissent
* un ensemble de fonction, que vous utilisez dans un autre fichier javascript, alors
* RIEN ne vous garantis que les fichiers définissant les fonctions seront assemblés
* AVANT le fichier utilisant ces fonctions. En d'autres mots, cette fonction de concaténation
* perd l'ordre (l'ordonnacement) des fichiers javascript.
* Pour contrer ce problème, rassemblez toutes vos commandes dans des fonctions,
* ne laisse rien "trainer" en dehors des fonctions.
* @note
* Il est conseillé de vous créer une fonction 'init' ou 'main', dans l'un des fichiers javascript,
* et de l'appeler dans la page HTML, après avoir chargé le fichier javascript concaténé.
*
* @param string $foldname
* Nom du dossier contenant l'ensemble de vos codes javascript.
* @param bool $zippy
* Indique s'il faut (true) comprimer le fichier concaténé en évinçant les lignes vides et les commentaires
* ou s'il faut juste faire une concaténation (false) en conservant les caractères qui sont inutiles pour l'exécution.
*
* @version 1.000.00
* @author Xenos
* @date 19:43 08/03/2013
*/
function Browse($foldname, $zippy=false)
{
// $foldname = "D:\\EasyPHP-12.1\\www\\Globals\\JVS";
// $zippy = false;
$files = Array();
Scan($foldname, $files);
// var_dump($files);
$outname = $foldname.'.js';
$outfile = fopen($outname, 'w');
$replacements = Array("}", "{", ";", "=");
foreach ($files as $f)
{
$content = file_get_contents($f);
if ($zippy)
{
$content = preg_replace('#/\*[^*]*\*+([^/][^*]*\*+)*/#', '', $content);
$content = preg_replace("#//([^\n]*)\n#im", "\n", $content);
$content = str_replace(Array("\r", "\n", "\t"), " ", $content);
for ($i=0;$i<10;$i++)
$content = str_replace(" ", " ", $content);
foreach ($replacements as $r)
$content = str_replace(Array($r." ", " ".$r), $r, $content);
}
fwrite($outfile, $content);
if ($zippy)
fwrite($outfile, "\r\n");
}
fclose($outfile);
}
?>
Utilisation:
Code :
Browse("./chemin/vers/le/dossier/contenant/les/javascripts");
Les fichiers seront concaténés et sauvés dans le fichier "./chemin/vers/le/dossier/contenant/les/javascripts.js" (aka le même nom que le dossier, mais avec .js en plus)
Le 2nd paramètre permet de réduire la taille du fichier concaténé en supprimant les lignes vides et les commentaires, mais je ne suis pas certain à 100% de son efficacité.