From 95661487a2fa0406e0d90ec3fda3668dba9d14d2 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Thu, 14 May 2009 21:20:49 +0000
Subject: [PATCH] =?UTF-8?q?Suite=20de=20[13986]=20sur=20l'analyse=20syntax?=
 =?UTF-8?q?e=20de=20{{{#INCLURE}}}=20et=20{{{<INCLURE>}}}:=20la=20remise?=
 =?UTF-8?q?=20=C3=A0=20plat=20des=20fonctions=20{{{phraser=5Farguments=5Fi?=
 =?UTF-8?q?nclure}}}=20et=20{{{argumenter=5Finclure}}}=20d=C3=A9bouchent?=
 =?UTF-8?q?=20finalement=20sur=20leur=20fusion,=20autrement=20dit=20=C3=A7?=
 =?UTF-8?q?a=20ne=20fait=20plus=20qu'une=20passe,=20=C3=A7a=20commence=20?=
 =?UTF-8?q?=C3=A0=20=C3=AAtre=20plus=20lisible,=20on=20s'approche=20du=20b?=
 =?UTF-8?q?ut=20annonc=C3=A9.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

La fonction {{{phraser_arguments_inclure}}} disparaît complètement, son seul appel non suivi de l'appel de sa congénère étant dans l'analyse des rares critères d'une boucle récursive, lesquels auraient toujours dû être analysés par {{{phraser_criteres}}}, ce qui est fait à présent.
---
 ecrire/public/balises.php      | 11 ++++----
 ecrire/public/compiler.php     | 47 ++++++++++++++++++++++++----------
 ecrire/public/phraser_html.php | 27 ++-----------------
 3 files changed, 41 insertions(+), 44 deletions(-)

diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 84497a4ee2..79176d484c 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -591,11 +591,11 @@ function balise_PAGINATION_dist($p, $liste='true') {
 	array_shift($p->param);
 	while(count($params))
 		array_unshift($p->param,array_pop($params));
-	
+
 	// a priori true
 	// si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
 	// si true, les arguments simples (sans truc=chose) vont degager
-	$code_contexte = argumenter_inclure(phraser_arguments_inclure($p->param, true), $p->descr, $p->boucles, $p->id_boucle, false);
+	$code_contexte = argumenter_inclure($p->param, true, $p->descr, $p->boucles, $p->id_boucle, false);
 
 	$p->boucles[$b]->numrows = true;
 	$connect = $p->boucles[$b]->sql_serveur;
@@ -965,7 +965,7 @@ function balise_INCLUDE_dist($p) {
 // http://doc.spip.org/@balise_INCLURE_dist
 function balise_INCLURE_dist($p) {
 	$id_boucle = $p->id_boucle;
-	$_contexte = argumenter_inclure(phraser_arguments_inclure($p->param, 'all'), $p->descr, $p->boucles, $id_boucle, false, false);
+	$_contexte = argumenter_inclure($p->param, 'all', $p->descr, $p->boucles, $id_boucle, false, false);
 
 	if (isset($_contexte['fond'])) {
 
@@ -1039,7 +1039,8 @@ function balise_MODELE_dist($p) {
 	// a priori true
 	// si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
 	// si true, les arguments simples (sans truc=chose) vont degager
-	$_contexte = argumenter_inclure(phraser_arguments_inclure($p->param, true), $p->descr, $p->boucles, $p->id_boucle, false);
+
+	$_contexte = argumenter_inclure($p->param, true, $p->descr, $p->boucles, $p->id_boucle, false);
 
 	// Si le champ existe dans la pile, on le met dans le contexte
 	// (a priori c'est du code mort ; il servait pour #LESAUTEURS dans
@@ -1063,7 +1064,7 @@ function balise_MODELE_dist($p) {
 	. (isset($_contexte['ajax'])?", 'ajax'=>true":'')
 	. "), " . _q($connect) . ")";
 
-	$p->code = "(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' : $page)";
+	$p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
 
 	$p->interdire_scripts = false; // securite assuree par le squelette
 
diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index 417c7e6a00..ea27aba667 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -40,20 +40,39 @@ include_spip('public/balises');
 include_spip('public/jointures');
 
 // http://doc.spip.org/@argumenter_inclure
-function argumenter_inclure($params, $descr, &$boucles, $id_boucle, $echap=true	, $lang = ''){
+function argumenter_inclure($params, $rejet_filtres, $descr, &$boucles, $id_boucle, $echap=true	, $lang = ''){
 	$l = array();
 
-	foreach($params as $couple) {
-		list($var, $val) = $couple;
-		if ($var == 'lang') {
-			$lang = $val;
-		} else {
-			$val = ($val[0]->type == 'texte' AND !$val[0]->texte) 
-			? index_pile($id_boucle, $var, $boucles)
-			: calculer_liste($val, $descr, $boucles, $id_boucle);
+	foreach($params as $k => $couple) {
+		$val = $couple[1];
+		$var = $val[0];
+		if ($couple[0]){
+			if ($rejet_filtres)
+				break; // on est arrive sur un filtre qui suit la balise
+		} elseif ($var->type != 'texte') {
+			if ($rejet_filtres)
+				break; // on est arrive sur un filtre sans argument qui suit la balise
+			else
+				erreur_squelette(_T('zbug_parametres_inclus_incorrects'),$var);
+		} else { preg_match(",^([^=]*)(=?)(.*)$,", $var->texte,$m);
+			$var = $m[1];
+			if ($m[2]) {
+			  $v = $m[3];
+			  if (preg_match(',^[\'"](.*)[\'"]$,', $v, $m)) $v = $m[1];
+			  $val[0]->texte = $v;
+			} else $val[0]->type = 'vide';
+
+			if ($var == 'lang') {
+			  $lang = $val;
+			} else {
+
+			  $val = ($val[0]->type === 'vide')
+			    ? index_pile($id_boucle, $var, $boucles)
+			    : calculer_liste($val, $descr, $boucles, $id_boucle);
 
-			$l[$var] = ($echap?"\'$var\' => ' . argumenter_squelette(":"'$var' => ")
-			  . $val . ($echap? ") . '":" ");
+			  $l[$var] = ($echap?"\'$var\' => ' . argumenter_squelette(":"'$var' => ")
+			    . $val . ($echap? ") . '":" ");
+			}
 		}
 	}
 	// Cas particulier de la langue : si {lang=xx} est definie, on
@@ -62,10 +81,11 @@ function argumenter_inclure($params, $descr, &$boucles, $id_boucle, $echap=true
 	if ($lang === false) return $l;
 
 	$l['lang'] = ($echap?"\'lang\' => ' . argumenter_squelette(":"'lang' => ")  .
-		($lang
+	  (($lang[0]->type !== 'vide')
 			? calculer_liste($lang[0], $descr, $boucles, $id_boucle)
 			: '$GLOBALS["spip_lang"]'
 			) . ($echap?") . '":" ");
+
 	return $l;
 }
 
@@ -95,8 +115,7 @@ function calculer_inclure($p, $descr, &$boucles, $id_boucle) {
 			}
 		}
 	}
-
-	$_contexte = argumenter_inclure(phraser_arguments_inclure($p->param), $descr, $boucles, $id_boucle);
+	$_contexte = argumenter_inclure($p->param, false, $descr, $boucles, $id_boucle);
 
 	// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
 	if ($env = (isset($_contexte['env'])|| isset($_contexte['self']))) {
diff --git a/ecrire/public/phraser_html.php b/ecrire/public/phraser_html.php
index bfc4375c23..af5a55edd9 100644
--- a/ecrire/public/phraser_html.php
+++ b/ecrire/public/phraser_html.php
@@ -38,29 +38,6 @@ define('BALISE_IDIOMES',',<:(([a-z0-9_]+):)?([a-z0-9_]+)({([^\|=>]*=[^\|>]*)})?(
 define('SQL_ARGS', '(\([^)]*\))');
 define('CHAMP_SQL_PLUS_FONC', '`?([A-Z_][A-Z_0-9.]*)' . SQL_ARGS . '?`?');
 
-// http://doc.spip.org/@phraser_arguments_inclure
-function phraser_arguments_inclure($param,$rejet_filtres = false){
-	// on assimile {var=val} a une liste de un argument sans fonction
-	foreach ($param as $k => $v) {
-		$var = $v[1][0];
-		if ($var==NULL){
-			if ($rejet_filtres)
-				break; // on est arrive sur un filtre sans argument qui suit la balise
-		} elseif ($var->type != 'texte') {
-			if ($rejet_filtres)
-				break; // on est arrive sur un filtre sans argument qui suit la balise
-			else
-				erreur_squelette(_T('zbug_parametres_inclus_incorrects'),$var);
-		} elseif (preg_match(",^([^=]*)=?(.*)$,", $var->texte,$m)) {
-			$param[$k][0] = $m[1];
-			$val = $m[2];
-			if (preg_match(',^[\'"](.*)[\'"]$,', $val, $m)) $val = $m[1];
-			$param[$k][1][0]->texte = $val;
-		}
-	}
-	return $param;
-}
-
 // http://doc.spip.org/@phraser_inclure
 function phraser_inclure($texte, $ligne, $result) {
 
@@ -604,8 +581,8 @@ function public_phraser_html($texte, $id_parent, &$boucles, $nom, $ligne=1) {
 		//
 		if (strncmp($soustype, TYPE_RECURSIF, strlen(TYPE_RECURSIF)) == 0) {
 			$result->type_requete = TYPE_RECURSIF;
-			$args = phraser_arguments_inclure($result->param);
-
+			phraser_criteres($result->param, $result);
+			$args = $result->param;
 			array_unshift($args,
 				      substr($type, strlen(TYPE_RECURSIF)));
 			$result->param = $args;
-- 
GitLab