source: spip-zone/_core_/plugins/compresseur/inc/compresseur_concatener.php @ 43501

Last change on this file since 43501 was 43501, checked in by cedric@…, 9 years ago

la globale $var_mode est remplacee par la constante _VAR_MODE

File size: 4.0 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2011                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15
16/**
17 * Concatener en un seul une liste de fichier,
18 * avec appels de callback sur chaque fichier,
19 * puis sur le fichier final
20 *
21 * Gestion d'un cache : le fichier concatene n'est produit que si il n'existe pas
22 * pour la liste de fichiers fournis en entree 
23 *
24 *
25 * @param  $files
26 * @param string $format
27 * @return array
28 */
29function concatener_fichiers($files,$format='js', $callbacks = array()){
30        $nom = "";
31        if (!is_array($files) && $files) $files = array($files);
32        if (count($files)){
33
34                $callback_min = isset($callbacks['each_min'])?$callbacks['each_min']:'concatener_callback_identite';
35                $callback_pre = isset($callbacks['each_pre'])?$callbacks['each_pre']:'';
36          $url_base = self('&');
37
38                // on trie la liste de files pour calculer le nom
39                // necessaire pour retomber sur le meme fichier
40                // si on renome une url a la volee pour enlever le var_mode=recalcul
41                // mais attention, il faut garder l'ordre initial pour la minification elle meme !
42                $s2 = $files;
43                ksort($s2);
44                $dir = sous_repertoire(_DIR_VAR,'cache-'.$format);
45                $nom = $dir . md5(serialize($s2)) . ".$format";
46                if (
47                        (defined('_VAR_MODE') AND _VAR_MODE=='recalcul')
48                        OR !file_exists($nom)
49                ) {
50                        $fichier = "";
51                        $comms = array();
52                        $total = 0;
53                        $s2 = false;
54                        foreach($files as $key=>$file){
55                                if (!is_array($file)) {
56                                        // c'est un fichier
57                                        $comm = $file;
58                                        // enlever le timestamp si besoin
59                                        $file = preg_replace(",[?].+$,",'',$file);
60
61                                        // preparer le fichier si necessaire
62                                        if ($callback_pre)
63                                                $file = $callback_pre($file);
64                                       
65                                        lire_fichier($file, $contenu);
66                                }
67                                else {
68                                        // c'est un squelette
69                                        $comm = _SPIP_PAGE . "=$file[0]"
70                                                . (strlen($file[1])?"($file[1])":'');
71                                        parse_str($file[1],$contexte);
72                                        $contenu = recuperer_fond($file[0],$contexte);
73
74                                        // preparer le contenu si necessaire
75                                        if ($callback_pre)
76                                                $file = $callback_pre($contenu, $url_base);
77
78                                        // enlever le var_mode si present pour retrouver la css minifiee standard
79                                        if (strpos($file[1],'var_mode')!==false) {
80                                                if (!$s2) $s2 = $files;
81                                                unset($s2[$key]);
82                                                $key = preg_replace(',(&(amp;)?)?var_mode=[^&\'"]*,','',$key);
83                                                $file[1] = preg_replace(',&?var_mode=[^&\'"]*,','',$file[1]);
84                                                $s2[$key] = $file;
85                                        }
86                                }
87                                // passer la balise html initiale en second argument
88                                $fichier .= "/* $comm */\n". $callback_min($contenu, $key) . "\n\n";
89                                $comms[] = $comm;
90                                $total += strlen($contenu);
91                        }
92
93                        // calcul du % de compactage
94                        $pc = intval(1000*strlen($fichier)/$total)/10;
95                        $comms = "compact [\n\t".join("\n\t", $comms)."\n] $pc%";
96                        $fichier = "/* $comms */\n\n".$fichier;
97
98                        if ($s2) {
99                                ksort($s2);
100                                $nom = $dir . md5(serialize($s2)) . ".$format";
101                        }
102
103                        // ecrire
104                        ecrire_fichier($nom,$fichier,true);
105                        // ecrire une version .gz pour content-negociation par apache, cf. [11539]
106                        ecrire_fichier("$nom.gz",$fichier,true);
107
108                  if (isset($callbacks['all'])){
109                          $callback = $callbacks['all'];
110                                // closure compiler ou autre super-compresseurs
111                                // a appliquer sur le fichier final
112                                $nom = $callback($nom, $format);
113                  }
114                }
115
116
117        }
118
119        // Le commentaire detaille n'apparait qu'au recalcul, pour debug
120        return array($nom, (isset($comms) AND $comms) ? "<!-- $comms -->\n" : '');
121}
122
123function &concatener_callback_identite(&$contenu){
124        return $contenu;
125}
Note: See TracBrowser for help on using the repository browser.