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