[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / plugins-dist / compresseur / compresseur_fonctions.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
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
13 /**
14 * Fonctions et filtres du compresseur
15 *
16 * @package SPIP\Compresseur\Fonctions
17 */
18 if (!defined("_ECRIRE_INC_VERSION")) return;
19
20 /**
21 * Minifier un fichier JS ou CSS
22 *
23 * Si la source est un chemin, on retourne un chemin avec le contenu minifié
24 * dans _DIR_VAR/cache_$format/
25 * Si c'est un flux on le renvoit compacté
26 * Si on ne sait pas compacter, on renvoie ce qu'on a recu
27 *
28 * @param string $source
29 * Contenu à minifier ou chemin vers un fichier dont on veut minifier le contenu
30 * @param string $format
31 * Format de la source (js|css).
32 * @return string
33 * - Contenu minifié (si la source est un contenu)
34 * - Chemin vers un fichier ayant le contenu minifié (si source est un fichier)
35 */
36 function minifier($source, $format = null) {
37 if (!$format AND preg_match(',\.(js|css)$,', $source, $r))
38 $format = $r[1];
39 include_spip('inc/compresseur_minifier');
40 if (!function_exists($minifier = 'minifier_'.$format))
41 return $source;
42
43 // Si on n'importe pas, est-ce un fichier ?
44 if (!preg_match(',[\s{}],', $source)
45 AND preg_match(',\.'.$format.'$,i', $source, $r)
46 AND file_exists($source)) {
47 // si c'est une css, il faut reecrire les url en absolu
48 if ($format=='css')
49 $source = url_absolue_css($source);
50
51 $f = basename($source,'.'.$format);
52 $f = sous_repertoire (_DIR_VAR, 'cache-'.$format)
53 . preg_replace(",(.*?)(_rtl|_ltr)?$,","\\1-minify-"
54 . substr(md5("$source-minify"), 0,4) . "\\2", $f, 1)
55 . '.' . $format;
56
57 if ((@filemtime($f) > @filemtime($source))
58 AND (!defined('_VAR_MODE') OR _VAR_MODE != 'recalcul'))
59 return $f;
60
61 if (!lire_fichier($source, $contenu))
62 return $source;
63
64 // traiter le contenu
65 $contenu = $minifier($contenu);
66
67 // ecrire le fichier destination, en cas d'echec renvoyer la source
68 if (ecrire_fichier($f, $contenu, true))
69 return $f;
70 else
71 return $source;
72 }
73
74 // Sinon simple minification de contenu
75 return $minifier($source);
76 }
77
78 /**
79 * Synonyme historique de minifier, pour compatibilite
80 *
81 * @deprecated Utiliser minifier()
82 *
83 * @param string $source
84 * @param string $format
85 * @return string
86 */
87 function compacte($source, $format = null){
88 return minifier($source, $format);
89 }
90
91 /**
92 * Compacte les éléments CSS et JS d'un <head> HTML
93 *
94 * Cette fonction vérifie les réglages du site et traite le compactage
95 * des css et/ou js d'un <head>
96 *
97 * Un fichier .gz est crée pour chaque, qui peut etre utilisé par apache
98 * et lui éviter de recompresser à chaque hit, avec les directives suivantes :
99 *
100 * <IfModule mod_gzip.c>
101 * mod_gzip_on Yes
102 * mod_gzip_can_negotiate Yes
103 * mod_gzip_static_suffix .gz
104 * AddEncoding gzip .gz
105 * mod_gzip_item_include file \.(js|css)$
106 * </IfModule>
107 *
108 * @see compacte_head_files()
109 *
110 * @param string $flux
111 * Partie de contenu du head HTML
112 * @return string
113 * Partie de contenu du head HTML
114 */
115 function compacte_head($flux){
116 include_spip('inc/compresseur');
117 if (!defined('_INTERDIRE_COMPACTE_HEAD')){
118 // dans l'espace prive on compacte toujours, c'est concu pour
119 if ((!test_espace_prive() AND $GLOBALS['meta']['auto_compress_css'] == 'oui') OR (test_espace_prive() AND !defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE')))
120 $flux = compacte_head_files($flux,'css');
121 if ((!test_espace_prive() AND $GLOBALS['meta']['auto_compress_js'] == 'oui') OR (test_espace_prive() AND !defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE')))
122 $flux = compacte_head_files($flux,'js');
123 }
124 return $flux;
125 }
126
127 /**
128 * Embarquer sous forme URI Scheme un fichier
129 *
130 * Une URI Scheme est de la forme data:xxx/yyy;base64,....
131 *
132 * Experimental
133 *
134 * @filtre embarque_fichier
135 *
136 * @staticvar array $mime
137 * Couples (extension de fichier => type myme)
138 * @param string $src
139 * Chemin du fichier
140 * @param string $base
141 * Le chemin de base à partir duquel chercher $src
142 * @param int $maxsize
143 * Taille maximale des fichiers à traiter
144 * @return string
145 * URI Scheme du fichier si la compression est faite,
146 * URL du fichier sinon (la source)
147 */
148 function filtre_embarque_fichier ($src, $base="", $maxsize = 4096) {
149 static $mime = array();
150 $extension = substr(strrchr($src,'.'),1);
151 $filename = $base . $src;
152
153 if (!file_exists($filename)
154 OR filesize($filename)>$maxsize
155 OR !lire_fichier($filename, $contenu))
156 return $src;
157
158 if (!isset($mime[$extension])){
159 if (isset($GLOBALS['tables_mime']) AND isset($GLOBALS['tables_mime'][$extension]))
160 $mime[$extension] = $GLOBALS['tables_mime'][$extension];
161 }
162 if (!isset($mime[$extension])){
163 if (!function_exists("sql_getfetsel"))
164 include_spip("base/abstract_sql");
165 $mime[$extension] = sql_getfetsel('mime_type','spip_types_documents','extension='.sql_quote($extension));
166 }
167
168 $base64 = base64_encode($contenu);
169 $encoded = 'data:'.$mime[$extension].';base64,'.$base64;
170
171 return $encoded;
172 }
173
174
175 /**
176 * Embarquer le 'src' d'une balise html en URI Scheme
177 *
178 * Experimental
179 *
180 * @param string $img
181 * Code HTML d'une image
182 * @param int $maxsize
183 * Taille maximale des fichiers à traiter
184 * @return string
185 * Code HTML de l'image, avec la source en URI Scheme si cela a été possible.
186 */
187 function filtre_embarque_src ($img, $maxsize = 4096){
188 $src = extraire_attribut($img,'src');
189 if ($src2=filtre_embarque_fichier($src, "", $maxsize) AND $src2!= $src) {
190 $img = inserer_attribut($img, 'src', $src2);
191 }
192 return $img;
193 }
194 ?>