From d69d07d49f308e8df75ac73d7a37fd142b9fd5db Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Thu, 30 Mar 2006 20:32:20 +0000
Subject: [PATCH] =?UTF-8?q?permettre=20la=20surcharge=20de=20la=20fonction?=
 =?UTF-8?q?=20d=C3=A9cidant=20de=20la=20compilation=20du=20squelette.=20Au?=
 =?UTF-8?q?=20passage,=20eviter=20d'inclure=20l'artillerie=20lourde=20si?=
 =?UTF-8?q?=20l'article=20est=20en=20fait=20une=20redirection?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/public/executer_squelette.php | 233 +++++++++----------------
 ecrire/public/localiser_page.php     | 243 +++++++++++++++++----------
 2 files changed, 236 insertions(+), 240 deletions(-)

diff --git a/ecrire/public/executer_squelette.php b/ecrire/public/executer_squelette.php
index 47b3b4baa5..278d653cd5 100644
--- a/ecrire/public/executer_squelette.php
+++ b/ecrire/public/executer_squelette.php
@@ -10,6 +10,84 @@
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+include_spip('inc/meta');
+include_spip("inc/indexation");
+include_spip('inc/texte');
+include_spip('inc/documents');
+include_spip('inc/forum');
+include_spip('inc/distant');
+include_spip('inc/rubriques'); # pour calcul_branche (cf critere branche)
+
+# Charge un squelette (au besoin le compile) 
+# et retoune le nom de sa fonction principale, ou '' s'il est indefini
+# Charge egalement un fichier homonyme de celui du squelette
+# mais de suffixe '_fonctions.php' pouvant contenir:
+# 1. des filtres
+# 2. des fonctions de traduction de balise, de critere et de boucle
+# 3. des declaration de tables SQL supplementaires
+# Toutefois pour 2. et 3. preferer la technique de la surcharge
+
+function public_executer_squelette($squelette, $mime_type, $gram, $sourcefile) {
+
+	$nom = $mime_type . '_' . md5($squelette);
+
+	// si squelette est deja en memoire (INCLURE  a repetition)
+	if (function_exists($nom))
+		return $nom;
+
+	$phpfile = sous_repertoire(_DIR_CACHE, 'skel') . $nom . '.php';
+
+	// si squelette est deja compile et perenne, le charger
+	if (!squelette_obsolete($phpfile, $sourcefile)
+	AND lire_fichier ($phpfile, $contenu,
+	array('critique' => 'oui', 'phpcheck' => 'oui'))) 
+		eval('?'.'>'.$contenu);
+
+	@include_once($squelette . '_fonctions'.'.php3'); # compatibilite
+	@include_once($squelette . '_fonctions'.'.php');
+
+	// 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)) {
+		$f = include_fonction('compiler_squelette', 'public');
+		$skel_code = $f($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') {
+			include_spip('public/debug');
+			debug_dumpfile ($skel_code, $nom, 'code');
+		}
+		eval('?'.'>'.$skel_code);
+		if (function_exists($nom)) {
+			ecrire_fichier ($phpfile, $skel_code);
+			return $nom;
+		} else {
+			erreur_squelette($sourcefile, _L('Erreur de compilation'));
+		}
+	}
+}
+
+// Le squelette compile est-il trop vieux ?
+function squelette_obsolete($skel, $squelette) {
+	return (
+		($GLOBALS['var_mode'] AND $GLOBALS['var_mode']<>'calcul')
+		OR !@file_exists($skel)
+		OR (@filemtime($squelette) > ($date = @filemtime($skel)))
+		OR (@filemtime('mes_fonctions.php') > $date)
+		OR (@filemtime('mes_fonctions.php3') > $date)  # compatibilite
+		OR (defined('_FILE_OPTIONS') AND @filemtime(_FILE_OPTIONS) > $date)
+	);
+}
 
 //
 // Des fonctions diverses utilisees lors du calcul d'une page ; ces fonctions
@@ -19,20 +97,13 @@
 // definissant leur balise ???
 //
 
-// ON TROUVERA EN QUEUE DE FICHIER LES FONCTIONS FAISANT DES APPELS SQL
-
-
-if (!defined("_ECRIRE_INC_VERSION")) return;
-
-include_spip('inc/rubriques'); # pour calcul_branche()
-
 // 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;
+	return ereg_replace("^" . _DIR_IMG, "", $on);
 }
 
 // Renvoie le code html pour afficher un logo, avec ou sans survol, lien, etc.
@@ -328,8 +399,7 @@ function calcule_logo_document($id_document, $doubdoc, &$doublons, $flag_fichier
 
 	// flag_fichier : seul le fichier est demande
 	if ($flag_fichier)
-		# supprimer le IMG/
-		return calcule_fichier_logo(extraire_attribut($logo, 'src'));
+		return ereg_replace("^" . _DIR_IMG, "", (extraire_attribut($logo, 'src')));
 
 
 	// Calculer le code html complet (cf. calcule_logo)
@@ -384,147 +454,6 @@ function calculer_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) {
-	list($id) = spip_abstract_fetsel(array(id_parent), 
-			array('spip_rubriques'), 
-			array("id_rubrique=" . intval($id_rubrique)));
-	return $id;
-}
-
-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.id_auteur', 'auteurs.nom'),
-			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']);
-			$url_auteur = generer_url_auteur($row_auteur['id_auteur']);
-			if ($url_auteur) {
-				$auteurs[] = "<a href=\"mailto:$email_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)
diff --git a/ecrire/public/localiser_page.php b/ecrire/public/localiser_page.php
index d984a87af6..848301f943 100644
--- a/ecrire/public/localiser_page.php
+++ b/ecrire/public/localiser_page.php
@@ -13,19 +13,11 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 //
-// Ce fichier calcule une page en executant un squelette.
+ // Ce fichier calcule une page en executant un squelette.
 //
 
-include_spip('inc/meta');
-include_spip("inc/indexation");
-include_spip('inc/texte');
-include_spip('inc/lang');
-include_spip('inc/documents');
 include_spip('base/abstract_sql');
-include_spip('inc/forum');
-include_spip('public/debug');
-include_spip('public/executer_squelette');
-include_spip('inc/distant');
+include_spip('inc/lang');
 
 // NB: Ce fichier peut initialiser $dossier_squelettes (old-style)
 // donc il faut l'inclure "en globals"
@@ -38,76 +30,7 @@ if (@is_readable(_DIR_SESSIONS."charger_plugins_fonctions.php")){
 	include_once(_DIR_SESSIONS."charger_plugins_fonctions.php");
 }
 
-charger_generer_url();
-
-// Le squelette compile est-il trop vieux ?
-function squelette_obsolete($skel, $squelette) {
-	return (
-		($GLOBALS['var_mode'] AND $GLOBALS['var_mode']<>'calcul')
-		OR !@file_exists($skel)
-		OR (@filemtime($squelette) > ($date = @filemtime($skel)))
-		OR (@filemtime('mes_fonctions.php') > $date)
-		OR (@filemtime('mes_fonctions.php3') > $date)  # compatibilite
-		OR (defined('_FILE_OPTIONS') AND @filemtime(_FILE_OPTIONS) > $date)
-	);
-}
-
-
-# Charge un squelette (au besoin le compile) 
-# et retoune le nom de sa fonction principale, ou '' s'il est indefini
-# Charge egalement un fichier homonyme de celui du squelette
-# mais de suffixe '_fonctions.php' pouvant contenir:
-# 1. des filtres
-# 2. des fonctions de traduction de balise, de critere et de boucle
-# 3. des declaration de tables SQL supplementaires
-# Toutefois pour 2. et 3. preferer la technique de la surcharge
-
-function charger_squelette ($squelette, $mime_type, $gram, $sourcefile) {
-
-	$nom = $mime_type . '_' . md5($squelette);
-
-	// si squelette est deja en memoire (INCLURE  a repetition)
-	if (function_exists($nom))
-		return $nom;
-
-	$phpfile = sous_repertoire(_DIR_CACHE, 'skel') . $nom . '.php';
-
-	// si squelette est deja compile et perenne, le charger
-	if (!squelette_obsolete($phpfile, $sourcefile)
-	AND lire_fichier ($phpfile, $contenu,
-	array('critique' => 'oui', 'phpcheck' => 'oui'))) 
-		eval('?'.'>'.$contenu);
-
-	@include_once($squelette . '_fonctions'.'.php3'); # compatibilite
-	@include_once($squelette . '_fonctions'.'.php');
-
-	// 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)) {
-		$f = include_fonction('compiler_squelette', 'public');
-		$skel_code = $f($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($sourcefile, _L('Erreur de compilation'));
-		}
-	}
-}
+charger_generer_url(); # pour recuperer_parametres_url
 
 //
 // Contexte : lors du calcul d'une page spip etablit le contexte a partir
@@ -150,8 +73,6 @@ function signaler_squelette($contexte)
 	return $signal;
 }
 
-
-
 function analyse_resultat_skel($nom, $cache, $corps) {
 	$headers = array();
 
@@ -177,13 +98,158 @@ function analyse_resultat_skel($nom, $cache, $corps) {
 	);
 }
 
-# Recherche un squelette et l'applique sur un contexte pour un certain cache.
+// 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);
+	}
+}
+
+# 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 parent d'une rubrique
+
+function sql_parent($id_rubrique) {
+	list($id) = spip_abstract_fetsel(array(id_parent), 
+			array('spip_rubriques'), 
+			array("id_rubrique=" . intval($id_rubrique)));
+	return $id;
+}
+
+# retourne la profondeur d'une rubrique
+
+function sql_profondeur($id) {
+	$n = 0;
+	while ($id) {
+		$n++;
+		$id = sql_parent($id);
+	}
+	return $n;
+}
+
+# retourne la rubrique d'un article
+
+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.id_auteur', 'auteurs.nom'),
+			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']);
+			$url_auteur = generer_url_auteur($row_auteur['id_auteur']);
+			if ($url_auteur) {
+				$auteurs[] = "<a href=\"mailto:$email_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 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];
+}
+
+# Determine les parametres d'URL (hors réécriture) et consorts
+# En deduit un contexte disant si la page est un rediction ou 
+# exige un squelette deductible de $fond et du contexte linguistique.
+# Aplique alors le squelette sur le contexte et le nom du cache.
 # Retourne un tableau de 3 elements:
 # 'texte' => la page calculee
 # 'process_ins' => 'html' ou 'php' si presence d'un '< ?php'
-# 'invalideurs' => les invalideurs de cache
+# 'invalideurs' => les invalideurs de ce cache
 # En cas d'erreur process_ins est absent et texte est un tableau de 2 chaines
-# La recherche est assuree par la fonction surchargeable trouver_squelette,
 
 function public_localiser_page_dist($fond, $local='', $cache='')  {
 
@@ -247,9 +313,9 @@ function public_localiser_page_dist($fond, $local='', $cache='')  {
 	// et appliquer sa fonction principale sur le contexte.
 	// Passer le nom du cache pour produire sa destruction automatique
 
-	$page = array();
+	$f = include_fonction('executer_squelette', 'public');
 
-	if ($fonc = charger_squelette($skel, $mime_type, $gram, $sourcefile)){
+	if ($fonc = $f($skel, $mime_type, $gram, $sourcefile)){
 		spip_timer('calcul page');
 		$page = $fonc(array('cache' => $cache), array($local));
 		spip_log("calcul ("
@@ -258,9 +324,10 @@ function public_localiser_page_dist($fond, $local='', $cache='')  {
 			 join(", ", $local)
 			.' ('.strlen($page['texte']).' octets)'
 		);
-	}
+	} else 	$page = array();
 
 	if ($GLOBALS['var_mode'] == 'debug') {
+		include_spip('public/debug');
 		debug_dumpfile ($page['texte'], $fonc, 'resultat');
 	}
 	if (!is_array($signal)) $page['signal'] = signaler_squelette($local);
-- 
GitLab