1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/spip_ynh.git synced 2024-09-03 20:25:59 +02:00
spip_ynh/sources/ecrire/public/interfaces.php
2015-04-28 17:10:23 +02:00

694 lines
17 KiB
PHP
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/***************************************************************************\
* SPIP, Systeme de publication pour l'internet *
* *
* Copyright (c) 2001-2014 *
* 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. *
\***************************************************************************/
/**
* Définition des noeuds de l'arbre de syntaxe abstraite
*
* @package SPIP\Compilateur\AST
**/
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 = '';
}
/**
* Description d'un texte
*
* @package SPIP\Compilateur\AST
**/
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;
}
/**
* Description d'une inclusion de squelette
*
* @package SPIP\Compilateur\AST
**/
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();
}
/**
* Description d'une boucle
*
* @package SPIP\Compilateur\AST
**/
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;
}
/**
* Description d'un critère de boucle
*
* Sous-noeud de Boucle
*
* @package SPIP\Compilateur\AST
**/
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;
}
/**
* Description d'un champ (balise SPIP)
*
* @package SPIP\Compilateur\AST
**/
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;
}
/**
* 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;
}
/**
* Description d'un texte polyglotte (<multi>)
*
* @package SPIP\Compilateur\AST
**/
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;
}
global $table_criteres_infixes;
$table_criteres_infixes = array('<', '>', '<=', '>=', '==', '===', '!=', '!==', '<>', '?');
global $exception_des_connect;
$exception_des_connect[] = ''; // ne pas transmettre le connect='' par les inclure
/**
* Déclarer les interfaces de la base pour le compilateur
*
* On utilise une fonction qui initialise les valeurs,
* sans écraser d'eventuelles prédéfinition dans mes_options
* et les envoie dans un pipeline
* pour les plugins
*
* @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();
?>