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

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

2 filtres experimentaux pour embarquer une image sous forme URI Scheme
|embarque_fichier a utiliser sur un nom de fichier
|embarque_src a utiliser sur une balise img

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