source: spip-zone/_core_/plugins/compresseur/filtres/compresseur.php @ 43373

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

refactoring du compresseur :
Separer par groupes fonctionnel :

  • minifier pour tout ce qui concerne la minification css ou js d'un fichier
  • concatener pour le regroupement de plusieurs fichiers en un (au passage, la fonction est generalisee et les specificites css/js sont simplement gerees par les callbacks passees en appel)
  • embarquer pour tout ce qui concerne(ra) l'inclusion des images en base64 dans les css (a developper)

On rationalise les nommage

File size: 4.8 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 * Minifier un fichier js ou css :
17 * Si la source est un chemin, on retourne un chemin avec le contenu minifie
18 * dans _DIR_VAR/cache_$format/
19 * Si c'est un flux on le renvoit compacte
20 * Si on ne sait pas compacter, on renvoie ce qu'on a recu
21 *
22 * @param string $source
23 * @param string $format
24 * @return string
25 */
26function minifier($source, $format = null) {
27        if (!$format AND preg_match(',\.(js|css)$,', $source, $r))
28                $format = $r[1];
29        include_spip('inc/compresseur_minifier');
30        if (!function_exists($minifier = 'minifier_'.$format))
31                return $source;
32
33        // Si on n'importe pas, est-ce un fichier ?
34        if (!preg_match(',[\s{}],', $source)
35        AND preg_match(',\.'.$format.'$,i', $source, $r)
36        AND file_exists($source)) {
37                // si c'est une css, il faut reecrire les url en absolu
38        if ($format=='css')
39                $source = url_absolue_css($source);
40
41                $f = basename($source,'.'.$format);
42                $f = sous_repertoire (_DIR_VAR, 'cache-'.$format)
43                . preg_replace(",(.*?)(_rtl|_ltr)?$,","\\1-minify-"
44                . substr(md5("$source-minify"), 0,4) . "\\2", $f, 1)
45                . '.' . $format;
46
47                if ((@filemtime($f) > @filemtime($source))
48                AND ($GLOBALS['var_mode'] != 'recalcul'))
49                        return $f;
50
51                if (!lire_fichier($source, $contenu))
52                        return $source;
53
54                // traiter le contenu
55                $contenu = $minifier($contenu);
56
57                // ecrire le fichier destination, en cas d'echec renvoyer la source
58                if (ecrire_fichier($f, $contenu, true))
59                        return $f;
60                else
61                        return $source;
62        }
63
64        // Sinon simple minification de contenu
65        return $minifier($source);
66}
67/**
68 * Synonyme historique de minifier, pour compatibilite
69 *
70 * @param string $source
71 * @param string $format
72 * @return string
73 */
74function compacte($source, $format = null){
75        return minifier($source, $format = null);
76}
77
78// Cette fonction verifie les reglages du site et traite le compactage
79// des css et/ou js d'un <head>
80// un fichier .gz est cree pour chaque, qui peut etre utilise par apache
81// et lui eviter de recompresser a chaque hit, avec les directives suivantes :
82//<IfModule mod_gzip.c>
83//mod_gzip_on                   Yes
84//mod_gzip_can_negotiate        Yes
85//mod_gzip_static_suffix        .gz
86//AddEncoding              gzip .gz
87//mod_gzip_item_include         file       \.(js|css)$
88//</IfModule>
89// http://doc.spip.org/@compacte_head
90function compacte_head($flux){
91        include_spip('inc/compresseur');
92        if (!defined('_INTERDIRE_COMPACTE_HEAD')){
93                // dans l'espace prive on compacte toujours, c'est concu pour
94                if ((!test_espace_prive() AND $GLOBALS['meta']['auto_compress_css'] == 'oui') OR (test_espace_prive() AND !defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE')))
95                        $flux = compacte_head_files($flux,'css');
96                if ((!test_espace_prive() AND $GLOBALS['meta']['auto_compress_js'] == 'oui') OR (test_espace_prive() AND !defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE')))
97                        $flux = compacte_head_files($flux,'js');
98        }
99        return $flux;
100}
101
102/**
103 * Embarquer sous forme URI Scheme
104 * data:xxx/yyy;base64,....
105 * un fichier
106 *
107 * Experimental
108 *
109 * @staticvar array $mime
110 * @param string $src
111 *   chemin du fichier
112 * @param string $base
113 *   le chemin de base a partir duquel chercher $src
114 * @param int $maxsize
115 * @return string
116 */
117function filtre_embarque_fichier ($src, $base="", $maxsize = 4096) {
118        static $mime = array();
119        $extension = substr(strrchr($src,'.'),1);
120        $filename = $base . $src;
121        #var_dump("$base:$src:$filename");
122
123        if (!file_exists($filename)
124                OR filesize($filename)>$maxsize
125                OR !lire_fichier($filename, $contenu))
126                return $src;
127
128        if (!isset($mime[$extension]))
129                $mime[$extension] = sql_getfetsel('mime_type','spip_types_documents','extension='.sql_quote($extension));
130
131        $base64 = base64_encode($contenu);
132        $encoded = 'data:'.$mime[$extension].';base64,'.$base64;
133        #var_dump($encoded);
134
135        return $encoded;
136}
137
138/**
139 * Embarquer le 'src' d'une balise html en URI Scheme
140 *
141 * Experimental
142 *
143 * @param string $img
144 * @param int $maxsize
145 * @return string
146 */
147function filtre_embarque_src ($img, $maxsize = 4096){
148        $src = extraire_attribut($img,'src');
149        if ($src2=filtre_embarque_fichier($src, "", $maxsize) AND $src2!= $src) {
150                $img = inserer_attribut($img, 'src', $src2);
151        }
152        return $img;
153}
154?>
Note: See TracBrowser for help on using the repository browser.