Changeset 43971 in spip-zone


Ignore:
Timestamp:
Jan 29, 2011, 12:39:58 PM (9 years ago)
Author:
cedric@…
Message:

debug de la gestion du recalcul dans la concatenation des fichiers (&var_mode=recalcul dans une url ne doit pas empecher de retomber sur le bon nom de fichier compresse obtenu sans ce var_mode)
respect de l'ordre du html pour le calcul du nom

Gestion plus smart du google closure compiler :

  • prise en compte des callbacks dans le nom du fichier compresse, ce qui permet de differencier le nom final dans les cas avec ou sans closure compiler
  • la fonction minifier_encore_js n'est appelee que lorsque le head est modifie (ou recalcul explicite)
  • modification de la fonction minifier_encore_js : si son second argument est une chaine, on l'utilise comme nom de fichier cible pour y recopier le js minifie, et on renvoie ce nom la, ce qui permet a l'appelant de fixer le nom final
Location:
_core_/plugins/compresseur
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • _core_/plugins/compresseur/formulaires/configurer_compresseur.html

    r41502 r43971  
    4848                                                        [<span class='erreur_message'>(#ENV**{erreurs}|table_valeur{auto_compress_css})</span>]
    4949                                                        <div class='choix'>
    50                                                                 <input class='checkbox' type="checkbox" name="auto_compress_css" value='oui' [checked="(#ENV{auto_compress_css}|=={oui}|?{checked})"] id="auto_compress_http"/>
     50                                                                <input class='checkbox' type="checkbox" name="auto_compress_css" value='oui' [checked="(#ENV{auto_compress_css}|=={oui}|?{checked})"] id="auto_compress_css"/>
    5151                                                                <label for="auto_compress_css"><:item_compresseur:></label>
    5252                                                        </div>
  • _core_/plugins/compresseur/inc/compresseur.php

    r43501 r43971  
    140140        }
    141141
    142         $callbacks = array('each_min'=>'callback_minifier_'.$format.'_file', 'all_min'=>'callback_minifier_encore');
     142        $callbacks = array('each_min'=>'callback_minifier_'.$format.'_file');
     143
    143144        if ($format=="css")
    144145                $callbacks['each_pre'] = 'compresseur_callback_prepare_css';
     146        if ($format=='js' AND $GLOBALS['meta']['auto_compress_closure']=='oui'){
     147                $callbacks['all_min'] = 'minifier_encore_js';
     148        }
    145149
    146150        include_spip('inc/compresseur_concatener');
  • _core_/plugins/compresseur/inc/compresseur_concatener.php

    r43501 r43971  
    2323 *
    2424 *
    25  * @param  $files
     25 * @param array $files
     26 *   liste des fichiers a concatener, chaque entree sour la forme html=>fichier
     27 *   string $key : html d'insertion du fichier dans la page
     28 *   string|array $fichier : chemin du fichier, ou tableau (page,argument) si c'est un squelette
    2629 * @param string $format
     30 *   js ou css utilise pour l'extension du fichier de sortie
     31 * @param array $callbacks
     32 *   tableau de fonctions a appeler :
     33 *   each_pre : fonction de preparation a appeler sur le contenu de chaque fichier
     34 *   each_min : fonction de minification a appeler sur le contenu de chaque fichier
     35 *   all_min : fonction de minification a appeler sur le contenu concatene complet, en fin de traitement
    2736 * @return array
     37 *   tableau a 2 entrees retournant le nom du fichier et des commentairs html a inserer dans la page initiale
    2838 */
    2939function concatener_fichiers($files,$format='js', $callbacks = array()){
     
    3141        if (!is_array($files) && $files) $files = array($files);
    3242        if (count($files)){
    33 
    3443                $callback_min = isset($callbacks['each_min'])?$callbacks['each_min']:'concatener_callback_identite';
    3544                $callback_pre = isset($callbacks['each_pre'])?$callbacks['each_pre']:'';
     
    4049                // si on renome une url a la volee pour enlever le var_mode=recalcul
    4150                // mais attention, il faut garder l'ordre initial pour la minification elle meme !
    42                 $s2 = $files;
    43                 ksort($s2);
    4451                $dir = sous_repertoire(_DIR_VAR,'cache-'.$format);
    45                 $nom = $dir . md5(serialize($s2)) . ".$format";
     52                $nom = $dir . md5(serialize($files).serialize($callbacks)) . ".$format";
    4653                if (
    4754                        (defined('_VAR_MODE') AND _VAR_MODE=='recalcul')
     
    5158                        $comms = array();
    5259                        $total = 0;
    53                         $s2 = false;
     60                        $files2 = false;
    5461                        foreach($files as $key=>$file){
    5562                                if (!is_array($file)) {
     
    7481                                        // preparer le contenu si necessaire
    7582                                        if ($callback_pre)
    76                                                 $file = $callback_pre($contenu, $url_base);
    77 
     83                                                $contenu = $callback_pre($contenu, $url_base);
    7884                                        // enlever le var_mode si present pour retrouver la css minifiee standard
    7985                                        if (strpos($file[1],'var_mode')!==false) {
    80                                                 if (!$s2) $s2 = $files;
    81                                                 unset($s2[$key]);
     86                                                if (!$files2) $files2 = $files;
     87                                                $old_key = $key;
    8288                                                $key = preg_replace(',(&(amp;)?)?var_mode=[^&\'"]*,','',$key);
    8389                                                $file[1] = preg_replace(',&?var_mode=[^&\'"]*,','',$file[1]);
    84                                                 $s2[$key] = $file;
     90                                                $files2 = array_replace_key($files2,$old_key,$key,$file);
    8591                                        }
    8692                                }
     
    96102                        $fichier = "/* $comms */\n\n".$fichier;
    97103
    98                         if ($s2) {
    99                                 ksort($s2);
    100                                 $nom = $dir . md5(serialize($s2)) . ".$format";
     104                        // si on a nettoye des &var_mode=recalcul : mettre a jour le nom
     105                        // on ecrit pas dans le nom initial, qui est de toute facon recherche qu'en cas de recalcul
     106                        // donc jamais utile
     107                        if ($files2) {
     108                                $files=$files2;
     109                                $nom = $dir . md5(serialize($files).serialize($callbacks)) . ".$format";
    101110                        }
    102111
     112                        $nom_tmp = $nom;
     113                  $final_callback = (isset($callbacks['all_min'])?$callbacks['all_min']:false);
     114                  if ($final_callback){
     115                          unset($callbacks['all_min']);
     116                    $nom_tmp = $dir . md5(serialize($files).serialize($callbacks)) . ".$format";
     117                  }
    103118                        // ecrire
    104                         ecrire_fichier($nom,$fichier,true);
     119                        ecrire_fichier($nom_tmp,$fichier,true);
    105120                        // ecrire une version .gz pour content-negociation par apache, cf. [11539]
    106                         ecrire_fichier("$nom.gz",$fichier,true);
     121                        ecrire_fichier("$nom_tmp.gz",$fichier,true);
    107122
    108                   if (isset($callbacks['all'])){
    109                           $callback = $callbacks['all'];
     123                  if ($final_callback){
    110124                                // closure compiler ou autre super-compresseurs
    111125                                // a appliquer sur le fichier final
    112                                 $nom = $callback($nom, $format);
     126                                $encore = $final_callback($nom_tmp, $nom);
     127                    // si echec, on se contente de la compression sans cette callback
     128                          if ($encore!==$nom){
     129                                        // ecrire
     130                                        ecrire_fichier($nom,$fichier,true);
     131                                        // ecrire une version .gz pour content-negociation par apache, cf. [11539]
     132                                        ecrire_fichier("$nom.gz",$fichier,true);
     133                          }
    113134                  }
    114135                }
     
    124145        return $contenu;
    125146}
     147
     148function &array_replace_key($tableau,$orig_key,$new_key,$new_value=null){
     149        $t = array();
     150  foreach($tableau as $k=>$v){
     151          if ($k==$orig_key){
     152                  $k=$new_key;
     153            if (!is_null($new_value))
     154                    $v = $new_value;
     155          }
     156    $t[$k] = $v;
     157  }
     158  return $t;
     159}
  • _core_/plugins/compresseur/inc/compresseur_minifier.php

    r43376 r43971  
    182182
    183183/**
     184 * Minification additionnelle :
    184185 * Compacter du javascript plus intensivement
    185186 * grace au google closure compiler
    186187 *
    187188 * @param string $content
     189 *  contenu a compresser
    188190 * @param bool $file
     191 *  indique si $content est ou non un fichier, et retourne un fichier dans ce dernier cas
     192 *  si $file est une chaine, c'est un nom de ficher sous lequel on ecrit aussi le fichier destination
    189193 * @return string
    190194 */
     
    196200                $nom = $content;
    197201                lire_fichier($nom, $content);
    198                 $dest = dirname($nom).'/'.md5($content).'.js';
    199                 if (file_exists($dest))
     202                $dest = dirname($nom).'/'.md5($content.$file).'.js';
     203                if (file_exists($dest) AND (!is_string($file) OR file_exists($file)))
    200204                        if (filesize($dest))
    201                                 return $dest;
    202                         else
     205                                return is_string($file)?$file:$dest;
     206                        else {
     207                                spip_log("minifier_encore_js: Fichier $dest vide",_LOG_INFO);
    203208                                return $nom;
     209                        }
    204210        }
    205211
     
    232238                        ecrire_fichier ("$dest.gz", $cc, true);
    233239                        $content = $dest;
     240                  if (is_string($file)){
     241                          ecrire_fichier ($file, $cc, true);
     242                          ecrire_fichier ("$file.gz", $cc, true);
     243                    $content = $file;
     244                  }
    234245                }
    235246                else
    236247                        $content = &$cc;
    237248        } else {
    238                 if ($file)
     249                if ($file){
     250                        spip_log("minifier_encore_js:Echec appel Closure Compiler. Ecriture fichier $dest vide",_LOG_INFO_IMPORTANTE);
    239251                        ecrire_fichier ($dest, '', true);
     252                }
    240253        }
    241254        return $content;
     
    263276}
    264277
    265 
    266 /**
    267  * Minification additionnelle :
    268  * experimenter le Closure Compiler de Google
    269  * @param string $nom
    270  *   nom d'un fichier a minifier encore plus
    271  * @param string $format
    272  *   format css ou js
    273  * @return string
    274  */
    275 function callback_minifier_encore(&$nom, $format) {
    276         # Closure Compiler n'accepte pas des POST plus gros que 200 000 octets
    277         # au-dela il faut stocker dans un fichier, et envoyer l'url du fichier
    278         # dans code_url ; en localhost ca ne marche evidemment pas
    279         if (
    280         $GLOBALS['meta']['auto_compress_closure'] == 'oui'
    281         AND $format=='js'
    282         ) {
    283                 $nom = minifier_encore_js($nom,true);
    284         }
    285         return $nom;
    286 }
    287278
    288279/**
  • _core_/plugins/compresseur/plugin.xml

    r43376 r43971  
    44        <icon>images/compresseur-32.png</icon>
    55        <licence>GPL</licence>
    6         <version>1.4.0</version>
     6        <version>1.4.1</version>
    77        <etat>stable</etat>
    88        <description>Compression des css et javascript
Note: See TracChangeset for help on using the changeset viewer.