From 9d8a35efa41013d16c64c5c7d0f109aa16f00a39 Mon Sep 17 00:00:00 2001
From: "Committo,Ergo:sum" <esj@rezo.net>
Date: Sat, 27 Oct 2007 13:04:19 +0000
Subject: [PATCH] Petites modifications, normalement transparentes, dans le
 code produit par le compilateur pour maximiser le nombre d'occurrences de
 {{{$Pile[O]['}}}''nom''{{{']}}}. Cela concerne:
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

 * la balise ENV
 * les #PARAM non indiqués par les boucles

et déplacements de fonctions et inclusions pour que le validateur puisse exécuter le compilateur hors contexte.
---
 ecrire/balise/url_.php       | 40 +++++++++++++++++++++++++++++++++---
 ecrire/public/balises.php    |  9 +++++---
 ecrire/public/compiler.php   |  3 +++
 ecrire/public/composer.php   | 15 --------------
 ecrire/public/parametrer.php | 35 -------------------------------
 ecrire/public/references.php | 24 ++++++++++++++++++----
 6 files changed, 66 insertions(+), 60 deletions(-)

diff --git a/ecrire/balise/url_.php b/ecrire/balise/url_.php
index 034ed45649..456eba7bd6 100644
--- a/ecrire/balise/url_.php
+++ b/ecrire/balise/url_.php
@@ -12,9 +12,43 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-// Les balises URL_$type sont generiques:
-// Elles produisent un appel a generer_url_$type(id-courant)
-// sauf qq cas particuliers
+// Les balises URL_$type sont generiques, sauf qq cas particuliers:
+// elles produisent un appel a generer_url_$type(id-courant)
+// grace a la fonction ci-dessous
+// Si ces balises sont utilisees pour la base locale,
+// producttion des appels aux fonctions generer_url parametrees par $type_urls
+// Si la base est externe et non geree par SPIP
+// on retourne NULL pour provoquer leur interpretation comme champ SQL normal.
+// Si la base est externe et sous SPIP,
+// on produit l'URL de l'objet si c'est une piece jointe
+// ou sinon l'URL du site local applique sur l'objet externe
+// ce qui permet de le voir a travers les squelettes du site local
+
+// http://doc.spip.org/@generer_generer_url
+function generer_generer_url($type, $p)
+{
+	$_id = interprete_argument_balise(1,$p);
+
+	if (!$_id) $_id = champ_sql('id_' . $type, $p);
+
+	if ($s = $p->id_boucle) $s = $p->boucles[$s]->sql_serveur;
+
+	if (!$s)
+		return "generer_url_$type($_id)";
+	elseif (!$GLOBALS['connexions'][$s]['spip_connect_version']) {
+		return NULL;
+	} else {
+		$s = addslashes($s);
+		if ($type != 'document')
+			return "'./?page=$type&amp;id_$type=' . $_id . '&connect=$s'";
+		else {
+			$u = "quete_meta('adresse_site', '$s')";
+			$f = "$_id . '&amp;file=' . quete_fichier($_id,'$s')";
+			return "$u . '?action=acceder_document&amp;arg=' .$f";
+		}
+	}
+}
+
 
 // http://doc.spip.org/@balise_URL__dist
 function balise_URL__dist($p) {
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index fde4e6084b..8699044ee2 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -785,7 +785,6 @@ function balise_CHEMIN_dist($p) {
 // http://doc.spip.org/@balise_ENV_dist
 function balise_ENV_dist($p, $src = NULL) {
 	// le tableau de base de la balise (cf #META ci-dessous)
-	if (!$src) $src = '@$Pile[0]';
 
 	$_nom = interprete_argument_balise(1,$p);
 	$_sinon = interprete_argument_balise(2,$p);
@@ -793,10 +792,14 @@ function balise_ENV_dist($p, $src = NULL) {
 	if (!$_nom) {
 		// cas de #ENV sans argument : on retourne le serialize() du tableau
 		// une belle fonction [(#ENV|affiche_env)] serait pratique
-		$p->code = '(is_array($a = ('.$src.')) ? serialize($a) : "")';
+		$p->code = $src 
+		? ('(is_array($a = ('.$src.')) ? serialize($a) : "")')
+		: '@serialize($Pile[0])';
 	} else {
 		// admet deux arguments : nom de variable, valeur par defaut si vide
-		$p->code = 'is_array($a = ('.$src.')) ? $a['.$_nom.'] : ""';
+		$p->code = $src 
+		? ('is_array($a = ('.$src.')) ? $a['.$_nom.'] : ""')
+		: ('@$Pile[0][' . $_nom . ']');
 		if ($_sinon)
 			$p->code = 'sinon('. 
 				$p->code.",$_sinon)";
diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index b2a4b28334..12ecf460a4 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -20,6 +20,9 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // reperer un code ne calculant rien, meme avec commentaire
 define('CODE_MONOTONE', ",^(\n//[^\n]*\n)?\(?'([^'])*'\)?$,");
 
+// definition des structures de donnees
+include_spip('public/interfaces');
+
 // Definition de la structure $p, et fonctions de recherche et de reservation
 // dans l'arborescence des boucles
 include_spip('public/references');
diff --git a/ecrire/public/composer.php b/ecrire/public/composer.php
index 97793bd10d..5c9b586b7e 100644
--- a/ecrire/public/composer.php
+++ b/ecrire/public/composer.php
@@ -45,7 +45,6 @@ function public_composer_dist($squelette, $mime_type, $gram, $source, $connect)
 	AND lire_fichier ($phpfile, $contenu,
 	array('critique' => 'oui', 'phpcheck' => 'oui'))) 
 		eval('?'.'>'.$contenu);
-
 	if (@file_exists($fonc = $squelette . '_fonctions'.'.php')
 	OR @file_exists($fonc = $squelette . '_fonctions'.'.php3')) {
 		include_once $fonc;
@@ -432,20 +431,6 @@ function calcule_logo_document($id_document, $doubdoc, &$doublons, $flag_fichier
 	return $logo;
 }
 
-
-// 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) . "'");
-}
-
 // fonction appelee par la balise #NOTES
 // http://doc.spip.org/@calculer_notes
 function calculer_notes() {
diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php
index 2e604ed31e..610467d978 100644
--- a/ecrire/public/parametrer.php
+++ b/ecrire/public/parametrer.php
@@ -204,41 +204,6 @@ function quete_meta($nom, $serveur) {
 	return sql_getfetsel("valeur", "spip_meta", "nom=" . _q($nom), '','','','','','','',$serveur);
 }
 
-// Compilation finale des balise #URL_xxx
-// Si ces balises sont utilisees pour la base locale,
-// Producttion des appels aux fonctions generer_url parametrees par $type_urls
-// Si la base est externe et non geree par SPIP
-// on retourne NULL pour provoquer leur interpretation comme champ SQL normal.
-// Si la base est externe et sous SPIP,
-// on produit l'URL de l'objet si c'est une piece jointe
-// ou sinon l'URL du site local applique sur l'objet externe
-// ce qui permet de le voir a travers les squelettes du site local
-
-// http://doc.spip.org/@generer_generer_url
-function generer_generer_url($type, $p)
-{
-	$_id = interprete_argument_balise(1,$p);
-
-	if (!$_id) $_id = champ_sql('id_' . $type, $p);
-
-	if ($s = $p->id_boucle) $s = $p->boucles[$s]->sql_serveur;
-
-	if (!$s)
-		return "generer_url_$type($_id)";
-	elseif (!$GLOBALS['connexions'][$s]['spip_connect_version']) {
-		return NULL;
-	} else {
-		$s = addslashes($s);
-		if ($type != 'document')
-			return "'./?page=$type&amp;id_$type=' . $_id . '&connect=$s'";
-		else {
-			$u = "quete_meta('adresse_site', '$s')";
-			$f = "$_id . '&amp;file=' . quete_fichier($_id,'$s')";
-			return "$u . '?action=acceder_document&amp;arg=' .$f";
-		}
-	}
-}
-
 
 # Determine les parametres d'URL (hors reecriture) et consorts
 # En deduit un contexte disant si la page est une redirection ou 
diff --git a/ecrire/public/references.php b/ecrire/public/references.php
index c5cab7b997..5e1845eb46 100644
--- a/ecrire/public/references.php
+++ b/ecrire/public/references.php
@@ -294,6 +294,19 @@ function calculer_balise_dynamique($p, $nom, $l) {
 	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)
@@ -483,12 +496,15 @@ function compose_filtres_args($p, $args, $sep)
 function calculer_argument_precedent($idb, $nom_champ, &$boucles) {
 
 	// si recursif, forcer l'extraction du champ SQL mais ignorer le code
-	if ($boucles[$idb]->externe)
+	if ($boucles[$idb]->externe) {
 		index_pile ($idb, $nom_champ, $boucles); 
-	// retourner $Pile[$SP] et pas $Pile[0] (bug recursion en 1ere boucle)
+		$zero = '$SP';
+	} else $zero = '0';
+	// retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle
 	$prec = $boucles[$idb]->id_parent;
-	return (($prec==="") ? ('$Pile[$SP][\''.$nom_champ.'\']') : 
-		index_pile($prec, $nom_champ, $boucles));
+	return (($prec === '')
+		? ('$Pile[' . $zero . "]['$nom_champ']") 
+		: index_pile($prec, $nom_champ, $boucles));
 }
 
 //
-- 
GitLab