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

Last change on this file since 80112 was 80112, checked in by toutati@…, 7 years ago

oups, c'est mieux avec url_absolue !

File size: 14.8 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        if(preg_match('/[jpg|gif|png]\?/i',$src,$matches)){
160                $pos = strpos($src,'?');
161                $src = substr($src,0,$pos);
162        }
163       
164        $src = url_absolue($src);
165       
166        spip_log("src=$src","modeles_media");
167
168        list($width, $height) = getimagesize($src);
169        // hauteur du redimensionnement
170        if (is_numeric($hauteur) && intval($hauteur)>0)
171                $hauteur = intval($hauteur);
172        elseif (in_array($taille,array('icone','petit','moyen','grand')))
173                $hauteur = $GLOBALS['meta']['media_taille_'.$taille.'_hauteur'];
174        elseif (is_numeric($taille) && intval($taille)>0)
175                $hauteur = intval($taille);
176        else
177                $hauteur = 100000;
178        // largeur du redimensionnement
179        if (is_numeric($largeur) && intval($largeur)>0)
180                $largeur = intval($largeur);
181        elseif (in_array($taille,array('icone','petit','moyen','grand')))
182                $largeur = $GLOBALS['meta']['media_taille_'.$taille.'_largeur'];
183        elseif (is_numeric($taille) && intval($taille)>0)
184                $largeur = intval($taille);
185        else
186                $largeur = 100000;
187        // Doit-on redimensionner ?
188        if ($height > $hauteur || $width > $largeur) {
189                include_spip('inc/filtres_images_mini');
190                $img = image_reduire($src,$largeur,$hauteur);
191                }
192        else
193                $img = "<img src=\"$src\" style=\"height: $height"."px; width: $width"."px;\" height=\"$height\" width=\"$width\" />"; // Pas d'espace
194        // Ajouter une alternative
195        // Variable alt si transmise, sinon le titre du document, sinon type et poids
196        if ($alt)
197                $alternative = typo($alt);
198        elseif ($titre && $titre!='titre')
199                $alternative = typo($titre);
200        elseif ($sql_titre)
201                $alternative = typo($sql_titre);
202        else
203                $alternative = typo($sql_type).' - '.taille_en_octets($sql_poids);
204        $img = inserer_attribut($img,'alt',$alternative);
205        return $img;
206}
207
208// Calcule le lien, si lien demandé, sur le document
209// Balise placée dans une boucle DOCUMENTS et appelée dans un modèle <media>
210// Les paramètres lien, titre_lien et sont récupérés dans l'environnement.
211// Exemple de syntaxe :
212// #MEDIA_LIEN{#LOGO_DOCUMENT} ou #MEDIA_LIEN{#MEDIA_IMAGE_RETAILLEE{#LOGO_DOCUMENT}}
213function balise_MEDIA_LIEN_dist($p) {
214        $objet = interprete_argument_balise(1,$p);
215        $forcer_lien = interprete_argument_balise(2,$p);
216        $forcer_lien = is_null($forcer_lien) ? "''" : $forcer_lien;
217        $id_document = champ_sql('id_document', $p);
218        include_spip('balise/url_');
219        $url_document = generer_generer_url_arg('document', $p, $id_document);
220        $connect = '';
221        if (isset($p->boucles[$p->id_boucle]))
222                $connect = $p->boucles[$p->id_boucle]->sql_serveur;
223        $connect = _q($connect);
224        $p->code = "calculer_balise_MEDIA_LIEN($objet,$forcer_lien,$id_document,$url_document,\$Pile[0]['args'],$connect)";
225        return $p;
226}
227
228function calculer_balise_MEDIA_LIEN($objet,$forcer_lien,$id_document,$url_document,$args,$connect='') {
229        $lien = $args['lien'];
230        $titre_lien = $args['titre_lien'];
231        $titre = $args['titre'];
232       
233        // A-t-on demandé un lien
234        if (!$lien && !$forcer_lien)
235                return $objet;
236        // 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)
237        if ($lien=='lien' || !$lien) {
238                $lien = 'doc'.$id_document;
239                // 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
240                if (!$titre_lien && $titre && $titre!='titre')
241                        $titre_lien = $titre;
242                $l = calculer_url($lien, $titre_lien, 'tout', $connect);
243                $l['url'] = $url_document;
244        }
245        else $l = calculer_url($lien, $titre_lien, 'tout', $connect);
246       
247        if (!$l['url'])
248                return $object;
249        $a = '<a href="'.$l['url'].'"';
250        $a .= $l['class'] ? ' class="'.$l['class'].'"' : '';
251        $a .= $l['titre'] ? ' title="'.attribut_html($l['titre']).'"' : '';
252        $a .= $l['lang'] ? ' hreflang="'.$l['lang'].'"' : '';
253        $a .= $l['mime'] ? ' type="'.$l['mime'].'"' : '';
254        $a .= '>';
255        return $a.$objet.'</a>';
256}
257
258// Renvoie la taille du fichier après redimensionnement si besoin
259// Balise placée dans une boucle DOCUMENTS et appelée dans un modèle <media>
260// Les paramètres taille, hauteur et largeur sont récupérés dans l'environnement.
261// Exemple de syntaxe :
262// #MEDIA_TAILLE{largeur} ou #MEDIA_TAILLE{hauteur}
263function balise_MEDIA_TAILLE_dist($p) {
264        $dim = interprete_argument_balise(1,$p);
265        $sql_largeur = champ_sql('largeur', $p);
266        $sql_hauteur = champ_sql('hauteur', $p);
267        $p->code = "calculer_balise_MEDIA_TAILLE($dim,\$Pile[0]['args'],$sql_largeur,$sql_hauteur)";
268        return $p;
269}
270
271function calculer_balise_MEDIA_TAILLE($dim,$args,$sql_largeur,$sql_hauteur){
272        $taille = $args['taille'];
273        $hauteur = $args['hauteur'];
274        $largeur = $args['largeur'];
275       
276        $hauteur_defaut = array(
277                'icone' => 52,
278                'petit' => 90,
279                'moyen' => 240,
280                'grand' => 480
281        );
282        $largeur_defaut = array(
283                'icone' => 52,
284                'petit' => 120,
285                'moyen' => 320,
286                'grand' => 640
287        );
288        // Une taille par défaut si le document n'en n'a pas
289        if (!is_numeric($sql_hauteur) || intval($sql_hauteur)<=0)
290                $sql_hauteur = isset($GLOBALS['meta']['media_taille_grand_hauteur']) ? $GLOBALS['meta']['media_taille_grand_hauteur'] : 480;
291        if (!is_numeric($sql_largeur) || intval($sql_largeur)<=0)
292                $sql_largeur = isset($GLOBALS['meta']['media_taille_grand_largeur']) ? $GLOBALS['meta']['media_taille_grand_largeur'] : 640;
293        // Hauteur visée (on peut avoir passé une hauteur en %)
294        if (substr(trim($hauteur),-1)=='%')
295                $hauteur = trim($hauteur);
296        elseif (is_numeric($hauteur) && intval($hauteur)>0)
297                $hauteur = intval($hauteur);
298        elseif (in_array($taille,array('icone','petit','moyen','grand')) && isset($GLOBALS['meta']['media_taille_'.$taille.'_hauteur']))
299                $hauteur = $GLOBALS['meta']['media_taille_'.$taille.'_hauteur'];
300        elseif (in_array($taille,array('icone','petit','moyen','grand')))
301                $hauteur = $hauteur_defaut[$taille];
302        elseif (substr(trim($taille),-1)=='%')
303                $hauteur = trim($taille);
304        elseif (is_numeric($taille) && intval($taille)>0)
305                $hauteur = intval($taille);
306        else
307                $hauteur = $sql_hauteur;
308        // Largeur visée (on peut avoir passé une largeur en %)
309        if (substr(trim($largeur),-1)=='%')
310                $largeur = trim($largeur);
311        elseif (is_numeric($largeur) && intval($largeur)>0)
312                $largeur = intval($largeur);
313        elseif (in_array($taille,array('icone','petit','moyen','grand')) && isset($GLOBALS['meta']['media_taille_'.$taille.'_largeur']))
314                $largeur = $GLOBALS['meta']['media_taille_'.$taille.'_largeur'];
315        elseif (in_array($taille,array('icone','petit','moyen','grand')))
316                $largeur = $largeur_defaut[$taille];
317        elseif (substr(trim($taille),-1)=='%')
318                $hauteur = trim($taille);
319        elseif (is_numeric($taille) && intval($taille)>0)
320                $largeur = intval($taille);
321        else
322                $largeur = $sql_largeur;
323        // Doit-on redimensionner ? Si une deux dimensions est exprimée en %, on ne redimensionne pas.
324        if (substr($hauteur,-1)=='%' || substr($largeur,-1)=='%')
325                $t = array('largeur' => $largeur, 'hauteur' => $hauteur);
326        elseif ($sql_hauteur > $hauteur || $sql_largeur > $largeur) {
327                $ratio = max ($sql_hauteur/$hauteur,$sql_largeur/$largeur);
328                $t = array('largeur' => round($sql_largeur/$ratio), 'hauteur' => round($sql_hauteur/$ratio));
329        } else
330                $t = array('largeur' => $sql_largeur, 'hauteur' => $sql_hauteur);
331        return $dim ? $t[$dim] : $t;
332}
333
334// Renvoie un tableau des paramètres à ignorer à utiliser avec env_to_params et env_to_attribute
335// Exemple : [(#ENV*|env_to_attributs{#MEDIA_IGNORE_PARAMS})] ou [(#ENV*|env_to_params{#MEDIA_IGNORE_PARAMS})]
336function balise_MEDIA_IGNORE_PARAMS_dist($p) {
337        $p->code = "array('id_media', 'legende','titre','descriptif','credits','poids','type','taille','hauteur','largeur','class','lien','lien_class')";
338        return $p;
339}
340
341
342// Sécurité
343if (!defined("_ECRIRE_INC_VERSION")) return;
344
345// Filtre media_generer_vignette pour générer une vignette automatique à partir du fichier
346// Recherche l'existence d'un filtre media_generer_vignette_ext et renvoie le résultat de ce filtre, sinon rien
347// media_generer_vignette_ext doit renvoyer l'url de la vignette
348function filtre_media_generer_vignette_dist($fichier,$ext) {
349        $f = charger_fonction('media_generer_vignette_'.$ext,'filtre',true);
350        if ($f)
351                return $f($fichier);
352        else
353                return '';
354}
355
356// Pour les images jpg, png et gif, on renvoie simplement $fichier
357// Le redimensionnement est assuré par le paramètre taille transmis aux modèles <media>
358function filtre_media_generer_vignette_jpg_dist($fichier) {return $fichier;}
359function filtre_media_generer_vignette_png_dist($fichier) {return $fichier;}
360function filtre_media_generer_vignette_gif_dist($fichier) {return $fichier;}
361
362// Extrait le groupe du mime_type
363// utilisation [(#MIME_TYPE|groupe_mime)]
364function filtre_groupe_mime_dist($m) {
365        return substr($m,0,strpos($m,'/'));
366}
367
368?>
Note: See TracBrowser for help on using the repository browser.