source: spip-zone/_plugins_/adaptive_images/trunk/adaptive_images_options.php @ 115787

Last change on this file since 115787 was 115787, checked in by cedric@…, 8 months ago

proteger les images adaptees d'une double adaptation

File size: 9.4 KB
Line 
1<?php
2/**
3 * Options du plugin Adaptive Images
4 *
5 * @plugin     Adaptive Images
6 * @copyright  2013
7 * @author     Cedric
8 * @licence    GNU/GPL
9 * @package    SPIP\Adaptive_Images\Options
10 */
11
12
13if (!defined('_ECRIRE_INC_VERSION')) return;
14
15include_once(_DIR_PLUGIN_ADAPTIVE_IMAGES."lib/AdaptiveImages/AdaptiveImages.php");
16class SPIPAdaptiveImages extends AdaptiveImages {
17        protected function URL2filepath($url){
18                $url = parent::URL2filepath($url);
19                // URL absolue en URL relative
20                if (preg_match(",^https?://,",$url)){
21                        $base = url_de_base();
22                        if (strncmp($url,$base,strlen($base))==0)
23                                $url = _DIR_RACINE . substr($url,strlen($base));
24                        elseif (defined('_ADAPTIVE_IMAGES_DOMAIN')
25                          AND strncmp($url,_ADAPTIVE_IMAGES_DOMAIN,strlen(_ADAPTIVE_IMAGES_DOMAIN))==0){
26                                $url = _DIR_RACINE . substr($url,strlen(_ADAPTIVE_IMAGES_DOMAIN));
27                        }
28                }
29                return $url;
30        }
31
32        protected function filepath2URL($filepath, $relative=false){
33                $filepath = parent::filepath2URL($filepath, $relative);
34                if (!$relative AND defined('_ADAPTIVE_IMAGES_DOMAIN')){
35                        $filepath = rtrim(_ADAPTIVE_IMAGES_DOMAIN,"/")."/".$filepath;
36                }
37                return $filepath;
38        }
39}
40$AdaptiveImages = SPIPAdaptiveImages::getInstance();
41
42
43// utiliser le progressive rendering sur PNG et GIF si pas de JS
44if (defined('_ADAPTIVE_IMAGES_NOJS_PNGGIF_PROGRESSIVE_RENDERING'))
45        $AdaptiveImages->nojsPngGifProgressiveRendering = _ADAPTIVE_IMAGES_NOJS_PNGGIF_PROGRESSIVE_RENDERING;
46
47$settings = (isset($GLOBALS['meta']['adaptive_images'])?unserialize($GLOBALS['meta']['adaptive_images']):false);
48if ($settings){
49        // couleur de background pour les images lowsrc
50        if (isset($settings['lowsrc_jpg_bg_color']) AND $settings['lowsrc_jpg_bg_color'])
51                $AdaptiveImages->lowsrcJpgBgColor = $settings['lowsrc_jpg_bg_color'];
52        // qualite des images lowsrc
53        if (isset($settings['lowsrc_jpg_quality']) AND $q=intval($settings['lowsrc_jpg_quality']))
54                $AdaptiveImages->lowsrcJpgQuality= $q;
55        // qualite de compression JPG pour les images 1x
56        if (isset($settings['10x_jpg_quality']) AND $q=intval($settings['10x_jpg_quality']))
57                $AdaptiveImages->x10JpgQuality = $q;
58        // qualite de compression JPG pour les images 1.5x
59        if (isset($settings['15x_jpg_quality']) AND $q=intval($settings['15x_jpg_quality']))
60                $AdaptiveImages->x15JpgQuality = $q;
61        // qualite de compression JPG pour les images 2x
62        if (isset($settings['20x_jpg_quality']) AND $q=intval($settings['20x_jpg_quality']))
63                $AdaptiveImages->x20JpgQuality = $q;
64        // Breakpoints de taille d'ecran pour lesquels on generent des images
65        if (isset($settings['default_bkpts']) AND $settings['default_bkpts'])
66                $AdaptiveImages->defaultBkpts = explode(",",$settings['default_bkpts']);
67        // les images 1x sont au maximum en max_width_1x px de large dans la page
68        if (isset($settings['max_width_1x']) AND $v=intval($settings['max_width_1x']))
69                $AdaptiveImages->maxWidth1x = $v;
70        // Pour les ecrans plus petits, c'est la version mobile qui est fournie (recadree)
71        if (isset($settings['max_width_mobile_version']) AND $v=intval($settings['max_width_mobile_version']))
72                $AdaptiveImages->maxWidthMobileVersion = $v;
73
74        // on ne traite pas les images de largeur inferieure a min_width_1x px
75        if (isset($settings['min_width_1x']) AND $v=intval($settings['min_width_1x']))
76                $AdaptiveImages->minWidth1x = $v;
77        // on ne traite pas les images de poids inferieur a min_filesize ko
78        if (isset($settings['min_filesize']) AND $v=intval($settings['min_filesize']))
79                $AdaptiveImages->minFileSize = $v*1024;
80
81
82        // Pour generer chaque variante d'image uniquement quand elle est demandee pour la premiere fois
83        // par defaut false : on genere toutes les images au calcul de la page (mais timeout possible)
84        // pour passer a true : ajouter la rewrite rule suivante dans .htaccess
85        /*
86        ###
87        # Adaptive Images
88
89        RewriteRule \badapt-img/(\d+/\d\dx/.*)$ spip.php?action=adapt_img&arg=$1 [QSA,L]
90
91        # Fin des Adaptive Images
92        ###
93        */
94        if (isset($settings['on_demand_production']) AND $settings['on_demand_production'])
95                $AdaptiveImages->onDemandImages = true;
96
97        if (isset($settings['lazy_load']) AND $settings['lazy_load'])
98                $AdaptiveImages->lazyload = true;
99
100}
101
102
103
104// GD memory limit
105if (defined('_IMG_GD_MAX_PIXELS'))
106        $AdaptiveImages->maxImagePxGDMemoryLimit = intval(_IMG_GD_MAX_PIXELS);
107
108// dossier de stockage des images adaptatives
109$AdaptiveImages->destDirectory = _DIR_VAR . "adapt-img/";
110
111
112
113/**
114 * ?action=adapt_img
115 * Production d'une image a la volee a partir de son URL
116 * arg
117 *   local/adapt-img/w/x/file
118 *   ex : 320/20x/file
119 *   w est la largeur affichee de l'image
120 *   x est la resolution (10x => 1, 15x => 1.5, 20x => 2)
121 *   file le chemin vers le fichier source
122 */
123function action_adapt_img_dist(){
124
125        $AdaptiveImages = SPIPAdaptiveImages::getInstance();
126        try {
127                $AdaptiveImages->deliverBkptImage(_request('arg'));
128        }
129        catch (Exception $e){
130                http_status(404);
131                include_spip('inc/minipres');
132                echo minipres(_T('erreur').' 404',
133                        _T('medias:info_document_indisponible')."<br />".$e->getMessage(),"",true);
134        }
135        exit;
136}
137
138
139/** Filtre  ***********************************************************************************************************/
140
141/**
142 * Rendre les images d'un texte adaptatives, en permettant de preciser la largeur maxi a afficher en 1x
143 * [(#TEXTE|adaptive_images{1024})]
144 * ou passer la liste des breakpoints (le dernier est la largeur maxi 1x)
145 * [(#TEXTE|adaptive_images{160/320/480/640/1024})]
146 * @param string $texte
147 * @param null|int $max_width_1x
148 * @return mixed
149 */
150function adaptive_images($texte,$max_width_1x=null){
151        $bkpt = null;
152        // plusieurs valeurs separees par un / : ce sont les breakpoints, max_width_1x est la derniere valeur
153        if (strpos($max_width_1x,"/")!==false){
154                $bkpt = explode("/",$max_width_1x);
155                $bkpt = array_map("intval",$bkpt);
156                $max_width_1x = end($bkpt);
157                if (!$max_width_1x){
158                        $max_width_1x = null;
159                        $bkpt = null;
160                }
161        }
162        $AdaptiveImages = SPIPAdaptiveImages::getInstance();
163        $res = $AdaptiveImages->adaptHTMLPart($texte, $max_width_1x, $bkpt);
164
165        // injecter la class filtre_inactif sur les balises img pour ne pas repasser un filtre image dessus
166        $imgs = extraire_balises($res, 'img');
167        foreach ($imgs as $img) {
168                $class = extraire_attribut($img, "class");
169                if (strpos($class, 'filtre_inactif') !== false) {
170                        $class = str_replace('adapt-img', 'no_image_filtrer filtre_inactif adapt-img', $class);
171                        $img2 = inserer_attribut($img, 'class', $class);
172                        if (strlen($img2) !== strlen($img)) {
173                                $res = str_replace($img, $img2, $res);
174                        }
175                }
176        }
177        return $res;
178}
179
180/**
181 * nommage alternatif
182 * @param $texte
183 * @param int $max_width_1x
184 * @return mixed
185 */
186function adaptative_images($texte,$max_width_1x=null){
187        return adaptive_images($texte,$max_width_1x);
188}
189
190/** Pipelines  ********************************************************************************************************/
191
192/**
193 * Completer la page d'edition d'un document
194 * pour joindre sous-titrage, audio-desc et transcript sur les videos
195 *
196 * @param array $flux
197 * @return array
198 */
199function adaptive_images_affiche_milieu($flux){
200        if (in_array($flux['args']['exec'],array('document_edit','documents_edit'))
201          AND $id_document=$flux['args']['id_document']){
202                $flux['data'] .= recuperer_fond('prive/squelettes/inclure/adapter-image',array('id_document'=>$id_document));
203        }
204        return $flux;
205}
206
207/**
208 * Injecter data-src-mobile="..." sur les modeles img/doc/emb quand une variante mobile existe
209 *
210 * @param array $flux
211 * @return array
212 */
213function adaptive_images_recuperer_fond($flux){
214        if (
215                strncmp($flux['args']['fond'],"modeles/img",11)==0
216                OR strncmp($flux['args']['fond'],"modeles/doc",11)==0
217                OR strncmp($flux['args']['fond'],"modeles/emb",11)==0){
218                if ($id_document = intval($flux['args']['contexte']['id_document'])){
219                        if ($mobileview = adaptive_images_variante($id_document,"mobileview")){
220                                $src_mobile = get_spip_doc($mobileview['fichier']);
221                                $imgs = extraire_balises($flux['data']['texte'],'img');
222                                foreach($imgs as $img){
223                                        $src = extraire_attribut($img,"src");
224                                        $src = set_spip_doc($src);
225                                        if (sql_getfetsel("id_document","spip_documents","id_document=".intval($id_document)." AND fichier=".sql_quote($src))){
226                                                $img2 = inserer_attribut($img,"data-src-mobile",$src_mobile);
227                                                $flux['data']['texte'] = str_replace($img,$img2,$flux['data']['texte']);
228                                        }
229                                }
230                        }
231                }
232        }
233        return $flux;
234}
235
236
237/**
238 * Trouver la variante $mode d'une image
239 * @param int $id_document
240 * @param string $mode
241 *   mobileview
242 * @return array
243 */
244function adaptive_images_variante($id_document,$mode){
245        return sql_fetsel('*',
246                'spip_documents as d JOIN spip_documents_liens as L on L.id_document=d.id_document',
247                "L.objet='document' AND L.id_objet=".intval($id_document)." AND d.mode=".sql_quote($mode));
248}
249
250
251
252/**
253 * Traiter les images de la page et les passer en responsive
254 * si besoin
255 *
256 * @param $texte
257 * @return mixed
258 */
259function adaptive_images_affichage_final($texte){
260        if ($GLOBALS['html']){
261                #spip_timer();
262                $AdaptiveImages = SPIPAdaptiveImages::getInstance();
263                $texte = $AdaptiveImages->adaptHTMLPage($texte);
264                #var_dump(spip_timer());
265        }
266        return $texte;
267}
268
269/**
270 * Inserer jquery.lazyload.js si besoin
271 * @param $texte
272 * @return string
273 */
274function adaptive_images_insert_head($texte){
275        $AdaptiveImages = SPIPAdaptiveImages::getInstance();
276        if ($AdaptiveImages->lazyload){
277                if ($js = find_in_path("javascript/jquery.lazyload.js"))
278                        $texte .= "<script type='text/javascript' src='$js'></script>\n";
279                if ($js = find_in_path("javascript/adaptive.lazyload.js"))
280                        $texte .= "<script type='text/javascript' src='$js'></script>\n";
281        }
282        return $texte;
283}
284
285?>
Note: See TracBrowser for help on using the repository browser.