Subversion Repositories Sites.tela-botanica.org

Rev

Blame | Last modification | View Log | RSS feed

<?php

/***************************************************************************\
 *  SPIP, Systeme de publication pour l'internet                           *
 *                                                                         *
 *  Copyright (c) 2001-2005                                                *
 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
 *                                                                         *
 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
\***************************************************************************/


//
// Des fonctions diverses utilisees lors du calcul d'une page ; ces fonctions
// bien pratiques n'ont guere de logique organisationnelle ; elles sont
// appelees par certaines balises au moment du calcul des pages. (Peut-on
// trouver un modele de donnees qui les associe physiquement au fichier
// definissant leur balise ???
//

// ON TROUVERA EN QUEUE DE FICHIER LES FONCTIONS FAISANT DES APPELS SQL


// Ce fichier ne sera execute qu'une fois
if (defined("_INC_CALCUL_OUTILS")) return;
define("_INC_CALCUL_OUTILS", "1");

// Pour les documents comme pour les logos, le filtre |fichier donne
// le chemin du fichier apres 'IMG/' ;  peut-etre pas d'une purete
// remarquable, mais a conserver pour compatibilite ascendante.
// -> http://www.spip.net/fr_article901.html
function calcule_fichier_logo($on) {
        $r = ereg_replace("^" . _DIR_IMG, "", $on);
        return $r;
}

// Renvoie le code html pour afficher un logo, avec ou sans survol, lien, etc.

function affiche_logos($logos, $lien, $align) {

        list ($arton, $artoff) = $logos;

        if (!$arton) return $artoff;

        if ($taille = @getimagesize($arton)) {
                $taille = " ".$taille[3];
        }

        if ($artoff)
                $mouseover = " onmouseover=\"this.src='$artoff'\" "
                        ."onmouseout=\"this.src='$arton'\"";

        $milieu = "<img src=\"$arton\" alt=\"\""
                . ($align ? " align='$align'" : '') 
                . $taille
                . $mouseover
                . " style='border-width: 0px;' class='spip_logos' />";

        return ($lien ? http_href($lien, $milieu) : $milieu);
}

//
// Retrouver le logo d'un objet (et son survol)
//

function calcule_logo($type, $onoff, $id, $id_rubrique, $ff) {
        include_ecrire('inc_logos.php3');

        $table_logos = array (
        'ARTICLE' => 'art',
        'AUTEUR' =>  'aut',
        'BREVE' =>  'breve',
        'MOT' => 'mot',
        'RUBRIQUE' => 'rub',
        'SITE' => 'site'
        );
        $type = $table_logos[$type];
        $nom = strtolower($onoff);
        # attention au cas $id = '0' pour LOGO_SITE_SPIP : utiliser intval()
        while (1) {
                $on = cherche_image_nommee($type . $nom . intval($id));
                if ($on) {
                        if ($ff)
                          return  (array('', "$on[1].$on[2]"));
                        else {
                                $off = ($onoff != 'ON') ? '' :
                                        cherche_image_nommee($type . 'off' . $id);
                                return array ("$on[0]$on[1].$on[2]",
                                              ($off ? ("$off[0]$off[1].$off[2]") : ''));
                        }
                }
                else if ($id_rubrique) {
                        $type = 'rub';
                        $id = $id_rubrique;
                        $id_rubrique = 0;
                } else if ($id AND $type == 'rub')
                        $id = sql_parent($id);
                else return array('','');
        }
}

//
// fonction standard de calcul de la balise #INTRODUCTION
// on peut la surcharger en definissant dans mes_fonctions.php3 :
// function introduction($type,$texte,$chapo,$descriptif) {...}
//
function calcul_introduction ($type, $texte, $chapo='', $descriptif='') {
        if (function_exists("introduction"))
                return introduction ($type, $texte, $chapo, $descriptif);

        switch ($type) {
                case 'articles':
                        if ($descriptif)
                                return propre($descriptif);
                        else if (substr($chapo, 0, 1) == '=')   // article virtuel
                                return '';
                        else
                                return PtoBR(propre(supprimer_tags(couper_intro($chapo."\n\n\n".$texte, 500))));
                        break;
                case 'breves':
                        return PtoBR(propre(supprimer_tags(couper_intro($texte, 300))));
                        break;
                case 'forums':
                        return PtoBR(propre(supprimer_tags(couper_intro($texte, 600))));
                        break;
                case 'rubriques':
                        if ($descriptif)
                                return propre($descriptif);
                        else
                                return PtoBR(propre(supprimer_tags(couper_intro($texte, 600))));
                        break;
        }
}


//
// Balises dynamiques
//

// elles sont traitees comme des inclusions
function synthetiser_balise_dynamique($nom, $args, $file, $lang, $ligne) {
 return 
                ('<'.'?php 
include_ecrire(\'inc_lang.php3\');
lang_select("'.$lang.'");
include_local("'
                . $file
                . '");
inclure_balise_dynamique(balise_'
                . $nom
                . '_dyn(\''
                . join("', '", array_map('texte_script', $args))
                . "'),1, $ligne);
lang_dselect();
?"
                .">");
}

// verifier leurs arguments et filtres, et calculer le code a inclure
function executer_balise_dynamique($nom, $args, $filtres, $lang, $ligne) {
        if ($file = find_in_path('inc-' . strtolower($nom) . _EXTENSION_PHP))
                include_local($file);
        else
                die ("pas de balise dynamique pour #". strtolower($nom)." !");

        // Y a-t-il une fonction de traitement filtres-arguments ?
        $f = 'balise_' . $nom . '_stat';
        if (function_exists($f))
                $r = $f($args, $filtres);
        else
                $r = $args;
        if (!is_array($r))
                return $r;
        else
          return synthetiser_balise_dynamique($nom, $r, $file, $lang, $ligne);
}


//
// FONCTIONS FAISANT DES APPELS SQL
//

# NB : a l'exception des fonctions pour les balises dynamiques

function calcul_exposer ($id, $type, $reference) {
        static $exposer;
        static $ref_precedente;

        // Que faut-il exposer ? Tous les elements de $reference
        // ainsi que leur hierarchie ; on ne fait donc ce calcul
        // qu'une fois (par squelette) et on conserve le resultat
        // en static.
        if ($reference<>$ref_precedente) {
                $ref_precedente = $reference;

                $exposer = array();
                foreach ($reference as $element=>$id_element) {
                        if ($element == 'id_secteur') $element = 'id_rubrique';
                        if ($x = table_from_primary($element)) {
                                list($table,$hierarchie) = $x;
                                $exposer[$element][$id_element] = true;
                                if ($hierarchie) {
                                        list ($id_rubrique) = spip_abstract_fetsel(
array('id_rubrique'), 
array($table),
array("$element=$id_element"));
                                $hierarchie = substr(calculer_hierarchie($id_rubrique), 2);
                                foreach (split(',',$hierarchie) as $id_rubrique)
                                        $exposer['id_rubrique'][$id_rubrique] = true;
                                }
                        }
                }
        }

        // And the winner is...
        return $exposer[$type][$id];
}

function table_from_primary($id) {
        global $tables_principales;
        include_ecrire('inc_serialbase.php3');
        foreach ($tables_principales as $k => $v) {
                if ($v['key']['PRIMARY KEY'] == $id)
                        return array($k, array_key_exists('id_rubrique', $v['field']));
        }
        return '';
}

function calcul_generation ($generation) {
        $lesfils = array();
        $result = spip_abstract_select(array('id_rubrique'),
                                array('spip_rubriques AS rubriques'),
                                array(calcul_mysql_in('id_parent', 
                                        $generation,
                                                      '')));
        while ($row = spip_abstract_fetch($result))
                $lesfils[] = $row['id_rubrique'];
        return join(",",$lesfils);
}

function calcul_branche ($generation) {
        if (!$generation) 
                return '0';
        else {
                $branche[] = $generation;
                while ($generation = calcul_generation ($generation))
                        $branche[] = $generation;
                return join(",",$branche);
        }
}

// fonction appelee par la balise #LOGO_DOCUMENT
function calcule_logo_document($id_document, $doubdoc, &$doublons, $flag_fichier, $lien, $align, $params) {
        if (!$id_document) return '';
        if ($doubdoc) $doublons["documents"] .= ','.$id_document;

        if (!($row = spip_abstract_select(array('id_type', 'id_vignette', 'fichier', 'mode'), array('spip_documents AS documents'), array("id_document = $id_document"))))
                // pas de document. Ne devrait pas arriver
                return ''; 

        list($id_type, $id_vignette, $fichier, $mode) = spip_abstract_fetch($row);

        // Lien par defaut = l'adresse du document
        ## if (!$lien) $lien = $fichier;

        // Y a t il une vignette personnalisee ?
        if ($id_vignette) {
                if ($res = spip_abstract_select(array('fichier'),
                array('spip_documents AS documents'),
                array("id_document = $id_vignette"))) {
                        list($vignette) = spip_abstract_fetch($res);
                        if (@file_exists($vignette))
                                $logo = generer_url_document($id_vignette);
                }
        } else if ($mode == 'vignette') {
                $logo = generer_url_document($id_document);
                if (!@file_exists($logo))
                        $logo = '';
        }

        // taille maximum [(#LOGO_DOCUMENT{300,52})]
        list($x,$y) = split(',', ereg_replace("[}{]", "", $params)); 


        if ($logo AND @file_exists($logo)) {
                if ($x OR $y)
                        $logo = reduire_image($logo, $x, $y);
                else {
                        $size = @getimagesize($logo);
                        $logo = "<img src='$logo' ".$size[3]." />";
                }
        }
        else {
                // Retrouver l'extension
                list($extension) =
                        spip_abstract_fetch(spip_abstract_select(array('extension'),
                        array('spip_types_documents AS documents'),
                        array("id_type = " . intval($id_type))));
                if (!$extension) $extension = 'txt';

                // Pas de vignette, mais un fichier image -- creer la vignette
                if (strstr(lire_meta('formats_graphiques'), $extension)) {
                        if ($img = copie_locale($fichier)
                        AND @file_exists($img)) {
                                if (!$x AND !$y) {
                                        $logo = reduire_image($img);
                                } else {
                                        # eviter une double reduction
                                        $size = @getimagesize($img);
                                        $logo = "<img src='$img' ".$size[3]." />";
                                }
                        }
                }

                // Document sans vignette ni image : vignette par defaut
                if (!$logo) {
                        $img = vignette_par_defaut($extension, false);
                        $size = @getimagesize($img);
                        $logo = "<img src='$img' ".$size[3]." />";
                }
        }

        // Reduire si une taille precise est demandee
        if ($x OR $y)
                $logo = reduire_image($logo, $x, $y);

        // flag_fichier : seul le fichier est demande
        if ($flag_fichier)
                # supprimer le IMG/
                return calcule_fichier_logo(extraire_attribut($logo, 'src'));


        // Calculer le code html complet (cf. calcule_logo)
        $logo = inserer_attribut($logo, 'alt', '');
        $logo = inserer_attribut($logo, 'style', 'border-width: 0px;');
        $logo = inserer_attribut($logo, 'class', 'spip_logos');
        if ($align)
                $logo = inserer_attribut($logo, 'align', $align);

        if ($lien)
                $logo = "<a href='$lien'>$logo</a>";

        return $logo;
}


// fonction appelee par la balise #EMBED
function calcule_embed_document($id_document, $filtres, &$doublons, $doubdoc) {
        if ($doubdoc && $id_document) $doublons["documents"] .= ', ' . $id_document;
        return embed_document($id_document, $filtres, false);
}

// les balises dynamiques et EMBED ont des filtres sans arguments 
// car en fait ce sont des arguments pas des filtres.
// Si le besoin s'en fait sentir, il faudra r�cuperer la 2e moitie du tableau 

function argumenter_balise($fonctions, $sep) {
  $res = array();
  if ($fonctions)
    foreach ($fonctions as $f) $res[] =
      str_replace('\'', '\\\'', str_replace('\\', '\\\\',$f[0]));
  return ("'" . join($sep, $res) . "'");
}

// fonction appelee par la balise #NOTES
function calculer_notes() {
        $r = $GLOBALS["les_notes"];
        $GLOBALS["les_notes"] = "";
        $GLOBALS["compt_note"] = 0;
        $GLOBALS["marqueur_notes"] ++;
        return $r;
}

# retourne la profondeur d'une rubrique

function sql_profondeur($id) {
        $n = 0;
        while ($id) {
                $n++;
                $id = sql_parent($id);
        }
        return $n;
}


function sql_parent($id_rubrique) {
        $row = spip_abstract_fetsel(array(id_parent), 
                        array('spip_rubriques'), 
                        array("id_rubrique=" . intval($id_rubrique)));
        return $row['id_parent'];
}

function sql_rubrique($id_article) {
        $row = spip_abstract_fetsel(array('id_rubrique'),
                        array('spip_articles'),
                        array("id_article=" . intval($id_article)));
        return $row['id_rubrique'];
}

function sql_auteurs($id_article, $table, $id_boucle, $serveur='') {
        $auteurs = "";
        if ($id_article) {
                $result_auteurs = spip_abstract_select(array('auteurs.nom', 'auteurs.email', 'auteurs.id_auteur'),
                        array('spip_auteurs AS auteurs',
                                'spip_auteurs_articles AS lien'), 
                        array("lien.id_article=$id_article",
                                "auteurs.id_auteur=lien.id_auteur"),
                        '',array(),'','',1, 
                        $table, $id_boucle, $serveur);

                while($row_auteur = spip_abstract_fetch($result_auteurs, $serveur)) {
                        $nom_auteur = typo($row_auteur["nom"]);
                        $email_auteur = $row_auteur["email"];
                        $id_auteur = $row_auteur["id_auteur"];
                        if ($email_auteur) {
                                $auteurs[] = "<a href=\"http://www.tela-botanica.org/page:membres_du_reseau_annuaire?m=annuaire_fiche_utilisateur_consultation&id_annuaire=1&id_utilisateur=$id_auteur\">$nom_auteur</a>";
                        } else {
                                $auteurs[] = "$nom_auteur";
                        }
                }
        }
        return (!$auteurs) ? "" : join($auteurs, ", ");
}

function sql_petitions($id_article, $table, $id_boucle, $serveur, &$Cache) {
        $retour = spip_abstract_fetsel(
                array('texte'),
                array('spip_petitions'),
                array("id_article=".intval($id_article)),
                '',array(),'','',1, 
                $table, $id_boucle, $serveur);

        if (!$retour) return '';
        # cette page est invalidee par toute petition
        $Cache['varia']['pet'.$id_article] = 1;
        # ne pas retourner '' car le texte sert aussi de presence
        return ($retour['texte'] ? $retour['texte'] : ' ');
}

# retourne le chapeau d'un article, et seulement s'il est publie

function sql_chapo($id_article) {
        if ($id_article)
        return spip_abstract_fetsel(array('chapo'),
                array('spip_articles'),
                array("id_article=".intval($id_article),
                "statut='publie'"));
}

# retourne le champ 'accepter_forum' d'un article
function sql_accepter_forum($id_article) {
        static $cache = array();

        if (!$id_article) return;

        if (!isset($cache[$id_article])) {
                $row = spip_abstract_fetsel(array('accepter_forum'),
                        array('spip_articles'),
                        array("id_article=".intval($id_article)));
                $cache[$id_article] = $row['accepter_forum'];
        }

        return $cache[$id_article];
}


// Calcul de la rubrique associee a la requete
// (selection de squelette specifique par id_rubrique & lang)

function sql_rubrique_fond($contexte) {

        if ($id = intval($contexte['id_rubrique'])) {
                $row = spip_abstract_fetsel(array('lang'),
                                            array('spip_rubriques'),
                                            array("id_rubrique=$id"));
                if ($row['lang'])
                        $lang = $row['lang'];
                return array ($id, $lang);
        }

        if ($id  = intval($contexte['id_breve'])) {
                $row = spip_abstract_fetsel(array('id_rubrique', 'lang'),
                        array('spip_breves'), 
                        array("id_breve=$id"));
                $id_rubrique_fond = $row['id_rubrique'];
                if ($row['lang'])
                        $lang = $row['lang'];
                return array($id_rubrique_fond, $lang);
        }

        if ($id = intval($contexte['id_syndic'])) {
                $row = spip_abstract_fetsel(array('id_rubrique'),
                        array('spip_syndic'),
                        array("id_syndic=$id"));
                $id_rubrique_fond = $row['id_rubrique'];
                $row = spip_abstract_fetsel(array('lang'),
                        array('spip_rubriques'),
                        array("id_rubrique='$id_rubrique_fond'"));
                if ($row['lang'])
                        $lang = $row['lang'];
                return array($id_rubrique_fond, $lang);
        }

        if ($id = intval($contexte['id_article'])) {
                $row = spip_abstract_fetsel(array('id_rubrique', 'lang'),
                        array('spip_articles'),
                        array("id_article=$id"));
                $id_rubrique_fond = $row['id_rubrique'];
                if ($row['lang'])
                        $lang = $row['lang'];
                return array($id_rubrique_fond, $lang);
        }
}

// Ajouter "&lang=..." si la langue de base n'est pas celle du site
function lang_parametres_forum($s) {

        // ne pas se fatiguer si le site est unilingue (plus rapide)
        if (strstr(lire_meta('langues_utilisees'), ',')
        // chercher l'identifiant qui nous donnera la langue
        AND preg_match(',id_(article|breve|rubrique|syndic)=([0-9]+),', $s, $r)){
                $objet = $r[1];
                $id = $r[2];
                list($lang) = spip_fetch_array(spip_query(
                        "SELECT lang FROM spip_${objet}s WHERE id_$objet=$id"
                ));
                // Si ce n'est pas la meme que celle du site, l'ajouter aux parametres
                if ($lang AND $lang <> lire_meta('langue_site'))
                        $s .= "&lang=$lang";
        }

        return $s;
}

?>