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&id_$type=' . $_id . '&connect=$s'"; + else { + $u = "quete_meta('adresse_site', '$s')"; + $f = "$_id . '&file=' . quete_fichier($_id,'$s')"; + return "$u . '?action=acceder_document&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&id_$type=' . $_id . '&connect=$s'"; - else { - $u = "quete_meta('adresse_site', '$s')"; - $f = "$_id . '&file=' . quete_fichier($_id,'$s')"; - return "$u . '?action=acceder_document&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