Update of /home/spip-cvs/spip
In directory alan:/tmp/cvs-serv15590
Modified Files:
inc-balises.php3 inc-calcul-outils.php3 inc-calcul.php3
inc-compilo-index.php3 inc-compilo.php3 inc-criteres.php3
inc-html-squel.php3
Log Message:
quel bazar dans ces filtres: FORMULAIRE_RECHERCHE et URL_LOGOUT avec un paramètre déclenchaient un "parse error", LOGO_DOCUMENT ignorait le filtre "fichier" et le reste de ces attributs apparaissait comme du texte, et je dois en oublier. Bon, petite avancée vers les filtres imbriqués en séparant dès le phrasé la fonction de filtre de ses arguments
Index: inc-criteres.php3
RCS file: /home/spip-cvs/spip/inc-criteres.php3,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -d -r1.49 -r1.50
--- inc-criteres.php3 2 May 2005 18:16:19 -0000 1.49
+++ inc-criteres.php3 12 May 2005 16:53:37 -0000 1.50
@@ -617,7 +617,7 @@
$champ->nom_boucle = $regs[2];
$champ->nom_champ = $regs[3];
$champ->etoile = $regs[4];
- $champ->fonctions = $regs[5] ? array($regs[5]) : '';
+ $champ->fonctions = $regs[5] ? array(array('',$regs[5])) : '';
$champ->id_boucle = $idb;
$champ->boucles = &$boucles;
$champ = calculer_champ($champ);
Index: inc-calcul.php3
RCS file: /home/spip-cvs/spip/inc-calcul.php3,v
retrieving revision 1.140
retrieving revision 1.141
diff -u -d -r1.140 -r1.141
--- inc-calcul.php3 8 Apr 2005 13:50:09 -0000 1.140
+++ inc-calcul.php3 12 May 2005 16:53:37 -0000 1.141
@@ -97,7 +97,6 @@
if (function_exists($nom)) return $nom;
$skel_code = calculer_squelette($skel, $nom, $ext, $sourcefile);
-
// Tester si le compilateur renvoie une erreur
if (is_array($skel_code))
erreur_squelette($skel_code[0], $skel_code[1]);
Index: inc-compilo-index.php3
RCS file: /home/spip-cvs/spip/inc-compilo-index.php3,v
retrieving revision 1.56
retrieving revision 1.57
diff -u -d -r1.56 -r1.57
--- inc-compilo-index.php3 7 May 2005 22:42:34 -0000 1.56
+++ inc-compilo-index.php3 12 May 2005 16:53:37 -0000 1.57
@@ -190,15 +190,17 @@
function calculer_balise_dynamique($p, $nom, $l) {
balise_distante_interdite($p);
- $param = param_balise($p);
+ $param = param_balise($p); # attention: ca affecte $p
+ $param = filtres_arglist($param, $p, ',');
+ $collecte = join(',',collecter_balise_dynamique($l, $p));
$p->code = "executer_balise_dynamique('" . $nom . "',\n\tarray("
- . join(',',collecter_balise_dynamique($l, $p))
- . filtres_arglist($param, $p, ',')
+ . $collecte
+ . ($collecte ? $param : substr($param,1)) # virer la virgule
. "),\n\tarray("
- . (!$p->fonctions ? '' : ("'" . join("','", $p->fonctions) . "'"))
+ . argumenter_balise($p->fonctions, "', '")
. "), \$GLOBALS['spip_lang'])";
$p->statut = 'php';
- $p->fonctions = '';
+ $p->fonctions = array();
// Cas particulier de #FORMULAIRE_FORUM : inserer l'invalideur
if ($nom == 'FORMULAIRE_FORUM')
@@ -208,16 +210,11 @@
}
function param_balise(&$p) {
- $a = $p->fonctions;
- if ($a) list(,$nom) = each($a) ; else $nom = '';
- if (!ereg('^ *\{([^{}]*(\{[^{}]*\})?[^{}]*)\} *',$nom, $m))
- return '';
- else {
- $filtres= array();
- while (list(, $f) = each($a)) if ($f) $filtres[] = $f;
- $p->fonctions = $filtres;
- return $m[1];
- }
+ if (!($a=$p->fonctions)) return "";
+ $c = array_shift($a);
+ if ($c[0]) return "";
+ $p->fonctions = $a;
+ return $c[1];
}
// construire un tableau des valeurs interessant un formulaire
@@ -233,7 +230,7 @@
$statut = $p->statut;
$fonctions = $p->fonctions;
- $p->fonctions = ''; # pour réutiliser la structure si récursion
+ $p->fonctions = array(); # pour reutilisation si recursion
// pretraitements standards
switch ($statut) {
@@ -252,29 +249,25 @@
$code = ($p->etoile ? $p->code : champs_traitements($p));
// Appliquer les filtres perso
if ($fonctions) {
- foreach($fonctions as $fonc) {
- if ($fonc) {
- $arglist = '';
- if (ereg('([^{}]+)\{([^{}]*(\{[^{}]*\})?[^{}]*)\}$', $fonc, $regs)) {
- $fonc = $regs[1];
+ foreach($fonctions as $couple) {
+ if ($couple) {
+ $fonc = $couple[0];
+ $arglist = filtres_arglist($couple[1],$p, ($fonc == '?' ? ':' : ','));
- $arglist = filtres_arglist($regs[2],$p, ($fonc == '?' ? ':' : ','));
- }
- if (function_exists($fonc))
+ if (function_exists($fonc))
$code = "$fonc($code$arglist)";
- else if (strpos("x < > <= >= == === != !== <> ? ", " $fonc "))
+ else if (strpos("x < > <= >= == === != !== <> ? ", " $fonc "))
$code = "($code $fonc "
. substr($arglist,1)
. ')';
- else
+ else
$code = "erreur_squelette('".
texte_script(
_T('zbug_erreur_filtre', array('filtre' => $fonc))
)."','" . $p->id_boucle . "')";
- }
+ }
}
}
-
// post-traitement securite
if ($statut == 'html')
$code = "interdire_scripts($code)";
@@ -287,7 +280,6 @@
function filtres_arglist($args, $p, $sep) {
$arglist ='';
-
while (strlen($args = trim($args))) {
if ($args[0] == '"')
ereg ('^[[:space:]]*(")([^"]*)"[[:space:]]*,?(.*)$', $args, $regs);
@@ -300,7 +292,6 @@
$quote = trim($regs[1]); // valeur = ", ', ou vide
$arg = $regs[2]; // le premier argument
$args = $regs[3]; // ceux qui restent
-
if ($quote)
$arg = "'" . texte_script($arg) . "'";
else {
@@ -312,11 +303,9 @@
else if (ereg("^" . NOM_DE_CHAMP ."(.*)$", $arg, $r2)) {
$p->nom_boucle = $r2[2];
$p->nom_champ = $r2[3];
- $p->fonctions = array($r2[5]);
+ $p->fonctions = phraser_filtres($r2[5]);
$arg = calculer_champ($p);
- } else if (is_numeric($arg))
- $arg = $arg;
- else
+ } else if (!is_numeric($arg))
$arg = "'" . texte_script($arg) . "'";
}
Index: inc-calcul-outils.php3
RCS file: /home/spip-cvs/spip/inc-calcul-outils.php3,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -d -r1.57 -r1.58
--- inc-calcul-outils.php3 12 May 2005 07:39:40 -0000 1.57
+++ inc-calcul-outils.php3 12 May 2005 16:53:37 -0000 1.58
@@ -140,7 +140,7 @@
// elles sont traitees comme des inclusions
function synthetiser_balise_dynamique($nom, $args, $file, $lang) {
- return
+ return
('<'.'?php
include_ecrire(\'inc_lang.php3\');
lang_select("'.$lang.'");
@@ -170,7 +170,6 @@
$r = $f($args, $filtres);
else
$r = $args;
-
if (!is_array($r))
return $r;
else
@@ -323,6 +322,18 @@
return embed_document($id_document, $filtres, false);
}
+// 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 récuperer la 2e moitie du tableau
+
+function argumenter_balise($fonctions, $sep) {
+ $res = array();
+ if ($fonctions)
+ foreach ($fonctions as $f) $res[] =
+ str_replace('\'', '\\\'', str_replace('\\', '\\\\',$f[0]));
+ return ("'" . join($sep, $res) . "'");
+}
+
// fonction appelee par la balise #NOTES
function calculer_notes() {
$r = $GLOBALS["les_notes"];
Index: inc-html-squel.php3
RCS file: /home/spip-cvs/spip/inc-html-squel.php3,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -d -r1.44 -r1.45
--- inc-html-squel.php3 27 Apr 2005 11:41:55 -0000 1.44
+++ inc-html-squel.php3 12 May 2005 16:53:37 -0000 1.45
@@ -15,14 +15,14 @@
if (defined("_INC_HTML_SQUEL")) return;
define("_INC_HTML_SQUEL", "1");
-# Ce fichier doit IMPERATIVEMENT contenir la fonction "parser"
+# Ce fichier doit IMPERATIVEMENT contenir la fonction "phraser"
# qui transforme un squelette en un tableau d'objets de classe Boucle
# il est charge par un include calcule dans inc-calcul-squel
# pour permettre differentes syntaxes en entree
define('NOM_DE_BOUCLE', "[0-9]+|[-_][-_.a-zA-Z0-9]*");
define('NOM_DE_CHAMP', "#((" . NOM_DE_BOUCLE . "):)?([A-Z_]+)(\*?)");
-define('CHAMP_ETENDU', '\[([^]\[]*)\(' . NOM_DE_CHAMP . '([^)]*)\)([^]\[]*)\]');
+define('CHAMP_ETENDU', '\[([^]\[]*)\(' . NOM_DE_CHAMP . '([^[)]*)\)([^]\[]*)\]');
define('PARAM_DE_BOUCLE','[[:space:]]*\{[[:space:]]*([^{}]*(\{[^\}]*\}[^\}]*)*)[[:space:]]*\}');
define('TYPE_DE_BOUCLE', "[^)]*");
define('BALISE_DE_BOUCLE',
@@ -42,7 +42,7 @@
define('DEBUT_DE_BOUCLE','/<B('.NOM_DE_BOUCLE.')>.*?<BOUCLE\1[^-_.a-zA-Z0-9]|<BOUCLE('.NOM_DE_BOUCLE.')/ms'); # preg
-function parser_inclure($texte, $result) {
+function phraser_inclure($texte, $result) {
while (($p=strpos($texte, '<INCLU')) !== false) {
$fin = substr($texte, $p);
@@ -51,7 +51,7 @@
$debut = substr($texte, 0, $p);
$texte = substr($fin, strlen($s));
- if ($debut) $result = parser_champs($debut, $result);
+ if ($debut) $result = phraser_champs($debut, $result);
$champ = new Inclure;
$champ->fichier = $match[1];
@@ -70,10 +70,10 @@
$result[] = $champ;
}
- return (!$texte ? $result : parser_champs($texte, $result));
+ return (!$texte ? $result : phraser_champs($texte, $result));
}
-function parser_champs($texte,$result) {
+function phraser_champs($texte,$result) {
while (ereg(NOM_DE_CHAMP . '(.*)$', $texte, $regs)) {
$p = strpos($texte, $regs[0]);
@@ -112,42 +112,54 @@
// %###N@ ou N indexe un tableau comportant le resultat de leur phrase
// on recommence tant qu'il y a des [...] en substituant a l'appel suivant
-function parser_champs_etendus($texte, $result) {
+function phraser_champs_etendus($texte, $result) {
if (!$texte) return $result;
$sep = '##';
while (strpos($texte,$sep)!== false)
$sep .= '#';
- return array_merge($result, parser_champs_interieurs($texte, $sep, array()));
+ return array_merge($result, phraser_champs_interieurs($texte, $sep, array()));
}
-function parser_champs_exterieurs($debut, $sep, $nested) {
+function phraser_filtres($fonctions) {
+ $r = array();
+ if ($fonctions) {
+ $fonctions = explode('|', ereg_replace("^\|", "", $fonctions));
+ foreach($fonctions as $f) {
+ ereg("^([^{]*)?(.*)$",$f,$m);
+ $arg = $m[2];
+ $fonc = $m[1];
+ $x = ereg("^\{(.*)\} *$",$arg,$m);
+ $r[]= array($fonc, ($x ? $m[1] : $arg));
+ }
+ }
+ return $r;
+}
+
+function phraser_champs_exterieurs($debut, $sep, $nested) {
$res = array();
while (($p=strpos($debut, "%$sep"))!==false) {
- if ($p) $res = parser_inclure(substr($debut,0,$p), $res);
+ if ($p) $res = phraser_inclure(substr($debut,0,$p), $res);
ereg("^%$sep([0-9]+)@(.*)$", substr($debut,$p),$m);
$res[]= $nested[$m[1]];
$debut = $m[2];
}
- return (!$debut ? $res : parser_inclure($debut, $res));
+ return (!$debut ? $res : phraser_inclure($debut, $res));
}
-function parser_champs_interieurs($texte, $sep, $result) {
+function phraser_champs_interieurs($texte, $sep, $result) {
$i = 1;
while (true) { $j=$i;
while (ereg(CHAMP_ETENDU . '(.*)$', $texte, $regs)) {
+
$champ = new Champ;
$champ->nom_boucle = $regs[3];
$champ->nom_champ = $regs[4];
$champ->etoile = $regs[5];
- $champ->cond_avant = parser_champs_exterieurs($regs[1],$sep,$result);
- $champ->cond_apres = parser_champs_exterieurs($regs[7],$sep,$result);
- $fonctions = $regs[6];
- if ($fonctions) {
- $fonctions = explode('|', ereg_replace("^\|", "", $fonctions));
- foreach($fonctions as $f) $champ->fonctions[]= $f;
- }
+ $champ->cond_avant = phraser_champs_exterieurs($regs[1],$sep,$result);
+ $champ->cond_apres = phraser_champs_exterieurs($regs[7],$sep,$result);
+ $champ->fonctions = phraser_filtres($regs[6]);
$p = strpos($texte, $regs[0]);
if ($p) {$result[$i] = substr($texte,0,$p);$i++; }
@@ -163,11 +175,11 @@
if (is_object($z)) $x .= "%$sep$j@" ; else $x.=$z ;
$j++;}
if (ereg(CHAMP_ETENDU, $x)) $texte = $x;
- else return parser_champs_exterieurs($x, $sep, $result);}
+ else return phraser_champs_exterieurs($x, $sep, $result);}
}
-function parser_param($params, &$result) {
+function phraser_param($params, &$result) {
$params2 = array();
$type = $result->type_requete;
while (ereg('^' . PARAM_DE_BOUCLE . '[[:space:]]*(.*)$', trim($params), $m)) {
@@ -208,7 +220,7 @@
$result->param = $params2;
}
-function parser($texte, $id_parent, &$boucles, $nom) {
+function phraser($texte, $id_parent, &$boucles, $nom) {
$all_res = array();
@@ -256,7 +268,7 @@
$result->param = substr($match[2], 6);
} else {
$result->type_requete = $type;
- parser_param($match[3], $result);
+ phraser_param($match[3], $result);
}
//
@@ -308,12 +320,12 @@
$texte = substr($texte, $p + strlen($s));
}
- $result->cond_avant = parser($result->cond_avant, $id_parent,$boucles, $nom);
- $result->cond_apres = parser($result->cond_fin, $id_parent,$boucles, $nom);
- $result->cond_altern = parser($result->cond_altern,$id_parent,$boucles, $nom);
- $result->milieu = parser($milieu, $id_boucle,$boucles, $nom);
+ $result->cond_avant = phraser($result->cond_avant, $id_parent,$boucles, $nom);
+ $result->cond_apres = phraser($result->cond_fin, $id_parent,$boucles, $nom);
+ $result->cond_altern = phraser($result->cond_altern,$id_parent,$boucles, $nom);
+ $result->milieu = phraser($milieu, $id_boucle,$boucles, $nom);
- $all_res = parser_champs_etendus($debut, $all_res);
+ $all_res = phraser_champs_etendus($debut, $all_res);
$all_res[] = $result;
if ($boucles[$id_boucle]) {
erreur_squelette(_T('zbug_erreur_boucle_syntaxe'),
@@ -323,7 +335,7 @@
$boucles[$id_boucle] = $result;
}
- return parser_champs_etendus($texte, $all_res);
+ return phraser_champs_etendus($texte, $all_res);
}
?>
Index: inc-compilo.php3
RCS file: /home/spip-cvs/spip/inc-compilo.php3,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -d -r1.61 -r1.62
--- inc-compilo.php3 5 May 2005 22:24:10 -0000 1.61
+++ inc-compilo.php3 12 May 2005 16:53:37 -0000 1.62
@@ -123,7 +123,7 @@
$module = 'public/spip/ecrire';
$c = new Champ;
$c->code = "_T('$module:$chaine')";
- $c->fonctions = explode('|', substr($match[4],1));
+ $c->fonctions = phraser_filtres(substr($match[4],1));
$c->id_boucle = $id_boucle;
$c->boucles = &$boucles;
$c->statut = 'php'; // ne pas manger les espaces avec trim()
@@ -536,7 +536,7 @@
include_local("inc-$gram-squel.php3");
- $racine = parser($squelette, '',$boucles, $nom);
+ $racine = phraser($squelette, '',$boucles, $nom);
// tableau des informations sur le squelette
$descr = array('nom' => $nom, 'documents' => false, 'sourcefile' => $sourcefile);
Index: inc-balises.php3
RCS file: /home/spip-cvs/spip/inc-balises.php3,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -d -r1.72 -r1.73
--- inc-balises.php3 12 May 2005 07:39:40 -0000 1.72
+++ inc-balises.php3 12 May 2005 16:53:36 -0000 1.73
@@ -359,19 +359,14 @@
}
$on = 'on';
$off= '';
- if ($p->fonctions) {
+ if ($a = ($p->fonctions)) {
// Gerer la notation [(#EXPOSER|on,off)]
- reset($p->fonctions);
- list(, $onoff) = each($p->fonctions);
- ereg("([^,]*)(,(.*))?", $onoff, $regs);
+ $onoff = array_shift($a);
+ ereg("([^,]*)(,(.*))?", $onoff[0], $regs);
$on = addslashes($regs[1]);
$off = addslashes($regs[3]);
-
// autres filtres
- $filtres=Array();
- while (list(, $nom) = each($p->fonctions))
- $filtres[] = $nom;
- $p->fonctions = $filtres;
+ $p->fonctions = $a;
}
@@ -389,10 +384,10 @@
function balise_EMBED_DOCUMENT_dist($p) {
balise_distante_interdite($p);
$_id_document = champ_sql('id_document',$p);
- $p->code = "calcule_embed_document(intval($_id_document), '" .
- texte_script($p->fonctions ? join($p->fonctions, "|") : "") .
- "', \$doublons, '" . $p->descr['documents'] . "')";
- unset ($p->fonctions);
+ $p->code = "calcule_embed_document(intval($_id_document), " .
+ argumenter_balise($p->fonctions, "|") .
+ ", \$doublons, '" . $p->descr['documents'] . "')";
+ $p->fonctions = array();
$p->statut = 'html';
return $p;
}
@@ -539,10 +534,11 @@
$_id_objet = champ_sql("id_".strtolower($type_objet), $p);
}
// analyser les filtres
- $flag_fichier = false;
+ $flag_fichier = 0;
$filtres = '';
if (is_array($p->fonctions)) {
- foreach($p->fonctions as $nom) {
+ foreach($p->fonctions as $couple) {
+ $nom = $couple[0];
if (ereg('^(left|right|center|top|bottom)$', $nom))
$align = $nom;
else if ($nom == 'lien') {
@@ -550,7 +546,7 @@
$flag_stop = true;
}
else if ($nom == 'fichier') {
- $flag_fichier = 'true';
+ $flag_fichier = 1;
$flag_stop = true;
}
// double || signifie "on passe aux filtres"
@@ -563,7 +559,7 @@
// apres un URL ou || ou |fichier ce sont
// des filtres (sauf left...lien...fichier)
else
- $filtres[] = $nom;
+ $filtres[] = $couple;
}
// recuperer les autres filtres s'il y en a
$p->fonctions = $filtres;
@@ -634,15 +630,15 @@
include_ecrire("inc_extra.php3");
list ($key, $champ_extra) = each($p->fonctions); // le premier filtre
$type_extra = $p->type_requete;
- // ci-dessus est sans doute un peu buggue : si on invoque #EXTRA
- // depuis un sous-objet sans champ extra d'un objet a champ extra,
- // on aura le type_extra du sous-objet (!)
- if (extra_champ_valide($type_extra, $champ_extra)) {
+ // ci-dessus est sans doute un peu buggue : si on invoque #EXTRA
+ // depuis un sous-objet sans champ extra d'un objet a champ extra,
+ // on aura le type_extra du sous-objet (!)
+ if (extra_champ_valide($type_extra, $champ_extra[0])) {
unset($p->fonctions[$key]);
$p->code = "extra($p->code, '".addslashes($champ_extra)."')";
// Appliquer les filtres definis par le webmestre
- $filtres = extra_filtres($type_extra, $champ_extra);
+ $filtres = extra_filtres($type_extra, $champ_extra[0]);
if ($filtres) foreach ($filtres as $f)
$p->code = "$f($p->code)";
}
@@ -696,7 +692,7 @@
# porter un nom et faire partie de l'API.
if ($retour = param_balise($p))
$code_retour = calculer_liste(
- parser_champs_etendus($retour, array()),
+ phraser_champs_etendus($retour, array()),
$p->descr,
$p->boucles,
$p->id_boucle);