Skip to content
Extraits de code Groupes Projets
Valider 23000744 rédigé par esj's avatar esj
Parcourir les fichiers

Décompilation paramétrable des squelettes.

Le petit décompilateur accompagnant le débusqueur à ses débuts avait été neutralisé, faute d'avoir suivi les évolutions syntaxiques de SPIP. En voici un tout neuf et complet, qui a de plus la vertu d'être paramétrable: il parcourt l'arbre de syntaxe abstraite mais ne produit rien lui-même, car il délégue la production du format de sortie à un jeu de 7 fonctions dont les noms commencent respectivement par {{{format_boucle_ format_include_ format_polyglotte_ format_idiome_ format_champ_ format_liste_ format_critere_}}} et se terminent par le nom de la syntaxe de sortie désirée. Par défaut, ce nom est celui indiqué par la constante {{{_EXTENSION_SQUELETTES}}}, savoir {{{html}}} traditionnellement, et le fichier {{{public/format_}}}{format}{{{.php}}} est automatiquement chargé pour fournir la syntaxe en sortie.

Outre le rétablissement d'une fonctionnalité perdue dans le débusqueur, l'intérêt de ce décompilateur est de pouvoir expérimenter des nouvelles syntaxes. Pour les absents à [http://videos.spip.org/spip.php?article113 la session de Juin 2009 de SPIP-Party] (et pour les autres aussi), devoir de vacances: écrire les 7 fonctions produisant la syntaxe proposée à la session de Juin. Attention, il y a des pièges qui rendent certaines parties difficiles, preuve que cette syntaxe n'est pas encore aboutie.
parent a998956a
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
...@@ -387,6 +387,8 @@ ecrire/maj/vieille_base/charger.php -text ...@@ -387,6 +387,8 @@ ecrire/maj/vieille_base/charger.php -text
ecrire/maj/vieille_base/create.php -text ecrire/maj/vieille_base/create.php -text
ecrire/prive.php -text ecrire/prive.php -text
ecrire/public/aiguiller.php -text ecrire/public/aiguiller.php -text
ecrire/public/decompile.php -text
ecrire/public/format_html.php -text
ecrire/public/index.php -text ecrire/public/index.php -text
ecrire/public/jointures.php -text ecrire/public/jointures.php -text
ecrire/public/quete.php -text ecrire/public/quete.php -text
......
...@@ -762,46 +762,6 @@ function compile_retour($code, $avant, $apres, $altern, $tab, $n) ...@@ -762,46 +762,6 @@ function compile_retour($code, $avant, $apres, $altern, $tab, $n)
} }
// affichage du code produit
// http://doc.spip.org/@code_boucle
function code_boucle(&$boucles, $id, $nom)
{
$boucle = &$boucles[$id];
// Indiquer la boucle en commentaire
$pretty = '';
if ($boucle->type_requete != 'boucle')
{
// Resynthetiser les criteres
foreach ($boucle->param as $param) {
$s = "";
$sep = "";
foreach ($param as $t) {
if (is_array($t)) { // toujours vrai normalement
$s .= $sep;
$c = $t[0];
if ($c->apres)
$s .= ($c->apres . $c->texte . $c->apres);
else {
// faudrait decompiler aussi les balises...
foreach ($t as $c)
$s .= ($c->type == 'texte') ? $c->texte : '#...';
}
$sep = ", ";
}
}
$pretty .= ' {' . $s . '}';
}
}
$pretty = "BOUCLE$id(".strtoupper($boucle->type_requete) . ")" .
strtr($pretty,"\r\n", " ");
return $pretty;
}
function compile_inclure_doublons($lexemes) function compile_inclure_doublons($lexemes)
{ {
foreach($lexemes as $v) foreach($lexemes as $v)
...@@ -953,7 +913,12 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co ...@@ -953,7 +913,12 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co
// idem pour la racine // idem pour la racine
$descr['id_mere'] = ''; $descr['id_mere'] = '';
$corps = calculer_liste($squelette, $descr, $boucles); $corps = calculer_liste($squelette, $descr, $boucles);
$debug = (isset($GLOBALS['var_mode']) AND $GLOBALS['var_mode']=='debug');
if ($debug) {
include_spip('public/decompile');
include_spip('public/format_' . _EXTENSION_SQUELETTES);
}
// Calcul du corps de toutes les fonctions PHP, // Calcul du corps de toutes les fonctions PHP,
// en particulier les requetes SQL et TOTAL_BOUCLE // en particulier les requetes SQL et TOTAL_BOUCLE
// de'terminables seulement maintenant // de'terminables seulement maintenant
...@@ -981,24 +946,34 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co ...@@ -981,24 +946,34 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co
$req . $req .
"\n}\n\n"; "\n}\n\n";
if (isset($GLOBALS['var_mode']) AND $GLOBALS['var_mode'] == 'debug') if ($debug)
boucle_debug_compile ($id, $nom, $boucles[$id]->return); boucle_debug_compile ($id, $nom, $boucles[$id]->return);
} }
$code = ""; $code = "";
foreach($boucles as $id => $boucle) { foreach($boucles as $id => $boucle) {
$code .= "\n//\n// <BOUCLE " . $code .= "\n\n/* BOUCLE " .
# code_boucle($boucles, $id, $nom). # pas au point
$boucle->type_requete . $boucle->type_requete .
">\n//\n" . " " .
(!$debug ? '' :
decompile_criteres($boucle->param, $boucle->criteres)) .
" */\n\n" .
$boucle->return; $boucle->return;
} }
$secondes = spip_timer('calcul_skel'); $secondes = spip_timer('calcul_skel');
spip_log("COMPIL ($secondes) [$sourcefile] $nom.php"); spip_log("COMPIL ($secondes) [$sourcefile] $nom.php");
$head = '';
if (is_array($tableau_des_erreurs)) {
foreach ($tableau_des_erreurs as $err) {
$head .= "\n// "
. str_replace("\n", ' ', join(" ", $err));
}
}
if (!CODE_COMMENTE) if (!CODE_COMMENTE)
$head = ''; $head .= '';
else $head = " else $head = "
/* /*
* Squelette : $sourcefile * Squelette : $sourcefile
......
../../Ajouts/Essai/public/decompile.php
\ No newline at end of file
<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2009 *
* Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
* *
* Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
* Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
\***************************************************************************/
if (!defined("_ECRIRE_INC_VERSION")) return;
function format_boucle_html($avant, $nom, $type, $crit, $corps, $apres, $altern, $prof)
{
$avant = $avant ? "<B$nom>avant" : "";
$apres = $apres ? "$apres</B$nom>" : "";
$altern = $altern ? "$altern<//B$nom>" : "";
if (!$corps) $corps = " />"; else $corps = ">$corps</BOUCLE$nom>";
return "$avant<BOUCLE$nom($type)$crit$corps$apres$altern";
}
function format_include_html($file, $fond, $args, $prof)
{
$t = $file ? ("(" . $file . ")") : "" ;
if ($fond) array_unshift($args, "fond=" . $fond);
if ($args) $args = "{" . join(", ",$args) . "}";
return "<INCLURE" . $t . $args . ">";
}
function format_polyglotte_html($args, $prof)
{
return "<multi>" . join(" ", $args) . "</multi>";
}
function format_idiome_html($nom, $module, $args, $s, $prof)
{
return "<:" . ($module ? "$module:" : "") . $nom . $args . ":>";
}
function format_champ_html($nom, $boucle, $etoile, $avant, $apres, $args, $filtres, $next, $prof)
{
$nom = "#"
. ($boucle ? ($boucle . ":") : "")
. $nom
. $etoile
. $args
. $filtres;
// Determiner si c'est un champ etendu,
// notamment pour viter que le lexeme suivant s'agrege au champ
// si pas d'etoile terminale, pas d'arg et suivi d'une ambiguite
$s = ($avant OR $apres OR $filtres
OR ($prof < 0)
OR (strpos($args, '(#') !==false)
OR (!$args
AND !$etoile
AND $next
AND ($next->type == 'texte')
AND preg_match(',^[\w\d|{*],', $next->texte)));
return $s ? "[$avant($nom)$apres]" : $nom;
}
function format_liste_html($fonc, $args, $prof)
{
return ($fonc ? "|$fonc" : $fonc)
. (!$args ? "" : ("{" . join(",", $args) . "}"));
}
function format_critere_html($args, $prof)
{
return (!$args ? "" : ("{" . join(",", $args) . "}"));
}
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter