source: spip-zone/_plugins_/modeles_media/trunk/media_fonctions.php @ 87530

Last change on this file since 87530 was 87530, checked in by joseph@…, 5 years ago

Oups, erreur dans le commit précédent

File size: 15.1 KB
Line 
1<?php
2
3// Sécurité
4if (!defined("_ECRIRE_INC_VERSION")) return;
5
6// Calcule la légende d'un document
7// Balise placée dans une boucle DOCUMENTS et appelée dans un modèle <media>
8// Les paramètres legende, titre, descriptif, credits, poids et type sont récupérés dans l'environnement
9// Syntaxe (premier argument précise si en div ou en dl, le second la largeur de la légende) :
10// #MEDIA_LEGENDE{'dl',#GET{width}} ou #MEDIA_LEGENDE{'div',#GET{width}}
11function balise_MEDIA_LEGENDE_dist($p) {
12        $conteneur = interprete_argument_balise(1,$p);
13        $width = interprete_argument_balise(2,$p);
14        $sql_id_document = champ_sql('id_document', $p);
15        $sql_titre = champ_sql('titre', $p);
16        $sql_descriptif = champ_sql('descriptif', $p);
17        $sql_credits = champ_sql('credits', $p);
18        $sql_type = champ_sql('type_document', $p);
19        $sql_poids = champ_sql('taille', $p);
20        $connect = '';
21        if (isset($p->boucles[$p->id_boucle]))
22                $connect = $p->boucles[$p->id_boucle]->sql_serveur;
23        $connect = _q($connect);
24        $p->code = "calculer_balise_MEDIA_LEGENDE($conteneur,$width,$sql_id_document,$sql_titre,$sql_descriptif,$sql_credits,$sql_type,$sql_poids,\$Pile[0]['args'],$connect)";
25        return $p;
26}
27
28function calculer_balise_MEDIA_LEGENDE($conteneur,$width,$sql_id_document,$sql_titre,$sql_descriptif,$sql_credits,$sql_type,$sql_poids,$args,$connect=''){
29        $ret = '';
30        $env_legende = $args['legende'];
31        $env_titre = $args['titre'];
32        $env_descriptif =$args['descriptif'];
33        $env_credits = $args['credits'];
34        $env_type = $args['type'];
35        $env_poids = $args['poids'];
36       
37        // Doit-on afficher une légende ?
38        if ($env_legende || $env_titre || $env_descriptif || $env_credits || $env_poids || $env_type) {
39                $media_largeur_max_legende = isset($GLOBALS['meta']['media_largeur_max_legende']) ? $GLOBALS['meta']['media_largeur_max_legende'] : 120;
40                $media_largeur_min_legende = isset($GLOBALS['meta']['media_largeur_min_legende']) ? $GLOBALS['meta']['media_largeur_min_legende'] : 350;
41                $width = is_numeric($width) ? min($media_largeur_max_legende,max($media_largeur_min_legende,intval($width))) : $media_largeur_max_legende;
42                // Y a-t-il un modèle légende à utiliser ?
43                if ($env_legende && find_in_path('modeles/legende_'.$env_legende.'.html')) {
44                        $ret = recuperer_fond('modeles/legende_'.$env_legende,array(
45                                'id' => $sql_id_document,
46                                'titre' => $env_titre,
47                                'descriptif' => $env_descriptif,
48                                'credits' => $env_credits,
49                                'type' => $env_type,
50                                'poids' => $env_poids,
51                                'width' => $width,
52                                'conteneur' => $conteneur
53                        ),array(),$connect);
54                } else {
55                        $width = is_numeric($width) ? 'width: '.intval($width).'px;' : '';
56                        $dt = $conteneur=='dl' ? 'dt' : 'div';
57                        $dd = $conteneur=='dl' ? 'dd' : 'div';
58                        $distant = ($connect) ? $connect.'__' : '';
59                        // Titre
60                        if ($env_titre && $env_titre!='titre') {
61                                $titre = typo($env_titre);
62                                $crayons_titre = '';
63                        } elseif ($env_titre=='titre' || $env_legende) {
64                                $titre = typo(supprimer_numero($sql_titre));
65                                $crayons_titre = defined('_DIR_PLUGIN_CRAYONS') ? ' crayon '.$distant.'document-titre-'.$sql_id_document : '';
66                        } else {
67                                $titre = '';
68                                $crayons_titre = '';
69                        }
70                        // Descriptif
71                        if ($env_descriptif && $env_descriptif!='descriptif') {
72                                $descriptif = propre($env_descriptif);
73                                $crayons_descriptif = '';
74                        } elseif ($env_descriptif=='descriptif' || $env_legende) {
75                                $descriptif = propre($sql_descriptif);
76                                $crayons_descriptif = defined('_DIR_PLUGIN_CRAYONS') ? ' crayon '.$distant.'document-descriptif-'.$sql_id_document : '';
77                        } else {
78                                $descriptif = '';
79                                $crayons_descriptif = '';
80                        }
81                        // Notes
82                        $notes = calculer_notes();
83                        if ($notes)
84                                $notes = '<p class="notes">'.PtoBR($notes).'</p>';
85                        // Crédits
86                        if ($env_credits && $env_credits!='credits') {
87                                $credits = typo($env_credits);
88                                $crayons_credits = '';
89                        } elseif ($env_credits=='credits' || $env_legende=='complete') {
90                                $credits = typo($sql_credits);
91                                $crayons_credits = defined('_DIR_PLUGIN_CRAYONS') && defined('_DIR_PLUGIN_MEDIAS') ? ' crayon '.$distant.'document-credits-'.$sql_id_document : '';
92                        } else {
93                                $credits = '';
94                                $crayons_credits = '';
95                        }
96                        // Type de document
97                        if ($env_type && $env_type!='type') 
98                                $type = typo($env_type);
99                        elseif ($env_type=='type' || $env_legende=='complete')
100                                $type = typo($sql_type);
101                        else
102                                $type = '';
103                        // Poids du document
104                        if ($env_poids || $env_legende=='complete')
105                                $poids = taille_en_octets($sql_poids);
106                        else
107                                $poids = '';
108                        if ($type && $poids)
109                                $poids = ' - '.$poids;
110                       
111                        if ($titre)
112                                $ret .= "<$dt class='spip_doc_titre$crayons_titre' style='$width'><strong>$titre</strong></$dt>";
113                        if ($descriptif)
114                                $ret .= "<$dd class='spip_doc_descriptif$crayons_descriptif' style='$width'>".PtoBR($descriptif).$notes."</$dd>";
115                        if ($credits)
116                                $ret .= "<$dd class='spip_doc_credits$crayons_credits' style='$width'>"._T('media:credits')." <span class='credit'>$credits</span></$dd>";
117                        if ($type || $poids)
118                                $ret .= "<$dd class='spip_doc_infos' style='$width'>$type$poids</$dd>";
119                }
120        }
121        return $ret;
122}
123
124// Renvoie un espace si on doit afficher une légende
125// Rien sinon
126// Balise placée dans une boucle DOCUMENTS et appelée dans un modèle <media>
127function balise_MEDIA_AFFICHER_LEGENDE_dist($p) {
128        $conteneur = interprete_argument_balise(1,$p);
129        $p->code = "\$Pile[0]['args']['legende'] || \$Pile[0]['args']['titre'] || \$Pile[0]['args']['descriptif'] || \$Pile[0]['args']['credits'] || \$Pile[0]['args']['type'] || \$Pile[0]['args']['poids'] ? ' ' : ''";
130        return $p;
131}
132
133// Renvoie le fichier d'une image retaillée selon les paramètres passés au modèle
134// Balise placée dans une boucle DOCUMENTS et appelée dans un modèle <media>
135// Les paramètres taille, hauteur, largeur, alt et titre sont récupérés dans l'environnement.
136// Exemple de syntaxe :
137// #MEDIA_IMAGE_RETAILLEE{#LOGO_DOCUMENT} ou #MEDIA_IMAGE_RETAILLEE{#URL_DOCUMENT}
138function balise_MEDIA_IMAGE_RETAILLEE_dist($p) {
139        $image = interprete_argument_balise(1,$p);
140        $sql_titre = champ_sql('titre', $p);
141        $sql_type = champ_sql('type_document', $p);
142        $sql_poids = champ_sql('taille', $p);
143        $p->code = "calculer_balise_MEDIA_IMAGE_RETAILLEE($image,\$Pile[0]['args'],$sql_titre,$sql_type,$sql_poids)";
144        return $p;
145}
146
147function calculer_balise_MEDIA_IMAGE_RETAILLEE($image,$args,$sql_titre,$sql_type,$sql_poids){
148        $taille = $args['taille'];
149        $hauteur = $args['hauteur'];
150        $largeur = $args['largeur'];
151        $alt = $args['alt'];
152        $titre = $args['titre'];
153
154        $src = extraire_attribut($image, 'src');
155        $url_site_spip=$GLOBALS['meta']['adresse_site'];
156
157        if (!$src)
158                $src = $image;
159               
160        if(preg_match('/\.[jpg|gif|png]\?/i',$src,$matches)){
161                $pos = strpos($src,'?');
162                $src = substr($src,0,$pos);
163        }
164       
165        if(substr($src,0,strlen($url_site_spip))==$url_site_spip)
166                $src = substr($src,strlen($url_site_spip));
167   
168        $src_relative = $src;
169   
170        if(!preg_match('`^https?://`i',$src,$matches)){
171                $src = realpath($src);
172        }
173       
174        spip_log("src=$src","modeles_media");
175
176        $src_imgsize = str_replace('https://', 'http://', $src); // No https for getimagesize
177        list($width, $height) = getimagesize($src_imgsize);
178        // hauteur du redimensionnement
179        if (is_numeric($hauteur) && intval($hauteur)>0)
180                $hauteur = intval($hauteur);
181        elseif (in_array($taille,array('icone','petit','moyen','grand')))
182                $hauteur = $GLOBALS['meta']['media_taille_'.$taille.'_hauteur'];
183        elseif (is_numeric($taille) && intval($taille)>0)
184                $hauteur = intval($taille);
185        else
186                $hauteur = 100000;
187        // largeur du redimensionnement
188        if (is_numeric($largeur) && intval($largeur)>0)
189                $largeur = intval($largeur);
190        elseif (in_array($taille,array('icone','petit','moyen','grand')))
191                $largeur = $GLOBALS['meta']['media_taille_'.$taille.'_largeur'];
192        elseif (is_numeric($taille) && intval($taille)>0)
193                $largeur = intval($taille);
194        else
195                $largeur = 100000;
196        // Doit-on redimensionner ?
197        if ($height > $hauteur || $width > $largeur) {
198                include_spip('inc/filtres_images_mini');
199                $img = image_reduire($src,$largeur,$hauteur);
200                }
201        else
202                $img = "<img src=\"$src_relative\" height=\"$height\" width=\"$width\" />";
203        // Ajouter une alternative
204        // Variable alt si transmise, sinon le titre du document, sinon type et poids
205        if ($alt)
206                $alternative = typo($alt);
207        elseif ($titre && $titre!='titre')
208                $alternative = typo($titre);
209        elseif ($sql_titre)
210                $alternative = typo($sql_titre);
211        else
212                $alternative = typo($sql_type).' - '.taille_en_octets($sql_poids);
213        $img = inserer_attribut($img,'alt',$alternative);
214        return $img;
215}
216
217// Calcule le lien, si lien demandé, sur le document
218// Balise placée dans une boucle DOCUMENTS et appelée dans un modèle <media>
219// Les paramètres lien, titre_lien et sont récupérés dans l'environnement.
220// Exemple de syntaxe :
221// #MEDIA_LIEN{#LOGO_DOCUMENT} ou #MEDIA_LIEN{#MEDIA_IMAGE_RETAILLEE{#LOGO_DOCUMENT}}
222function balise_MEDIA_LIEN_dist($p) {
223        $objet = interprete_argument_balise(1,$p);
224        $forcer_lien = interprete_argument_balise(2,$p);
225        $forcer_lien = is_null($forcer_lien) ? "''" : $forcer_lien;
226        $id_document = champ_sql('id_document', $p);
227        include_spip('balise/url_');
228        $url_document = generer_generer_url_arg('document', $p, $id_document);
229        $connect = '';
230        if (isset($p->boucles[$p->id_boucle]))
231                $connect = $p->boucles[$p->id_boucle]->sql_serveur;
232        $connect = _q($connect);
233        $p->code = "calculer_balise_MEDIA_LIEN($objet,$forcer_lien,$id_document,$url_document,\$Pile[0]['args'],$connect)";
234        return $p;
235}
236
237function calculer_balise_MEDIA_LIEN($objet,$forcer_lien,$id_document,$url_document,$args,$connect='') {
238        $lien = $args['lien'];
239        $titre_lien = $args['titre_lien'];
240        $titre = $args['titre'];
241       
242        // A-t-on demandé un lien
243        if (!$lien && !$forcer_lien)
244                return $objet;
245        // Si lien non spécifique, on pointe sur le document (en se basant sur $url_document pour ne pas pointer sur spip.php?page=document)
246        if ($lien=='lien' || !$lien) {
247                $lien = 'doc'.$id_document;
248                // Si on pointe sur le document, que titre_lien n'est pas spécifié mais qu'on a spécifié un titre au document, on prend le titre spécifique
249                if (!$titre_lien && $titre && $titre!='titre')
250                        $titre_lien = $titre;
251                $l = calculer_url($lien, $titre_lien, 'tout', $connect);
252                $l['url'] = $url_document;
253        }
254        else $l = calculer_url($lien, $titre_lien, 'tout', $connect);
255       
256        if (!$l['url'])
257                return $object;
258        $a = '<a href="'.$l['url'].'"';
259        $a .= $l['class'] ? ' class="'.$l['class'].'"' : '';
260        $a .= $l['titre'] ? ' title="'.attribut_html(typo($l['titre'])).'"' : '';
261        $a .= $l['lang'] ? ' hreflang="'.$l['lang'].'"' : '';
262        $a .= $l['mime'] ? ' type="'.$l['mime'].'"' : '';
263        $a .= '>';
264        return $a.$objet.'</a>';
265}
266
267// Renvoie la taille du fichier après redimensionnement si besoin
268// Balise placée dans une boucle DOCUMENTS et appelée dans un modèle <media>
269// Les paramètres taille, hauteur et largeur sont récupérés dans l'environnement.
270// Exemple de syntaxe :
271// #MEDIA_TAILLE{largeur} ou #MEDIA_TAILLE{hauteur}
272function balise_MEDIA_TAILLE_dist($p) {
273        $dim = interprete_argument_balise(1,$p);
274        $sql_largeur = champ_sql('largeur', $p);
275        $sql_hauteur = champ_sql('hauteur', $p);
276        $p->code = "calculer_balise_MEDIA_TAILLE($dim,\$Pile[0]['args'],$sql_largeur,$sql_hauteur)";
277        return $p;
278}
279
280function calculer_balise_MEDIA_TAILLE($dim,$args,$sql_largeur,$sql_hauteur){
281        $taille = $args['taille'];
282        $hauteur = $args['hauteur'];
283        $largeur = $args['largeur'];
284       
285        $hauteur_defaut = array(
286                'icone' => 52,
287                'petit' => 90,
288                'moyen' => 240,
289                'grand' => 480
290        );
291        $largeur_defaut = array(
292                'icone' => 52,
293                'petit' => 120,
294                'moyen' => 320,
295                'grand' => 640
296        );
297        // Une taille par défaut si le document n'en n'a pas
298        if (!is_numeric($sql_hauteur) || intval($sql_hauteur)<=0)
299                $sql_hauteur = isset($GLOBALS['meta']['media_taille_grand_hauteur']) ? $GLOBALS['meta']['media_taille_grand_hauteur'] : 480;
300        if (!is_numeric($sql_largeur) || intval($sql_largeur)<=0)
301                $sql_largeur = isset($GLOBALS['meta']['media_taille_grand_largeur']) ? $GLOBALS['meta']['media_taille_grand_largeur'] : 640;
302        // Hauteur visée (on peut avoir passé une hauteur en %)
303        if (substr(trim($hauteur),-1)=='%')
304                $hauteur = trim($hauteur);
305        elseif (is_numeric($hauteur) && intval($hauteur)>0)
306                $hauteur = intval($hauteur);
307        elseif (in_array($taille,array('icone','petit','moyen','grand')) && isset($GLOBALS['meta']['media_taille_'.$taille.'_hauteur']))
308                $hauteur = $GLOBALS['meta']['media_taille_'.$taille.'_hauteur'];
309        elseif (in_array($taille,array('icone','petit','moyen','grand')))
310                $hauteur = $hauteur_defaut[$taille];
311        elseif (substr(trim($taille),-1)=='%')
312                $hauteur = trim($taille);
313        elseif (is_numeric($taille) && intval($taille)>0)
314                $hauteur = intval($taille);
315        else
316                $hauteur = $sql_hauteur;
317        // Largeur visée (on peut avoir passé une largeur en %)
318        if (substr(trim($largeur),-1)=='%')
319                $largeur = trim($largeur);
320        elseif (is_numeric($largeur) && intval($largeur)>0)
321                $largeur = intval($largeur);
322        elseif (in_array($taille,array('icone','petit','moyen','grand')) && isset($GLOBALS['meta']['media_taille_'.$taille.'_largeur']))
323                $largeur = $GLOBALS['meta']['media_taille_'.$taille.'_largeur'];
324        elseif (in_array($taille,array('icone','petit','moyen','grand')))
325                $largeur = $largeur_defaut[$taille];
326        elseif (substr(trim($taille),-1)=='%')
327                $hauteur = trim($taille);
328        elseif (is_numeric($taille) && intval($taille)>0)
329                $largeur = intval($taille);
330        else
331                $largeur = $sql_largeur;
332        // Doit-on redimensionner ? Si une deux dimensions est exprimée en %, on ne redimensionne pas.
333        if (substr($hauteur,-1)=='%' || substr($largeur,-1)=='%')
334                $t = array('largeur' => $largeur, 'hauteur' => $hauteur);
335        elseif ($sql_hauteur > $hauteur || $sql_largeur > $largeur) {
336                $ratio = max ($sql_hauteur/$hauteur,$sql_largeur/$largeur);
337                $t = array('largeur' => round($sql_largeur/$ratio), 'hauteur' => round($sql_hauteur/$ratio));
338        } else
339                $t = array('largeur' => $sql_largeur, 'hauteur' => $sql_hauteur);
340        return $dim ? $t[$dim] : $t;
341}
342
343// Renvoie un tableau des paramètres à ignorer à utiliser avec env_to_params et env_to_attribute
344// Exemple : [(#ENV*|env_to_attributs{#MEDIA_IGNORE_PARAMS})] ou [(#ENV*|env_to_params{#MEDIA_IGNORE_PARAMS})]
345function balise_MEDIA_IGNORE_PARAMS_dist($p) {
346        $p->code = "array('id_media', 'legende','titre','descriptif','credits','poids','type','taille','hauteur','largeur','class','lien','lien_class')";
347        return $p;
348}
349
350
351// Sécurité
352if (!defined("_ECRIRE_INC_VERSION")) return;
353
354// Filtre media_generer_vignette pour générer une vignette automatique à partir du fichier
355// Recherche l'existence d'un filtre media_generer_vignette_ext et renvoie le résultat de ce filtre, sinon rien
356// media_generer_vignette_ext doit renvoyer l'url de la vignette
357function filtre_media_generer_vignette_dist($fichier,$ext) {
358        $f = charger_fonction('media_generer_vignette_'.$ext,'filtre',true);
359        if ($f)
360                return $f($fichier);
361        else
362                return '';
363}
364
365// Pour les images jpg, png et gif, on renvoie simplement $fichier
366// Le redimensionnement est assuré par le paramètre taille transmis aux modèles <media>
367function filtre_media_generer_vignette_jpg_dist($fichier) {return $fichier;}
368function filtre_media_generer_vignette_png_dist($fichier) {return $fichier;}
369function filtre_media_generer_vignette_gif_dist($fichier) {return $fichier;}
370
371// Extrait le groupe du mime_type
372// utilisation [(#MIME_TYPE|groupe_mime)]
373function filtre_groupe_mime_dist($m) {
374        return substr($m,0,strpos($m,'/'));
375}
376
377?>
Note: See TracBrowser for help on using the repository browser.