source: spip-zone/_plugins_/modeles_media/media_balises.php @ 47874

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

Traiter les liens de la forme [->media12]

Pouvoir préciser une taille en %

File size: 12.9 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        $p->code = "calculer_balise_MEDIA_LEGENDE($conteneur,$width,$sql_id_document,$sql_titre,$sql_descriptif,$sql_credits,$sql_type,$sql_poids,\$Pile[0]['legende'],\$Pile[0]['titre'],\$Pile[0]['descriptif'],\$Pile[0]['credits'],\$Pile[0]['type'],\$Pile[0]['poids'])";
21        return $p;
22}
23
24function calculer_balise_MEDIA_LEGENDE($conteneur,$width,$sql_id_document,$sql_titre,$sql_descriptif,$sql_credits,$sql_type,$sql_poids,$env_legende,$env_titre,$env_descriptif,$env_credits,$env_type,$env_poids){
25        $ret = '';
26        // Doit-on afficher une légende ?
27        if ($env_legende || $env_titre || $env_descriptif || $env_credits || $env_poids || $env_type) {
28                $media_largeur_max_legende = isset($GLOBALS['meta']['media_largeur_max_legende']) ? $GLOBALS['meta']['media_largeur_max_legende'] : 120;
29                $media_largeur_min_legende = isset($GLOBALS['meta']['media_largeur_min_legende']) ? $GLOBALS['meta']['media_largeur_min_legende'] : 350;
30                $width = is_numeric($width) ? min($media_largeur_max_legende,max($media_largeur_min_legende,intval($width))) : $media_largeur_max_legende;
31                // Y a-t-il un modèle légende à utiliser ?
32                if ($env_legende && find_in_path('modeles/legende_'.$env_legende.'.html')) {
33                        $ret = recuperer_fond('modeles/legende_'.$env_legende,array(
34                                'id' => $sql_id_document,
35                                'titre' => $env_titre,
36                                'descriptif' => $env_descriptif,
37                                'credits' => $env_credits,
38                                'type' => $env_type,
39                                'poids' => $env_poids,
40                                'width' => $width,
41                                'conteneur' => $conteneur
42                        ));
43                } else {
44                        $width = is_numeric($width) ? 'width: '.intval($width).'px;' : '';
45                        $dt = $conteneur=='dl' ? 'dt' : 'div';
46                        $dd = $conteneur=='dl' ? 'dd' : 'div';
47                        // Titre
48                        if ($env_titre && $env_titre!='titre') {
49                                $titre = typo($env_titre);
50                                $crayons_titre = '';
51                        } elseif ($env_titre=='titre' || $env_legende) {
52                                $titre = typo(supprimer_numero($sql_titre));
53                                $crayons_titre = defined('_DIR_PLUGIN_CRAYONS') ? ' crayon document-titre-'.$sql_id_document : '';
54                        } else {
55                                $titre = '';
56                                $crayons_titre = '';
57                        }
58                        // Descriptif
59                        if ($env_descriptif && $env_descriptif!='descriptif') {
60                                $descriptif = propre($env_descriptif);
61                                $crayons_descriptif = '';
62                        } elseif ($env_descriptif=='descriptif' || $env_legende) {
63                                $descriptif = propre($sql_descriptif);
64                                $crayons_descriptif = defined('_DIR_PLUGIN_CRAYONS') ? ' crayon document-descriptif-'.$sql_id_document : '';
65                        } else {
66                                $descriptif = '';
67                                $crayons_descriptif = '';
68                        }
69                        // Notes
70                        $notes = calculer_notes();
71                        if ($notes)
72                                $notes = '<p class="notes">'.PtoBR($notes).'</p>';
73                        // Crédits
74                        if ($env_credits && $env_credits!='credits') {
75                                $credits = typo($env_credits);
76                                $crayons_credits = '';
77                        } elseif ($env_credits=='credits' || $env_legende=='complete') {
78                                $credits = typo($sql_credits);
79                                $crayons_credits = defined('_DIR_PLUGIN_CRAYONS') && defined('_DIR_PLUGIN_MEDIAS') ? ' crayon document-credits-'.$sql_id_document : '';
80                        } else {
81                                $credits = '';
82                                $crayons_credits = '';
83                        }
84                        // Type de document
85                        if ($env_type && $env_type!='type') 
86                                $type = typo($env_type);
87                        elseif ($env_type=='type' || $env_legende=='complete')
88                                $type = typo($sql_type);
89                        else
90                                $type = '';
91                        // Poids du document
92                        if ($env_poids || $env_legende=='complete')
93                                $poids = taille_en_octets($sql_poids);
94                        else
95                                $poids = '';
96                        if ($type && $poids)
97                                $poids = ' - '.$poids;
98                       
99                        if ($titre)
100                                $ret .= "<$dt class='spip_doc_titre$crayons_titre' style='$width'><strong>$titre</strong></$dt>";
101                        if ($descriptif)
102                                $ret .= "<$dd class='spip_doc_descriptif$crayons_descriptif' style='$width'>".PtoBR($descriptif).$notes."</$dd>";
103                        if ($credits)
104                                $ret .= "<$dd class='spip_doc_credits$crayons_credits' style='$width'>"._T('media:credits')." <span class='credit'>$credits</span></$dd>";
105                        if ($type || $poids)
106                                $ret .= "<$dd class='spip_doc_infos' style='$width'>$type$poids</$dd>";
107                }
108        }
109        return $ret;
110}
111
112// Renvoie un espace si on doit afficher une légende
113// Rien sinon
114// Balise placée dans une boucle DOCUMENTS et appelée dans un modèle <media>
115function balise_MEDIA_AFFICHER_LEGENDE_dist($p) {
116        $conteneur = interprete_argument_balise(1,$p);
117        $p->code = "\$Pile[0]['legende'] || \$Pile[0]['titre'] || \$Pile[0]['descriptif'] || \$Pile[0]['credits'] || \$Pile[0]['type'] || \$Pile[0]['poids'] ? ' ' : ''";
118        return $p;
119}
120
121// Renvoie le fichier d'une image retaillée selon les paramètres passés au modèle
122// Balise placée dans une boucle DOCUMENTS et appelée dans un modèle <media>
123// Les paramètres taille, hauteur, largeur, alt et titre sont récupérés dans l'environnement.
124// Exemple de syntaxe :
125// #MEDIA_IMAGE_RETAILLEE{#LOGO_DOCUMENT} ou #MEDIA_IMAGE_RETAILLEE{#URL_DOCUMENT}
126function balise_MEDIA_IMAGE_RETAILLEE_dist($p) {
127        $image = interprete_argument_balise(1,$p);
128        $sql_titre = champ_sql('titre', $p);
129        $sql_type = champ_sql('type_document', $p);
130        $sql_poids = champ_sql('taille', $p);
131        $p->code = "calculer_balise_MEDIA_IMAGE_RETAILLEE($image,\$Pile[0]['taille'],\$Pile[0]['hauteur'],\$Pile[0]['largeur'],\$Pile[0]['alt'],\$Pile[0]['titre'],$sql_titre,$sql_type,$sql_poids)";
132        return $p;
133}
134
135function calculer_balise_MEDIA_IMAGE_RETAILLEE($image,$taille,$hauteur,$largeur,$alt,$titre,$sql_titre,$sql_type,$sql_poids){
136        $src = extraire_attribut($image, 'src');
137        if (!$src)
138                $src = $image;
139        list($width, $height) = getimagesize($src);
140        // hauteur du redimensionnement
141        if (is_numeric($hauteur) && intval($hauteur)>0)
142                $hauteur = intval($hauteur);
143        elseif (in_array($taille,array('icone','petit','moyen','grand')))
144                $hauteur = $GLOBALS['meta']['media_taille_'.$taille.'_hauteur'];
145        elseif (is_numeric($taille) && intval($taille)>0)
146                $hauteur = intval($taille);
147        else
148                $hauteur = 100000;
149        // largeur du redimensionnement
150        if (is_numeric($largeur) && intval($largeur)>0)
151                $largeur = intval($largeur);
152        elseif (in_array($taille,array('icone','petit','moyen','grand')))
153                $largeur = $GLOBALS['meta']['media_taille_'.$taille.'_largeur'];
154        elseif (is_numeric($taille) && intval($taille)>0)
155                $largeur = intval($taille);
156        else
157                $largeur = 100000;
158        // Doit-on redimensionner ?
159        if ($height > $hauteur || $width > $largeur) {
160                include_spip('inc/filtres_images_mini');
161                $img = image_reduire($src,$largeur,$hauteur);
162                }
163        else
164                $img = "<img src=\"$src\" style=\"height: $height px; width: $width px;\" height=\"$height\" width=\"$width\" />";
165        // Ajouter une alternative
166        // Variable alt si transmise, sinon le titre du document, sinon type et poids
167        if ($alt)
168                $alternative = typo($alt);
169        elseif ($titre && $titre!='titre')
170                $alternative = typo($titre);
171        elseif ($sql_titre)
172                $alternative = typo($sql_titre);
173        else
174                $alternative = typo($sql_type).' - '.taille_en_octets($sql_poids);
175        $img = inserer_attribut($img,'alt',$alternative);
176        return $img;
177}
178
179// Calcule le lien, si lien demandé, sur le document
180// Balise placée dans une boucle DOCUMENTS et appelée dans un modèle <media>
181// Les paramètres lien, titre_lien et sont récupérés dans l'environnement.
182// Exemple de syntaxe :
183// #MEDIA_LIEN{#LOGO_DOCUMENT} ou #MEDIA_LIEN{#MEDIA_IMAGE_RETAILLEE{#LOGO_DOCUMENT}}
184function balise_MEDIA_LIEN_dist($p) {
185        $objet = interprete_argument_balise(1,$p);
186        $forcer_lien = interprete_argument_balise(2,$p);
187        $forcer_lien = is_null($forcer_lien) ? "''" : $forcer_lien;
188        $id_document = champ_sql('id_document', $p);
189        $p->code = "calculer_balise_MEDIA_LIEN($objet,$forcer_lien,$id_document,\$Pile[0]['lien'],\$Pile[0]['titre_lien'],\$Pile[0]['titre'])";
190        return $p;
191}
192
193function calculer_balise_MEDIA_LIEN($objet,$forcer_lien,$id_document,$lien,$titre_lien,$titre) {
194        // A-t-on demandé un lien
195        if (!$lien && !$forcer_lien)
196                return $objet;
197        // Si lien non spécifique, on pointe sur le document
198        if ($lien=='lien' || !$lien) {
199                $lien = 'doc'.$id_document;
200                // 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
201                if (!$titre_lien && $titre && $titre!='titre')
202                        $titre_lien = $titre;
203        }
204        $l = calculer_url($lien, $titre_lien, 'tout');
205        if (!$l['url'])
206                return $object;
207        $a = '<a href="'.$l['url'].'"';
208        $a .= $l['class'] ? ' class="'.$l['class'].'"' : '';
209        $a .= $l['titre'] ? ' title="'.attribut_html($l['titre']).'"' : '';
210        $a .= $l['lang'] ? ' hreflang="'.$l['lang'].'"' : '';
211        $a .= $l['mime'] ? ' type="'.$l['mime'].'"' : '';
212        $a .= '>';
213        return $a.$objet.'</a>';
214}
215
216// Renvoie la taille du fichier après redimensionnement si besoin
217// Balise placée dans une boucle DOCUMENTS et appelée dans un modèle <media>
218// Les paramètres taille, hauteur et largeur sont récupérés dans l'environnement.
219// Exemple de syntaxe :
220// #MEDIA_TAILLE{largeur} ou #MEDIA_TAILLE{hauteur}
221function balise_MEDIA_TAILLE_dist($p) {
222        $dim = interprete_argument_balise(1,$p);
223        $sql_largeur = champ_sql('largeur', $p);
224        $sql_hauteur = champ_sql('hauteur', $p);
225        $p->code = "calculer_balise_MEDIA_TAILLE($dim,\$Pile[0]['taille'],\$Pile[0]['hauteur'],\$Pile[0]['largeur'],$sql_largeur,$sql_hauteur)";
226        return $p;
227}
228
229function calculer_balise_MEDIA_TAILLE($dim,$taille,$hauteur,$largeur,$sql_largeur,$sql_hauteur){
230        $hauteur_defaut = array(
231                'icone' => 52,
232                'petit' => 90,
233                'moyen' => 240,
234                'grand' => 480
235        );
236        $largeur_defaut = array(
237                'icone' => 52,
238                'petit' => 120,
239                'moyen' => 320,
240                'grand' => 640
241        );
242        // Une taille par défaut si le document n'en n'a pas
243        if (!is_numeric($sql_hauteur) || intval($sql_hauteur)<=0)
244                $sql_hauteur = isset($GLOBALS['meta']['media_taille_grand_hauteur']) ? $GLOBALS['meta']['media_taille_grand_hauteur'] : 480;
245        if (!is_numeric($sql_largeur) || intval($sql_largeur)<=0)
246                $sql_largeur = isset($GLOBALS['meta']['media_taille_grand_largeur']) ? $GLOBALS['meta']['media_taille_grand_largeur'] : 640;
247        // Hauteur visée (on peut avoir passé une hauteur en %)
248        if (substr(trim($hauteur),-1)=='%')
249                $hauteur = trim($hauteur);
250        elseif (is_numeric($hauteur) && intval($hauteur)>0)
251                $hauteur = intval($hauteur);
252        elseif (in_array($taille,array('icone','petit','moyen','grand')) && isset($GLOBALS['meta']['media_taille_'.$taille.'_hauteur']))
253                $hauteur = $GLOBALS['meta']['media_taille_'.$taille.'_hauteur'];
254        elseif (in_array($taille,array('icone','petit','moyen','grand')))
255                $hauteur = $hauteur_defaut[$taille];
256        elseif (substr(trim($taille),-1)=='%')
257                $hauteur = trim($taille);
258        elseif (is_numeric($taille) && intval($taille)>0)
259                $hauteur = intval($taille);
260        else
261                $hauteur = $sql_hauteur;
262        // Largeur visée (on peut avoir passé une largeur en %)
263        if (substr(trim($largeur),-1)=='%')
264                $largeur = trim($largeur);
265        elseif (is_numeric($largeur) && intval($largeur)>0)
266                $largeur = intval($largeur);
267        elseif (in_array($taille,array('icone','petit','moyen','grand')) && isset($GLOBALS['meta']['media_taille_'.$taille.'_largeur']))
268                $largeur = $GLOBALS['meta']['media_taille_'.$taille.'_largeur'];
269        elseif (in_array($taille,array('icone','petit','moyen','grand')))
270                $largeur = $largeur_defaut[$taille];
271        elseif (substr(trim($taille),-1)=='%')
272                $hauteur = trim($taille);
273        elseif (is_numeric($taille) && intval($taille)>0)
274                $largeur = intval($taille);
275        else
276                $largeur = $sql_largeur;
277        // Doit-on redimensionner ? Si une deux dimensions est exprimée en %, on ne redimensionne pas.
278        if (substr($hauteur,-1)=='%' || substr($largeur,-1)=='%')
279                $t = array('largeur' => $largeur, 'hauteur' => $hauteur);
280        elseif ($sql_hauteur > $hauteur || $sql_largeur > $largeur) {
281                $ratio = max ($sql_hauteur/$hauteur,$sql_largeur/$largeur);
282                $t = array('largeur' => round($sql_largeur/$ratio), 'hauteur' => round($sql_hauteur/$ratio));
283        } else
284                $t = array('largeur' => $sql_largeur, 'hauteur' => $sql_hauteur);
285        return $dim ? $t[$dim] : $t;
286}
287
288// Renvoie un tableau des paramètres à ignorer à utiliser avec env_to_params et env_to_attribute
289// Exemple : [(#ENV*|env_to_attributs{#MEDIA_IGNORE_PARAMS})] ou [(#ENV*|env_to_params{#MEDIA_IGNORE_PARAMS})]
290function balise_MEDIA_IGNORE_PARAMS_dist($p) {
291        $p->code = "array('id_media', 'legende','titre','descriptif','credits','poids','type','taille','hauteur','largeur','class','lien','lien_class')";
292        return $p;
293}
294
295?>
Note: See TracBrowser for help on using the repository browser.