Dépôt officiel du core SPIP Les plugins-dist faisant partie de la distribution SPIP sont présents dans https://git.spip.net/spip/[nom du plugin dist] https://www.spip.net
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

695 lines
17 KiB

<?php
18 years ago
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
7 years ago
* Copyright (c) 2001-2016 *
18 years ago
* 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. *
\***************************************************************************/
11 years ago
/**
* Définition des noeuds de l'arbre de syntaxe abstraite
*
* @package SPIP\Compilateur\AST
**/
18 years ago
if (!defined('_ECRIRE_INC_VERSION')) return;
/**
* Description d'un contexte de compilation
*
* Objet simple pour stocker le nom du fichier, la ligne, la boucle
* permettant entre autre de localiser le lieu d'une erreur de compilation.
* Cette structure est nécessaire au traitement d'erreur à l'exécution.
*
* Le champ code est inutilisé dans cette classe seule, mais harmonise
* le traitement d'erreurs.
*
* @package SPIP\Compilateur\AST
*/
class Contexte {
/**
* Description du squelette
*
* Sert pour la gestion d'erreur et la production de code dependant du contexte
*
* Peut contenir les index :
* - nom : Nom du fichier de cache
* - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
* - sourcefile : Chemin du squelette
* - squelette : Code du squelette
* - id_mere : Identifiant de la boucle parente
* - documents : Pour embed et img dans les textes
* - session : Pour un cache sessionné par auteur
* - niv : Niveau de tabulation
*
* @var array */
public $descr = array();
/**
* Identifiant de la boucle
* @var string */
public $id_boucle = '';
/**
* Numéro de ligne dans le code source du squelette
* @var int */
public $ligne = 0;
/**
* Langue d'exécution
* @var string */
public $lang = '';
/**
* Résultat de la compilation: toujours une expression PHP
* @var string */
public $code = '';
}
11 years ago
/**
* Description d'un texte
*
* @package SPIP\Compilateur\AST
11 years ago
**/
class Texte {
/**
* Type de noeud
* @var string */
public $type = 'texte';
/**
* Le texte
* @var string */
public $texte;
/**
* Contenu avant le texte.
*
* Vide ou apostrophe simple ou double si le texte en était entouré
* @var string|array */
public $avant = "";
/**
* Contenu après le texte.
*
* Vide ou apostrophe simple ou double si le texte en était entouré
* @var string|array */
public $apres = "";
/**
* Numéro de ligne dans le code source du squelette
* @var int */
public $ligne = 0;
}
11 years ago
/**
* Description d'une inclusion de squelette
*
* @package SPIP\Compilateur\AST
11 years ago
**/
class Inclure {
/**
* Type de noeud
* @var string */
public $type = 'include';
/**
* Nom d'un fichier inclu
*
* - Objet Texte si inclusion d'un autre squelette
* - chaîne si inclusion d'un fichier PHP directement
* @var string|Texte */
public $texte;
/**
* Inutilisé, propriété générique de l'AST
* @var string|array */
public $avant = '';
/**
* Inutilisé, propriété générique de l'AST
* @var string|array */
public $apres = '';
/**
* Numéro de ligne dans le code source du squelette
* @var int */
public $ligne = 0;
/**
* Valeurs des paramètres
* @var array */
public $param = array();
}
11 years ago
/**
* Description d'une boucle
*
* @package SPIP\Compilateur\AST
11 years ago
**/
class Boucle {
/**
* Type de noeud
* @var string */
public $type = 'boucle';
/**
* Identifiant de la boucle
* @var string */
public $id_boucle;
/**
* Identifiant de la boucle parente
* @var string */
public $id_parent ='';
/**
* Partie optionnelle avant
* @var string|array */
public $avant = '';
/**
* Pour chaque élément
* @var string|array */
public $milieu = '';
/**
* Partie optionnelle après
* @var string|array */
public $apres = '';
/**
* Partie alternative, si pas de résultat dans la boucle
* @var string|array */
public $altern = '';
/**
* La boucle doit-elle sélectionner la langue ?
* @var string|null */
public $lang_select;
/**
* Alias de table d'application de la requête ou nom complet de la table SQL
* @var string|null */
public $type_requete;
/**
* La table est elle optionnelle ?
*
* Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
* @var bool */
public $table_optionnelle = false;
/**
* Nom du fichier de connexion
* @var string */
public $sql_serveur = '';
/**
* Paramètres de la boucle
*
* Description des paramètres passés à la boucle, qui servent ensuite
* au calcul des critères
*
* @var array */
public $param = array();
/**
* Critères de la boucle
* @var Critere[] */
public $criteres = array();
/**
* Textes insérés entre 2 éléments de boucle (critère inter)
* @var string[] */
public $separateur = array();
/**
* Liste des jointures possibles avec cette table
*
* Les jointures par défaut de la table sont complétées en priorité
* des jointures déclarées explicitement sur la boucle
* @see base_trouver_table_dist()
* @var array */
public $jointures = array();
/**
* Jointures explicites avec cette table
*
* Ces jointures sont utilisées en priorité par rapport aux jointures
* normales possibles pour retrouver les colonnes demandées extérieures
* à la boucle.
* @var string|bool */
public $jointures_explicites = false;
/**
* Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
* @var string|null */
public $doublons;
var $partie, $total_parties,$mode_partie='';
var $externe = ''; # appel a partir d'une autre boucle (recursion)
// champs pour la construction de la requete SQL
var $select = array();
var $from = array();
var $from_type = array();
var $where = array();
var $join = array();
var $having = array();
var $limit;
var $group = array();
var $order = array();
var $default_order = array();
var $date = 'date' ;
var $hash = "" ;
var $in = "" ;
var $sous_requete = false;
var $hierarchie = '';
var $statut = false; # definition/surcharge du statut des elements retournes
// champs pour la construction du corps PHP
var $show = array();
var $id_table;
var $primary;
var $return;
var $numrows = false;
var $cptrows = false;
/**
* Description du squelette
*
* Sert pour la gestion d'erreur et la production de code dependant du contexte
*
* Peut contenir les index :
* - nom : Nom du fichier de cache
* - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
* - sourcefile : Chemin du squelette
* - squelette : Code du squelette
* - id_mere : Identifiant de la boucle parente
* - documents : Pour embed et img dans les textes
* - session : Pour un cache sessionné par auteur
* - niv : Niveau de tabulation
*
* @var array */
public $descr = array();
/**
* Numéro de ligne dans le code source du squelette
* @var int */
public $ligne = 0;
var $modificateur = array(); // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
var $iterateur = ''; // type d'iterateur
// obsoletes, conserves provisoirement pour compatibilite
var $tout = false;
var $plat = false;
var $lien = false;
}
11 years ago
/**
* Description d'un critère de boucle
*
* Sous-noeud de Boucle
*
* @package SPIP\Compilateur\AST
11 years ago
**/
class Critere {
/**
* Type de noeud
* @var string */
public $type = 'critere';
/**
* Opérateur (>, <, >=, IN, ...)
* @var null|string */
public $op;
/**
* Présence d'une négation (truc !op valeur)
* @var null|string */
public $not;
/**
* Présence d'une exclusion (!truc op valeur)
* @var null|string */
public $exclus;
/**
* Paramètres du critère
* - $param[0] : élément avant l'opérateur
* - $param[1..n] : éléments après l'opérateur
* @var array */
var $param = array();
/**
* Numéro de ligne dans le code source du squelette
* @var int */
public $ligne = 0;
}
11 years ago
/**
* Description d'un champ (balise SPIP)
*
* @package SPIP\Compilateur\AST
11 years ago
**/
class Champ {
/**
* Type de noeud
* @var string */
public $type = 'champ';
/**
* Nom du champ demandé. Exemple 'ID_ARTICLE'
* @var string|null */
public $nom_champ;
/**
* Identifiant de la boucle parente si explicité
* @var string|null */
public $nom_boucle= '';
/**
* Partie optionnelle avant
* @var null|string|array */
public $avant;
/**
* Partie optionnelle après
* @var null|string|array */
public $apres;
/**
* Étoiles : annuler des automatismes
*
* - '*' annule les filtres automatiques
* - '**' annule en plus les protections de scripts
* @var null|string */
public $etoile;
/**
* Arguments et filtres explicites sur la balise
* - $param[0] contient les arguments de la balise
* - $param[1..n] contient les filtres à appliquer à la balise
* @var array */
public $param = array();
/**
* Source des filtres (compatibilité) (?)
* @var array|null */
public $fonctions = array();
/**
* Identifiant de la boucle
* @var string */
public $id_boucle = '';
/**
* AST du squelette, liste de toutes les boucles
* @var Boucles[] */
public $boucles;
/**
* Alias de table d'application de la requête ou nom complet de la table SQL
* @var string|null */
public $type_requete;
/**
* Résultat de la compilation: toujours une expression PHP
* @var string */
public $code = '';
/**
* Interdire les scripts
*
* false si on est sûr de cette balise
* @see interdire_scripts()
* @var bool */
public $interdire_scripts = true;
/**
* Description du squelette
*
* Sert pour la gestion d'erreur et la production de code dependant du contexte
*
* Peut contenir les index :
* - nom : Nom du fichier de cache
* - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
* - sourcefile : Chemin du squelette
* - squelette : Code du squelette
* - id_mere : Identifiant de la boucle parente
* - documents : Pour embed et img dans les textes
* - session : Pour un cache sessionné par auteur
* - niv : Niveau de tabulation
*
* @var array */
public $descr = array();
/**
* Numéro de ligne dans le code source du squelette
* @var int */
public $ligne = 0;
/**
* Drapeau pour reperer les balises calculées par une fonction explicite
* @var bool */
public $balise_calculee = false;
}
11 years ago
/**
* Description d'une chaîne de langue
**/
class Idiome {
/**
* Type de noeud
* @var string */
public $type = 'idiome';
/**
* Clé de traduction demandée. Exemple 'item_oui'
* @var string */
public $nom_champ = "";
/**
* Module de langue où chercher la clé de traduction. Exemple 'medias'
* @var string */
public $module = "";
/**
* Arguments à passer à la chaîne
* @var array */
public $arg = array();
/**
* Filtres à appliquer au résultat
* @var array */
public $param = array();
/**
* Source des filtres (compatibilité) (?)
* @var array|null */
public $fonctions = array();
/**
* Inutilisé, propriété générique de l'AST
* @var string|array */
public $avant = '';
/**
* Inutilisé, propriété générique de l'AST
* @var string|array */
public $apres = '';
/**
* Identifiant de la boucle
* @var string */
public $id_boucle = '';
/**
* AST du squelette, liste de toutes les boucles
* @var Boucles[] */
public $boucles;
/**
* Alias de table d'application de la requête ou nom complet de la table SQL
* @var string|null */
public $type_requete;
/**
* Résultat de la compilation: toujours une expression PHP
* @var string */
public $code = '';
/**
* Interdire les scripts
* @see interdire_scripts()
* @var bool */
public $interdire_scripts = false;
/**
* Description du squelette
*
* Sert pour la gestion d'erreur et la production de code dependant du contexte
*
* Peut contenir les index :
* - nom : Nom du fichier de cache
* - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
* - sourcefile : Chemin du squelette
* - squelette : Code du squelette
* - id_mere : Identifiant de la boucle parente
* - documents : Pour embed et img dans les textes
* - session : Pour un cache sessionné par auteur
* - niv : Niveau de tabulation
*
* @var array */
public $descr = array();
/**
* Numéro de ligne dans le code source du squelette
* @var int */
public $ligne = 0;
}
11 years ago
/**
* Description d'un texte polyglotte (<multi>)
*
* @package SPIP\Compilateur\AST
11 years ago
**/
class Polyglotte {
/**
* Type de noeud
* @var string */
public $type = 'polyglotte';
/**
* Tableau des traductions possibles classées par langue
*
* Tableau code de langue => texte
* @var array */
var $traductions = array();
/**
* Numéro de ligne dans le code source du squelette
* @var int */
public $ligne = 0;
}
Le débusqueur donne à présent aussi pour les balises dynamiques l'endroit précis de leur éventuelle mauvaise utilisation dans un squelette. Cette fonctionnalité a nécessité de revenir encore une fois sur le deuxième argument des balises dynamiques, tombé en désuétude en [14194], ressuscité en [14213] sur la suggestion de #1728: ce tableau est finalement composé d'abord de 5 valeurs issues du contexte de compilation (nom du squelette, nom du fichier compilé, nom de la boucle éventuelle où figure la balise, numéro de ligne, langue) suivis éventuellement des éléments du tableau optionnel fourni par la fonction principale de la balise dynamique comme 4e argument de la fonction {{{calculer_balise_dynamique}}}. Introduction aussi d'une nouvelle structure pour contenir ces informations, qui n'est peut-être pas très intuitive mais facilite leur propagation. Ce dépot s'accompagne d'un modification sémantique du libellé des erreurs concernant ces balises: elles ne sont pas nécessairement à utiliser dans une boucle (sinon on pourrait réperer l'erreur à la compilation et on n'aurait pas tout ce problème de contexte à trimbaler), il faut seulement que le {{{id_*}}} idoine soit présent (par exemple dans l'URL). Musée des horreurs ayant servi de tests pour les derniers dépôts: {{{ [(#FORMULAIRE_ECRIRE_AUTEUR)] [(#FORMULAIRE_SITE)] [(#FORMULAIRE_SIGNATURE)] <BOUCLE_coucou(AUTEURS){#ID_AUTEUR}> CHEMIN #INCLURE{expo, #X} </div> </BOUCLE_coucou> <//B_coucou> <BOUCLE2(AUTEURS){id_auteur} /> <BOUCLE2(ARTICLES){id_auteur} /> <BOUCLE3(ARTICLES){id_auteur} > [(#NOM&&&)] [(#NOM{,,,,,,,,,})] }}}
14 years ago
11 years ago
global $table_criteres_infixes;
$table_criteres_infixes = array('<', '>', '<=', '>=', '==', '===', '!=', '!==', '<>', '?');
14 years ago
global $exception_des_connect;
$exception_des_connect[] = ''; // ne pas transmettre le connect='' par les inclure
11 years ago
/**
11 years ago
* Déclarer les interfaces de la base pour le compilateur
*
* On utilise une fonction qui initialise les valeurs,
11 years ago
* sans écraser d'eventuelles prédéfinition dans mes_options
* et les envoie dans un pipeline
* pour les plugins
*
11 years ago
* @link http://doc.spip.org/@declarer_interfaces
*
* @return void
*/
function declarer_interfaces(){
global $exceptions_des_tables, $table_des_tables, $table_date, $table_titre, $table_statut;
$table_des_tables['articles']='articles';
$table_des_tables['auteurs']='auteurs';
$table_des_tables['rubriques']='rubriques';
$table_des_tables['hierarchie']='rubriques';
// definition des statuts de publication
global $tables_statut;
$table_statut = array();
//
// tableau des tables de jointures
// Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
global $tables_jointures;
$tables_jointures = array();
$tables_jointures['spip_jobs'][] = 'jobs_liens';
global $exceptions_des_jointures;
#$exceptions_des_jointures['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
$exceptions_des_jointures['profondeur'] = array('spip_rubriques', 'profondeur');
global $table_des_traitements;
define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
define('_TRAITEMENT_TYPO_SANS_NUMERO', 'typo(supprimer_numero(%s), "TYPO", $connect, $Pile[0])');
$table_des_traitements['BIO'][]= _TRAITEMENT_RACCOURCIS;
$table_des_traitements['CHAPO'][]= _TRAITEMENT_RACCOURCIS;
$table_des_traitements['DATE'][]= 'normaliser_date(%s)';
$table_des_traitements['DATE_REDAC'][]= 'normaliser_date(%s)';
$table_des_traitements['DATE_MODIF'][]= 'normaliser_date(%s)';
$table_des_traitements['DATE_NOUVEAUTES'][]= 'normaliser_date(%s)';
$table_des_traitements['DESCRIPTIF'][]= _TRAITEMENT_RACCOURCIS;
$table_des_traitements['INTRODUCTION'][]= 'PtoBR('. _TRAITEMENT_RACCOURCIS .')';
$table_des_traitements['NOM_SITE_SPIP'][]= _TRAITEMENT_TYPO;
$table_des_traitements['NOM'][]= _TRAITEMENT_TYPO_SANS_NUMERO;
$table_des_traitements['AUTEUR'][]= _TRAITEMENT_TYPO;
$table_des_traitements['PS'][]= _TRAITEMENT_RACCOURCIS;
$table_des_traitements['SOURCE'][]= _TRAITEMENT_TYPO;
$table_des_traitements['SOUSTITRE'][]= _TRAITEMENT_TYPO;
$table_des_traitements['SURTITRE'][]= _TRAITEMENT_TYPO;
$table_des_traitements['TAGS'][]= '%s';
$table_des_traitements['TEXTE'][]= _TRAITEMENT_RACCOURCIS;
$table_des_traitements['TITRE'][]= _TRAITEMENT_TYPO_SANS_NUMERO;
$table_des_traitements['TYPE'][]= _TRAITEMENT_TYPO;
$table_des_traitements['DESCRIPTIF_SITE_SPIP'][]= _TRAITEMENT_RACCOURCIS;
$table_des_traitements['SLOGAN_SITE_SPIP'][]= _TRAITEMENT_TYPO;
$table_des_traitements['ENV'][]= 'entites_html(%s,true)';
// valeur par defaut pour les balises non listees ci-dessus
$table_des_traitements['*'][]= false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
// toujours securiser les DATA
$table_des_traitements['*']['DATA']= 'safehtml(%s)';
// expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
$table_des_traitements['VALEUR']['DATA']= 'safehtml(%s)';
// gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
$interfaces = pipeline('declarer_tables_interfaces',
array(
'table_des_tables'=>$table_des_tables,
'exceptions_des_tables'=>$exceptions_des_tables,
'table_date'=>$table_date,
'table_titre'=>$table_titre,
'tables_jointures'=>$tables_jointures,
'exceptions_des_jointures'=>$exceptions_des_jointures,
'table_des_traitements'=>$table_des_traitements,
'table_statut'=>$table_statut,
));
if ($interfaces){
$table_des_tables = $interfaces['table_des_tables'];
$exceptions_des_tables = $interfaces['exceptions_des_tables'];
$table_date = $interfaces['table_date'];
$table_titre = $interfaces['table_titre'];
$tables_jointures = $interfaces['tables_jointures'];
$exceptions_des_jointures = $interfaces['exceptions_des_jointures'];
$table_des_traitements = $interfaces['table_des_traitements'];
$table_statut = $interfaces['table_statut'];
}
}
declarer_interfaces();
?>