From 0b59ea67aef6007acc4d30d78ceba528a5e0be64 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Mon, 5 Mar 2007 11:34:57 +0000
Subject: [PATCH] introduction de la notation <INCLURE{fond=truc}{env}> qui
 passe tout l'environnement de la page incluante a la page incluse ; au
 passage j'ai nettoye plusieurs facilites dans le debugueur, la pagination
 etc, qui devenaient des bugs si on creusait un peu (notamment : avec #INCLURE
 le contexte affiche par le debugueur etait celui de la page incluante)

---
 ecrire/inc/filtres.php       | 31 +++++++++++++++++++++++++++----
 ecrire/public/balises.php    | 26 ++++++++++++++++++--------
 ecrire/public/compiler.php   | 20 ++++++++++++++------
 ecrire/public/criteres.php   |  4 ++--
 ecrire/public/debug.php      | 11 +++--------
 ecrire/public/parametrer.php |  4 ++++
 6 files changed, 68 insertions(+), 28 deletions(-)

diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index a8472a2f09..5a0343ee76 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -1608,14 +1608,14 @@ function calcul_bornes_pagination($courante, $nombre, $max = 10) {
 //
 
 // http://doc.spip.org/@calcul_pagination
-function calcul_pagination($total, $nom, $pas, $liste = true, $modele='') {
+function calcul_pagination($total, $nom, $position, $pas, $liste = true, $modele='') {
 	static $ancres = array();
 	$bloc_ancre = "";
 	
 	if ($pas<1) return;
 
 	if (function_exists("pagination"))
-		return pagination($total, $nom, $pas, $liste);
+		return pagination($total, $nom, $position, $pas, $liste);
 
 	$debut = 'debut'.$nom;
 	$ancre='pagination'.$nom;
@@ -1628,10 +1628,10 @@ function calcul_pagination($total, $nom, $pas, $liste = true, $modele='') {
 		'debut' => 'debut'.$nom,
 		'url' => parametre_url(self(),'fragment',''), // nettoyer l'id ahah eventuel
 		'total' => $total,
-		'position' => intval(_request($debut)),
+		'position' => intval($position),
 		'pas' => $pas,
 		'nombre_pages' => floor(($total-1)/$pas)+1,
-		'page_courante' => floor(intval(_request($debut))/$pas)+1,
+		'page_courante' => floor(intval($position)/$pas)+1,
 		'ancre' => $ancre,
 		'bloc_ancre' => $bloc_ancre
 	);
@@ -1944,4 +1944,27 @@ function compacte($source, $format = null) {
 	return $compacte($source);
 }
 
+
+// clone de http://php.net/var_export compatible < 4.2.0 et sans ob_xx
+function spip_var_export($s) {
+	if (is_array($s)) {
+		foreach ($s as $k=>$v)
+			$s[$k] = spip_var_export($k) . ' => ' . spip_var_export($v);
+		return 'array(' . join(',',$s).')';
+	}
+
+	return is_null($s)
+		? 'null'
+		: (is_bool($s)
+			? ($s ? 'true' : 'false')
+			: (is_numeric($s)
+				? "$s"
+				: (is_string($s)
+					? "'".addslashes($s)."'"
+					: "'".gettype($s)."'"
+				)
+			)
+		);
+}
+
 ?>
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 8238eabcbd..3d7cf54e3e 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -636,7 +636,7 @@ function balise_PAGINATION_dist($p, $liste='true') {
 	}
 
 	// s'il n'y a pas de total_parties, c'est qu'on se trouve
-	// dans un boucle recurive ou qu'on a oublie le critere {pagination}
+	// dans un boucle recursive ou qu'on a oublie le critere {pagination}
 	if (!$p->boucles[$b]->total_parties) {
 		erreur_squelette(
 			_T('zbug_pagination_sans_critere',
@@ -646,16 +646,17 @@ function balise_PAGINATION_dist($p, $liste='true') {
 		return $p;
 	}
 	$__modele = interprete_argument_balise(1,$p);
-	$__modele = $__modele?",$__modele":"";
+	$__modele = $__modele?", $__modele":"";
 
 	$p->boucles[$b]->numrows = true;
 
 	$p->code = "calcul_pagination(
 	(isset(\$Numrows['$b']['grand_total']) ?
 		\$Numrows['$b']['grand_total'] : \$Numrows['$b']['total']
-	), ".$p->boucles[$b]->modificateur['debut_nom'].", "
+	), ".$p->boucles[$b]->modificateur['debut_nom'].",
+		\$Pile[0]['debut'.".$p->boucles[$b]->modificateur['debut_nom']."],"
 	. $p->boucles[$b]->total_parties
-	. ", $liste $__modele)";
+	. ", $liste$__modele)";
 
 	$p->interdire_scripts = false;
 	return $p;
@@ -1172,6 +1173,7 @@ function balise_INSERT_HEAD_dist($p) {
 // l'inclusion est realisee au calcul du squelette, pas au service
 // ainsi le produit du squelette peut etre utilise en entree de filtres a suivre
 // on peut faire un #INCLURE{fichier} sans squelette
+// (Incompatible avec les balises dynamiques)
 // http://doc.spip.org/@balise_INCLUDE_dist
 function balise_INCLUDE_dist($p) {
 	if(function_exists('balise_INCLURE'))
@@ -1182,16 +1184,24 @@ function balise_INCLUDE_dist($p) {
 // http://doc.spip.org/@balise_INCLURE_dist
 function balise_INCLURE_dist($p) {
 	$champ = phraser_arguments_inclure($p, true);
-	$l = argumenter_inclure($champ, $p->descr, $p->boucles, $p->id_boucle, false);
+	$_contexte = argumenter_inclure($champ, $p->descr, $p->boucles, $p->id_boucle, false);
 
-	if (isset($l['fond'])) {
-		$p->code = "recuperer_fond('',array(".implode(',',$l)."))";
+	if (isset($_contexte['fond'])) {
+		if (isset($_contexte['env'])) {
+			$flag_env = true;
+			unset($_contexte['env']);
+		}
+		$l = 'array(' . join(",\n\t", $_contexte) .')';
+		if ($flag_env) {
+			$l = "array_merge(\$Pile[0],$l)";
+		}
+		$p->code = "recuperer_fond('',".$l.")";
 	} else {
 		$n = interprete_argument_balise(1,$p);
 		$p->code = '(($c = find_in_path(' . $n . ')) ? spip_file_get_contents($c) : "")';
 	}
 
-	$p->interdire_scripts = false;
+	$p->interdire_scripts = false; // la securite est assuree par recuperer_fond
 	return $p;
 }
 
diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index 51f815ce39..2b0db70787 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -45,9 +45,9 @@ function argumenter_inclure($struct, $descr, &$boucles, $id_boucle, $echap=true)
 	$lang = '';
 	foreach($struct->param as $val) {
 		$var = array_shift($val);
-		if ($var == 'lang')
+		if ($var == 'lang') {
 			$lang = $val;
-		else
+		} else
 			$l[$var] = ($echap?"\'$var\' => ' . argumenter_squelette(":"'$var' => ")  .
 			($val
 				? calculer_liste($val[0], $descr, $boucles, $id_boucle)
@@ -91,11 +91,19 @@ function calculer_inclure($struct, $descr, &$boucles, $id_boucle) {
 		}
 	}
 
+	$_contexte = argumenter_inclure($struct, $descr, $boucles, $id_boucle);
+	if (isset($_contexte['env'])) {
+		$flag_env = true;
+		unset($_contexte['env']);
+	}
+	$contexte = 'array(' . join(",\n\t", $_contexte) .')';
+	if ($flag_env) {
+		$contexte = "array_merge('.spip_var_export(\$Pile[0]).',$contexte)";
+	}
+
 	return "\n'<".
-		"?php\n\t\$contexte_inclus = array(" .
-		join(",\n\t", argumenter_inclure($struct, $descr, $boucles, $id_boucle)) .
-		");" .
-		"\n\tinclude(" .
+		"?php\n\t\$contexte_inclus = $contexte;"
+		. "\n\tinclude(" .
 		($fichier ? "\\'$path\\'" : ('_DIR_RESTREINT . "public.php"')).
 		");" .
 		"\n?'." . "'>'";
diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index 8ce3ff0e1f..089e58d1fb 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -89,7 +89,7 @@ function critere_lang_select_dist($idb, &$boucles, $crit) {
 // http://doc.spip.org/@critere_debut_dist
 function critere_debut_dist($idb, &$boucles, $crit) {
 	$boucle = &$boucles[$idb];
-	$boucle->limit = 'intval($GLOBALS["debut' .
+	$boucle->limit = 'intval($Pile[0]["debut' .
 	  $crit->param[0][0]->texte .
 	  '"]) . ",' .
 	  $crit->param[1][0]->texte .
@@ -110,7 +110,7 @@ function critere_pagination_dist($idb, &$boucles, $crit) {
 
 	$boucle = &$boucles[$idb];
 	$boucle->mode_partie = 'p+';
-	$boucle->partie = 'intval(_request("debut".'.$debut.'))';
+	$boucle->partie = 'intval($Pile[0][\'debut\'.'.$debut.'])';
 	$boucle->modificateur['debut_nom'] = $debut;
 	$boucle->total_parties = $pas;
 	if (!isset($boucle->modificateur['fragment']))
diff --git a/ecrire/public/debug.php b/ecrire/public/debug.php
index 76b2285429..fa5faeb24a 100644
--- a/ecrire/public/debug.php
+++ b/ecrire/public/debug.php
@@ -197,13 +197,8 @@ function squelette_debug_compile($nom, $sourcefile, $code, $squelette) {
 	$debug_objets['squelette'][$nom] = $squelette;
 	$debug_objets['sourcefile'][$nom] = $sourcefile;
 
-	if (is_array($GLOBALS['contexte_inclus']))
-		$debug_objets['contexte'][$nom] = $GLOBALS['contexte_inclus'];
-	else {
-	  $debug_objets['contexte'][$nom] = calculer_contexte();
-		if (!isset($debug_objets['principal']))
-		  $debug_objets['principal'] = $nom;
-	}
+	if (!isset($debug_objets['principal']))
+		$debug_objets['principal'] = $nom;
 }
 
 // appelee a chaque analyse syntaxique de squelette
@@ -390,7 +385,7 @@ function debug_dumpfile ($texte, $fonc, $type) {
 		echo "\n<a href='$self&amp;var_mode_objet=$nom_skel&amp;var_mode_affiche=resultat#$nom_skel'>"._T('zbug_resultat')."</a>";
 		echo "\n<a href='$self&amp;var_mode_objet=$nom_skel&amp;var_mode_affiche=code#$nom_skel'>"._T('zbug_code')."</a></legend>";
 
-		if (is_array($contexte = $debug_objets['contexte'][$nom_skel]))
+		if (is_array($contexte = $debug_objets['contexte'][$sourcefile]))
 			echo afficher_debug_contexte($contexte);
 
 		$i = 0;
diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php
index d6976ade05..94b85e7eec 100644
--- a/ecrire/public/parametrer.php
+++ b/ecrire/public/parametrer.php
@@ -316,6 +316,10 @@ function public_parametrer_dist($fond, $local='', $cache='')  {
 
 	$composer = charger_fonction('composer', 'public');
 
+	// Le debugueur veut afficher le contexte
+	if ($GLOBALS['var_mode'] == 'debug')
+		$GLOBALS['debug_objets']['contexte'][$sourcefile] = $local;
+
 	if ($fonc = $composer($skel, $mime_type, $gram, $sourcefile)){
 		spip_timer($a = 'calcul page '.rand(0,1000));
 		$page = $fonc(array('cache' => $cache), array($local));
-- 
GitLab