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

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

Up lib, renommage variable, et mise a jour de la config pour permettre de configurer la largeur des miniatures

File size: 11.6 KB
Line 
1<?php
2/**
3 * Options du plugin Adaptive Images
4 *
5 * @plugin     Adaptive Images
6 * @copyright  2013-2019
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 de compression JPG pour les images 1x
53        if (isset($settings['10x_jpg_quality']) AND $q=intval($settings['10x_jpg_quality']))
54                $AdaptiveImages->x10JpgQuality = $q;
55        // qualite de compression JPG pour les images 1.5x
56        if (isset($settings['15x_jpg_quality']) AND $q=intval($settings['15x_jpg_quality']))
57                $AdaptiveImages->x15JpgQuality = $q;
58        // qualite de compression JPG pour les images 2x
59        if (isset($settings['20x_jpg_quality']) AND $q=intval($settings['20x_jpg_quality']))
60                $AdaptiveImages->x20JpgQuality = $q;
61        // Breakpoints de taille d'ecran pour lesquels on generent des images
62        if (isset($settings['default_bkpts']) AND $settings['default_bkpts'])
63                $AdaptiveImages->defaultBkpts = explode(",",$settings['default_bkpts']);
64        // les images 1x sont au maximum en max_width_1x px de large dans la page
65        if (isset($settings['max_width_1x']) AND $v=intval($settings['max_width_1x']))
66                $AdaptiveImages->maxWidth1x = $v;
67        // Pour les ecrans plus petits, c'est la version mobile qui est fournie (recadree)
68        if (isset($settings['max_width_mobile_version']) AND $v=intval($settings['max_width_mobile_version']))
69                $AdaptiveImages->maxWidthMobileVersion = $v;
70
71
72        // qualite des images lowsrc
73        if (isset($settings['lowsrc_jpg_quality']) AND $q=intval($settings['lowsrc_jpg_quality']))
74                $AdaptiveImages->lowsrcJpgQuality= $q;
75        if (isset($settings['lowsrc_width']) AND $v=intval($settings['lowsrc_width'])){
76                $AdaptiveImages->lowsrcWidth = $v;
77        }
78        else {
79                // fine tuning automatique si pas de config (up depuis une version existante) :
80                // on genere une miniature toute petite en ameliorant un peu la qualite de sortie,
81                // ce qui donne une taille beaucoup plus reduite
82                $AdaptiveImages->lowsrcWidth = 128;
83                $AdaptiveImages->lowsrcJpgQuality = min($AdaptiveImages->lowsrcJpgQuality + 30, 90);
84        }
85
86        // on ne traite pas les images de largeur inferieure a min_width_1x px
87        if (isset($settings['min_width_1x']) AND $v=intval($settings['min_width_1x']))
88                $AdaptiveImages->minWidth1x = $v;
89        // on ne traite pas les images de poids inferieur a min_filesize ko
90        if (isset($settings['min_filesize']) AND $v=intval($settings['min_filesize']))
91                $AdaptiveImages->minFileSize = $v*1024;
92
93
94        // Pour generer chaque variante d'image uniquement quand elle est demandee pour la premiere fois
95        // par defaut false : on genere toutes les images au calcul de la page (mais timeout possible)
96        // pour passer a true : ajouter la rewrite rule suivante dans .htaccess
97        /*
98        ###
99        # Adaptive Images
100
101        RewriteRule \badapt-img/(\d+/\d\dx/.*)$ spip.php?action=adapt_img&arg=$1 [QSA,L]
102
103        # Fin des Adaptive Images
104        ###
105        */
106        if (isset($settings['on_demand_production']) AND $settings['on_demand_production'])
107                $AdaptiveImages->onDemandImages = true;
108
109        if (isset($settings['lazy_load']) AND $settings['lazy_load'])
110                $AdaptiveImages->lazyload = true;
111
112        // Experimental : generer des thumbnails svg a base de gradients (mais resultat assez bof)
113        //$AdaptiveImages->thumbnailGeneratorCallback = "adaptive_images_preview_gradients";
114}
115
116
117
118// GD memory limit
119if (defined('_IMG_GD_MAX_PIXELS'))
120        $AdaptiveImages->maxImagePxGDMemoryLimit = intval(_IMG_GD_MAX_PIXELS);
121
122// dossier de stockage des images adaptatives
123$AdaptiveImages->destDirectory = _DIR_VAR . "adapt-img/";
124
125
126
127/**
128 * ?action=adapt_img
129 * Production d'une image a la volee a partir de son URL
130 * arg
131 *   local/adapt-img/w/x/file
132 *   ex : 320/20x/file
133 *   w est la largeur affichee de l'image
134 *   x est la resolution (10x => 1, 15x => 1.5, 20x => 2)
135 *   file le chemin vers le fichier source
136 */
137function action_adapt_img_dist(){
138
139        $AdaptiveImages = SPIPAdaptiveImages::getInstance();
140        try {
141                $AdaptiveImages->deliverBkptImage(_request('arg'));
142        }
143        catch (Exception $e){
144                http_status(404);
145                include_spip('inc/minipres');
146                echo minipres(_T('erreur').' 404',
147                        _T('medias:info_document_indisponible')."<br />".$e->getMessage(),"",true);
148        }
149        exit;
150}
151
152/**
153 * Fonction de base pour les filtres, ne pas utiliser directement
154 * @protected
155 *
156 * @param $texte
157 * @param $max_width_1x
158 * @param bool $background_only
159 * @return mixed|string
160 */
161function adaptive_images_base($texte, $max_width_1x, $background_only = false){
162        $bkpt = null;
163        // plusieurs valeurs separees par un / : ce sont les breakpoints, max_width_1x est la derniere valeur
164        if (strpos($max_width_1x,"/")!==false){
165                $bkpt = explode("/",$max_width_1x);
166                $bkpt = array_map("intval",$bkpt);
167                $max_width_1x = end($bkpt);
168                if (!$max_width_1x){
169                        $max_width_1x = null;
170                        $bkpt = null;
171                }
172        }
173        $AdaptiveImages = SPIPAdaptiveImages::getInstance();
174        $res = $AdaptiveImages->adaptHTMLPart($texte, $max_width_1x, $bkpt, $background_only);
175
176        if (!$background_only) {
177                // injecter la class filtre_inactif sur les balises img pour ne pas repasser un filtre image dessus
178                $imgs = extraire_balises($res, 'img');
179                foreach ($imgs as $img) {
180                        $class = extraire_attribut($img, "class");
181                        if (strpos($class, 'filtre_inactif') !== false) {
182                                $class = str_replace('adapt-img', 'no_image_filtrer filtre_inactif adapt-img', $class);
183                                $img2 = inserer_attribut($img, 'class', $class);
184                                if (strlen($img2) !== strlen($img)) {
185                                        $res = str_replace($img, $img2, $res);
186                                }
187                        }
188                }
189        }
190        return $res;
191}
192
193function adaptive_images_preview_gradients($image, $options) {
194        $gradients = charger_fonction("image_gradients", "preview");
195        //spip_timer('gradients');
196        if ($thumbnail = $gradients($image, $options)) {
197                //var_dump($thumbnail,filesize($thumbnail),spip_timer('gradients'));
198                return array($thumbnail, 'gradients');
199        }
200        return false;
201}
202
203/** Filtres  ***********************************************************************************************************/
204
205
206/**
207 * Rendre les images d'un texte adaptatives, en permettant de preciser la largeur maxi a afficher en 1x
208 * [(#TEXTE|adaptive_images{1024})]
209 * ou passer la liste des breakpoints (le dernier est la largeur maxi 1x)
210 * [(#TEXTE|adaptive_images{160/320/480/640/1024})]
211 * @param string $texte
212 * @param null|int $max_width_1x
213 * @return mixed
214 */
215function adaptive_images($texte, $max_width_1x=null){
216        return adaptive_images_base($texte, $max_width_1x);
217}
218
219/**
220 * Rendre les images d'un texte adaptatives mais en background sur des span seulement (pas de balise <img>)
221 * @param string $texte
222 * @param null|int $max_width_1x
223 * @param string $class
224 * @return mixed
225 */
226function adaptive_images_background($texte, $max_width_1x=null, $class = ''){
227        $res = adaptive_images_base($texte, !empty($max_width_1x) ? $max_width_1x : null, true);
228        if ($class) {
229                // injecter la class sur les balises span.adapt-img-background
230                $spans = extraire_balises($res, 'span');
231                foreach ($spans as $span) {
232                        if (strpos($span,'adapt-img-background') !== false) {
233                                $span = explode('>', $span, 2);
234                                $s = $span[0] . '>';
235                                $c = extraire_attribut($s, "class");
236                                if (strpos($c, 'adapt-img-background') !== false) {
237                                        $c = rtrim($c) . ' '. $class;
238                                        $s2 = inserer_attribut($s, 'class', $c);
239                                        $res = str_replace($s, $s2, $res);
240                                }
241                        }
242                }
243        }
244        return $res;
245}
246
247/**
248 * nommage alternatif
249 * @param $texte
250 * @param int $max_width_1x
251 * @return mixed
252 */
253function adaptative_images($texte, $max_width_1x=null){
254        return adaptive_images($texte, $max_width_1x);
255}
256
257/** Pipelines  ********************************************************************************************************/
258
259/**
260 * Completer la page d'edition d'un document
261 * pour joindre sous-titrage, audio-desc et transcript sur les videos
262 *
263 * @param array $flux
264 * @return array
265 */
266function adaptive_images_affiche_milieu($flux){
267        if (in_array($flux['args']['exec'],array('document_edit','documents_edit'))
268          AND $id_document=$flux['args']['id_document']){
269                $flux['data'] .= recuperer_fond('prive/squelettes/inclure/adapter-image',array('id_document'=>$id_document));
270        }
271        return $flux;
272}
273
274/**
275 * Injecter data-src-mobile="..." sur les modeles img/doc/emb quand une variante mobile existe
276 *
277 * @param array $flux
278 * @return array
279 */
280function adaptive_images_recuperer_fond($flux){
281        if (
282                strncmp($flux['args']['fond'],"modeles/img",11)==0
283                OR strncmp($flux['args']['fond'],"modeles/doc",11)==0
284                OR strncmp($flux['args']['fond'],"modeles/emb",11)==0){
285                if ($id_document = intval($flux['args']['contexte']['id_document'])){
286                        if ($mobileview = adaptive_images_variante($id_document,"mobileview")){
287                                $src_mobile = get_spip_doc($mobileview['fichier']);
288                                $imgs = extraire_balises($flux['data']['texte'],'img');
289                                foreach($imgs as $img){
290                                        $src = extraire_attribut($img,"src");
291                                        $src = set_spip_doc($src);
292                                        if (sql_getfetsel("id_document","spip_documents","id_document=".intval($id_document)." AND fichier=".sql_quote($src))){
293                                                $img2 = inserer_attribut($img,"data-src-mobile",$src_mobile);
294                                                $flux['data']['texte'] = str_replace($img,$img2,$flux['data']['texte']);
295                                        }
296                                }
297                        }
298                }
299        }
300        return $flux;
301}
302
303
304/**
305 * Trouver la variante $mode d'une image
306 * @param int $id_document
307 * @param string $mode
308 *   mobileview
309 * @return array
310 */
311function adaptive_images_variante($id_document,$mode){
312        return sql_fetsel('*',
313                'spip_documents as d JOIN spip_documents_liens as L on L.id_document=d.id_document',
314                "L.objet='document' AND L.id_objet=".intval($id_document)." AND d.mode=".sql_quote($mode));
315}
316
317
318
319/**
320 * Traiter les images de la page et les passer en responsive
321 * si besoin
322 *
323 * @param $texte
324 * @return mixed
325 */
326function adaptive_images_affichage_final($texte){
327        if ($GLOBALS['html']){
328                #spip_timer();
329                $AdaptiveImages = SPIPAdaptiveImages::getInstance();
330                $texte = $AdaptiveImages->adaptHTMLPage($texte);
331                #var_dump(spip_timer());
332        }
333        return $texte;
334}
335
336/**
337 * Inserer jquery.lazyload.js si besoin
338 * @param $texte
339 * @return string
340 */
341function adaptive_images_insert_head($texte){
342        $AdaptiveImages = SPIPAdaptiveImages::getInstance();
343        if ($AdaptiveImages->lazyload){
344                if ($js = find_in_path("javascript/jquery.lazyload.js"))
345                        $texte .= "<script type='text/javascript' src='$js'></script>\n";
346                if ($js = find_in_path("javascript/adaptive.lazyload.js"))
347                        $texte .= "<script type='text/javascript' src='$js'></script>\n";
348        }
349        return $texte;
350}
351
352?>
Note: See TracBrowser for help on using the repository browser.