[SPIP] ~v3.0.20-->v3.0.25
[lhc/web/clavette_www.git] / www / ecrire / public / interfaces.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2016 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 /**
14 * Définition des noeuds de l'arbre de syntaxe abstraite
15 *
16 * @package SPIP\Compilateur\AST
17 **/
18
19 if (!defined('_ECRIRE_INC_VERSION')) return;
20
21
22 /**
23 * Description d'un contexte de compilation
24 *
25 * Objet simple pour stocker le nom du fichier, la ligne, la boucle
26 * permettant entre autre de localiser le lieu d'une erreur de compilation.
27 * Cette structure est nécessaire au traitement d'erreur à l'exécution.
28 *
29 * Le champ code est inutilisé dans cette classe seule, mais harmonise
30 * le traitement d'erreurs.
31 *
32 * @package SPIP\Compilateur\AST
33 */
34 class Contexte {
35 /**
36 * Description du squelette
37 *
38 * Sert pour la gestion d'erreur et la production de code dependant du contexte
39 *
40 * Peut contenir les index :
41 * - nom : Nom du fichier de cache
42 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
43 * - sourcefile : Chemin du squelette
44 * - squelette : Code du squelette
45 * - id_mere : Identifiant de la boucle parente
46 * - documents : Pour embed et img dans les textes
47 * - session : Pour un cache sessionné par auteur
48 * - niv : Niveau de tabulation
49 *
50 * @var array */
51 public $descr = array();
52
53 /**
54 * Identifiant de la boucle
55 * @var string */
56 public $id_boucle = '';
57
58 /**
59 * Numéro de ligne dans le code source du squelette
60 * @var int */
61 public $ligne = 0;
62
63 /**
64 * Langue d'exécution
65 * @var string */
66 public $lang = '';
67
68 /**
69 * Résultat de la compilation: toujours une expression PHP
70 * @var string */
71 public $code = '';
72 }
73
74
75 /**
76 * Description d'un texte
77 *
78 * @package SPIP\Compilateur\AST
79 **/
80 class Texte {
81 /**
82 * Type de noeud
83 * @var string */
84 public $type = 'texte';
85
86 /**
87 * Le texte
88 * @var string */
89 public $texte;
90
91 /**
92 * Contenu avant le texte.
93 *
94 * Vide ou apostrophe simple ou double si le texte en était entouré
95 * @var string|array */
96 public $avant = "";
97
98 /**
99 * Contenu après le texte.
100 *
101 * Vide ou apostrophe simple ou double si le texte en était entouré
102 * @var string|array */
103 public $apres = "";
104
105 /**
106 * Numéro de ligne dans le code source du squelette
107 * @var int */
108 public $ligne = 0;
109 }
110
111 /**
112 * Description d'une inclusion de squelette
113 *
114 * @package SPIP\Compilateur\AST
115 **/
116 class Inclure {
117 /**
118 * Type de noeud
119 * @var string */
120 public $type = 'include';
121
122 /**
123 * Nom d'un fichier inclu
124 *
125 * - Objet Texte si inclusion d'un autre squelette
126 * - chaîne si inclusion d'un fichier PHP directement
127 * @var string|Texte */
128 public $texte;
129
130 /**
131 * Inutilisé, propriété générique de l'AST
132 * @var string|array */
133 public $avant = '';
134
135 /**
136 * Inutilisé, propriété générique de l'AST
137 * @var string|array */
138 public $apres = '';
139
140 /**
141 * Numéro de ligne dans le code source du squelette
142 * @var int */
143 public $ligne = 0;
144
145 /**
146 * Valeurs des paramètres
147 * @var array */
148 public $param = array();
149 }
150
151
152 /**
153 * Description d'une boucle
154 *
155 * @package SPIP\Compilateur\AST
156 **/
157 class Boucle {
158 /**
159 * Type de noeud
160 * @var string */
161 public $type = 'boucle';
162
163 /**
164 * Identifiant de la boucle
165 * @var string */
166 public $id_boucle;
167
168 /**
169 * Identifiant de la boucle parente
170 * @var string */
171 public $id_parent ='';
172
173 /**
174 * Partie optionnelle avant
175 * @var string|array */
176 public $avant = '';
177
178 /**
179 * Pour chaque élément
180 * @var string|array */
181 public $milieu = '';
182
183 /**
184 * Partie optionnelle après
185 * @var string|array */
186 public $apres = '';
187
188 /**
189 * Partie alternative, si pas de résultat dans la boucle
190 * @var string|array */
191 public $altern = '';
192
193 /**
194 * La boucle doit-elle sélectionner la langue ?
195 * @var string|null */
196 public $lang_select;
197
198 /**
199 * Alias de table d'application de la requête ou nom complet de la table SQL
200 * @var string|null */
201 public $type_requete;
202
203 /**
204 * La table est elle optionnelle ?
205 *
206 * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente
207 * @var bool */
208 public $table_optionnelle = false;
209
210 /**
211 * Nom du fichier de connexion
212 * @var string */
213 public $sql_serveur = '';
214
215 /**
216 * Paramètres de la boucle
217 *
218 * Description des paramètres passés à la boucle, qui servent ensuite
219 * au calcul des critères
220 *
221 * @var array */
222 public $param = array();
223
224 /**
225 * Critères de la boucle
226 * @var Critere[] */
227 public $criteres = array();
228
229 /**
230 * Textes insérés entre 2 éléments de boucle (critère inter)
231 * @var string[] */
232 public $separateur = array();
233
234 /**
235 * Liste des jointures possibles avec cette table
236 *
237 * Les jointures par défaut de la table sont complétées en priorité
238 * des jointures déclarées explicitement sur la boucle
239 * @see base_trouver_table_dist()
240 * @var array */
241 public $jointures = array();
242
243 /**
244 * Jointures explicites avec cette table
245 *
246 * Ces jointures sont utilisées en priorité par rapport aux jointures
247 * normales possibles pour retrouver les colonnes demandées extérieures
248 * à la boucle.
249 * @var string|bool */
250 public $jointures_explicites = false;
251
252 /**
253 * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index"
254 * @var string|null */
255 public $doublons;
256
257 var $partie, $total_parties,$mode_partie='';
258 var $externe = ''; # appel a partir d'une autre boucle (recursion)
259 // champs pour la construction de la requete SQL
260 var $select = array();
261 var $from = array();
262 var $from_type = array();
263 var $where = array();
264 var $join = array();
265 var $having = array();
266 var $limit;
267 var $group = array();
268 var $order = array();
269 var $default_order = array();
270 var $date = 'date' ;
271 var $hash = "" ;
272 var $in = "" ;
273 var $sous_requete = false;
274 var $hierarchie = '';
275 var $statut = false; # definition/surcharge du statut des elements retournes
276 // champs pour la construction du corps PHP
277 var $show = array();
278 var $id_table;
279 var $primary;
280 var $return;
281 var $numrows = false;
282 var $cptrows = false;
283
284 /**
285 * Description du squelette
286 *
287 * Sert pour la gestion d'erreur et la production de code dependant du contexte
288 *
289 * Peut contenir les index :
290 * - nom : Nom du fichier de cache
291 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
292 * - sourcefile : Chemin du squelette
293 * - squelette : Code du squelette
294 * - id_mere : Identifiant de la boucle parente
295 * - documents : Pour embed et img dans les textes
296 * - session : Pour un cache sessionné par auteur
297 * - niv : Niveau de tabulation
298 *
299 * @var array */
300 public $descr = array();
301
302 /**
303 * Numéro de ligne dans le code source du squelette
304 * @var int */
305 public $ligne = 0;
306
307
308 var $modificateur = array(); // table pour stocker les modificateurs de boucle tels que tout, plat ..., utilisable par les plugins egalement
309
310 var $iterateur = ''; // type d'iterateur
311
312 // obsoletes, conserves provisoirement pour compatibilite
313 var $tout = false;
314 var $plat = false;
315 var $lien = false;
316 }
317
318 /**
319 * Description d'un critère de boucle
320 *
321 * Sous-noeud de Boucle
322 *
323 * @package SPIP\Compilateur\AST
324 **/
325 class Critere {
326 /**
327 * Type de noeud
328 * @var string */
329 public $type = 'critere';
330
331 /**
332 * Opérateur (>, <, >=, IN, ...)
333 * @var null|string */
334 public $op;
335
336 /**
337 * Présence d'une négation (truc !op valeur)
338 * @var null|string */
339 public $not;
340
341 /**
342 * Présence d'une exclusion (!truc op valeur)
343 * @var null|string */
344 public $exclus;
345
346 /**
347 * Paramètres du critère
348 * - $param[0] : élément avant l'opérateur
349 * - $param[1..n] : éléments après l'opérateur
350 * @var array */
351 var $param = array();
352
353 /**
354 * Numéro de ligne dans le code source du squelette
355 * @var int */
356 public $ligne = 0;
357 }
358
359 /**
360 * Description d'un champ (balise SPIP)
361 *
362 * @package SPIP\Compilateur\AST
363 **/
364 class Champ {
365 /**
366 * Type de noeud
367 * @var string */
368 public $type = 'champ';
369
370 /**
371 * Nom du champ demandé. Exemple 'ID_ARTICLE'
372 * @var string|null */
373 public $nom_champ;
374
375 /**
376 * Identifiant de la boucle parente si explicité
377 * @var string|null */
378 public $nom_boucle= '';
379
380 /**
381 * Partie optionnelle avant
382 * @var null|string|array */
383 public $avant;
384
385 /**
386 * Partie optionnelle après
387 * @var null|string|array */
388 public $apres;
389
390 /**
391 * Étoiles : annuler des automatismes
392 *
393 * - '*' annule les filtres automatiques
394 * - '**' annule en plus les protections de scripts
395 * @var null|string */
396 public $etoile;
397
398 /**
399 * Arguments et filtres explicites sur la balise
400 * - $param[0] contient les arguments de la balise
401 * - $param[1..n] contient les filtres à appliquer à la balise
402 * @var array */
403 public $param = array();
404
405 /**
406 * Source des filtres (compatibilité) (?)
407 * @var array|null */
408 public $fonctions = array();
409
410 /**
411 * Identifiant de la boucle
412 * @var string */
413 public $id_boucle = '';
414
415 /**
416 * AST du squelette, liste de toutes les boucles
417 * @var Boucles[] */
418 public $boucles;
419
420 /**
421 * Alias de table d'application de la requête ou nom complet de la table SQL
422 * @var string|null */
423 public $type_requete;
424
425 /**
426 * Résultat de la compilation: toujours une expression PHP
427 * @var string */
428 public $code = '';
429
430 /**
431 * Interdire les scripts
432 *
433 * false si on est sûr de cette balise
434 * @see interdire_scripts()
435 * @var bool */
436 public $interdire_scripts = true;
437
438 /**
439 * Description du squelette
440 *
441 * Sert pour la gestion d'erreur et la production de code dependant du contexte
442 *
443 * Peut contenir les index :
444 * - nom : Nom du fichier de cache
445 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
446 * - sourcefile : Chemin du squelette
447 * - squelette : Code du squelette
448 * - id_mere : Identifiant de la boucle parente
449 * - documents : Pour embed et img dans les textes
450 * - session : Pour un cache sessionné par auteur
451 * - niv : Niveau de tabulation
452 *
453 * @var array */
454 public $descr = array();
455
456 /**
457 * Numéro de ligne dans le code source du squelette
458 * @var int */
459 public $ligne = 0;
460
461 /**
462 * Drapeau pour reperer les balises calculées par une fonction explicite
463 * @var bool */
464 public $balise_calculee = false;
465 }
466
467
468 /**
469 * Description d'une chaîne de langue
470 **/
471 class Idiome {
472 /**
473 * Type de noeud
474 * @var string */
475 public $type = 'idiome';
476
477 /**
478 * Clé de traduction demandée. Exemple 'item_oui'
479 * @var string */
480 public $nom_champ = "";
481
482 /**
483 * Module de langue où chercher la clé de traduction. Exemple 'medias'
484 * @var string */
485 public $module = "";
486
487 /**
488 * Arguments à passer à la chaîne
489 * @var array */
490 public $arg = array();
491
492 /**
493 * Filtres à appliquer au résultat
494 * @var array */
495 public $param = array();
496
497 /**
498 * Source des filtres (compatibilité) (?)
499 * @var array|null */
500 public $fonctions = array();
501
502 /**
503 * Inutilisé, propriété générique de l'AST
504 * @var string|array */
505 public $avant = '';
506
507 /**
508 * Inutilisé, propriété générique de l'AST
509 * @var string|array */
510 public $apres = '';
511
512 /**
513 * Identifiant de la boucle
514 * @var string */
515 public $id_boucle = '';
516
517 /**
518 * AST du squelette, liste de toutes les boucles
519 * @var Boucles[] */
520 public $boucles;
521
522 /**
523 * Alias de table d'application de la requête ou nom complet de la table SQL
524 * @var string|null */
525 public $type_requete;
526
527 /**
528 * Résultat de la compilation: toujours une expression PHP
529 * @var string */
530 public $code = '';
531
532 /**
533 * Interdire les scripts
534 * @see interdire_scripts()
535 * @var bool */
536 public $interdire_scripts = false;
537
538 /**
539 * Description du squelette
540 *
541 * Sert pour la gestion d'erreur et la production de code dependant du contexte
542 *
543 * Peut contenir les index :
544 * - nom : Nom du fichier de cache
545 * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser)
546 * - sourcefile : Chemin du squelette
547 * - squelette : Code du squelette
548 * - id_mere : Identifiant de la boucle parente
549 * - documents : Pour embed et img dans les textes
550 * - session : Pour un cache sessionné par auteur
551 * - niv : Niveau de tabulation
552 *
553 * @var array */
554 public $descr = array();
555
556 /**
557 * Numéro de ligne dans le code source du squelette
558 * @var int */
559 public $ligne = 0;
560 }
561
562 /**
563 * Description d'un texte polyglotte (<multi>)
564 *
565 * @package SPIP\Compilateur\AST
566 **/
567 class Polyglotte {
568 /**
569 * Type de noeud
570 * @var string */
571 public $type = 'polyglotte';
572
573 /**
574 * Tableau des traductions possibles classées par langue
575 *
576 * Tableau code de langue => texte
577 * @var array */
578 var $traductions = array();
579
580 /**
581 * Numéro de ligne dans le code source du squelette
582 * @var int */
583 public $ligne = 0;
584 }
585
586
587
588 global $table_criteres_infixes;
589 $table_criteres_infixes = array('<', '>', '<=', '>=', '==', '===', '!=', '!==', '<>', '?');
590
591 global $exception_des_connect;
592 $exception_des_connect[] = ''; // ne pas transmettre le connect='' par les inclure
593
594
595
596 /**
597 * Déclarer les interfaces de la base pour le compilateur
598 *
599 * On utilise une fonction qui initialise les valeurs,
600 * sans écraser d'eventuelles prédéfinition dans mes_options
601 * et les envoie dans un pipeline
602 * pour les plugins
603 *
604 * @link http://doc.spip.org/@declarer_interfaces
605 *
606 * @return void
607 */
608 function declarer_interfaces(){
609 global $exceptions_des_tables, $table_des_tables, $table_date, $table_titre, $table_statut;
610
611 $table_des_tables['articles']='articles';
612 $table_des_tables['auteurs']='auteurs';
613 $table_des_tables['rubriques']='rubriques';
614 $table_des_tables['hierarchie']='rubriques';
615
616 // definition des statuts de publication
617 global $tables_statut;
618 $table_statut = array();
619
620 //
621 // tableau des tables de jointures
622 // Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
623 global $tables_jointures;
624 $tables_jointures = array();
625 $tables_jointures['spip_jobs'][] = 'jobs_liens';
626
627 global $exceptions_des_jointures;
628 #$exceptions_des_jointures['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
629 $exceptions_des_jointures['profondeur'] = array('spip_rubriques', 'profondeur');
630
631 global $table_des_traitements;
632
633 define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect, $Pile[0])');
634 define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])');
635 define('_TRAITEMENT_TYPO_SANS_NUMERO', 'typo(supprimer_numero(%s), "TYPO", $connect, $Pile[0])');
636
637 $table_des_traitements['BIO'][]= _TRAITEMENT_RACCOURCIS;
638 $table_des_traitements['CHAPO'][]= _TRAITEMENT_RACCOURCIS;
639 $table_des_traitements['DATE'][]= 'normaliser_date(%s)';
640 $table_des_traitements['DATE_REDAC'][]= 'normaliser_date(%s)';
641 $table_des_traitements['DATE_MODIF'][]= 'normaliser_date(%s)';
642 $table_des_traitements['DATE_NOUVEAUTES'][]= 'normaliser_date(%s)';
643 $table_des_traitements['DESCRIPTIF'][]= _TRAITEMENT_RACCOURCIS;
644 $table_des_traitements['INTRODUCTION'][]= 'PtoBR('. _TRAITEMENT_RACCOURCIS .')';
645 $table_des_traitements['NOM_SITE_SPIP'][]= _TRAITEMENT_TYPO;
646 $table_des_traitements['NOM'][]= _TRAITEMENT_TYPO_SANS_NUMERO;
647 $table_des_traitements['AUTEUR'][]= _TRAITEMENT_TYPO;
648 $table_des_traitements['PS'][]= _TRAITEMENT_RACCOURCIS;
649 $table_des_traitements['SOURCE'][]= _TRAITEMENT_TYPO;
650 $table_des_traitements['SOUSTITRE'][]= _TRAITEMENT_TYPO;
651 $table_des_traitements['SURTITRE'][]= _TRAITEMENT_TYPO;
652 $table_des_traitements['TAGS'][]= '%s';
653 $table_des_traitements['TEXTE'][]= _TRAITEMENT_RACCOURCIS;
654 $table_des_traitements['TITRE'][]= _TRAITEMENT_TYPO_SANS_NUMERO;
655 $table_des_traitements['TYPE'][]= _TRAITEMENT_TYPO;
656 $table_des_traitements['DESCRIPTIF_SITE_SPIP'][]= _TRAITEMENT_RACCOURCIS;
657 $table_des_traitements['SLOGAN_SITE_SPIP'][]= _TRAITEMENT_TYPO;
658 $table_des_traitements['ENV'][]= 'entites_html(%s,true)';
659
660 // valeur par defaut pour les balises non listees ci-dessus
661 $table_des_traitements['*'][]= false; // pas de traitement, mais permet au compilo de trouver la declaration suivante
662 // toujours securiser les DATA
663 $table_des_traitements['*']['DATA']= 'safehtml(%s)';
664 // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all *
665 $table_des_traitements['VALEUR']['DATA']= 'safehtml(%s)';
666
667
668 // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales
669 $interfaces = pipeline('declarer_tables_interfaces',
670 array(
671 'table_des_tables'=>$table_des_tables,
672 'exceptions_des_tables'=>$exceptions_des_tables,
673 'table_date'=>$table_date,
674 'table_titre'=>$table_titre,
675 'tables_jointures'=>$tables_jointures,
676 'exceptions_des_jointures'=>$exceptions_des_jointures,
677 'table_des_traitements'=>$table_des_traitements,
678 'table_statut'=>$table_statut,
679 ));
680 if ($interfaces){
681 $table_des_tables = $interfaces['table_des_tables'];
682 $exceptions_des_tables = $interfaces['exceptions_des_tables'];
683 $table_date = $interfaces['table_date'];
684 $table_titre = $interfaces['table_titre'];
685 $tables_jointures = $interfaces['tables_jointures'];
686 $exceptions_des_jointures = $interfaces['exceptions_des_jointures'];
687 $table_des_traitements = $interfaces['table_des_traitements'];
688 $table_statut = $interfaces['table_statut'];
689 }
690 }
691
692 declarer_interfaces();
693
694 ?>