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

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

Mise a jour de la lib AdaptiveImage? : meilleure optimisation de la vignette (taille plus petite+filtre blur) et markup <picture> au lieu de <span> (sans modif de la technique)

File size: 9.7 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        // fine tuning : on genere une miniature toute petite en ameliorant un peu la qualite de sortie,
75        // ce qui donne une taille beaucoup plus reduite
76        $AdaptiveImages->maxWidthFallbackVersion = $AdaptiveImages->maxWidthMobileVersion / 4;
77        $AdaptiveImages->lowsrcJpgQuality = min($AdaptiveImages->lowsrcJpgQuality + 30, 90);
78
79        // on ne traite pas les images de largeur inferieure a min_width_1x px
80        if (isset($settings['min_width_1x']) AND $v=intval($settings['min_width_1x']))
81                $AdaptiveImages->minWidth1x = $v;
82        // on ne traite pas les images de poids inferieur a min_filesize ko
83        if (isset($settings['min_filesize']) AND $v=intval($settings['min_filesize']))
84                $AdaptiveImages->minFileSize = $v*1024;
85
86
87        // Pour generer chaque variante d'image uniquement quand elle est demandee pour la premiere fois
88        // par defaut false : on genere toutes les images au calcul de la page (mais timeout possible)
89        // pour passer a true : ajouter la rewrite rule suivante dans .htaccess
90        /*
91        ###
92        # Adaptive Images
93
94        RewriteRule \badapt-img/(\d+/\d\dx/.*)$ spip.php?action=adapt_img&arg=$1 [QSA,L]
95
96        # Fin des Adaptive Images
97        ###
98        */
99        if (isset($settings['on_demand_production']) AND $settings['on_demand_production'])
100                $AdaptiveImages->onDemandImages = true;
101
102        if (isset($settings['lazy_load']) AND $settings['lazy_load'])
103                $AdaptiveImages->lazyload = true;
104
105}
106
107
108
109// GD memory limit
110if (defined('_IMG_GD_MAX_PIXELS'))
111        $AdaptiveImages->maxImagePxGDMemoryLimit = intval(_IMG_GD_MAX_PIXELS);
112
113// dossier de stockage des images adaptatives
114$AdaptiveImages->destDirectory = _DIR_VAR . "adapt-img/";
115
116
117
118/**
119 * ?action=adapt_img
120 * Production d'une image a la volee a partir de son URL
121 * arg
122 *   local/adapt-img/w/x/file
123 *   ex : 320/20x/file
124 *   w est la largeur affichee de l'image
125 *   x est la resolution (10x => 1, 15x => 1.5, 20x => 2)
126 *   file le chemin vers le fichier source
127 */
128function action_adapt_img_dist(){
129
130        $AdaptiveImages = SPIPAdaptiveImages::getInstance();
131        try {
132                $AdaptiveImages->deliverBkptImage(_request('arg'));
133        }
134        catch (Exception $e){
135                http_status(404);
136                include_spip('inc/minipres');
137                echo minipres(_T('erreur').' 404',
138                        _T('medias:info_document_indisponible')."<br />".$e->getMessage(),"",true);
139        }
140        exit;
141}
142
143
144/** Filtre  ***********************************************************************************************************/
145
146/**
147 * Rendre les images d'un texte adaptatives, en permettant de preciser la largeur maxi a afficher en 1x
148 * [(#TEXTE|adaptive_images{1024})]
149 * ou passer la liste des breakpoints (le dernier est la largeur maxi 1x)
150 * [(#TEXTE|adaptive_images{160/320/480/640/1024})]
151 * @param string $texte
152 * @param null|int $max_width_1x
153 * @return mixed
154 */
155function adaptive_images($texte,$max_width_1x=null){
156        $bkpt = null;
157        // plusieurs valeurs separees par un / : ce sont les breakpoints, max_width_1x est la derniere valeur
158        if (strpos($max_width_1x,"/")!==false){
159                $bkpt = explode("/",$max_width_1x);
160                $bkpt = array_map("intval",$bkpt);
161                $max_width_1x = end($bkpt);
162                if (!$max_width_1x){
163                        $max_width_1x = null;
164                        $bkpt = null;
165                }
166        }
167        $AdaptiveImages = SPIPAdaptiveImages::getInstance();
168        $res = $AdaptiveImages->adaptHTMLPart($texte, $max_width_1x, $bkpt);
169
170        // injecter la class filtre_inactif sur les balises img pour ne pas repasser un filtre image dessus
171        $imgs = extraire_balises($res, 'img');
172        foreach ($imgs as $img) {
173                $class = extraire_attribut($img, "class");
174                if (strpos($class, 'filtre_inactif') !== false) {
175                        $class = str_replace('adapt-img', 'no_image_filtrer filtre_inactif adapt-img', $class);
176                        $img2 = inserer_attribut($img, 'class', $class);
177                        if (strlen($img2) !== strlen($img)) {
178                                $res = str_replace($img, $img2, $res);
179                        }
180                }
181        }
182        return $res;
183}
184
185/**
186 * nommage alternatif
187 * @param $texte
188 * @param int $max_width_1x
189 * @return mixed
190 */
191function adaptative_images($texte,$max_width_1x=null){
192        return adaptive_images($texte,$max_width_1x);
193}
194
195/** Pipelines  ********************************************************************************************************/
196
197/**
198 * Completer la page d'edition d'un document
199 * pour joindre sous-titrage, audio-desc et transcript sur les videos
200 *
201 * @param array $flux
202 * @return array
203 */
204function adaptive_images_affiche_milieu($flux){
205        if (in_array($flux['args']['exec'],array('document_edit','documents_edit'))
206          AND $id_document=$flux['args']['id_document']){
207                $flux['data'] .= recuperer_fond('prive/squelettes/inclure/adapter-image',array('id_document'=>$id_document));
208        }
209        return $flux;
210}
211
212/**
213 * Injecter data-src-mobile="..." sur les modeles img/doc/emb quand une variante mobile existe
214 *
215 * @param array $flux
216 * @return array
217 */
218function adaptive_images_recuperer_fond($flux){
219        if (
220                strncmp($flux['args']['fond'],"modeles/img",11)==0
221                OR strncmp($flux['args']['fond'],"modeles/doc",11)==0
222                OR strncmp($flux['args']['fond'],"modeles/emb",11)==0){
223                if ($id_document = intval($flux['args']['contexte']['id_document'])){
224                        if ($mobileview = adaptive_images_variante($id_document,"mobileview")){
225                                $src_mobile = get_spip_doc($mobileview['fichier']);
226                                $imgs = extraire_balises($flux['data']['texte'],'img');
227                                foreach($imgs as $img){
228                                        $src = extraire_attribut($img,"src");
229                                        $src = set_spip_doc($src);
230                                        if (sql_getfetsel("id_document","spip_documents","id_document=".intval($id_document)." AND fichier=".sql_quote($src))){
231                                                $img2 = inserer_attribut($img,"data-src-mobile",$src_mobile);
232                                                $flux['data']['texte'] = str_replace($img,$img2,$flux['data']['texte']);
233                                        }
234                                }
235                        }
236                }
237        }
238        return $flux;
239}
240
241
242/**
243 * Trouver la variante $mode d'une image
244 * @param int $id_document
245 * @param string $mode
246 *   mobileview
247 * @return array
248 */
249function adaptive_images_variante($id_document,$mode){
250        return sql_fetsel('*',
251                'spip_documents as d JOIN spip_documents_liens as L on L.id_document=d.id_document',
252                "L.objet='document' AND L.id_objet=".intval($id_document)." AND d.mode=".sql_quote($mode));
253}
254
255
256
257/**
258 * Traiter les images de la page et les passer en responsive
259 * si besoin
260 *
261 * @param $texte
262 * @return mixed
263 */
264function adaptive_images_affichage_final($texte){
265        if ($GLOBALS['html']){
266                #spip_timer();
267                $AdaptiveImages = SPIPAdaptiveImages::getInstance();
268                $texte = $AdaptiveImages->adaptHTMLPage($texte);
269                #var_dump(spip_timer());
270        }
271        return $texte;
272}
273
274/**
275 * Inserer jquery.lazyload.js si besoin
276 * @param $texte
277 * @return string
278 */
279function adaptive_images_insert_head($texte){
280        $AdaptiveImages = SPIPAdaptiveImages::getInstance();
281        if ($AdaptiveImages->lazyload){
282                if ($js = find_in_path("javascript/jquery.lazyload.js"))
283                        $texte .= "<script type='text/javascript' src='$js'></script>\n";
284                if ($js = find_in_path("javascript/adaptive.lazyload.js"))
285                        $texte .= "<script type='text/javascript' src='$js'></script>\n";
286        }
287        return $texte;
288}
289
290?>
Note: See TracBrowser for help on using the repository browser.