source: spip-zone/_squelettes_/soyezcreateurs_net/plugins_1.9.3/plugins/__soyezcreateurs/public/composer.php @ 12874

Last change on this file since 12874 was 12874, checked in by real3t@…, 13 years ago

Suivre la SVN

Ajout de remarques # <sc> et # </sc> pour encadrer les modifications

File size: 17.9 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2007                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15include_spip("inc/indexation");
16include_spip('inc/texte');
17include_spip('inc/documents');
18include_spip('inc/forum');
19include_spip('inc/distant');
20include_spip('inc/rubriques'); # pour calcul_branche (cf critere branche)
21include_spip('public/debug'); # toujours prevoir le pire
22
23# Charge et retourne un composeur, i.e. la fonction principale d'un squelette
24# ou '' s'il est inconnu. Le compile au besoin
25# Charge egalement un fichier homonyme de celui du squelette
26# mais de suffixe '_fonctions.php' pouvant contenir:
27# 1. des filtres
28# 2. des fonctions de traduction de balise, de critere et de boucle
29# 3. des declaration de tables SQL supplementaires
30# Toutefois pour 2. et 3. preferer la technique de la surcharge
31
32// http://doc.spip.org/@public_composer_dist
33function public_composer_dist($squelette, $mime_type, $gram, $sourcefile) {
34
35        $nom = $mime_type . '_' . md5($squelette);
36
37        // si squelette est deja en memoire (INCLURE  a repetition)
38        if (function_exists($nom))
39                return $nom;
40
41        $phpfile = sous_repertoire(_DIR_SKELS,'',false,true) . $nom . '.php';
42
43        // si squelette est deja compile et perenne, le charger
44        if (!squelette_obsolete($phpfile, $sourcefile)
45        AND lire_fichier ($phpfile, $contenu,
46        array('critique' => 'oui', 'phpcheck' => 'oui'))) 
47                eval('?'.'>'.$contenu);
48
49        if (@file_exists($fonc = $squelette . '_fonctions'.'.php')
50        OR @file_exists($fonc = $squelette . '_fonctions'.'.php3')) {
51                include_once $fonc;
52        }
53
54        // tester si le eval ci-dessus a mis le squelette en memoire
55
56        if (function_exists($nom)) return $nom;
57
58        // charger le source, si possible, et compiler
59        if (lire_fichier ($sourcefile, $skel)) {
60                $compiler = charger_fonction('compiler', 'public');
61                $skel_code = $compiler($skel, $nom, $gram, $sourcefile);
62        }
63
64        // Tester si le compilateur renvoie une erreur
65        if (is_array($skel_code))
66                erreur_squelette($skel_code[0], $skel_code[1]);
67        else {
68                if ($GLOBALS['var_mode'] == 'debug') {
69                        debug_dumpfile ($skel_code, $nom, 'code');
70                }
71                eval('?'.'>'.$skel_code);
72                if (function_exists($nom)) {
73                        ecrire_fichier ($phpfile, $skel_code);
74                        return $nom;
75                } else {
76                        erreur_squelette(_T('zbug_erreur_compilation'), $sourcefile);
77                }
78        }
79}
80
81// Le squelette compile est-il trop vieux ?
82// http://doc.spip.org/@squelette_obsolete
83function squelette_obsolete($skel, $squelette) {
84        return (
85                in_array($GLOBALS['var_mode'], array('recalcul','preview','debug'))
86                OR !@file_exists($skel)
87                OR ((@file_exists($squelette)?@filemtime($squelette):0)
88                        > ($date = @filemtime($skel)))
89                OR (
90                        (@file_exists($fonc = 'mes_fonctions.php')
91                        OR @file_exists($fonc = 'mes_fonctions.php3'))
92                        AND @filemtime($fonc) > $date) # compatibilite
93                OR (defined('_FILE_OPTIONS') AND @filemtime(_FILE_OPTIONS) > $date)
94        );
95}
96
97//
98// Des fonctions diverses utilisees lors du calcul d'une page ; ces fonctions
99// bien pratiques n'ont guere de logique organisationnelle ; elles sont
100// appelees par certaines balises au moment du calcul des pages. (Peut-on
101// trouver un modele de donnees qui les associe physiquement au fichier
102// definissant leur balise ???
103//
104
105// Pour les documents comme pour les logos, le filtre |fichier donne
106// le chemin du fichier apres 'IMG/' ;  peut-etre pas d'une purete
107// remarquable, mais a conserver pour compatibilite ascendante.
108// -> http://www.spip.net/fr_article901.html
109
110
111// Renvoie le code html pour afficher un logo, avec ou sans survol, lien, etc.
112
113// http://doc.spip.org/@affiche_logos
114function affiche_logos($logos, $lien, $align) {
115
116        list ($arton, $artoff) = $logos;
117
118        if (!$arton) return $artoff;
119
120# <sc>
121        if (strpos($arton, 'swf')) {
122                include_spip('inc/swfheader');
123                $swf = new swfheader();
124                $swf->loadswf($arton);
125                if ($swf->valid) {
126                        $width = $swf->width;
127                        $height = $swf->height;
128                        return "<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'
129          codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0'
130          width='$width' height='$height' type='application/x-shockwave-flash'>
131          <param name='movie' value='$arton' />
132          <param name='quality' value='high' />
133          <!--[if !IE]>-->
134          <object type='application/x-shockwave-flash'
135                data='$arton'
136                width='$width' height='$height'>
137                <param name='movie' value='$arton' />
138                <param name='quality' value='high' />
139          </object>
140          <!--<![endif]-->
141        </object>";
142                } else {
143                        return $arton;
144                }
145        } else {
146# </sc>
147                if ($taille = @getimagesize($arton)) {
148                        $taille = " ".$taille[3];
149                }
150
151                if ($artoff)
152                        $artoff = " onmouseover=\"this.src='$artoff'\" "
153                                ."onmouseout=\"this.src='$arton'\"";
154
155                $milieu = "<img src=\"$arton\" alt=\"\""
156                        . ($align ? " align=\"$align\"" : '')
157                        . $taille
158                        . $artoff
159                        . ' class="spip_logos" />';
160
161                return (!$lien ? $milieu :
162                        ('<a href="' .
163                         quote_amp($lien) .
164                        '">' .
165                        $milieu .
166                        '</a>'));
167        }
168# <sc>
169}
170# </sc>
171
172//
173// Retrouver le logo d'un objet (et son survol)
174//
175
176// http://doc.spip.org/@calcule_logo
177function calcule_logo($type, $onoff, $id, $id_rubrique, $flag_fichier) {
178        $chercher_logo = charger_fonction('chercher_logo', 'inc');
179        $nom = strtolower($onoff);
180
181        while (1) {
182                $on = $chercher_logo($id, $type, $nom);
183                if ($on) {
184                        if ($flag_fichier)
185                          return  (array('', "$on[2].$on[3]"));
186                        else {
187                                $off = ($onoff != 'ON') ? '' :
188                                        $chercher_logo($id, $type, 'off');
189                                return array ($on[0], ($off ? $off[0] : ''));
190                        }
191                }
192                else if ($id_rubrique) {
193                        $type = 'id_rubrique';
194                        $id = $id_rubrique;
195                        $id_rubrique = 0;
196                } else if ($id AND $type == 'id_rubrique')
197                        $id = sql_parent($id);
198                else return array('','');
199        }
200}
201
202//
203// fonction standard de calcul de la balise #INTRODUCTION
204// on peut la surcharger en definissant dans mes_fonctions :
205// function introduction($type,$texte,$chapo,$descriptif) {...}
206//
207// http://doc.spip.org/@calcul_introduction
208function calcul_introduction ($type, $texte, $chapo='', $descriptif='') {
209        if (function_exists("introduction"))
210                return introduction ($type, $texte, $chapo, $descriptif);
211
212        define('_INTRODUCTION_SUITE', '&nbsp;(...)');
213
214        switch ($type) {
215                case 'articles':
216                        # si descriptif contient juste des espaces ca produit une intro vide,
217                        # c'est une fonctionnalite, pas un bug
218                        if (strlen($descriptif))
219                                return propre($descriptif);
220                        else if (substr($chapo, 0, 1) == '=')   // article virtuel
221                                return '';
222                        else
223                                return PtoBR(propre(supprimer_tags(couper_intro($chapo."\n\n\n".$texte, 500, _INTRODUCTION_SUITE))));
224                        break;
225                case 'breves':
226                        return PtoBR(propre(supprimer_tags(couper_intro($texte, 300, _INTRODUCTION_SUITE))));
227                        break;
228                case 'forums':
229                        return PtoBR(propre(supprimer_tags(couper_intro($texte, 600, _INTRODUCTION_SUITE))));
230                        break;
231                case 'rubriques':
232                        if (strlen($descriptif))
233                                return propre($descriptif);
234                        else
235                                return PtoBR(propre(supprimer_tags(couper_intro($texte, 600, _INTRODUCTION_SUITE))));
236                        break;
237        }
238}
239
240
241//
242// Balises dynamiques
243//
244
245// elles sont traitees comme des inclusions
246// http://doc.spip.org/@synthetiser_balise_dynamique
247function synthetiser_balise_dynamique($nom, $args, $file, $lang, $ligne) {
248        return
249                ('<'.'?php
250$lang_select = lang_select("'.$lang.'");
251include_once(_DIR_RACINE . "'
252                . $file
253                . '");
254inclure_balise_dynamique(balise_'
255                . $nom
256                . '_dyn('
257                . join(", ", array_map('argumenter_squelette', $args))
258                . '),1, '
259                . $ligne
260                . ');
261if ($lang_select) lang_select();
262?'
263                .">");
264}
265// http://doc.spip.org/@argumenter_squelette
266function argumenter_squelette($v) {
267
268        if (!is_array($v))
269                return "'" . texte_script($v) . "'";
270        else  return 'array(' . join(", ", array_map('argumenter_squelette', $v)) . ')';
271}
272
273// verifier leurs arguments et filtres, et calculer le code a inclure
274// http://doc.spip.org/@executer_balise_dynamique
275function executer_balise_dynamique($nom, $args, $filtres, $lang, $ligne) {
276        if (!$file = include_spip('balise/' . strtolower($nom)))
277                die ("pas de balise dynamique pour #". strtolower($nom)." !");
278
279        // Y a-t-il une fonction de traitement filtres-arguments ?
280        $f = 'balise_' . $nom . '_stat';
281        if (function_exists($f))
282                $r = $f($args, $filtres);
283        else
284                $r = $args;
285        if (!is_array($r))
286                return $r;
287        else {
288                if (!_DIR_RESTREINT) 
289                        $file = _DIR_RESTREINT_ABS . $file;
290                return synthetiser_balise_dynamique($nom, $r, $file, $lang, $ligne);
291}
292}
293
294
295//
296// FONCTIONS FAISANT DES APPELS SQL
297//
298
299# NB : a l'exception des fonctions pour les balises dynamiques
300
301// http://doc.spip.org/@calculer_hierarchie
302function calculer_hierarchie($id_rubrique, $exclure_feuille = false) {
303
304        if (!$id_rubrique = intval($id_rubrique))
305                return '0';
306
307        $hierarchie = array();
308
309        if (!$exclure_feuille)
310                $hierarchie[] = $id_rubrique;
311
312        while ($id_rubrique = sql_parent($id_rubrique))
313                array_unshift($hierarchie, $id_rubrique);
314
315        if (count($hierarchie))
316                return join(',', $hierarchie);
317        else
318                return '0';
319}
320
321
322// http://doc.spip.org/@calcul_exposer
323function calcul_exposer ($id, $type, $reference) {
324        static $exposer;
325        static $ref_precedente;
326
327        // Que faut-il exposer ? Tous les elements de $reference
328        // ainsi que leur hierarchie ; on ne fait donc ce calcul
329        // qu'une fois (par squelette) et on conserve le resultat
330        // en static.
331        if ($reference<>$ref_precedente) {
332                $ref_precedente = $reference;
333
334                $exposer = array();
335                foreach ($reference as $element=>$id_element) {
336                        if ($element == 'id_secteur') $element = 'id_rubrique';
337                        if ($x = table_from_primary($element)) {
338                                list($table,$hierarchie) = $x;
339                                $exposer[$element][$id_element] = true;
340                                if ($hierarchie) {
341                                         $row = spip_abstract_fetsel(array('id_rubrique'), array($table), array("$element=$id_element"));
342                                        $hierarchie = calculer_hierarchie($row['id_rubrique']);
343                                foreach (split(',',$hierarchie) as $id_rubrique)
344                                        $exposer['id_rubrique'][$id_rubrique] = true;
345                                }
346                        }
347                }
348        }
349
350        // And the winner is...
351        return isset($exposer[$type]) ? isset($exposer[$type][$id]) : '';
352}
353
354// http://doc.spip.org/@lister_objets_avec_logos
355function lister_objets_avec_logos ($type) {
356        global $formats_logos;
357        $logos = array();
358        $chercher_logo = charger_fonction('chercher_logo', 'inc');
359        $type = '/'
360        . type_du_logo($type)
361        . "on(\d+)\.("
362        . join('|',$formats_logos)
363        . ")$/";
364
365        if ($d = @opendir(_DIR_LOGOS)) {
366                while($f = readdir($d)) {
367                        if (preg_match($type, $f, $r))
368                                $logos[] = $r[1];
369                }
370        }
371        @closedir($d);
372        return join(',',$logos);
373}
374
375// http://doc.spip.org/@table_from_primary
376function table_from_primary($id) {
377        global $tables_principales;
378        include_spip('base/serial');
379        foreach ($tables_principales as $k => $v) {
380                if ($v['key']['PRIMARY KEY'] == $id)
381                        return array($k, array_key_exists('id_rubrique', $v['field']));
382        }
383        return '';
384}
385
386// fonction appelee par la balise #LOGO_DOCUMENT
387// http://doc.spip.org/@calcule_logo_document
388function calcule_logo_document($id_document, $doubdoc, &$doublons, $flag_fichier, $lien, $align, $params) {
389        include_spip('inc/documents');
390
391        if (!$id_document) return '';
392        if ($doubdoc) $doublons["documents"] .= ','.$id_document;
393
394        if (!($row = spip_abstract_select(array('extension', 'id_vignette', 'fichier', 'mode'), array('spip_documents'), array("id_document = $id_document"))))
395                // pas de document. Ne devrait pas arriver
396                return ''; 
397
398        $row = spip_abstract_fetch($row);
399        $extension = $row['extension'];
400        $id_vignette = $row['id_vignette'];
401        $fichier = get_spip_doc($row['fichier']);
402        $mode = $row['mode'];
403
404        // Y a t il une vignette personnalisee ?
405        if ($id_vignette) {
406                if ($res = spip_abstract_select(array('fichier'),
407                                array('spip_documents'),
408                                array("id_document = $id_vignette"))) {
409                        $vignette = spip_abstract_fetch($res);
410                        if (@file_exists(get_spip_doc($vignette['fichier'])))
411                                $logo = generer_url_document($id_vignette);
412                }
413        } else if ($mode == 'vignette') {
414                $logo = generer_url_document($id_document);
415                if (!@file_exists($logo))
416                        $logo = '';
417        }
418
419        // taille maximum [(#LOGO_DOCUMENT{300,52})]
420        if ($params
421        AND preg_match('/{\s*(\d+),\s*(\d+)\s*}/', $params, $r)) {
422                $x = intval($r[1]);
423                $y = intval($r[2]);
424        }
425
426        // Retrouver le type mime
427        $ex = spip_abstract_fetch(spip_abstract_select(
428                array('mime_type'),
429                array('spip_types_documents'),
430                array("extension = " . _q($extension))));
431        $mime = $ex['mime_type'];
432
433        if ($logo AND @file_exists($logo)) {
434                if ($x OR $y)
435                        $logo = reduire_image($logo, $x, $y);
436                else {
437                        $size = @getimagesize($logo);
438                        $logo = "<img src='$logo' ".$size[3]." />";
439                }
440        }
441        else {
442                // Pas de vignette, mais un fichier image -- creer la vignette
443                if (strpos($GLOBALS['meta']['formats_graphiques'], $extension)!==false) {
444                  if ($img = _DIR_RACINE.copie_locale($fichier)
445                        AND @file_exists($img)) {
446                                if (!$x AND !$y) {
447                                        $logo = reduire_image($img);
448                                } else {
449                                        # eviter une double reduction
450                                        $size = @getimagesize($img);
451                                        $logo = "<img src='$img' ".$size[3]." />";
452                                }
453                        }
454                }
455
456                // Document sans vignette ni image : vignette par defaut
457                if (!$logo) {
458                        $img = vignette_par_defaut($extension, false);
459                        $size = @getimagesize($img);
460                        $logo = "<img src='$img' ".$size[3]." />";
461                }
462        }
463
464        // Reduire si une taille precise est demandee
465        if ($x OR $y)
466                $logo = reduire_image($logo, $x, $y);
467
468        // flag_fichier : seul le fichier est demande
469        if ($flag_fichier)
470                return set_spip_doc(extraire_attribut($logo, 'src'));
471
472        // Calculer le code html complet (cf. calcule_logo)
473        $logo = inserer_attribut($logo, 'alt', '');
474        $logo = inserer_attribut($logo, 'class', 'spip_logos');
475        if ($align)
476                $logo = inserer_attribut($logo, 'align', $align);
477
478        if ($lien)
479                $logo = "<a href='$lien' type='$mime'>$logo</a>";
480
481        return $logo;
482}
483
484
485// les balises dynamiques et EMBED ont des filtres sans arguments
486// car en fait ce sont des arguments pas des filtres.
487// Si le besoin s'en fait sentir, il faudra recuperer la 2e moitie du tableau
488
489// http://doc.spip.org/@argumenter_balise
490function argumenter_balise($fonctions, $sep) {
491  $res = array();
492  if ($fonctions)
493                foreach ($fonctions as $f)
494                        $res[] = str_replace('\'', '\\\'', str_replace('\\', '\\\\',$f[0]));
495  return ("'" . join($sep, $res) . "'");
496}
497
498// fonction appelee par la balise #NOTES
499// http://doc.spip.org/@calculer_notes
500function calculer_notes() {
501        if (!isset($GLOBALS["les_notes"])) return '';
502        if ($r = $GLOBALS["les_notes"]) {
503        $GLOBALS["les_notes"] = "";
504        $GLOBALS["compt_note"] = 0;
505        $GLOBALS["marqueur_notes"] ++;
506        }
507        return $r;
508}
509
510// Renvoie le titre du "lien hypertexte"
511// http://doc.spip.org/@construire_titre_lien
512function construire_titre_lien($nom,$url) {
513        return typo(supprimer_numero(calculer_url($url, $nom, 'titre')));
514}
515
516// Ajouter "&lang=..." si la langue de base n'est pas celle du site
517// http://doc.spip.org/@lang_parametres_forum
518function lang_parametres_forum($s) {
519        // ne pas se fatiguer si le site est unilingue (plus rapide)
520        if (strstr($GLOBALS['meta']['langues_utilisees'], ',')
521        // chercher l'identifiant qui nous donnera la langue
522        AND preg_match(',(id_(article|breve|rubrique|syndic)=([0-9]+)),', $s, $r)){
523                $lang = spip_abstract_fetsel(array('lang'),
524                                           array("spip_" . $r[2] .'s'),
525                                           array($r[1]));
526
527        // Si ce n'est pas la meme que celle du site, l'ajouter aux parametres
528                if ($lang['lang'] AND $lang['lang'] <> $GLOBALS['meta']['langue_site'])
529                        return "$s&lang=" . $lang['lang'];
530        }
531
532        return $s;
533}
534
535// La fonction presente dans les squelettes compiles
536
537// http://doc.spip.org/@spip_optim_select
538function spip_optim_select ($select = array(), $from = array(), 
539                            $where = array(), $join=array(),
540                            $groupby = '', $orderby = array(), $limit = '',
541                            $sousrequete = '', $having = array(),
542                            $table = '', $id = '', $serveur='') {
543
544// retirer les criteres vides:
545// {X ?} avec X absent de l'URL
546// {par #ENV{X}} avec X absent de l'URL
547// IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil)
548
549        $menage = false;
550        foreach($where as $k => $v) { 
551                if ((!$v) OR ($v==1) OR ($v=='0=0')) {
552                        unset($where[$k]);
553                        $menage = true;
554                }
555        }
556
557        foreach($having as $k => $v) { 
558                if ((!$v) OR ($v==1) OR ($v=='0=0')) {
559                        unset($having[$k]);
560                }
561        }
562
563// Installer les jointures.
564// Retirer celles seulement utiles aux criteres finalement absents mais
565// parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln
566// si elle est seulement utile a Ln+1 elle meme inutile
567       
568        for($k = count($join); $k > 0; $k--) {
569                list($t,$c) = $join[$k];
570                $cle = "L$k";
571                if (!$menage
572                OR spip_optim_joint($cle, $select)
573                OR spip_optim_joint($cle, $join)
574                OR spip_optim_joint($cle, $where))
575                        $where[]= "$t.$c=$cle.$c";
576                else { unset($from[$cle]); unset($join[$k]);}
577        }
578
579        return spip_abstract_select($select, $from, $where,
580                  $groupby, array_filter($orderby), $limit,
581                  $sousrequete, $having,
582                  $table, $id, $serveur);
583
584}
585
586//condition suffisante (mais non necessaire) pour qu'une jointure soit inutile
587
588// http://doc.spip.org/@spip_optim_joint
589function spip_optim_joint($cle, $exp)
590{
591        if (!is_array($exp))
592                return  (strpos($exp, "$cle.") === false) ? false : true;
593        else {
594                foreach($exp as $v) {
595                        if (spip_optim_joint($cle, $v)) return true;
596                }
597                return false;
598        }
599}
600?>
Note: See TracBrowser for help on using the repository browser.