From 7497f73b0a3f66b587832cf786e3694e8ff2bb33 Mon Sep 17 00:00:00 2001
From: RastaPopoulos <rastapopoulos@spip.org>
Date: Wed, 2 Sep 2015 22:47:01 +0000
Subject: [PATCH] Report de r22402 :
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

RAH. On corrige enfin ce fichu gros bug du compilateur qui faisait qu'on ne pouvait pas avoir un critère conditionnel ET plusieurs arguments.

Ça marchait pour les critères sans arguments ou avec un seul argument.

La raison ? Non-factorisation et doublonnage de code : actuellement, les critères mêmes persos (pas juste les trucs SQL) qui ont 0 ou 1 arguments, ne passent PAS par le même code que ceux avec 2 ou plus. Alors qu'ensuite le traitement et la regex associée sont quasiment les mêmes… mais pas tout à fait, puisque dans le cas 2 ou plus ça ne cherchait pas le "?".

Pour l'instant on corrige juste le bug, mais il faudrait nettoyer le code et factoriser pour ne plus générer d'erreur de ce genre…
---
 ecrire/public/phraser_html.php | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/ecrire/public/phraser_html.php b/ecrire/public/phraser_html.php
index c93606d8cb..f1910bceaf 100644
--- a/ecrire/public/phraser_html.php
+++ b/ecrire/public/phraser_html.php
@@ -502,24 +502,25 @@ function phraser_criteres($params, &$result) {
 				$not = "";
 			} else {
 				// Le debut du premier argument est l'operateur
-				preg_match("/^([!]?)([a-zA-Z][a-zA-Z0-9_]*)[[:space:]]*(.*)$/ms", $param, $m);
+				preg_match("/^([!]?)([a-zA-Z][a-zA-Z0-9_]*)[[:space:]]*(\??)[[:space:]]*(.*)$/ms", $param, $m);
 				$op = $m[2];
 				$not = $m[1];
+				$cond = $m[3];
 				// virer le premier argument,
 				// et mettre son reliquat eventuel
 				// Recopier pour ne pas alterer le texte source
 				// utile au debusqueur
-				if ($m[3]) {
+				if ($m[4]) {
 					// une maniere tres sale de supprimer les "' autour de {critere "xxx","yyy"}
-					if (preg_match(',^(["\'])(.*)\1$,', $m[3])) {
+					if (preg_match(',^(["\'])(.*)\1$,', $m[4])) {
 						$c = null;
-						eval ('$c = '.$m[3].';');
+						eval ('$c = '.$m[4].';');
 						if (isset($c)) {
-							$m[3] = $c;
+							$m[4] = $c;
 						}
 					}
 					$texte = new Texte;
-					$texte->texte = $m[3]; 
+					$texte->texte = $m[4]; 
 					$v[1][0]= $texte;
 				} else {
 					array_shift($v[1]);
@@ -529,6 +530,7 @@ function phraser_criteres($params, &$result) {
 			$crit = new Critere;
 			$crit->op = $op;
 			$crit->not = $not;
+			$crit->cond = $cond;
 			$crit->exclus ="";
 			$crit->param = $v;
 			$args[] = $crit;
-- 
GitLab