From ea23ca5881c14306a1972c192cd9fa2883d44072 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Fri, 10 Jul 2009 20:58:41 +0000
Subject: [PATCH] =?UTF-8?q?Am=C3=A9lioration=20de=20[14178].=20En=20fait?=
 =?UTF-8?q?=20la=20seule=20balise=20dynamique=20qui=20continuait=20=C3=A0?=
 =?UTF-8?q?=20=C3=A9crire=20en=20position=20de=20filtre=20ce=20qui=20?=
 =?UTF-8?q?=C3=A9tait=20in=C3=A9vitablement=20un=20argument=20est=20FORMUL?=
 =?UTF-8?q?AIRE=5FRECHERCHE,=20qui=20depuis=20la=201.9=20a=20laiss=C3=A9?=
 =?UTF-8?q?=20tomber=20le=20pr=C3=A9-remplissage=20du=20champ=20de=20reche?=
 =?UTF-8?q?rce=20=C3=A0=20l'aide=20du=20v=C3=A9ritable=20argument=20de=20l?=
 =?UTF-8?q?a=20balise,=20et=20traite=20celui-ci=20exactement=20comme=20le?=
 =?UTF-8?q?=20filtre.=20D'ailleurs=20aucun=20squelette=20de=20zone/=5Fsque?=
 =?UTF-8?q?lettes=5F=20n'utilise=20la=20vieille=20possibilit=C3=A9.=20De?=
 =?UTF-8?q?=20nouveau=20on=20traite=20d=C3=A8s=20l'analyse=20syntaxique=20?=
 =?UTF-8?q?l'ancienne=20=C3=A9criture=20de=20FORMULAIRE=5FRECHERCHE,=20et?=
 =?UTF-8?q?=20on=20=C3=A9vite=20compl=C3=A8tement=20de=20charcuter=20l'arb?=
 =?UTF-8?q?re=20de=20syntaxe=20abstraite=20m=C3=AAme=20pour=20les=20balise?=
 =?UTF-8?q?s=20dynamiques.=20Comme=20de=20plus=20aucun=20squelette=20de=20?=
 =?UTF-8?q?zone/=5Fsquelettes=5F=20n'=C3=A9crit=20un=20filtre=20dans=20les?=
 =?UTF-8?q?=20balises=20dynamiques,=20sachant=20intuitivement=20que=20?=
 =?UTF-8?q?=C3=A7a=20ne=20peut=20pas=20marcher,=20on=20=C3=A9vacue=20compl?=
 =?UTF-8?q?=C3=A8tement=20leur=20prise=20en=20compte=20dans=20le=20code=20?=
 =?UTF-8?q?compil=C3=A9=20puisque=20que=20=C3=A7a=20sera=20toujours=20vide?=
 =?UTF-8?q?.=20Pour=20=C3=A9viter=20tout=20risque=20d'incompatibilit=C3=A9?=
 =?UTF-8?q?,=20seule=20la=20signature=20de=20la=20fonction=20ins=C3=A9r?=
 =?UTF-8?q?=C3=A9e=20dans=20le=20code=20change=20({{{executer=5Fbalise=5Fd?=
 =?UTF-8?q?ynamique}}}),=20les=20fonctions=20{{{*=5Fstat}}}=C2=A0continuen?=
 =?UTF-8?q?t=20=C3=A0=20admettre=202=20arguments,=20dont=20le=202e=20sera?=
 =?UTF-8?q?=20toujours=20vide.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/inc_version.php         |  2 +-
 ecrire/public/composer.php     |  6 ++--
 ecrire/public/phraser_html.php | 24 ++++++++++++++--
 ecrire/public/references.php   | 52 +++++++++-------------------------
 4 files changed, 39 insertions(+), 45 deletions(-)

diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php
index c0d91340cf..785652852f 100644
--- a/ecrire/inc_version.php
+++ b/ecrire/inc_version.php
@@ -375,7 +375,7 @@ $liste_des_authentifications = array(
 $spip_version_branche = "2.1.0 dev";
 // version des signatures de fonctions PHP
 // (= numero SVN de leur derniere modif cassant la compatibilite et/ou necessitant un recalcul des squelettes)
-$spip_version_code = 14090;
+$spip_version_code = 14194;
 // version de la base SQL (= numero SVN de sa derniere modif)
 $spip_version_base = 13929;
 
diff --git a/ecrire/public/composer.php b/ecrire/public/composer.php
index 4eab66f080..56911ecafc 100644
--- a/ecrire/public/composer.php
+++ b/ecrire/public/composer.php
@@ -288,7 +288,7 @@ function 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) {
+function executer_balise_dynamique($nom, $args, $lang, $ligne) {
 	if (!$file = find_in_path(strtolower($nom) .'.php', 'balise/', true)) {
 		// regarder si une fonction generique n'existe pas
 		if (($p = strpos($nom,"_"))
@@ -300,10 +300,10 @@ function executer_balise_dynamique($nom, $args, $filtres, $lang, $ligne) {
 		else
 			die ("pas de balise dynamique pour #". strtolower($nom)." !");
 	}
-	// Y a-t-il une fonction de traitement filtres-arguments ?
+	// Y a-t-il une fonction de traitement des arguments ?
 	$f = 'balise_' . $nom . '_stat';
 	if (function_exists($f))
-		$r = $f($args, $filtres);
+		$r = $f($args, ''); // historique
 	else
 		$r = $args;
 	if (!is_array($r))
diff --git a/ecrire/public/phraser_html.php b/ecrire/public/phraser_html.php
index 100393c867..9fcbd2ee8a 100644
--- a/ecrire/public/phraser_html.php
+++ b/ecrire/public/phraser_html.php
@@ -331,19 +331,24 @@ function phraser_champs_interieurs($texte, $ligne, $sep, $result) {
 				$result[$i] = $debut;
 				$i++;
 			}
+			$nom = $match[4];
 			$champ = new Champ;
 			// ca ne marche pas encore en cas de champ imbrique
 			$champ->ligne = $x ? 0 :($n+substr_count($debut, "\n"));
 			$champ->nom_boucle = $match[3];
-			$champ->nom_champ = $match[4];
+			$champ->nom_champ = $nom;
 			$champ->etoile = $match[6];
 			// phraser_args indiquera ou commence apres
 			$result = phraser_args($match[7], ")", $sep, $result, $champ);
-			if (preg_match(",^LOGO_[A-Z]+,", $match[4])
+			if (preg_match(",^LOGO_[A-Z]+,", $nom)
 			AND $champ->param) {
 				phraser_vieux_logos($champ);
-			} elseif ($match[4] == 'EMBED_DOCUMENT')
+			} elseif ($nom == 'EMBED_DOCUMENT') {
 				phraser_vieux_emb($champ);
+			} elseif ($nom == 'FORMULAIRE_RECHERCHE'
+				AND $champ->param) {
+				phraser_vieux_recherche($champ);
+			}
 			$champ->avant =
 				phraser_champs_exterieurs($match[1],$n,$sep,$result);
 			$debut = substr($champ->apres,1);
@@ -449,9 +454,22 @@ function phraser_vieux_emb($p)
 		array_shift($p->param);
 	}
 	array_unshift($p->param, $param);	
+	spip_log('balise EMBED_DOCUMENT obsolete', 'vieilles_defs');
 	$p->nom_champ = 'MODELE';
 }
 
+function phraser_vieux_recherche($p)
+{
+	if ($p->param[0][0]) {
+		$c = new Texte;
+		$c->texte = $p->param[0][0];
+		$p->param[0][1] = array($c);
+		$p->param[0][0] = '';
+		$p->fonctions = array();
+		spip_log('FORMULAIRE_RECHERCHE avec filtre ' . $c->texte, 'vieilles_defs');
+	}
+}
+
 function phraser_logo_faux_filtres($nom)
 {
 	switch($nom) {
diff --git a/ecrire/public/references.php b/ecrire/public/references.php
index 21fed7fbc6..e820f0951b 100644
--- a/ecrire/public/references.php
+++ b/ecrire/public/references.php
@@ -226,19 +226,13 @@ function calculer_balise_DEFAUT_dist($nom, $p) {
 
 //
 // Traduction des balises dynamiques, notamment les "formulaire_*"
-// Inclusion du fichier associe a son nom.
-// Ca donne les arguments a chercher dans la pile,on compile leur localisation
-// Ensuite on delegue a une fonction generale definie dans executer_squelette
-// qui recevra a l'execution la valeur des arguments, 
-// ainsi que les pseudo filtres qui ne sont donc pas traites a la compil
-// mais on traite le vrai parametre si present.
-// Pour empecher la mesinterpretation des pseudo-filtres tout en gardant acces
-// a leur representation abstraite, on les deplace dans le champ "fonctions"
-// qui sert une fois de plus aux bidouillages pour cause de syntaxe mal fichue.
+// Inclusion du fichier associe a son nom, qui contient la fonction homonyme
+// donnant les arguments a chercher dans la pile, et qui sont donc compiles.
+// On leur adjoint les arguments explicites de la balise (cf #LOGIN{url})
+// La fonction nomme ci-dessous recevra a l'execution la valeur de tout ca.
 
 define('CODE_EXECUTER_BALISE', "executer_balise_dynamique('%s',
 	array(%s%s),
-	array(%s),
 	\$GLOBALS['spip_lang'],
 	%s)");
 
@@ -249,46 +243,28 @@ function calculer_balise_dynamique($p, $nom, $l) {
 		$p->code = "''";
 		return $p;
 	}
-	$param = "";
-	$source = $a = $p->param;
-	if ($a) {
-		$c = array_shift($a);
-		if  (!array_shift($c)) {
-		  $p->fonctions = $a;
-		  array_shift( $p->param );
-		  $param = compose_filtres_args($p, $c, ',');
-		}
-	}
-	$collecte = join(',',collecter_balise_dynamique($l, $p, $nom));
+
+	if ($p->param AND ($c = $p->param[0])) {
+		// liste d'arguments commence toujours par la chaine vide
+		array_shift($c);
+		// construire la liste d'arguments comme pour un filtre
+		$param = compose_filtres_args($p, $c, ',');
+	} else	$param = "";
+	$collecte = join(',', collecter_balise_dynamique($l, $p, $nom));
 	$p->code = sprintf(CODE_EXECUTER_BALISE, $nom,
 		$collecte,
 		($collecte ? $param : substr($param,1)), # virer la virgule
-		argumenter_balise($p->param, "', '"),
 		$p->ligne);
 
 	$p->interdire_scripts = false;
-	$p->fonctions = $source;
-	$p->param = array();
-
 	return $p;
 }
 
-// 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) . "'");
-}
-
 // Construction du tableau des arguments d'une balise dynamique.
 // Ces arguments peuvent etre eux-meme des balises (cf FORMULAIRE_SIGNATURE)
 // mais gare au bouclage (on peut s'aider de $nom pour le reperer au besoin)
+// En revanche ils n'ont pas de filtres, donc on appelle calculer_balise qui
+// ne s'occupe pas de ce qu'il y a dans $p (mais qui va y ecrire le code)
 
 // http://doc.spip.org/@collecter_balise_dynamique
 function collecter_balise_dynamique($l, &$p, $nom) {
-- 
GitLab