'oui', 'phpcheck' => 'oui'))) eval('?'.'>'.$contenu); if (@file_exists($fonc = $squelette . '_fonctions'.'.php') OR @file_exists($fonc = $squelette . '_fonctions'.'.php3')) { include_once $fonc; } // tester si le eval ci-dessus a mis le squelette en memoire if (function_exists($nom)) return $nom; // charger le source, si possible, et compiler if (lire_fichier ($sourcefile, $skel)) { $compiler = charger_fonction('compiler', 'public'); $skel_code = $compiler($skel, $nom, $gram, $sourcefile); } // Tester si le compilateur renvoie une erreur if (is_array($skel_code)) erreur_squelette($skel_code[0], $skel_code[1]); else { if ($GLOBALS['var_mode'] == 'debug') { debug_dumpfile ($skel_code, $nom, 'code'); } eval('?'.'>'.$skel_code); if (function_exists($nom)) { ecrire_fichier ($phpfile, $skel_code); return $nom; } else { erreur_squelette(_T('zbug_erreur_compilation'), $sourcefile); } } } // Le squelette compile est-il trop vieux ? // http://doc.spip.org/@squelette_obsolete function squelette_obsolete($skel, $squelette) { return ( ($GLOBALS['var_mode'] AND $GLOBALS['var_mode']<>'calcul') OR !@file_exists($skel) OR ((@file_exists($squelette)?@filemtime($squelette):0) > ($date = @filemtime($skel))) OR ( (@file_exists($fonc = 'mes_fonctions.php') OR @file_exists($fonc = 'mes_fonctions.php3')) AND @filemtime($fonc) > $date) # compatibilite OR (defined('_FILE_OPTIONS') AND @filemtime(_FILE_OPTIONS) > $date) ); } // // 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 ??? // // 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 // Renvoie le code html pour afficher un logo, avec ou sans survol, lien, etc. // http://doc.spip.org/@affiche_logos function affiche_logos($logos, $lien, $align) { list ($arton, $artoff) = $logos; if (!$arton) return $artoff; if ($taille = @getimagesize($arton)) { $taille = " ".$taille[3]; } if ($artoff) $artoff = " onmouseover=\"this.src='$artoff'\" " ."onmouseout=\"this.src='$arton'\""; $milieu = "\"\""'; return (!$lien ? $milieu : ('' . $milieu . '')); } // // Retrouver le logo d'un objet (et son survol) // // http://doc.spip.org/@calcule_logo function calcule_logo($type, $onoff, $id, $id_rubrique, $flag_fichier) { $chercher_logo = charger_fonction('chercher_logo', 'inc'); $nom = strtolower($onoff); while (1) { $on = $chercher_logo($id, $type, $nom); if ($on) { if ($flag_fichier) return (array('', "$on[2].$on[3]")); else { $off = ($onoff != 'ON') ? '' : $chercher_logo($id, $type, 'off'); return array ($on[0], ($off ? $off[0] : '')); } } else if ($id_rubrique) { $type = 'id_rubrique'; $id = $id_rubrique; $id_rubrique = 0; } else if ($id AND $type == 'id_rubrique') $id = sql_parent($id); else return array('',''); } } // // fonction standard de calcul de la balise #INTRODUCTION // on peut la surcharger en definissant dans mes_fonctions : // function introduction($type,$texte,$chapo,$descriptif) {...} // // http://doc.spip.org/@calcul_introduction function calcul_introduction ($type, $texte, $chapo='', $descriptif='') { if (function_exists("introduction")) return introduction ($type, $texte, $chapo, $descriptif); switch ($type) { case 'articles': # si descriptif contient juste des espaces ca produit une intro vide, # c'est une fonctionnalite, pas un bug 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 // http://doc.spip.org/@synthetiser_balise_dynamique function synthetiser_balise_dynamique($nom, $args, $file, $lang, $ligne) { return ('<'.'?php include_spip(\'inc/lang\'); lang_select("'.$lang.'"); include_once(_DIR_RACINE . "' . $file . '"); inclure_balise_dynamique(balise_' . $nom . '_dyn(' . join(", ", array_map('argumenter_squelette', $args)) . "),1, $ligne); lang_dselect(); ?" .">"); } // http://doc.spip.org/@argumenter_squelette function argumenter_squelette($v) { if (!is_array($v)) return "'" . texte_script($v) . "'"; else return 'array(' . join(", ", array_map('argumenter_squelette', $v)) . ')'; } // verifier leurs arguments et filtres, et calculer le code a inclure // http://doc.spip.org/@executer_balise_dynamique function executer_balise_dynamique($nom, $args, $filtres, $lang, $ligne) { if (!$file = include_spip('balise/' . strtolower($nom))) 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 { if (!_DIR_RESTREINT) $file = _DIR_RESTREINT_ABS . $file; return synthetiser_balise_dynamique($nom, $r, $file, $lang, $ligne); } } // // FONCTIONS FAISANT DES APPELS SQL // # NB : a l'exception des fonctions pour les balises dynamiques // http://doc.spip.org/@calculer_hierarchie function calculer_hierarchie($id_rubrique, $exclure_feuille = false) { if (!$id_rubrique = intval($id_rubrique)) return '0'; $hierarchie = array(); if (!$exclure_feuille) $hierarchie[] = $id_rubrique; while ($id_rubrique = sql_parent($id_rubrique)) array_unshift($hierarchie, $id_rubrique); if (count($hierarchie)) return join(',', $hierarchie); else return '0'; } // http://doc.spip.org/@calcul_exposer 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) { $row = spip_abstract_fetsel(array('id_rubrique'), array($table), array("$element="._q($id_element))); $hierarchie = calculer_hierarchie($row['id_rubrique']); foreach (split(',',$hierarchie) as $id_rubrique) $exposer['id_rubrique'][$id_rubrique] = true; } } } } // And the winner is... return isset($exposer[$type]) ? isset($exposer[$type][$id]) : ''; } // http://doc.spip.org/@lister_objets_avec_logos function lister_objets_avec_logos ($type) { $type_logos = array( 'hierarchie' => 'rub', 'rubriques' => 'rub', 'articles' => 'art', 'breves' => 'breve', 'mots' => 'mot', 'sites' => 'site', 'auteurs' => 'aut' ); $logos = array(); if ($type = $type_logos[$type]) { $a = preg_files(_DIR_IMG.$type.'on[0-9]+\.(gif|png|jpg)$'); foreach ($a as $f) $logos[] = intval(substr($f, strlen(_DIR_IMG.$type.'on'))); } return join(',',$logos); } // http://doc.spip.org/@table_from_primary function table_from_primary($id) { global $tables_principales; include_spip('base/serial'); foreach ($tables_principales as $k => $v) { if ($v['key']['PRIMARY KEY'] == $id) return array($k, array_key_exists('id_rubrique', $v['field'])); } return ''; } // fonction appelee par la balise #LOGO_DOCUMENT // http://doc.spip.org/@calcule_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'), array("id_document = $id_document")))) // pas de document. Ne devrait pas arriver return ''; $row = spip_abstract_fetch($row); $id_type = $row['id_type']; $id_vignette = $row['id_vignette']; $fichier = $row['fichier']; $mode = $row['mode']; // Y a t il une vignette personnalisee ? if ($id_vignette) { if ($res = spip_abstract_select(array('fichier'), array('spip_documents'), array("id_document = $id_vignette"))) { $vignette = spip_abstract_fetch($res); if (@file_exists(_DIR_RACINE.$vignette['fichier'])) $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})] if ($params AND preg_match('/{\s*(\d+),\s*(\d+)\s*}/', $params, $r)) { $x = intval($r[1]); $y = intval($r[2]); } // Retrouver l'extension et le type mime $ex = spip_abstract_fetch(spip_abstract_select( array('extension', 'mime_type'), array('spip_types_documents'), array("id_type = " . intval($id_type)))); $extension = $ex['extension']; $mime = $ex['mime_type']; if (!$extension) $extension = 'txt'; if (($logo) AND (@file_exists($logo) OR (strpos($logo,'?')!==FALSE))) { if ($x OR $y) $logo = reduire_image($logo, $x, $y); else { $size = @getimagesize($logo); $logo = ""; } } else { // Pas de vignette, mais un fichier image -- creer la vignette if (strpos($GLOBALS['meta']['formats_graphiques'], $extension)!==false) { if ($img = _DIR_RACINE.copie_locale($fichier) AND @file_exists($img)) { if (!$x AND !$y) { $logo = reduire_image($img); } else { # eviter une double reduction $size = @getimagesize($img); $logo = ""; } } } // Document sans vignette ni image : vignette par defaut if (!$logo) { $img = vignette_par_defaut($extension, false); $size = @getimagesize($img); $logo = ""; } } // 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) return preg_replace(',^' . preg_quote(_DIR_IMG).',', '', extraire_attribut($logo, 'src')); // Calculer le code html complet (cf. calcule_logo) $logo = inserer_attribut($logo, 'alt', ''); $logo = inserer_attribut($logo, 'class', 'spip_logos'); if ($align) $logo = inserer_attribut($logo, 'align', $align); if ($lien) $logo = "$logo"; return $logo; } // 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 recuperer la 2e moitie du tableau // http://doc.spip.org/@argumenter_balise 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 // http://doc.spip.org/@calculer_notes function calculer_notes() { $r = $GLOBALS["les_notes"]; $GLOBALS["les_notes"] = ""; $GLOBALS["compt_note"] = 0; $GLOBALS["marqueur_notes"] ++; return $r; } // Renvoie le titre du "lien hypertexte" // http://doc.spip.org/@construire_titre_lien function construire_titre_lien($nom,$url) { return typo(supprimer_numero(calculer_url($url, $nom, 'titre'))); } // Ajouter "&lang=..." si la langue de base n'est pas celle du site // http://doc.spip.org/@lang_parametres_forum function lang_parametres_forum($s) { // ne pas se fatiguer si le site est unilingue (plus rapide) if (strstr($GLOBALS['meta']['langues_utilisees'], ',') // chercher l'identifiant qui nous donnera la langue AND preg_match(',(id_(article|breve|rubrique|syndic)=([0-9]+)),', $s, $r)){ $lang = spip_abstract_fetsel(array('lang'), array("spip_" . $r[2] .'s'), array($r[1])); // Si ce n'est pas la meme que celle du site, l'ajouter aux parametres if ($lang['lang'] AND $lang['lang'] <> $GLOBALS['meta']['langue_site']) return "$s&lang=" . $lang['lang']; } return $s; } // La fonction presente dans les squelettes compiles // http://doc.spip.org/@spip_optim_select function spip_optim_select ($select = array(), $from = array(), $where = array(), $join=array(), $groupby = '', $orderby = array(), $limit = '', $sousrequete = '', $having = array(), $table = '', $id = '', $serveur='') { // retirer les criteres vides: // {X ?} avec X absent de l'URL // {par #ENV{X}} avec X absent de l'URL // IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil) $menage = false; foreach($where as $k => $v) { if ((!$v) OR ($v==1) OR ($v=='0=0')) { unset($where[$k]); $menage = true; } } foreach($having as $k => $v) { if ((!$v) OR ($v==1) OR ($v=='0=0')) { unset($having[$k]); } } // Installer les jointures. // Retirer celles seulement utiles aux criteres finalement absents mais // parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln // si elle est seulement utile a Ln+1 elle meme inutile for($k = count($join); $k > 0; $k--) { list($t,$c) = $join[$k]; $cle = "L$k"; if (!$menage OR spip_optim_joint($cle, $select) OR spip_optim_joint($cle, $join) OR spip_optim_joint($cle, $where)) $where[]= "$t.$c=$cle.$c"; else { unset($from[$cle]); unset($join[$k]);} } return spip_abstract_select($select, $from, $where, $groupby, array_filter($orderby), $limit, $sousrequete, $having, $table, $id, $serveur); } //condition suffisante (mais non necessaire) pour qu'une jointure soit inutile // http://doc.spip.org/@spip_optim_joint function spip_optim_joint($cle, $exp) { if (!is_array($exp)) return (strpos($exp, "$cle.") === false) ? false : true; else { foreach($exp as $v) { if (spip_optim_joint($cle, $v)) return true; } return false; } } ?>