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

Last change on this file since 114515 was 114515, checked in by pierrekuhn82@…, 6 months ago

Version 1.4.9 : Notice en moins

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