From 1a132ae1422bb10555d05cbbf814ea3567a8faef Mon Sep 17 00:00:00 2001
From: Cerdic <cedric@yterium.com>
Date: Thu, 17 Aug 2006 16:53:17 +0000
Subject: [PATCH] simplification et factorisation de code bugs pas a exclure a
 l'inclure

---
 ecrire/public/assembler.php    | 22 ++++++++-------
 ecrire/public/balises.php      | 34 ++---------------------
 ecrire/public/compiler.php     | 45 +++++++++++++++++-------------
 ecrire/public/phraser_html.php | 51 ++++++++++++++++++++++------------
 ecrire/public/references.php   | 36 +++++-------------------
 5 files changed, 81 insertions(+), 107 deletions(-)

diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index cf1d5a753e..d3f31d0dab 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -384,18 +384,20 @@ function recuperer_fond($fond, $contexte=array()) {
 function creer_contexte_de_modele($args) {
 	$contexte = array();
 	$params = array();
-	foreach ($args as $arg) {
-		if (in_array($arg, array('left', 'right', 'center'))) {
-			$var = 'align';
-			$val = $arg;
-		} else {
-			list($var, $val) = split('=', $arg);
+	foreach ($args as $var=>$val) {
+		if (is_int($var)){ // argument pas formate
+			if (in_array($val, array('left', 'right', 'center'))) {
+				$var = 'align';
+				$contexte[$var] = $val;
+			} else {
+				$args = explode('=', $val);
+				if (count($args)==2)
+					$contexte[$args[0]] = $args[1];
+			}
 		}
-		$contexte[$var] = $val;
-		$params[] = "$var=$val";
+		else
+			$contexte[$var] = $val;
 	}
-	if ($params)
-		$contexte['params'] = serialize($params);
 
 	return $contexte;
 }
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 35ba8ca951..c6c23e0cce 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -1188,37 +1188,9 @@ function balise_INCLUDE_dist($p) {
 }
 // http://doc.spip.org/@balise_INCLURE_dist
 function balise_INCLURE_dist($p) {
-	$champ = new Inclure;
-	// on assimile {var=val} a une liste de un argument sans fonction
-	foreach ($p->param as $k => $v) {
-		$var = $v[1][0];
-		if ($var==NULL) break; // on est arrive sur un filtre
-		if ($var->type != 'texte')
-			erreur_squelette(_T('zbug_parametres_inclus_incorrects'),
-				 $match[0]);
-		else {
-			$champ->param[$k] = $v;
-			ereg("^([^=]*)(=)?(.*)$", $var->texte,$m);
-			if ($m[2]) {
-				$champ->param[$k][0] = $m[1];
-				$val = $m[3];
-				if (ereg('^[\'"](.*)[\'"]$', $val, $m)) $val = $m[1];
-				$champ->param[$k][1][0]->texte = $val;
-			}
-			else
-				$champ->param[$k] = array($m[1]);
-		}
-	}
-	$texte = substr($champ->apres,1);
-	$champ->apres = "";
-	$result[] = $champ;
-
-	$l = array();
-	foreach($champ->param as $val) {
-		$var = array_shift($val);
-		$l[] = "'$var' => " . 
-			($val ? calculer_liste($val[0], $p->descr, $p->boucles, $p->id_boucle) :(($var =='lang') ? '$GLOBALS["spip_lang"]' : index_pile($p->id_boucle, $var, $p->boucles)));
-	}
+	$champ = phraser_arguments_inclure($p, true);
+	$l = argumenter_inclure($champ, $p->descr, $p->boucles, $p->id_boucle, false);
+	
 	$code = "recuperer_fond('',array(".implode(',',$l)."))";
 
 	$commentaire = '#INCLURE ' . str_replace("\n", ' ', $code);
diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index 41d87d0f81..b7783ba683 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -39,6 +39,30 @@ include_spip('public/interfaces');
 # definition des tables
 include_spip('base/serial');
 
+function argumenter_inclure($struct, $descr, &$boucles, $id_boucle, $echap=true){
+	$l = array();
+	$lang = '';
+	foreach($struct->param as $val) {
+		$var = array_shift($val);
+		if ($var == 'lang')
+			$lang = $val;
+		else
+			$l[$var] = ($echap?"\'$var\' => ' . argumenter_squelette(":"'$var' => ")  .
+			($val
+				? calculer_liste($val[0], $descr, $boucles, $id_boucle)
+				: index_pile($id_boucle, $var, $boucles)
+			) . ($echap?") . '":" ");
+	}
+	// Cas particulier de la langue : si {lang=xx} est definie, on
+	// la passe, sinon on passe la langue courante au moment du calcul
+	$l['lang'] = ($echap?"\'lang\' => ' .":"'lang' => ") ." argumenter_squelette(" .
+		($lang
+			? calculer_liste($lang[0], $descr, $boucles, $id_boucle)
+			: '$GLOBALS["spip_lang"]'
+			) . ")" . ($echap?" . '":" ");
+	return $l;
+}
+
 //
 // Calculer un <INCLURE()>
 //
@@ -67,26 +91,7 @@ function calculer_inclure($struct, $descr, &$boucles, $id_boucle) {
 		return "'<!-- Erreur INCLURE(".texte_script($fichier).") -->'";
 	}
 
-	$l = array();
-	$lang = '';
-	foreach($struct->param as $val) {
-		$var = array_shift($val);
-		if ($var == 'lang')
-			$lang = $val;
-		else
-			$l[$var] = "\'$var\' => ' .  argumenter_squelette(" .
-			($val
-				? calculer_liste($val[0], $descr, $boucles, $id_boucle)
-				: index_pile($id_boucle, $var, $boucles)
-			) . ") . '";
-	}
-	// Cas particulier de la langue : si {lang=xx} est definie, on
-	// la passe, sinon on passe la langue courante au moment du calcul
-	$l['lang'] = "\'lang\' => ' . argumenter_squelette(" .
-		($lang
-			? calculer_liste($lang[0], $descr, $boucles, $id_boucle)
-			: '$GLOBALS["spip_lang"]'
-		) . ") . '";
+	$l = argumenter_inclure($struct, $descr, $boucles, $id_boucle);
 
 	return "\n'<".
 		"?php\n\t\$contexte_inclus = array(" .
diff --git a/ecrire/public/phraser_html.php b/ecrire/public/phraser_html.php
index ea533b5a6b..384ecc7739 100644
--- a/ecrire/public/phraser_html.php
+++ b/ecrire/public/phraser_html.php
@@ -36,6 +36,38 @@ define('BALISE_INCLURE','<INCLU[DR]E[[:space:]]*(\(([^)]*)\))?');
 define('SQL_ARGS', '(\([^)]*\))');
 define('CHAMP_SQL_PLUS_FONC', '`?([A-Za-z_][A-Za-z_0-9]*)' . SQL_ARGS . '?`?');
 
+function phraser_arguments_inclure($p,$rejet_filtres = false){
+	$champ = new Inclure;
+	// on assimile {var=val} a une liste de un argument sans fonction
+	foreach ($p->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
+			else
+				$champ->param[$k] = $v;
+		}
+		else {
+			if ($var->type != 'texte')
+				erreur_squelette(_T('zbug_parametres_inclus_incorrects'),
+					 $match[0]);
+			else {
+				$champ->param[$k] = $v;
+				ereg("^([^=]*)(=)?(.*)$", $var->texte,$m);
+				if ($m[2]) {
+					$champ->param[$k][0] = $m[1];
+					$val = $m[3];
+					if (ereg('^[\'"](.*)[\'"]$', $val, $m)) $val = $m[1];
+					$champ->param[$k][1][0]->texte = $val;
+				}
+				else
+					$champ->param[$k] = array($m[1]);
+			}
+		}
+	}
+	return $champ;
+}
+
 // http://doc.spip.org/@phraser_inclure
 function phraser_inclure($texte, $ligne, $result) {
 
@@ -51,23 +83,8 @@ function phraser_inclure($texte, $ligne, $result) {
 		$texte = substr($texte, $p+strlen($match[0]));
 		// on assimile {var=val} a une liste de un argument sans fonction
 		phraser_args($texte,">","",$result,$champ);
-		foreach ($champ->param as $k => $v) {
-		  $var = $v[1][0];
-		  if ($var->type != 'texte')
-			erreur_squelette(_T('zbug_parametres_inclus_incorrects'),
-					 $match[0]);
-		  else {
-		    ereg("^([^=]*)(=)?(.*)$", $var->texte,$m);
-		    if ($m[2]) {
-		      $champ->param[$k][0] = $m[1];
-		      $val = $m[3];
-		      if (ereg('^[\'"](.*)[\'"]$', $val, $m)) $val = $m[1];
-		      $champ->param[$k][1][0]->texte = $val;
-		    }
-		    else
-		      $champ->param[$k] = array($m[1]);
-		  }
-		}
+		$champ = phraser_arguments_inclure($champ);
+		
 		$texte = substr($champ->apres,1);
 		$champ->apres = "";
 		$result[] = $champ;
diff --git a/ecrire/public/references.php b/ecrire/public/references.php
index 7f68e1b38c..bb9e6cd755 100644
--- a/ecrire/public/references.php
+++ b/ecrire/public/references.php
@@ -259,6 +259,12 @@ function calculer_balise_modele_dist($p){
 	$nom = strtolower($p->nom_champ);
 	$contexte = array();
 
+	$champ = phraser_arguments_inclure($p, true); 
+	// 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($champ, $p->descr, $p->boucles, $p->id_boucle, false);
+
 	// Si le champ existe dans la pile, on le met dans le contexte
 	// (exemple : #LESAUTEURS dans spip_syndic_articles)
 	$code_contexte[] = "'$nom='.".champ_sql($nom, $p);
@@ -268,35 +274,7 @@ function calculer_balise_modele_dist($p){
 		$id = champ_sql($primary, $p);
 		$code_contexte[] = "'$primary='.".$id;
 	}
-
-	// Preparer le code du contexte (id + champ + params)
-	// on assimile {var=val} a une liste de un argument sans fonction
-	$champ = new Inclure;
-	foreach ($p->param as $k => $v) {
-		$var = $v[1][0];
-		if ($var==NULL) break; // on est arrive sur un filtre
-		if ($var->type != 'texte')
-			erreur_squelette(_T('zbug_parametres_inclus_incorrects'),
-				 $match[0]);
-		else {
-			$champ->param[$k] = $v;
-			ereg("^([^=]*)(=)?(.*)$", $var->texte,$m);
-			if ($m[2]) {
-				$champ->param[$k][0] = $m[1];
-				$val = $m[3];
-				if (ereg('^[\'"](.*)[\'"]$', $val, $m)) $val = $m[1];
-				$champ->param[$k][1][0]->texte = $val;
-			}
-			else
-				$champ->param[$k] = array($m[1]);
-		}
-	}	
-	foreach($champ->param as $val) {
-		$var = array_shift($val);
-		$code_contexte[] = "'$var' => " . 
-			($val ? calculer_liste($val[0], $p->descr, $p->boucles, $p->id_boucle) :(($var =='lang') ? '$GLOBALS["spip_lang"]' : index_pile($p->id_boucle, $var, $p->boucles)));
-	}
-
+	
 	$p->code = "recuperer_fond('modeles/".$nom."',
 		creer_contexte_de_modele(array(".join(',', $code_contexte)."), \$GLOBALS['spip_lang']))";
 	$p->interdire_scripts = false; // securite assuree par le squelette
-- 
GitLab