Update of /home/spip-cvs/spip
In directory alan:/tmp/cvs-serv6112
Modified Files:
inc-balises.php3 inc-calcul-outils.php3 inc-compilo.php3
Log Message:
retrait des dernières affectations dans les balises et optimisation résultante
Index: inc-compilo.php3
RCS file: /home/spip-cvs/spip/inc-compilo.php3,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -d -r1.7 -r1.8
--- inc-compilo.php3 2 Sep 2004 20:40:53 -0000 1.7
+++ inc-compilo.php3 3 Sep 2004 21:50:43 -0000 1.8
@@ -137,11 +137,11 @@
$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 @@
// 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 @@
$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 @@
//
// L'ajouter au corps
//
- $corps = $debut . $corps;
-
// Separateur ?
if ($boucle->separateur) {
$corps .= "\n \$t1 = $return;
@@ -285,9 +283,7 @@
$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 @@
// 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 @@
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 @@
// 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 @@
}
// 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 @@
// 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;
Index: inc-calcul-outils.php3
RCS file: /home/spip-cvs/spip/inc-calcul-outils.php3,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- inc-calcul-outils.php3 28 Aug 2004 23:17:42 -0000 1.1
+++ inc-calcul-outils.php3 3 Sep 2004 21:50:43 -0000 1.2
@@ -226,6 +226,16 @@
}
}
+# 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
Index: inc-balises.php3
RCS file: /home/spip-cvs/spip/inc-balises.php3,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -d -r1.5 -r1.6
--- inc-balises.php3 3 Sep 2004 20:16:14 -0000 1.5
+++ inc-balises.php3 3 Sep 2004 21:50:43 -0000 1.6
@@ -232,11 +232,7 @@
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;
}