Subversion Repositories Sites.tela-botanica.org

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4 david 1
<?php
2
 
3
/***************************************************************************\
4
 *  SPIP, Systeme de publication pour l'internet                           *
5
 *                                                                         *
6
 *  Copyright (c) 2001-2005                                                *
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
//
15
// Ce fichier regroupe la quasi totalite des definitions de #BALISES de spip
16
// Pour chaque balise, il est possible de surcharger, dans mes_fonctions.php3,
17
// la fonction balise_TOTO_dist par une fonction balise_TOTO() respectant la
18
// meme API :
19
// elle recoit en entree un objet de classe CHAMP, le modifie et le retourne.
20
// Cette classe est definie dans inc-compilo-index.php3
21
//
22
 
23
// Ce fichier ne sera execute qu'une fois
24
if (defined("_INC_BALISES")) return;
25
define("_INC_BALISES", "1");
26
 
27
 
28
//
29
// Traitements standard de divers champs
30
//
31
function champs_traitements ($p) {
32
	static $traitements = array (
33
		'BIO' => 'traiter_raccourcis(%s)',
34
		'CHAPO' => 'traiter_raccourcis(nettoyer_chapo(%s))',
35
		'DATE' => 'vider_date(%s)',
36
		'DATE_MODIF' => 'vider_date(%s)',
37
		'DATE_NOUVEAUTES' => 'vider_date(%s)',
38
		'DATE_REDAC' => 'vider_date(%s)',
39
		'DESCRIPTIF' => 'traiter_raccourcis(%s)',
40
		'LIEN_TITRE' => 'typo(%s)',
41
		'LIEN_URL' => 'htmlspecialchars(vider_url(%s))',
42
		'MESSAGE' => 'traiter_raccourcis(%s)',
43
		'NOM_SITE_SPIP' => 'typo(%s)',
44
		'NOM_SITE' => 'typo(%s)',
45
		'NOM' => 'typo(%s)',
46
		'PARAMETRES_FORUM' => 'htmlspecialchars(lang_parametres_forum(%s))',
47
		'PS' => 'traiter_raccourcis(%s)',
48
		'SOUSTITRE' => 'typo(%s)',
49
		'SURTITRE' => 'typo(%s)',
50
		'TEXTE' => 'traiter_raccourcis(%s)',
51
		'TITRE' => 'typo(%s)',
52
		'TYPE' => 'typo(%s)',
53
		'URL_ARTICLE' => 'htmlspecialchars(vider_url(%s))',
54
		'URL_BREVE' => 'htmlspecialchars(vider_url(%s))',
55
		'URL_DOCUMENT' => 'htmlspecialchars(vider_url(%s))',
56
		'URL_FORUM' => 'htmlspecialchars(vider_url(%s))',
57
		'URL_MOT' => 'htmlspecialchars(vider_url(%s))',
58
		'URL_RUBRIQUE' => 'htmlspecialchars(vider_url(%s))',
59
		'URL_SITE_SPIP' => 'htmlspecialchars(vider_url(%s))',
60
		'URL_SITE' => 'htmlspecialchars(vider_url(%s))',
61
		'URL_SYNDIC' => 'htmlspecialchars(vider_url(%s))',
62
		'ENV' => 'entites_html(%s)'
63
	);
64
	$ps = $traitements[$p->nom_champ];
65
	if (!$ps) return $p->code;
66
	if ($p->descr['documents']) {
67
		$ps = str_replace('traiter_raccourcis(',
68
			'traiter_raccourcis_doublon($doublons,',
69
			str_replace('typo(', 'typo_doublon($doublons,', $ps));
70
	}
71
 
72
	// on supprime les < IMGnnn > tant qu'on ne rapatrie pas
73
	// les documents distants joints..
74
	// il faudrait aussi corriger les raccourcis d'URL locales
75
	return str_replace('%s',
76
		(!$p->boucles[$p->id_boucle]->sql_serveur ?
77
		$p->code :
78
		('supprime_img(' . $p->code . ')')),
79
		$ps);
80
}
81
 
82
// il faudrait savoir traiter les formulaires en local
83
// tout en appelant le serveur SQL distant.
84
// En attendant, cette fonction permet de refuser une authentification
85
// sur qqch qui n'a rien a voir.
86
 
87
function balise_distante_interdite($p) {
88
	$nom = $p->id_boucle;
89
	if ($p->boucles[$nom]->sql_serveur) {
90
		erreur_squelette($p->nom_champ .' '._T('zbug_distant_interdit'), $nom);
91
	}
92
}
93
 
94
//
95
// Definition des balises
96
//
97
function balise_NOM_SITE_SPIP_dist($p) {
98
	$p->code = "lire_meta('nom_site')";
99
	$p->statut = 'php';
100
	return $p;
101
}
102
 
103
function balise_EMAIL_WEBMASTER_dist($p) {
104
	$p->code = "lire_meta('email_webmaster')";
105
	$p->statut = 'php';
106
	return $p;
107
}
108
 
109
function balise_CHARSET_dist($p) {
110
	$p->code = "lire_meta('charset')";
111
	$p->statut = 'php';
112
	return $p;
113
}
114
 
115
function balise_LANG_LEFT_dist($p) {
116
	$_lang = champ_sql('lang', $p);
117
	$p->code = "lang_dir(($_lang ? $_lang : \$GLOBALS['spip_lang']),'left','right')";
118
	$p->statut = 'php';
119
	return $p;
120
}
121
 
122
function balise_LANG_RIGHT_dist($p) {
123
	$_lang = champ_sql('lang', $p);
124
	$p->code = "lang_dir(($_lang ? $_lang : \$GLOBALS['spip_lang']),'right','left')";
125
	$p->statut = 'php';
126
	return $p;
127
}
128
 
129
function balise_LANG_DIR_dist($p) {
130
	$_lang = champ_sql('lang', $p);
131
	$p->code = "lang_dir(($_lang ? $_lang : \$GLOBALS['spip_lang']),'ltr','rtl')";
132
	$p->statut = 'php';
133
	return $p;
134
}
135
 
136
function balise_PUCE_dist($p) {
137
	$_lang = champ_sql('lang', $p);
138
	$p->code = "((lang_dir(($_lang ? $_lang : \$GLOBALS['spip_lang']),false,true) && \$GLOBALS['puce_rtl']) ? \$GLOBALS['puce_rtl'] : \$GLOBALS['puce'])";
139
	$p->statut = 'php';
140
	return $p;
141
}
142
 
143
// #DATE
144
// Cette fonction sait aller chercher dans le contexte general
145
// quand #DATE est en dehors des boucles
146
// http://www.spip.net/fr_article1971.html
147
function balise_DATE_dist ($p) {
148
	$_date = champ_sql('date', $p);
149
	$p->code = "$_date";
150
	$p->statut = 'php';
151
	return $p;
152
}
153
 
154
// #DATE_REDAC
155
// http://www.spip.net/fr_article1971.html
156
function balise_DATE_REDAC_dist ($p) {
157
	$_date = champ_sql('date_redac', $p);
158
	$p->code = "$_date";
159
	$p->statut = 'php';
160
	return $p;
161
}
162
 
163
// #DATE_MODIF
164
// http://www.spip.net/fr_article1971.html
165
function balise_DATE_MODIF_dist ($p) {
166
	$_date = champ_sql('date_modif', $p);
167
	$p->code = "$_date";
168
	$p->statut = 'php';
169
	return $p;
170
}
171
 
172
// #DATE_NOUVEAUTES
173
// http://www.spip.net/fr_article1971.html
174
function balise_DATE_NOUVEAUTES_dist($p) {
175
	$p->code = "((lire_meta('quoi_de_neuf') == 'oui'
176
	AND @file_exists(_DIR_SESSIONS . 'mail.lock')) ?
177
	normaliser_date(@filemtime(_DIR_SESSIONS . 'mail.lock')) :
178
	\"'0000-00-00'\")";
179
	$p->statut = 'php';
180
	return $p;
181
}
182
 
183
function balise_DOSSIER_SQUELETTE_dist($p) {
184
	$p->code = "'" . addslashes(dirname($p->descr['sourcefile'])) . "'" ;
185
	$p->statut = 'php';
186
	return $p;
187
}
188
 
189
function balise_URL_SITE_SPIP_dist($p) {
190
	$p->code = "lire_meta('adresse_site')";
191
	$p->statut = 'php';
192
	return $p;
193
}
194
 
195
 
196
function balise_URL_ARTICLE_dist($p) {
197
	$_type = $p->type_requete;
198
 
199
	// Cas particulier des boucles (SYNDIC_ARTICLES)
200
	if ($_type == 'syndic_articles') {
201
		$p->code = champ_sql('url', $p);
202
	}
203
 
204
	// Cas general : chercher un id_article dans la pile
205
	else {
206
		$_id_article = champ_sql('id_article', $p);
207
		$p->code = "generer_url_article($_id_article)";
208
 
209
		if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash)
210
			$p->code = "url_var_recherche(" . $p->code . ")";
211
	}
212
 
213
	$p->statut = 'html';
214
	return $p;
215
}
216
 
217
function balise_URL_RUBRIQUE_dist($p) {
218
	$p->code = "generer_url_rubrique(" .
219
	champ_sql('id_rubrique',$p) .
220
	")" ;
221
	if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash)
222
	$p->code = "url_var_recherche(" . $p->code . ")";
223
 
224
	$p->statut = 'html';
225
	return $p;
226
}
227
 
228
function balise_URL_BREVE_dist($p) {
229
	$p->code = "generer_url_breve(" .
230
	champ_sql('id_breve',$p) .
231
	")";
232
	if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash)
233
	$p->code = "url_var_recherche(" . $p->code . ")";
234
 
235
	$p->statut = 'html';
236
	return $p;
237
}
238
 
239
function balise_URL_MOT_dist($p) {
240
	$p->code = "generer_url_mot(" .
241
	champ_sql('id_mot',$p) .
242
	")";
243
 
244
	if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash)
245
	$p->code = "url_var_recherche(" . $p->code . ")";
246
 
247
	$p->statut = 'html';
248
	return $p;
249
}
250
 
251
# remarque : URL_SITE ne figure pas ici car c'est une donnee 'brute'
252
# correspondant a l'URL du site reference ; URL_SYNDIC correspond
253
# pour sa part a l'adresse de son backend.
254
# Il n'existe pas de balise pour afficher generer_url_site($id_syndic),
255
# a part [(#ID_SYNDIC|generer_url_site)]
256
 
257
function balise_URL_FORUM_dist($p) {
258
	$p->code = "generer_url_forum(" .
259
	champ_sql('id_forum',$p) .")";
260
 
261
	if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash)
262
	$p->code = "url_var_recherche(" . $p->code . ")";
263
 
264
	$p->statut = 'html';
265
	return $p;
266
}
267
 
268
function balise_URL_DOCUMENT_dist($p) {
269
	$p->code = "generer_url_document(" .
270
	champ_sql('id_document',$p) . ")";
271
 
272
	$p->statut = 'html';
273
	return $p;
274
}
275
 
276
function balise_URL_AUTEUR_dist($p) {
277
	$p->code = "generer_url_auteur(" .
278
	champ_sql('id_auteur',$p) .")";
279
	if ($p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash)
280
	$p->code = "url_var_recherche(" . $p->code . ")";
281
 
282
	$p->statut = 'html';
283
	return $p;
284
}
285
 
286
function balise_NOTES_dist($p) {
287
	// Recuperer les notes
288
	$p->code = 'calculer_notes()';
289
	$p->statut = 'html';
290
	return $p;
291
}
292
 
293
// Qu'afficher en cas d'erreur 404 ?
294
function balise_ERREUR_AUCUN_dist($p) {
295
	$p->code = '$Pile[0]["erreur_aucun"]';
296
	$p->statut = 'php';
297
	return $p;
298
}
299
 
300
function balise_RECHERCHE_dist($p) {
301
	$p->code = 'htmlspecialchars($GLOBALS["recherche"])';
302
	$p->statut = 'php';
303
	return $p;
304
}
305
 
306
function balise_COMPTEUR_BOUCLE_dist($p) {
307
	$b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
308
	if ($b === '') {
309
		erreur_squelette(
310
			_T('zbug_champ_hors_boucle',
311
				array('champ' => '#COMPTEUR_BOUCLE')
312
			), $p->id_boucle);
313
		$p->code = "''";
314
	} else {
315
		$p->code = "\$Numrows['$b']['compteur_boucle']";
316
		$p->statut = 'php';
317
		return $p;
318
	}
319
}
320
 
321
function balise_TOTAL_BOUCLE_dist($p) {
322
	$b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
323
	if ($b === '') {
324
		erreur_squelette(
325
			_T('zbug_champ_hors_boucle',
326
				array('champ' => '#TOTAL_BOUCLE')
327
			), $p->id_boucle);
328
		$p->code = "''";
329
	} else {
330
		$p->code = "\$Numrows['$b']['total']";
331
		$p->boucles[$b]->numrows = true;
332
		$p->statut = 'php';
333
	}
334
	return $p;
335
}
336
 
337
function balise_POINTS_dist($p) {
338
	return rindex_pile($p, 'points', 'recherche');
339
}
340
 
341
function balise_POPULARITE_ABSOLUE_dist($p) {
342
	$p->code = 'ceil(' .
343
	champ_sql('popularite', $p) .
344
	')';
345
	$p->statut = 'php';
346
	return $p;
347
}
348
 
349
function balise_POPULARITE_SITE_dist($p) {
350
	$p->code = 'ceil(lire_meta(\'popularite_total\'))';
351
	$p->statut = 'php';
352
	return $p;
353
}
354
 
355
function balise_POPULARITE_MAX_dist($p) {
356
	$p->code = 'ceil(lire_meta(\'popularite_max\'))';
357
	$p->statut = 'php';
358
	return $p;
359
}
360
 
361
function balise_EXPOSE_dist($p) {
362
	$on = "'on'";
363
	$off= "''";
364
 
365
	if ($p->param && !$p->param[0][0]) {
366
		$on =  calculer_liste($p->param[0][1],
367
					$p->descr,
368
					$p->boucles,
369
					$p->id_boucle);
370
 
371
		$off =  calculer_liste($p->param[0][2],
372
					$p->descr,
373
					$p->boucles,
374
					$p->id_boucle);
375
 
376
		// autres filtres
377
		array_shift($p->param);
378
	}
379
	return calculer_balise_expose($p, $on, $off);
380
}
381
 
382
// obsolete. utiliser la precedente
383
 
384
function balise_EXPOSER_dist($p)
385
{
386
	$on = "'on'";
387
	$off= "''";
388
	if ($a = ($p->fonctions)) {
389
		// Gerer la notation [(#EXPOSER|on,off)]
390
		$onoff = array_shift($a);
391
		ereg("([^,]*)(,(.*))?", $onoff[0], $regs);
392
		$on = "'" . addslashes($regs[1]) . "'";
393
		$off = "'" . addslashes($regs[3]) . "'" ;
394
		// autres filtres
395
		array_shift($p->param);
396
	}
397
	return calculer_balise_expose($p, $on, $off);
398
}
399
 
400
function calculer_balise_expose($p, $on, $off)
401
{
402
	global  $table_primary;
403
	$type_boucle = $p->type_requete;
404
	$primary_key = $table_primary[$type_boucle];
405
	if (!$primary_key) {
406
		erreur_squelette(_T('zbug_champ_hors_boucle',
407
				array('champ' => '#EXPOSER')
408
			), $p->id_boucle);
409
 
410
	}
411
 
412
	$p->code = '(calcul_exposer('
413
	.champ_sql($primary_key, $p)
414
	.", '$primary_key', \$Pile[0]) ? $on : $off)";
415
	$p->statut = 'php';
416
	return $p;
417
}
418
 
419
//
420
// Inserer directement un document dans le squelette
421
//
422
function balise_EMBED_DOCUMENT_dist($p) {
423
	balise_distante_interdite($p);
424
	$_id_document = champ_sql('id_document',$p);
425
	$p->code = "calcule_embed_document(intval($_id_document), " .
426
	  argumenter_balise($p->fonctions, "|") .
427
	  ", \$doublons, '" . $p->descr['documents'] . "')";
428
	$p->param = array();
429
	$p->statut = 'html';
430
	return $p;
431
}
432
 
433
// Debut et fin de surlignage auto des mots de la recherche
434
// on insere une balise Span avec une classe sans spec:
435
// c'est transparent s'il n'y a pas de recherche,
436
// sinon elles seront remplacees par les fontions de inc_surligne
437
 
438
function balise_DEBUT_SURLIGNE_dist($p) {
439
	include_ecrire('inc_surligne.php3');
440
	$p->code = "'<" . MARQUEUR_SURLIGNE . "'";
441
	return $p;
442
}
443
function balise_FIN_SURLIGNE_dist($p) {
444
	include_ecrire('inc_surligne.php3');
445
	$p->code = "'<" . MARQUEUR_FSURLIGNE . "'";
446
	return $p;
447
}
448
 
449
 
450
// #SPIP_CRON
451
// a documenter
452
// insere un <div> avec un lien background-image vers les taches de fond.
453
// Si cette balise est presente sur la page de sommaire, le site ne devrait
454
// quasiment jamais se trouver ralenti par des taches de fond un peu lentes
455
// ATTENTION: cette balise efface parfois les boutons admin implicites
456
function balise_SPIP_CRON_dist ($p) {
457
	$p->code = "'<div style=\\'position: absolute; background-image: url(\"spip_background.php3\"); height: 1px; width: 1px;\\'></div>'";
458
	$p->statut='php';
459
	return $p;
460
}
461
 
462
 
463
// #INTRODUCTION
464
// http://www.spip.net/@introduction
465
function balise_INTRODUCTION_dist ($p) {
466
	$_type = $p->type_requete;
467
	$_texte = champ_sql('texte', $p);
468
	$_chapo = champ_sql('chapo', $p);
469
	$_descriptif = champ_sql('descriptif', $p);
470
	$p->code = "calcul_introduction('$_type', $_texte, $_chapo, $_descriptif)";
471
 
472
	$p->statut = 'html';
473
	return $p;
474
}
475
 
476
 
477
// #LANG
478
// non documente ?
479
function balise_LANG_dist ($p) {
480
	$_lang = champ_sql('lang', $p);
481
	$p->code = "($_lang ? $_lang : \$GLOBALS['spip_lang'])";
482
	$p->statut = 'php';
483
	return $p;
484
}
485
 
486
 
487
// #LESAUTEURS
488
// les auteurs d'un article (ou d'un article syndique)
489
// http://www.spip.net/fr_article902.html
490
// http://www.spip.net/fr_article911.html
491
function balise_LESAUTEURS_dist ($p) {
492
	// Cherche le champ 'lesauteurs' dans la pile
493
	$_lesauteurs = champ_sql('lesauteurs', $p);
494
 
495
	// Si le champ n'existe pas (cas de spip_articles), on donne la
496
	// construction speciale sql_auteurs(id_article) ;
497
	// dans le cas contraire on prend le champ 'les_auteurs' (cas de
498
	// spip_syndic_articles)
499
	if ($_lesauteurs AND $_lesauteurs != '$Pile[0][\'lesauteurs\']') {
500
		$p->code = $_lesauteurs;
501
	} else {
502
		$nom = $p->id_boucle;
503
	# On pourrait mieux faire qu'utiliser cette fonction assistante ?
504
		$p->code = "sql_auteurs(" .
505
			champ_sql('id_article', $p) .
506
			",'" .
507
			$nom .
508
			"','" .
509
			$p->boucles[$nom]->type_requete .
510
			"','" .
511
			$p->boucles[$nom]->sql_serveur .
512
			"')";
513
	}
514
 
515
	$p->statut = 'html';
516
	return $p;
517
}
518
 
519
 
520
// #PETITION
521
// retourne '' si l'article courant n'a pas de petition
522
// le texte de celle-ci sinon (et ' ' si il est vide)
523
// cf FORMULAIRE_PETITION
524
 
525
function balise_PETITION_dist ($p) {
526
	$nom = $p->id_boucle;
527
	$p->code = "sql_petitions(" .
528
			champ_sql('id_article', $p) .
529
			",'" .
530
			$p->boucles[$nom]->type_requete .
531
			"','" .
532
			$nom .
533
			"','" .
534
			$p->boucles[$nom]->sql_serveur .
535
			"', \$Cache)";
536
	$p->statut = 'php';
537
	return $p;
538
}
539
 
540
 
541
// #POPULARITE
542
// http://www.spip.net/fr_article1846.html
543
function balise_POPULARITE_dist ($p) {
544
	$_popularite = champ_sql('popularite', $p);
545
	$p->code = "(ceil(min(100, 100 * $_popularite
546
	/ max(1 , 0 + lire_meta('popularite_max')))))";
547
	$p->statut = 'php';
548
	return $p;
549
}
550
 
551
 
552
//
553
// Fonction commune aux balises #LOGO_XXXX
554
// (les balises portant ce type de nom sont traitees en bloc ici)
555
//
556
function calculer_balise_logo ($p) {
557
 
558
	eregi("^LOGO_([A-Z]+)(_.*)?$", $p->nom_champ, $regs);
559
	$type_objet = $regs[1];
560
	$suite_logo = $regs[2];
561
	if (ereg("^_SPIP(.*)$", $suite_logo, $regs)) {
562
		$type_objet = 'RUBRIQUE';
563
		$suite_logo = $regs[1];
564
		$_id_objet = "\"'0'\"";
565
	} else {
566
 
567
		if ($type_objet == 'SITE')
568
			$_id_objet = champ_sql("id_syndic", $p);
569
		else
570
			$_id_objet = champ_sql("id_".strtolower($type_objet), $p);
571
	}
572
	// analyser les faux filtres,
573
	// supprimer ceux qui ont le tort d'etre vrais
574
	$flag_fichier = 0;
575
	$filtres = '';
576
	if (is_array($p->fonctions)) {
577
		foreach($p->fonctions as $couple) {
578
			// eliminer les faux filtres
579
			if (!$flag_stop) {
580
				array_shift($p->param);
581
				$nom = $couple[0];
582
				if (ereg('^(left|right|center|top|bottom)$', $nom))
583
					$align = $nom;
584
				else if ($nom == 'lien') {
585
					$flag_lien_auto = 'oui';
586
					$flag_stop = true;
587
				}
588
				else if ($nom == 'fichier') {
589
					$flag_fichier = 1;
590
					$flag_stop = true;
591
				}
592
				// double || signifie "on passe aux filtres"
593
				else if ($nom == '') {
594
					if (!$params = $couple[1])
595
						$flag_stop = true;
596
				}
597
				else if ($nom) {
598
					$lien = $nom;
599
					$flag_stop = true;
600
				} else {
601
 
602
				}
603
			}
604
			// apres un URL ou || ou |fichier ce sont
605
			// des filtres (sauf left...lien...fichier)
606
		}
607
	}
608
 
609
	//
610
	// Preparer le code du lien
611
	//
612
	// 1. filtre |lien
613
	if ($flag_lien_auto AND !$lien)
614
		$code_lien = '($lien = generer_url_'.$type_objet.'('.$_id_objet.')) ? $lien : ""';
615
	// 2. lien indique en clair (avec des balises : imprimer#ID_ARTICLE.html)
616
	else if ($lien) {
617
		$code_lien = "'".texte_script(trim($lien))."'";
618
		while (ereg("^([^#]*)#([A-Za-z_]+)(.*)$", $code_lien, $match)) {
619
			$c = new Champ();
620
			$c->nom_champ = $match[2];
621
			$c->id_boucle = $p->id_boucle;
622
			$c->boucles = &$p->boucles;
623
			$c->descr = $p->descr;
624
			$c = calculer_champ($c);
625
			$code_lien = str_replace('#'.$match[2], "'.".$c.".'", $code_lien);
626
		}
627
		// supprimer les '' disgracieux
628
		$code_lien = ereg_replace("^''\.|\.''$", "", $code_lien);
629
	}
630
 
631
	if ($flag_fichier)
632
		$code_lien = "'',''" ;
633
	else {
634
		if (!$code_lien)
635
			$code_lien = "''";
636
		$code_lien .= ", '". addslashes($align) . "'";
637
	}
638
 
639
	// cas des documents
640
	if ($type_objet == 'DOCUMENT') {
641
		$p->code = "calcule_logo_document($_id_objet, '" .
642
			$p->descr['documents'] .
643
			'\', $doublons, '. intval($flag_fichier).", $code_lien, '".
644
			// #LOGO_DOCUMENT{x,y} donne la taille maxi
645
			texte_script($params)
646
			."')";
647
	}
648
	else {
649
	  $p->code = "affiche_logos(calcule_logo('$type_objet', '" .
650
	    (($suite_logo == '_SURVOL') ? 'off' :
651
	     (($suite_logo == '_NORMAL') ? 'on' : 'ON')) .
652
	    "', $_id_objet," .
653
	    (($suite_logo == '_RUBRIQUE') ?
654
	     champ_sql("id_rubrique", $p) :
655
	     (($type_objet == 'RUBRIQUE') ? "sql_parent($_id_objet)" : "''")) .
656
	    ",  '$flag_fichier'), $code_lien)";
657
	}
658
	$p->statut = 'php';
659
	return $p;
660
}
661
 
662
// #EXTRA [(#EXTRA|isbn)]
663
// Champs extra
664
// Non documentes, en voie d'obsolescence, cf. ecrire/inc_extra.php3
665
function balise_EXTRA_dist ($p) {
666
	$_extra = champ_sql('extra', $p);
667
	$p->code = $_extra;
668
 
669
	// Gerer la notation [(#EXTRA|isbn)]
670
	if ($p->params) {
671
		include_ecrire("inc_extra.php3");
672
		list ($key, $champ_extra) = each($p->params);	// le premier filtre
673
		$type_extra = $p->type_requete;
674
		$champ = $champ_extra[1];
675
 
676
	// ci-dessus est sans doute un peu buggue : si on invoque #EXTRA
677
	// depuis un sous-objet sans champ extra d'un objet a champ extra,
678
	// on aura le type_extra du sous-objet (!)
679
		if (extra_champ_valide($type_extra, $champ))
680
		{
681
			array_shift($p->params);
682
# A quoi ca sert ?
683
#		$p->code = "extra($p->code, '".addslashes($champ)."')";
684
 
685
 
686
			// Appliquer les filtres definis par le webmestre
687
			$filtres = extra_filtres($type_extra, $champ);
688
			if ($filtres) foreach ($filtres as $f)
689
				$p->code = "$f($p->code)";
690
		}
691
	}
692
 
693
	$p->statut = 'html';
694
	return $p;
695
}
696
 
697
//
698
// Parametres de reponse a un forum
699
//
700
 
701
function balise_PARAMETRES_FORUM_dist($p) {
702
	include_local(find_in_path('inc-formulaire_forum.php3'));
703
	$_id_article = champ_sql('id_article', $p);
704
	$p->code = '
705
		// refus des forums ?
706
		(sql_accepter_forum('.$_id_article.')=="non" OR
707
		(lire_meta("forums_publics") == "non"
708
		AND sql_accepter_forum('.$_id_article.') == ""))
709
		? "" : // sinon:
710
		';
711
 
712
	switch ($p->type_requete) {
713
		case 'articles':
714
			$c = '"id_article=".' . champ_sql('id_article', $p);
715
			break;
716
		case 'breves':
717
			$c = '"id_breve=".' . champ_sql('id_breve', $p);
718
			break;
719
		case 'rubriques':
720
			$c = '"id_rubrique=".' . champ_sql('id_rubrique', $p);
721
			break;
722
		case 'syndication':
723
			$c = '"id_syndic=".' . champ_sql('id_syndic', $p);
724
			break;
725
		case 'forums':
726
		default:
727
			$liste_champs = array ("id_article","id_breve","id_rubrique","id_syndic","id_forum");
728
			foreach ($liste_champs as $champ) {
729
				$x = champ_sql( $champ, $p);
730
				$c .= (($c) ? ".\n" : "") . "((!$x) ? '' : ('&$champ='.$x))";
731
			}
732
			$c = "substr($c,1)";
733
			break;
734
	}
735
 
736
	// Syntaxe [(#PARAMETRES_FORUM{#SELF})] pour fixer le retour du forum
737
	# note : ce bloc qui sert a recuperer des arguments calcules pourrait
738
	# porter un nom et faire partie de l'API.
739
	if ($p->param && !$p->param[0][0]) {
740
		  $retour = array_shift( $p->param );
741
		  array_shift($retour);
742
		  $retour = calculer_liste($retour[0],
743
					   $p->descr,
744
					   $p->boucles,
745
					   $p->id_boucle);
746
	}
747
	else
748
		$retour = "''";
749
 
750
	// Attention un eventuel &retour=xxx dans l'URL est prioritaire
751
	$c .= '.
752
	(($lien = (_request("retour") ? _request("retour") : '.$retour.')) ? "&retour=".rawurlencode($lien) : "")';
753
 
754
	$p->code .= code_invalideur_forums($p, "(".$c.")");
755
 
756
	$p->statut = 'html';
757
	return $p;
758
}
759
 
760
 
761
// Noter l'invalideur de la page contenant ces parametres,
762
// en cas de premier post sur le forum
763
function code_invalideur_forums($p, $code) {
764
	include_ecrire('inc_invalideur.php3');
765
	$type = 'id_forum';
766
	$valeur = "\n\t\tcalcul_index_forum("
767
		// Retournera 4 [$SP] mais force la demande du champ a MySQL
768
		. champ_sql('id_article', $p) . ','
769
		. champ_sql('id_breve', $p) .  ','
770
		. champ_sql('id_rubrique', $p) .','
771
		. champ_sql('id_syndic', $p) .  ")\n\t";
772
 
773
	return ajouter_invalideur($type, $valeur, $code);
774
}
775
 
776
// Reference a l'URL de la page courante
777
// Attention dans un INCLURE() ou une balise dynamique on n'a pas le droit de
778
// mettre en cache #SELF car il peut correspondre a une autre page (attaque XSS)
779
// http://www.spip.net/@self
780
function balise_SELF_dist($p) {
781
	$p->code = 'quote_amp($GLOBALS["clean_link"]->getUrl())';
782
	$p->statut = 'php';
783
	return $p;
784
}
785
 
786
 
787
//
788
// #ENV
789
// l'"environnement", id est le $contexte (ou $contexte_inclus)
790
//
791
// en standard on applique |entites_html, mais attention si
792
// vous utilisez [(#ENV*{toto})] il *faut* vous assurer vous-memes
793
// de la securite anti-php et anti-javascript
794
//
795
// La syntaxe #ENV{toto, rempl} renverra 'rempl' si $toto est vide
796
//
797
function balise_ENV_dist($p) {
798
 
799
	if ($a = $p->param) {
800
		$sinon = array_shift($a);
801
		if  (!array_shift($sinon)) {
802
		  $p->fonctions = $a;
803
		  array_shift( $p->param );
804
		  $nom = array_shift($sinon);
805
		  $nom = ($nom[0]->type=='texte') ? $nom[0]->texte : "";
806
		}
807
	}
808
 
809
	if (!$nom) {
810
		// cas de #ENV sans argument : on retourne le serialize() du tableau
811
		// une belle fonction [(#ENV|affiche_env)] serait pratique
812
		$p->code = 'serialize($Pile[0])';
813
		$p->statut = 'html';
814
	} else {
815
		// admet deux arguments : nom de variable, valeur par defaut si vide
816
		$p->code = '$Pile[0]["' . addslashes($nom) . '"]';
817
		if ($sinon)
818
			$p->code = 'sinon('.
819
			  $p->code .
820
			  compose_filtres_args($p, $sinon, ',') .
821
			  ')';
822
		$p->statut = 'php';
823
	}
824
 
825
	return $p;
826
}
827
 
828
?>