compiler.php
SPIP, Système de publication pour l'internet
Copyright © avec tendresse depuis 2001 Arnaud Martin, Antoine Pitrou, Philippe Rivière, Emmanuel Saint-James
Ce programme est un logiciel libre distribué sous licence GNU/GPL.
Table of Contents
Constants
- _REGEXP_CONCAT_NON_VIDE = "/^(.*)[.]\\s*'[^']+'\\s*\$/"
- _REGEXP_COND_NONVIDE_VIDE = "/^[(](.*)[?]\\s*('[^']+')\\s*:\\s*''\\s*[)]\$/"
- _REGEXP_COND_VIDE_NONVIDE = "/^[(](.*)[?]\\s*''\\s*:\\s*('[^']+')\\s*[)]\$/"
- CODE_COMMENTE = \true
- Indique s'il faut commenter le code produit
- CODE_CORPS_BOUCLE = '%s if (defined("_BOUCLE_PROFILER")) $timer = time()+(float)microtime(); $t0 = ""; // REQUETE $iter = Spip\Compilateur\Iterateur\Factory::create( "%s", %s, array(%s) ); if (!$iter->err()) { %s%s$SP++; // RESULTATS %s %s$iter->free(); }%s if (defined("_BOUCLE_PROFILER") AND 1000*($timer = (time()+(float)microtime())-$timer) > _BOUCLE_PROFILER) spip_logger("profiler")->warning(intval(1000*$timer)."ms %s"); return $t0;'
- Compilation d'une boucle non recursive.
- CODE_MONOTONE = ",^(\n//[^\n]*\n)?\\(?'([^'])*'\\)?\$,"
- Repérer un code ne calculant rien, meme avec commentaire
- CODE_RECUPERER_FOND = 'recuperer_fond(%s, %s, array(%s), %s)'
- Code d'appel à un <INCLURE>
Functions
- argumenter_inclure() : mixed
- calculer_inclure() : string
- Compile une inclusion <INCLURE> ou #INCLURE
- instituer_boucle() : mixed
- Gérer les statuts declarés pour cette table
- calculer_boucle() : string
- Produit le corps PHP d'une boucle Spip.
- calculer_boucle_nonrec() : string
- Compilation d'une boucle (non recursive).
- calculer_requete_sql() : string
- Calcule le code PHP d'une boucle contenant les informations qui produiront une requête SQL
- memoriser_contexte_compil() : string
- Retourne une chaîne des informations du contexte de compilation
- reconstruire_contexte_compil() : Contexte
- Reconstruit un contexte de compilation
- calculer_dec() : array<string|int, mixed>
- Calcule le code d'affectation d'une valeur à une commande de boucle
- calculer_dump_array() : string
- Calcule l'expression PHP décrivant un tableau complexe (ou une chaîne)
- calculer_dump_join() : mixed
- calculer_from() : string
- Calcule l'expression PHP décrivant les informations FROM d'une boucle
- calculer_from_type() : string
- Calcule l'expression PHP décrivant des informations de type de jointure pour un alias de table connu dans le FROM
- calculer_order() : mixed
- calculer_liste() : mixed
- compile_cas() : array<string|int, mixed>|false
- compile_concatene_parties_codes() : string
- Concatene 2 parties de code, en simplifiant si l'une des 2 est vides
- compile_retour() : mixed|string
- production d'une expression conditionnelle ((v=EXP) ? (p . v .s) : a) mais si EXP est de la forme (t ? 'C' : '') on produit (t ? (p . C . s) : a) de meme si EXP est de la forme (t ? '' : 'C')
- compile_inclure_doublons() : mixed
- public_compiler_dist() : mixed
- compiler_squelette() : mixed
- requeteur_php_dist() : mixed
- Requeteur pour les boucles (php:nom_iterateur)
- requeteur_data_dist() : mixed
- Requeteur pour les boucles (data:type de donnee) note: (DATA) tout court ne passe pas par ici.
Constants
_REGEXP_CONCAT_NON_VIDE
public
mixed
_REGEXP_CONCAT_NON_VIDE
= "/^(.*)[.]\\s*'[^']+'\\s*\$/"
_REGEXP_COND_NONVIDE_VIDE
public
mixed
_REGEXP_COND_NONVIDE_VIDE
= "/^[(](.*)[?]\\s*('[^']+')\\s*:\\s*''\\s*[)]\$/"
_REGEXP_COND_VIDE_NONVIDE
public
mixed
_REGEXP_COND_VIDE_NONVIDE
= "/^[(](.*)[?]\\s*''\\s*:\\s*('[^']+')\\s*[)]\$/"
CODE_COMMENTE
Indique s'il faut commenter le code produit
public
mixed
CODE_COMMENTE
= \true
CODE_CORPS_BOUCLE
Compilation d'une boucle non recursive.
public
mixed
CODE_CORPS_BOUCLE
= '%s
if (defined("_BOUCLE_PROFILER")) $timer = time()+(float)microtime();
$t0 = "";
// REQUETE
$iter = Spip\Compilateur\Iterateur\Factory::create(
"%s",
%s,
array(%s)
);
if (!$iter->err()) {
%s%s$SP++;
// RESULTATS
%s
%s$iter->free();
}%s
if (defined("_BOUCLE_PROFILER")
AND 1000*($timer = (time()+(float)microtime())-$timer) > _BOUCLE_PROFILER)
spip_logger("profiler")->warning(intval(1000*$timer)."ms %s");
return $t0;'
La constante donne le cadre systématique du code:
- %s1: initialisation des arguments de calculer_select
- %s2: appel de calculer_select en donnant un contexte pour les cas d'erreur
- %s3: initialisation du sous-tableau Numrows[id_boucle]
- %s4: sauvegarde de la langue et calcul des invariants de boucle sur elle
- %s5: boucle while sql_fetch ou str_repeat si corps monotone
- %s6: restauration de la langue
- %s7: liberation de la ressource, en tenant compte du serveur SQL
- %s8: code de trace eventuel avant le retour
CODE_MONOTONE
Repérer un code ne calculant rien, meme avec commentaire
public
mixed
CODE_MONOTONE
= ",^(\n//[^\n]*\n)?\\(?'([^'])*'\\)?\$,"
CODE_RECUPERER_FOND
Code d'appel à un <INCLURE>
public
mixed
CODE_RECUPERER_FOND
= 'recuperer_fond(%s, %s, array(%s), %s)'
Code PHP pour un squelette (aussi pour #INCLURE, #MODELE #LES_AUTEURS)
Functions
argumenter_inclure()
argumenter_inclure(mixed $params, mixed $rejet_filtres, mixed $p, mixed &$boucles, mixed $id_boucle[, mixed $echap = true ][, mixed $lang = '' ][, mixed $fond1 = false ]) : mixed
Parameters
- $params : mixed
- $rejet_filtres : mixed
- $p : mixed
- $boucles : mixed
- $id_boucle : mixed
- $echap : mixed = true
- $lang : mixed = ''
- $fond1 : mixed = false
calculer_inclure()
Compile une inclusion <INCLURE> ou #INCLURE
calculer_inclure(Inclure $p, array<string|int, mixed> &$boucles, string $id_boucle) : string
Parameters
- $p : Inclure
-
Description de l'inclusion (AST au niveau de l'inclure)
- $boucles : array<string|int, mixed>
-
AST du squelette
- $id_boucle : string
-
Identifiant de la boucle contenant l'inclure
Return values
string —Code PHP appelant l'inclusion
instituer_boucle()
Gérer les statuts declarés pour cette table
instituer_boucle(Boucle &$boucle[, bool $echapper = true ][, bool $ignore_previsu = false ]) : mixed
S'il existe des statuts sur cette table, déclarés dans la description d'un objet éditorial, applique leurs contraintes
Parameters
- $boucle : Boucle
-
Descrition de la boucle
- $echapper : bool = true
-
true pour échapper le code créé
- $ignore_previsu : bool = false
-
true pour ne tester que le cas publie et ignorer l'eventuel var_mode=preview de la page
calculer_boucle()
Produit le corps PHP d'une boucle Spip.
calculer_boucle(string $id_boucle, array<string|int, mixed> &$boucles) : string
Ce corps remplit une variable $t0 retournée en valeur. Ici on distingue boucles recursives et boucle à requête SQL et on insère le code d'envoi au debusqueur du resultat de la fonction.
Parameters
- $id_boucle : string
-
Identifiant de la boucle
- $boucles : array<string|int, mixed>
-
AST du squelette
Return values
string —Code PHP compilé de la boucle
calculer_boucle_nonrec()
Compilation d'une boucle (non recursive).
calculer_boucle_nonrec(string $id_boucle, array<string|int, mixed> &$boucles, string $trace) : string
Parameters
- $id_boucle : string
-
Identifiant de la boucle
- $boucles : array<string|int, mixed>
-
AST du squelette
- $trace : string
-
Code PHP (en mode debug uniquement) servant à conserver une trace des premières valeurs de la boucle afin de pouvoir les afficher dans le débugueur ultérieurement
Return values
string —Code PHP compilé de la boucle récursive
calculer_requete_sql()
Calcule le code PHP d'une boucle contenant les informations qui produiront une requête SQL
calculer_requete_sql(Boucle $boucle) : string
Le code produit est un tableau associatif $command contenant les informations
pour que la boucle produise ensuite sa requête, tel que $command['from'] = 'spip_articles';
Parameters
- $boucle : Boucle
-
AST de la boucle
Return values
string —Code PHP compilé définissant les informations de requête
memoriser_contexte_compil()
Retourne une chaîne des informations du contexte de compilation
memoriser_contexte_compil(object $p) : string
Retourne la source, le nom, l'identifiant de boucle, la ligne, la langue de l'élément dans une chaîne.
Parameters
- $p : object
-
Objet de l'AST dont on mémorise le contexte
Tags
Return values
string —Informations du contexte séparés par des virgules, qui peut être utilisé pour la production d'un tableau array()
reconstruire_contexte_compil()
Reconstruit un contexte de compilation
reconstruire_contexte_compil(array<string|int, mixed> $context_compil) : Contexte
Pour un tableau d'information de contexte donné, retourne un objet Contexte (objet générique de l'AST) avec ces informations
Parameters
- $context_compil : array<string|int, mixed>
-
Tableau des informations du contexte
Tags
Return values
Contexte —Objet Contexte
calculer_dec()
Calcule le code d'affectation d'une valeur à une commande de boucle
calculer_dec(string $nom, string $val) : array<string|int, mixed>
Décrit le code qui complète le tableau $command qui servira entre autres à l'itérateur. Pour un nom de commande donnée et un code PHP décrivant ou récupérant une valeur, on retourne le code PHP qui fait l'affectation.
L'index 0 du tableau retourné indique, lorsqu'il n'est pas vide, que l'affectation de la variable pourra être statique (c'est à dire qu'il ne dépend pas d'une quelconque variable PHP), et donc attribué une fois pour toutes quelque soit le nombre d'appels de la boucle.
Parameters
- $nom : string
-
Nom de la commande
- $val : string
-
Code PHP décrivant la valeur à affecter
Return values
array<string|int, mixed> —- index 0 : Code pour une affectation statique. Si non rempli, la propriété devra être ré-affectée à chaque appel de la boucle.
- index 1 : Code de l'affectation
calculer_dump_array()
Calcule l'expression PHP décrivant un tableau complexe (ou une chaîne)
calculer_dump_array(mixed $a) : string
Lorsqu'un tableau est transmis, reconstruit de quoi créer le tableau en code PHP (une sorte de var_export) en appelant pour chaque valeur cette fonction de manière récursive.
Si le premier index (0) du tableau est "'?'", retourne un code de test entre les 3 autres valeurs (v1 ? v2 : v3). Les valeurs pouvant être des tableaux aussi.
Parameters
- $a : mixed
-
Les données dont on veut construire un équivalent de var_export
Return values
string —Expression PHP décrivant un texte ou un tableau
calculer_dump_join()
calculer_dump_join(mixed $a) : mixed
Parameters
- $a : mixed
calculer_from()
Calcule l'expression PHP décrivant les informations FROM d'une boucle
calculer_from(Boucle &$boucle) : string
Parameters
- $boucle : Boucle
-
Description de la boucle
Return values
string —Code PHP construisant un tableau des alias et noms des tables du FROM
calculer_from_type()
Calcule l'expression PHP décrivant des informations de type de jointure pour un alias de table connu dans le FROM
calculer_from_type(Boucle &$boucle) : string
Parameters
- $boucle : Boucle
-
Description de la boucle
Return values
string —Code PHP construisant un tableau des alias et type de jointure du FROM
calculer_order()
calculer_order(mixed &$boucle) : mixed
Parameters
- $boucle : mixed
calculer_liste()
calculer_liste(mixed $tableau, mixed $descr, mixed &$boucles[, mixed $id_boucle = '' ]) : mixed
Parameters
- $tableau : mixed
- $descr : mixed
- $boucles : mixed
- $id_boucle : mixed = ''
Tags
compile_cas()
compile_cas(array<string|int, mixed> $tableau, array<string|int, mixed> $descr, array<string, Boucle> &$boucles, string $id_boucle) : array<string|int, mixed>|false
Parameters
- $tableau : array<string|int, mixed>
- $descr : array<string|int, mixed>
- $boucles : array<string, Boucle>
- $id_boucle : string
Tags
Return values
array<string|int, mixed>|falsecompile_concatene_parties_codes()
Concatene 2 parties de code, en simplifiant si l'une des 2 est vides
compile_concatene_parties_codes(string $partie1, string $partie2) : string
Parameters
- $partie1 : string
- $partie2 : string
Return values
stringcompile_retour()
production d'une expression conditionnelle ((v=EXP) ? (p . v .s) : a) mais si EXP est de la forme (t ? 'C' : '') on produit (t ? (p . C . s) : a) de meme si EXP est de la forme (t ? '' : 'C')
compile_retour(string $code, string $avant, string $apres, string $altern, string $tab, int $n) : mixed|string
Parameters
- $code : string
-
le code principal, dont le resultat conditionnera le reste
- $avant : string
-
la partie conditionnelle avant, qui est calculee apres le code, mais s'affiche avant si le code produit un resultat
- $apres : string
-
la partie conditionnelle apres, qui est calculee apres le code, et s'affiche apres si le code produit un resultat
- $altern : string
-
la partie alternative apres, qui est calculee apres le code, et s'affiche apres, si le code ne produit pas de resultat
- $tab : string
-
tabulation
- $n : int
-
compteur
Return values
mixed|stringcompile_inclure_doublons()
compile_inclure_doublons(mixed $lexemes) : mixed
Parameters
- $lexemes : mixed
public_compiler_dist()
public_compiler_dist(mixed $squelette, mixed $nom, mixed $gram, mixed $sourcefile[, string $connect = '' ]) : mixed
Parameters
- $squelette : mixed
- $nom : mixed
- $gram : mixed
- $sourcefile : mixed
- $connect : string = ''
compiler_squelette()
compiler_squelette(mixed $squelette, mixed $boucles, mixed $nom, mixed $descr, mixed $sourcefile[, string $connect = '' ]) : mixed
Parameters
- $squelette : mixed
- $boucles : mixed
- $nom : mixed
- $descr : mixed
- $sourcefile : mixed
- $connect : string = ''
requeteur_php_dist()
Requeteur pour les boucles (php:nom_iterateur)
requeteur_php_dist(array<string, Boucle> &$boucles, Boucle &$boucle, string &$id) : mixed
Analyse si le nom d'iterateur correspond bien a une classe PHP existante et dans ce cas charge la boucle avec cet iterateur. Affichera une erreur dans le cas contraire.
Parameters
- $boucles : array<string, Boucle>
-
Liste des boucles
- $boucle : Boucle
-
La boucle parcourue
- $id : string
-
L'identifiant de la boucle parcourue
requeteur_data_dist()
Requeteur pour les boucles (data:type de donnee) note: (DATA) tout court ne passe pas par ici.
requeteur_data_dist(array<string, Boucle> &$boucles, Boucle &$boucle, string &$id) : mixed
Analyse si le type de donnee peut etre traite et dans ce cas charge la boucle avec cet iterateur. Affichera une erreur dans le cas contraire.
Parameters
- $boucles : array<string, Boucle>
-
Liste des boucles
- $boucle : Boucle
-
La boucle parcourue
- $id : string
-
L'identifiant de la boucle parcourue