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