diff --git a/ecrire/inc_filtres.php3 b/ecrire/inc_filtres.php3 index 7117e9d3db6a0fa7768ba83fcb2f2223caaf83f3..93554d44a1560063fe31e02c2df6d058fa514978 100644 --- a/ecrire/inc_filtres.php3 +++ b/ecrire/inc_filtres.php3 @@ -846,7 +846,7 @@ function multi_trad ($lang, $trads) { function extraire_trad ($langue_demandee, $bloc) { $lang = ''; - while (preg_match("/^(.*?)\[([a-z_]+)\]/si", $bloc, $regs)) { + while (preg_match("/^(.*?)[\{\[]([a-z_]+)[\}\]]/si", $bloc, $regs)) { $texte = trim($regs[1]); if ($texte OR $lang) $trads[$lang] = $texte; diff --git a/formulaires/inc-formulaire_recherche.php3 b/formulaires/inc-formulaire_recherche.php3 index 2a30be802652225de02fff136aa8e262dd3dde1f..bc38275b94c3624aff2c536d3398912985b14886 100644 --- a/formulaires/inc-formulaire_recherche.php3 +++ b/formulaires/inc-formulaire_recherche.php3 @@ -13,13 +13,15 @@ function balise_FORMULAIRE_RECHERCHE_stat($args, $filtres) { // Seul un lien [(#FORMULAIRE_RECHERCHE|xxx.php3)] nous interesse else - return array($filtres[0]); + return array($filtres[0], $args[0]); } -function balise_FORMULAIRE_RECHERCHE_dyn($lien) { +function balise_FORMULAIRE_RECHERCHE_dyn($lien, $rech) { include_ecrire('inc_filtres.php3'); if (!$recherche_securisee = entites_html(_request('recherche'))) { + if (!$recherche_securisee = entites_html($rech)) { $recherche_securisee = _T('info_rechercher'); + } } if (!$lien) $lien = 'recherche.php3'; # par defaut diff --git a/inc-balises.php3 b/inc-balises.php3 index 2ee04b31940388f2083f66c62be2f61a3321cefd..17f9b41d223da0145e7efeab094f0981c4b7ed81 100644 --- a/inc-balises.php3 +++ b/inc-balises.php3 @@ -359,19 +359,14 @@ function balise_EXPOSER_dist($p) { } $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_EXPOSER_dist($p) { 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 @@ function calculer_balise_logo ($p) { $_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 @@ function calculer_balise_logo ($p) { $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 @@ function calculer_balise_logo ($p) { // 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 @@ function balise_EXTRA_dist ($p) { 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 @@ function balise_PARAMETRES_FORUM_dist($p) { # 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); diff --git a/inc-calcul-outils.php3 b/inc-calcul-outils.php3 index 5f04574d82f342ce33a9992f2f58f9396de6d9f1..55360ce3dba23a75ebaa3aa18f718d64dba2480c 100644 --- a/inc-calcul-outils.php3 +++ b/inc-calcul-outils.php3 @@ -140,7 +140,7 @@ function calcul_introduction ($type, $texte, $chapo='', $descriptif='') { // 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 @@ function executer_balise_dynamique($nom, $args, $filtres, $lang) { $r = $f($args, $filtres); else $r = $args; - if (!is_array($r)) return $r; else @@ -323,6 +322,18 @@ function calcule_embed_document($id_document, $filtres, &$doublons, $doubdoc) { 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"]; diff --git a/inc-calcul.php3 b/inc-calcul.php3 index 57a9363b586265ae4cf6f2d1883a4eb7517d18df..c1d26000ec3aaed79bf8d52be4ccea5e5de0098f 100644 --- a/inc-calcul.php3 +++ b/inc-calcul.php3 @@ -97,7 +97,6 @@ function charger_squelette ($squelette) { 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]); diff --git a/inc-compilo-index.php3 b/inc-compilo-index.php3 index 8792f40b79d0cb91b5fface01e07893cef8270a3..b18362708136e4c00076b83140835b0306304f53 100644 --- a/inc-compilo-index.php3 +++ b/inc-compilo-index.php3 @@ -190,15 +190,17 @@ function calculer_balise($nom, $p) { 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 calculer_balise_dynamique($p, $nom, $l) { } 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 @@ function applique_filtres($p) { $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 @@ function applique_filtres($p) { $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]; - - $arglist = filtres_arglist($regs[2],$p, ($fonc == '?' ? ':' : ',')); - } - if (function_exists($fonc)) + foreach($fonctions as $couple) { + if ($couple) { + $fonc = $couple[0]; + $arglist = filtres_arglist($couple[1],$p, ($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 applique_filtres($p) { function filtres_arglist($args, $p, $sep) { $arglist =''; - while (strlen($args = trim($args))) { if ($args[0] == '"') ereg ('^[[:space:]]*(")([^"]*)"[[:space:]]*,?(.*)$', $args, $regs); @@ -300,7 +292,6 @@ function filtres_arglist($args, $p, $sep) { $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 @@ function filtres_arglist($args, $p, $sep) { 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) . "'"; } diff --git a/inc-compilo.php3 b/inc-compilo.php3 index 1ef24eebfc60eb6c679cb7459c9ee60524173078..d7f339908f9509c099ab10ed726a607cfcf86e04 100644 --- a/inc-compilo.php3 +++ b/inc-compilo.php3 @@ -123,7 +123,7 @@ function calculer_texte($texte, $id_boucle, &$boucles) { $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 @@ function calculer_squelette($squelette, $nom, $gram, $sourcefile) { 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); diff --git a/inc-criteres.php3 b/inc-criteres.php3 index 99868909e3381ebfe247754df0616808887de315..492bd6a9d37961033b75a0d693b4d09fcde350f9 100644 --- a/inc-criteres.php3 +++ b/inc-criteres.php3 @@ -617,7 +617,7 @@ function calculer_param_dynamique($val, &$boucles, $idb) { $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); diff --git a/inc-html-squel.php3 b/inc-html-squel.php3 index 830f359c1f2d2866a72bdc7ef4e6f3d7d9dec05a..414188dd7d5034b94ad2aefe5dc1d73601f4d8d2 100644 --- a/inc-html-squel.php3 +++ b/inc-html-squel.php3 @@ -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('BALISE_INCLURE',"<INCLU[DR]E[[:space:]]*\(" . 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 @@ function parser_inclure($texte, $result) { $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 @@ function parser_inclure($texte, $result) { $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 @@ function parser_champs($texte,$result) { // %###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 @@ function parser_champs_interieurs($texte, $sep, $result) { 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 @@ function parser_param($params, &$result) { $result->param = $params2; } -function parser($texte, $id_parent, &$boucles, $nom) { +function phraser($texte, $id_parent, &$boucles, $nom) { $all_res = array(); @@ -256,7 +268,7 @@ function parser($texte, $id_parent, &$boucles, $nom) { $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 @@ function parser($texte, $id_parent, &$boucles, $nom) { $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 @@ function parser($texte, $id_parent, &$boucles, $nom) { $boucles[$id_boucle] = $result; } - return parser_champs_etendus($texte, $all_res); + return phraser_champs_etendus($texte, $all_res); } ?>