source: spip-zone/_core_/plugins/compresseur/compresseur_fonctions.php

Last change on this file was 113294, checked in by spip.franck@…, 2 months ago

Il parait que le futur c'est maintenant :-D

File size: 6.3 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2019                                                *
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 */
18if (!defined('_ECRIRE_INC_VERSION')) {
19        return;
20}
21$GLOBALS['spip_matrice']['compresseur_embarquer_images_css'] = 'inc/compresseur_embarquer.php';
22
23/**
24 * Minifier un fichier JS ou CSS
25 *
26 * Si la source est un chemin, on retourne un chemin avec le contenu minifié
27 * dans _DIR_VAR/cache_$format/
28 * Si c'est un flux on le renvoit compacté
29 * Si on ne sait pas compacter, on renvoie ce qu'on a recu
30 *
31 * @param string $source
32 *     Contenu à minifier ou chemin vers un fichier dont on veut minifier le contenu
33 * @param string $format
34 *     Format de la source (js|css).
35 * @return string
36 *     - Contenu minifié (si la source est un contenu)
37 *     - Chemin vers un fichier ayant le contenu minifié (si source est un fichier)
38 */
39function minifier($source, $format = null) {
40        $maybe_file = false;
41        if (strpos($source, "\n") === false
42                and strpos($source, "{") === false
43                and strpos($source, "}") === false) {
44                $maybe_file = true;
45                $source = supprimer_timestamp($source);
46        }
47        if (!$format and preg_match(',\.(js|css)$,', $source, $r)) {
48                $format = $r[1];
49        }
50        include_spip('inc/compresseur_minifier');
51        if (!function_exists($minifier = 'minifier_' . $format)) {
52                return $source;
53        }
54
55        // Si on n'importe pas, est-ce un fichier ?
56        if ($maybe_file
57                and preg_match(',\.' . $format . '$,i', $source)
58                and file_exists($source)
59        ) {
60                // si c'est un fichier deja minifie, on ne fait rien !
61                if (preg_match(',\.min\.' . $format . '$,i', $source)) {
62                        return $source;
63                }
64                // un fichier minifie existe-t-il deja, fourni avec le non-minifie ? (lib tierce-partie)
65                $f = preg_replace(',\.(' . $format . ')$,i', ".min.\\1", $source);
66                if (file_exists($f)) {
67                        return $f;
68                }
69
70                // si c'est une css, il faut reecrire les url en absolu
71                if ($format == 'css') {
72                        $source = url_absolue_css($source);
73                }
74
75                // calculer le nom du fichier
76                $f = basename($source, '.' . $format);
77                $f = sous_repertoire(_DIR_VAR, 'cache-' . $format)
78                        . preg_replace(',(.*?)(_rtl|_ltr)?$,', "\\1-minify-"
79                                . substr(md5("$source-minify"), 0, 4) . "\\2", $f, 1)
80                        . '.' . $format;
81
82                if ((@filemtime($f) > @filemtime($source))
83                        and (!defined('_VAR_MODE') or _VAR_MODE != 'recalcul')
84                ) {
85                        return $f;
86                }
87
88                if (!lire_fichier($source, $contenu)) {
89                        return $source;
90                }
91
92                // traiter le contenu
93                $contenu = $minifier($contenu);
94
95                // ecrire le fichier destination, en cas d'echec renvoyer la source
96                if (ecrire_fichier($f, $contenu, true)) {
97                        return $f;
98                } else {
99                        return $source;
100                }
101        }
102
103        // Sinon simple minification de contenu
104        return $minifier($source);
105}
106
107/**
108 * Synonyme historique de minifier, pour compatibilite
109 *
110 * @deprecated Utiliser minifier()
111 *
112 * @param string $source
113 * @param string $format
114 * @return string
115 */
116function compacte($source, $format = null) {
117        return minifier($source, $format);
118}
119
120/**
121 * Compacte les éléments CSS et JS d'un <head> HTML
122 *
123 * Cette fonction vérifie les réglages du site et traite le compactage
124 * des css et/ou js d'un <head>
125 *
126 * @see compacte_head_files()
127 *
128 * @param string $flux
129 *     Partie de contenu du head HTML
130 * @return string
131 *     Partie de contenu du head HTML
132 */
133function compacte_head($flux) {
134        include_spip('inc/compresseur');
135        if (!defined('_INTERDIRE_COMPACTE_HEAD')) {
136                // dans l'espace prive on compacte toujours, c'est concu pour
137                if ((!test_espace_prive() and $GLOBALS['meta']['auto_compress_css'] == 'oui') or (test_espace_prive() and !defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE'))) {
138                        $flux = compacte_head_files($flux, 'css');
139                }
140                if ((!test_espace_prive() and $GLOBALS['meta']['auto_compress_js'] == 'oui') or (test_espace_prive() and !defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE'))) {
141                        $flux = compacte_head_files($flux, 'js');
142                }
143        }
144
145        return $flux;
146}
147
148/**
149 * Embarquer sous forme URI Scheme un fichier
150 *
151 * Une URI Scheme est de la forme data:xxx/yyy;base64,....
152 *
153 * Experimental
154 *
155 * @filtre
156 *
157 * @staticvar array $mime
158 *     Couples (extension de fichier => type myme)
159 * @param string $src
160 *     Chemin du fichier
161 * @param string $base
162 *     Le chemin de base à partir duquel chercher $src
163 * @param int $maxsize
164 *     Taille maximale des fichiers à traiter
165 * @return string
166 *     URI Scheme du fichier si la compression est faite,
167 *     URL du fichier sinon (la source)
168 */
169function filtre_embarque_fichier($src, $base = '', $maxsize = 4096) {
170        static $mime = array();
171        $extension = substr(strrchr($src, '.'), 1);
172        $filename = $base . $src;
173
174        if (!file_exists($filename)
175                or filesize($filename) > $maxsize
176                or !lire_fichier($filename, $contenu)
177        ) {
178                return $src;
179        }
180
181        if (!isset($mime[$extension])) {
182                if (isset($GLOBALS['tables_mime']) and isset($GLOBALS['tables_mime'][$extension])) {
183                        $mime[$extension] = $GLOBALS['tables_mime'][$extension];
184                }
185        }
186        if (!isset($mime[$extension])) {
187                if (!function_exists('sql_getfetsel')) {
188                        include_spip('base/abstract_sql');
189                }
190                $mime[$extension] = sql_getfetsel('mime_type', 'spip_types_documents', 'extension=' . sql_quote($extension));
191        }
192
193        $base64 = base64_encode($contenu);
194        $encoded = 'data:' . $mime[$extension] . ';base64,' . $base64;
195
196        return $encoded;
197}
198
199
200/**
201 * Embarquer le 'src' d'une balise html en URI Scheme
202 *
203 * Experimental
204 *
205 * @param string $img
206 *     Code HTML d'une image
207 * @param int $maxsize
208 *     Taille maximale des fichiers à traiter
209 * @return string
210 *     Code HTML de l'image, avec la source en URI Scheme si cela a été possible.
211 */
212function filtre_embarque_src($img, $maxsize = 4096) {
213        $src = extraire_attribut($img, 'src');
214        if ($src2 = filtre_embarque_fichier($src, '', $maxsize) and $src2 != $src) {
215                $img = inserer_attribut($img, 'src', $src2);
216        }
217
218        return $img;
219}
Note: See TracBrowser for help on using the repository browser.