From 47d077a2bbd705bf80a1591f594c9aeef70498ac Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Fri, 3 Sep 2004 21:50:43 +0000 Subject: [PATCH] =?UTF-8?q?retrait=20des=20derni=C3=A8res=20affectations?= =?UTF-8?q?=20dans=20les=20balises=20et=20optimisation=20r=C3=A9sultante?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- inc-balises.php3 | 6 +- inc-calcul-outils.php3 | 10 +++ inc-compilo.php3 | 162 +++++++++++++++-------------------------- 3 files changed, 70 insertions(+), 108 deletions(-) diff --git a/inc-balises.php3 b/inc-balises.php3 index 77c962bdb2..2257d6d7bc 100644 --- a/inc-balises.php3 +++ b/inc-balises.php3 @@ -232,11 +232,7 @@ function balise_URL_AUTEUR_dist($p) { function balise_NOTES_dist($p) { // Recuperer les notes - $p->code = '$GLOBALS["les_notes"]'; - // Vider ensuite les globales des notes recuperees - // avec une formule qui renvoit toujours "" - $p->code .= '. ($GLOBALS["les_notes"] = $GLOBALS["compt_note"] = ' - . '($GLOBALS["marqueur_notes"]++)?"":"")'; + $p->code = 'calculer_notes()'; $p->type = 'html'; return $p; } diff --git a/inc-calcul-outils.php3 b/inc-calcul-outils.php3 index 1a3cf52448..44a162f5c6 100644 --- a/inc-calcul-outils.php3 +++ b/inc-calcul-outils.php3 @@ -226,6 +226,16 @@ function calcul_branche ($generation) { } } +# fonction appelée par la balise #NOTES + +function calcule_notes() +{ + $r = $GLOBALS["les_notes"]; + $GLOBALS["les_notes"] = ""; + $GLOBALS["compt_note"] = 0; + $GLOBALS["marqueur_notes"] ++; + return $r; +} # retourne la profondeur d'une rubrique diff --git a/inc-compilo.php3 b/inc-compilo.php3 index fdada54234..f68e185f81 100644 --- a/inc-compilo.php3 +++ b/inc-compilo.php3 @@ -137,11 +137,11 @@ function calculer_boucle($id_boucle, &$boucles) { $boucle = &$boucles[$id_boucle]; $type_boucle = $boucle->type_requete; - list($return,$corps) = $boucle->return; + $return = $boucle->return; // Boucle recursive : simplement appeler la boucle interieure if ($type_boucle == 'boucle') - return ("$corps\n return $return;"); + return ("\n return $return;"); // Cas general : appeler la fonction de definition de la boucle $f = 'boucle_'.strtoupper($type_boucle); // definition perso @@ -200,12 +200,12 @@ function calculer_boucle($id_boucle, &$boucles) { // Cas {1/3} {1,4} {n-2,1}... $flag_parties = ($boucle->partie AND $boucle->total_parties); $flag_cpt = $flag_parties || // pas '$compteur' a cause du cas 0 - strpos($corps,'compteur_boucle') || strpos($return,'compteur_boucle'); // // Creer le debut du corps de la boucle : // + $debut = ''; if ($flag_cpt) $debut = "\n \$compteur_boucle++;"; @@ -218,10 +218,10 @@ function calculer_boucle($id_boucle, &$boucles) { $debut .= ' if ($x = $Pile[$SP]["lang"]) $spip_lang = $x; // lang_select'; - $debut .= $invalide; + $corps = $debut . $invalide; if ($boucle->doublons) - $debut .= "\n \$doublons['".$boucle->doublons."'] .= ','. " . + $corps .= "\n \$doublons['".$boucle->doublons."'] .= ','. " . index_pile($id_boucle, $primary_key, $boucles) . "; // doublons"; @@ -229,8 +229,6 @@ function calculer_boucle($id_boucle, &$boucles) { // // L'ajouter au corps // - $corps = $debut . $corps; - // Separateur ? if ($boucle->separateur) { $corps .= "\n \$t1 = $return; @@ -285,9 +283,7 @@ function calculer_boucle($id_boucle, &$boucles) { $corps = ' // RESULTATS - while ($objet = @spip_fetch_array($result)) {' - . "\n\t\t\$Pile[\$SP] = \$objet;" - . "\n$corps\n }\n"; + while ($Pile[$SP] = @spip_fetch_array($result)) {'. "\n$corps\n }\n"; // Memoriser la langue avant la boucle pour la restituer apres if ($lang_select) { @@ -310,7 +306,7 @@ function calculer_boucle($id_boucle, &$boucles) { // En absence de champ c'est un decompte : on prend la primary pour // avoir qqch (le marteau-pilon * est trop couteux, et le COUNT - // incompatible avec le cas general) $init .= + // incompatible avec le cas general) $init .= "spip_abstract_select(\n\t\tarray(\"". ((!$boucle->select) ? $id_field : join("\",\n\t\t\"", array_unique($boucle->select))) . @@ -415,6 +411,10 @@ function calculer_parties($partie, $mode_partie, $total_parties, $id_boucle) { return $retour; } +function nom_de_fonction($nom) +{ + return 'BOUCLE' . ereg_replace("-","_", $nom) . '_'; +} // Production du code PHP a partir de la sequence livree par le phraseur @@ -425,126 +425,82 @@ function calculer_parties($partie, $mode_partie, $total_parties, $id_boucle) { // avant d'evaluer l'expression (a rendre obsolete tant que possible). function calculer_liste($tableau, $prefix, $id_boucle, $niv, &$boucles, $id_mere) { - if ((!$tableau)) - return array("''",''); + if (!$tableau) return "''"; + $codes = array(); $t = '$t' . ($niv+1); for ($i=0; $i<=$niv; $i++) $tab .= "\t"; foreach ($tableau as $objet) { - // c = 'code' ; m = 'entete' - // rendu[0] = (code, entete) du principal - // rendu[1] = (code, entete) du "avant" - // rendu[2] = (code, entete) du "apres" - // rendu[3] = (code, entete) du "alternatif" - unset($rendu); - unset($commentaire); - switch($objet->type) { // texte seul case 'texte': - $rendu[0][0] = calculer_texte($objet->texte, $id_boucle, $boucles, $id_mere); + $code = calculer_texte($objet->texte, $id_boucle, $boucles, $id_mere); + $commentaire=''; + $avant=''; + $apres=''; + $altern = "''"; break; // inclure case 'include': - $rendu[0][0] = calculer_inclure($objet->fichier, - $objet->params, - $id_boucle, - $boucles); + $code= calculer_inclure($objet->fichier, + $objet->params, + $id_boucle, + $boucles); $commentaire = "<INCLURE($objet->fichier)>"; + $avant=''; + $apres=''; + $altern = "''"; break; // boucle case 'boucle': $nom = $objet->id_boucle; - // avant - $rendu[1] = calculer_liste($objet->cond_avant, $prefix, - $id_boucle, $niv+2, $boucles, $nom); - // apres - $rendu[2] = calculer_liste($objet->cond_apres, $prefix, - $id_boucle, $niv+2, $boucles, $nom); - // alternatif - $rendu[3] = calculer_liste($objet->cond_altern, $prefix, - $id_boucle, $niv+1,$boucles, $nom); - $rendu[0][0] = $prefix . ereg_replace("-","_", $nom) - . '($Cache, $Pile, $doublons, $Numrows, $SP)'; - $commentaire = "BOUCLE$nom"; + + $code = 'BOUCLE' . + ereg_replace("-","_", $nom) . $prefix . + '($Cache, $Pile, $doublons, $Numrows, $SP)'; + $commentaire=''; + $avant = calculer_liste($objet->cond_avant, $prefix, $id_boucle, $niv+2, $boucles, $nom); + $apres = calculer_liste($objet->cond_apres, $prefix, $id_boucle, $niv+2, $boucles, $nom); + $altern = calculer_liste($objet->cond_altern, $prefix, $id_boucle, $niv+1,$boucles, $nom); break; // balise SPIP default: - $rendu[0][0] = calculer_champ($objet->fonctions, - $objet->nom_champ, - $id_boucle, - $boucles, - $id_mere, - $objet->etoile); + + $code = calculer_champ($objet->fonctions, + $objet->nom_champ, + $id_boucle, + $boucles, + $id_mere, + $objet->etoile); $commentaire = "#$objet->nom_champ".($objet->etoile?'*':''); - // avant - $rendu[1] = calculer_liste($objet->cond_avant, $prefix, - $id_boucle, $niv+2,$boucles, $id_mere); - // apres - $rendu[2] = calculer_liste($objet->cond_apres, $prefix, - $id_boucle, $niv+2,$boucles, $id_mere); + $avant = calculer_liste($objet->cond_avant, $prefix, $id_boucle, $niv+2,$boucles, $id_mere); + $apres = calculer_liste($objet->cond_apres, $prefix, $id_boucle, $niv+2,$boucles, $id_mere); + $altern = "''"; break; } // switch - // Assembler les elements en simplifiant si possible - // le resultat (lisibilite et rapidite) - $utiliser_f = false; - for ($i = 0; $i<=3; $i++) { - if ($rendu[$i][0] == '' OR $rendu[$i][0] == "''") { - $rendu[$i][0] = "''"; - } else { - // Ajouter l'entete eventuel - if ($rendu[$i][1]) - $rendu[$i][0] = - "eval('".texte_script($rendu[$i][1])."')." - ."/"."* entete *"."/" - ."\n$tab".$rendu[$i][0]; - // Noter le recours eventuel ˆ _f - if ($i>0) - $utiliser_f = true; - } - } - if ($commentaire) - $rendu[0][0] = "/"."* $commentaire *"."/ ".$rendu[0][0]; - - // - // (_f(1,principal) ? avant._f().apres : _f().alternatif) - // _f() fonctionne avec une pile ; cette structure logique permet - // de n'evaluer que ce qui doit l'etre (ne pas evaluer avant/apres - // si on veut utiliser sinon, et vice-versa) - if ($utiliser_f) - $code = "(_f(1,".$rendu[0][0].") ? " - . (($rendu[1][0]=="''") ? "" : - "\n$tab\t/"."* << *"."/".$rendu[1][0]." .") - . "_f()" - . (($rendu[2][0]=="''") ? "" : - ". ".$rendu[2][0]."/"."* >> *"."/") - . " : _f()" - . (($rendu[3][0]=="''") ? "" : - " /"."* sinon: *"."/.".$rendu[3][0]) - .")"; - else - // eviter les conditionnelles qui forkent le resultat - // si le code est '$a ? $b : $c', le parenthesage est obligatoire - // quand on est lie a d'autres chaines par des . tout nus - // NB/astuce: s'il y a un entete, la formule eval('...').$a ? $b : $c - // fonctionne a l'identique de $a ? $b : $c - if (strpos($rendu[0][0], '?')) - $code = "(".$rendu[0][0].")"; - else - $code = $rendu[0][0]; - - $codes[] = $code; - + if ($avant == "''") $avant = ''; + if ($apres == "''") $apres = ''; + if ($avant||$apres||($altern!="''")) + { + $res = (!$avant ? "" : "$avant . ") . + $t . + (!$apres ? "" : " . $apres"); + + if (($res != $t) || ($altern != "''")) + $code = "(($t = $code) ?\n\t$tab($res) :\n\t$tab$altern)"; + } + $codes[]= (!$commentaire ? $code : + ("/"."* $commentaire *"."/ " . $code)); } // foreach - return array(join ("\n$tab. ", $codes), ''); + return join ("\n$tab. ", $codes); } // Prend en argument le source d'un squelette, sa grammaire et un nom. @@ -608,7 +564,7 @@ function calculer_squelette($squelette, $nom, $gram, $sourcefile) { } // idem pour la racine - list ($return,$corps) = calculer_liste($racine, $nom, '',0, $boucles, ''); + $return = calculer_liste($racine, $nom, '',0, $boucles, ''); // Corps de toutes les fonctions PHP, @@ -633,7 +589,7 @@ function calculer_squelette($squelette, $nom, $gram, $sourcefile) { // Puis envoyer son code $codeboucle = "\n//\n// <$pretty>\n//\n" - ."function $nom" . ereg_replace("-","_",$id) . + ."function BOUCLE" . ereg_replace("-","_",$id) . $nom . '(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' . $boucle->return; -- GitLab