Subversion Repositories Sites.tela-botanica.org

Rev

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
// Des fonctions diverses utilisees lors du calcul d'une page ; ces fonctions
16
// bien pratiques n'ont guere de logique organisationnelle ; elles sont
17
// appelees par certaines balises au moment du calcul des pages. (Peut-on
18
// trouver un modele de donnees qui les associe physiquement au fichier
19
// definissant leur balise ???
20
//
21
 
22
// ON TROUVERA EN QUEUE DE FICHIER LES FONCTIONS FAISANT DES APPELS SQL
23
 
24
 
25
// Ce fichier ne sera execute qu'une fois
26
if (defined("_INC_CALCUL_OUTILS")) return;
27
define("_INC_CALCUL_OUTILS", "1");
28
 
29
// Pour les documents comme pour les logos, le filtre |fichier donne
30
// le chemin du fichier apres 'IMG/' ;  peut-etre pas d'une purete
31
// remarquable, mais a conserver pour compatibilite ascendante.
32
// -> http://www.spip.net/fr_article901.html
33
function calcule_fichier_logo($on) {
34
	$r = ereg_replace("^" . _DIR_IMG, "", $on);
35
	return $r;
36
}
37
 
38
// Renvoie le code html pour afficher un logo, avec ou sans survol, lien, etc.
39
 
40
function affiche_logos($logos, $lien, $align) {
41
 
42
	list ($arton, $artoff) = $logos;
43
 
44
	if (!$arton) return $artoff;
45
 
46
	if ($taille = @getimagesize($arton)) {
47
		$taille = " ".$taille[3];
48
	}
49
 
50
	if ($artoff)
51
		$mouseover = " onmouseover=\"this.src='$artoff'\" "
52
			."onmouseout=\"this.src='$arton'\"";
53
 
54
	$milieu = "<img src=\"$arton\" alt=\"\""
55
		. ($align ? " align='$align'" : '')
56
		. $taille
57
		. $mouseover
58
		. " style='border-width: 0px;' class='spip_logos' />";
59
 
60
	return ($lien ? http_href($lien, $milieu) : $milieu);
61
}
62
 
63
//
64
// Retrouver le logo d'un objet (et son survol)
65
//
66
 
67
function calcule_logo($type, $onoff, $id, $id_rubrique, $ff) {
68
	include_ecrire('inc_logos.php3');
69
 
70
	$table_logos = array (
71
	'ARTICLE' => 'art',
72
	'AUTEUR' =>  'aut',
73
	'BREVE' =>  'breve',
74
	'MOT' => 'mot',
75
	'RUBRIQUE' => 'rub',
76
	'SITE' => 'site'
77
	);
78
	$type = $table_logos[$type];
79
	$nom = strtolower($onoff);
80
	# attention au cas $id = '0' pour LOGO_SITE_SPIP : utiliser intval()
81
	while (1) {
82
		$on = cherche_image_nommee($type . $nom . intval($id));
83
		if ($on) {
84
			if ($ff)
85
			  return  (array('', "$on[1].$on[2]"));
86
			else {
87
				$off = ($onoff != 'ON') ? '' :
88
					cherche_image_nommee($type . 'off' . $id);
89
				return array ("$on[0]$on[1].$on[2]",
90
					      ($off ? ("$off[0]$off[1].$off[2]") : ''));
91
			}
92
		}
93
		else if ($id_rubrique) {
94
			$type = 'rub';
95
			$id = $id_rubrique;
96
			$id_rubrique = 0;
97
		} else if ($id AND $type == 'rub')
98
			$id = sql_parent($id);
99
		else return array('','');
100
	}
101
}
102
 
103
//
104
// fonction standard de calcul de la balise #INTRODUCTION
105
// on peut la surcharger en definissant dans mes_fonctions.php3 :
106
// function introduction($type,$texte,$chapo,$descriptif) {...}
107
//
108
function calcul_introduction ($type, $texte, $chapo='', $descriptif='') {
109
	if (function_exists("introduction"))
110
		return introduction ($type, $texte, $chapo, $descriptif);
111
 
112
	switch ($type) {
113
		case 'articles':
114
			if ($descriptif)
115
				return propre($descriptif);
116
			else if (substr($chapo, 0, 1) == '=')	// article virtuel
117
				return '';
118
			else
119
				return PtoBR(propre(supprimer_tags(couper_intro($chapo."\n\n\n".$texte, 500))));
120
			break;
121
		case 'breves':
122
			return PtoBR(propre(supprimer_tags(couper_intro($texte, 300))));
123
			break;
124
		case 'forums':
125
			return PtoBR(propre(supprimer_tags(couper_intro($texte, 600))));
126
			break;
127
		case 'rubriques':
128
			if ($descriptif)
129
				return propre($descriptif);
130
			else
131
				return PtoBR(propre(supprimer_tags(couper_intro($texte, 600))));
132
			break;
133
	}
134
}
135
 
136
 
137
//
138
// Balises dynamiques
139
//
140
 
141
// elles sont traitees comme des inclusions
142
function synthetiser_balise_dynamique($nom, $args, $file, $lang, $ligne) {
143
 return
144
		('<'.'?php
145
include_ecrire(\'inc_lang.php3\');
146
lang_select("'.$lang.'");
147
include_local("'
148
		. $file
149
		. '");
150
inclure_balise_dynamique(balise_'
151
		. $nom
152
		. '_dyn(\''
153
		. join("', '", array_map('texte_script', $args))
154
		. "'),1, $ligne);
155
lang_dselect();
156
?"
157
		.">");
158
}
159
 
160
// verifier leurs arguments et filtres, et calculer le code a inclure
161
function executer_balise_dynamique($nom, $args, $filtres, $lang, $ligne) {
162
	if ($file = find_in_path('inc-' . strtolower($nom) . _EXTENSION_PHP))
163
		include_local($file);
164
	else
165
		die ("pas de balise dynamique pour #". strtolower($nom)." !");
166
 
167
	// Y a-t-il une fonction de traitement filtres-arguments ?
168
	$f = 'balise_' . $nom . '_stat';
169
	if (function_exists($f))
170
		$r = $f($args, $filtres);
171
	else
172
		$r = $args;
173
	if (!is_array($r))
174
		return $r;
175
	else
176
	  return synthetiser_balise_dynamique($nom, $r, $file, $lang, $ligne);
177
}
178
 
179
 
180
//
181
// FONCTIONS FAISANT DES APPELS SQL
182
//
183
 
184
# NB : a l'exception des fonctions pour les balises dynamiques
185
 
186
function calcul_exposer ($id, $type, $reference) {
187
	static $exposer;
188
	static $ref_precedente;
189
 
190
	// Que faut-il exposer ? Tous les elements de $reference
191
	// ainsi que leur hierarchie ; on ne fait donc ce calcul
192
	// qu'une fois (par squelette) et on conserve le resultat
193
	// en static.
194
	if ($reference<>$ref_precedente) {
195
		$ref_precedente = $reference;
196
 
197
		$exposer = array();
198
		foreach ($reference as $element=>$id_element) {
199
			if ($element == 'id_secteur') $element = 'id_rubrique';
200
			if ($x = table_from_primary($element)) {
201
				list($table,$hierarchie) = $x;
202
				$exposer[$element][$id_element] = true;
203
				if ($hierarchie) {
204
					list ($id_rubrique) = spip_abstract_fetsel(
205
array('id_rubrique'),
206
array($table),
207
array("$element=$id_element"));
208
				$hierarchie = substr(calculer_hierarchie($id_rubrique), 2);
209
				foreach (split(',',$hierarchie) as $id_rubrique)
210
					$exposer['id_rubrique'][$id_rubrique] = true;
211
				}
212
			}
213
		}
214
	}
215
 
216
	// And the winner is...
217
	return $exposer[$type][$id];
218
}
219
 
220
function table_from_primary($id) {
221
	global $tables_principales;
222
	include_ecrire('inc_serialbase.php3');
223
	foreach ($tables_principales as $k => $v) {
224
		if ($v['key']['PRIMARY KEY'] == $id)
225
			return array($k, array_key_exists('id_rubrique', $v['field']));
226
	}
227
	return '';
228
}
229
 
230
function calcul_generation ($generation) {
231
	$lesfils = array();
232
	$result = spip_abstract_select(array('id_rubrique'),
233
				array('spip_rubriques AS rubriques'),
234
				array(calcul_mysql_in('id_parent',
235
					$generation,
236
						      '')));
237
	while ($row = spip_abstract_fetch($result))
238
		$lesfils[] = $row['id_rubrique'];
239
	return join(",",$lesfils);
240
}
241
 
242
function calcul_branche ($generation) {
243
	if (!$generation)
244
		return '0';
245
	else {
246
		$branche[] = $generation;
247
		while ($generation = calcul_generation ($generation))
248
			$branche[] = $generation;
249
		return join(",",$branche);
250
	}
251
}
252
 
253
// fonction appelee par la balise #LOGO_DOCUMENT
254
function calcule_logo_document($id_document, $doubdoc, &$doublons, $flag_fichier, $lien, $align, $params) {
255
	if (!$id_document) return '';
256
	if ($doubdoc) $doublons["documents"] .= ','.$id_document;
257
 
258
	if (!($row = spip_abstract_select(array('id_type', 'id_vignette', 'fichier', 'mode'), array('spip_documents AS documents'), array("id_document = $id_document"))))
259
		// pas de document. Ne devrait pas arriver
260
		return '';
261
 
262
	list($id_type, $id_vignette, $fichier, $mode) = spip_abstract_fetch($row);
263
 
264
	// Lien par defaut = l'adresse du document
265
	## if (!$lien) $lien = $fichier;
266
 
267
	// Y a t il une vignette personnalisee ?
268
	if ($id_vignette) {
269
		if ($res = spip_abstract_select(array('fichier'),
270
		array('spip_documents AS documents'),
271
		array("id_document = $id_vignette"))) {
272
			list($vignette) = spip_abstract_fetch($res);
273
			if (@file_exists($vignette))
274
				$logo = generer_url_document($id_vignette);
275
		}
276
	} else if ($mode == 'vignette') {
277
		$logo = generer_url_document($id_document);
278
		if (!@file_exists($logo))
279
			$logo = '';
280
	}
281
 
282
	// taille maximum [(#LOGO_DOCUMENT{300,52})]
283
	list($x,$y) = split(',', ereg_replace("[}{]", "", $params));
284
 
285
 
286
	if ($logo AND @file_exists($logo)) {
287
		if ($x OR $y)
288
			$logo = reduire_image($logo, $x, $y);
289
		else {
290
			$size = @getimagesize($logo);
291
			$logo = "<img src='$logo' ".$size[3]." />";
292
		}
293
	}
294
	else {
295
		// Retrouver l'extension
296
		list($extension) =
297
			spip_abstract_fetch(spip_abstract_select(array('extension'),
298
			array('spip_types_documents AS documents'),
299
			array("id_type = " . intval($id_type))));
300
		if (!$extension) $extension = 'txt';
301
 
302
		// Pas de vignette, mais un fichier image -- creer la vignette
303
		if (strstr(lire_meta('formats_graphiques'), $extension)) {
304
			if ($img = copie_locale($fichier)
305
			AND @file_exists($img)) {
306
				if (!$x AND !$y) {
307
					$logo = reduire_image($img);
308
				} else {
309
					# eviter une double reduction
310
					$size = @getimagesize($img);
311
					$logo = "<img src='$img' ".$size[3]." />";
312
				}
313
			}
314
		}
315
 
316
		// Document sans vignette ni image : vignette par defaut
317
		if (!$logo) {
318
			$img = vignette_par_defaut($extension, false);
319
			$size = @getimagesize($img);
320
			$logo = "<img src='$img' ".$size[3]." />";
321
		}
322
	}
323
 
324
	// Reduire si une taille precise est demandee
325
	if ($x OR $y)
326
		$logo = reduire_image($logo, $x, $y);
327
 
328
	// flag_fichier : seul le fichier est demande
329
	if ($flag_fichier)
330
		# supprimer le IMG/
331
		return calcule_fichier_logo(extraire_attribut($logo, 'src'));
332
 
333
 
334
	// Calculer le code html complet (cf. calcule_logo)
335
	$logo = inserer_attribut($logo, 'alt', '');
336
	$logo = inserer_attribut($logo, 'style', 'border-width: 0px;');
337
	$logo = inserer_attribut($logo, 'class', 'spip_logos');
338
	if ($align)
339
		$logo = inserer_attribut($logo, 'align', $align);
340
 
341
	if ($lien)
342
		$logo = "<a href='$lien'>$logo</a>";
343
 
344
	return $logo;
345
}
346
 
347
 
348
// fonction appelee par la balise #EMBED
349
function calcule_embed_document($id_document, $filtres, &$doublons, $doubdoc) {
350
	if ($doubdoc && $id_document) $doublons["documents"] .= ', ' . $id_document;
351
	return embed_document($id_document, $filtres, false);
352
}
353
 
354
// les balises dynamiques et EMBED ont des filtres sans arguments
355
// car en fait ce sont des arguments pas des filtres.
356
// Si le besoin s'en fait sentir, il faudra récuperer la 2e moitie du tableau
357
 
358
function argumenter_balise($fonctions, $sep) {
359
  $res = array();
360
  if ($fonctions)
361
    foreach ($fonctions as $f) $res[] =
362
      str_replace('\'', '\\\'', str_replace('\\', '\\\\',$f[0]));
363
  return ("'" . join($sep, $res) . "'");
364
}
365
 
366
// fonction appelee par la balise #NOTES
367
function calculer_notes() {
368
	$r = $GLOBALS["les_notes"];
369
	$GLOBALS["les_notes"] = "";
370
	$GLOBALS["compt_note"] = 0;
371
	$GLOBALS["marqueur_notes"] ++;
372
	return $r;
373
}
374
 
375
# retourne la profondeur d'une rubrique
376
 
377
function sql_profondeur($id) {
378
	$n = 0;
379
	while ($id) {
380
		$n++;
381
		$id = sql_parent($id);
382
	}
383
	return $n;
384
}
385
 
386
 
387
function sql_parent($id_rubrique) {
388
	$row = spip_abstract_fetsel(array(id_parent),
389
			array('spip_rubriques'),
390
			array("id_rubrique=" . intval($id_rubrique)));
391
	return $row['id_parent'];
392
}
393
 
394
function sql_rubrique($id_article) {
395
	$row = spip_abstract_fetsel(array('id_rubrique'),
396
			array('spip_articles'),
397
			array("id_article=" . intval($id_article)));
398
	return $row['id_rubrique'];
399
}
400
 
401
function sql_auteurs($id_article, $table, $id_boucle, $serveur='') {
402
	$auteurs = "";
403
	if ($id_article) {
404
		$result_auteurs = spip_abstract_select(array('auteurs.nom', 'auteurs.email'),
405
			array('spip_auteurs AS auteurs',
406
				'spip_auteurs_articles AS lien'),
407
			array("lien.id_article=$id_article",
408
				"auteurs.id_auteur=lien.id_auteur"),
409
			'',array(),'','',1,
410
			$table, $id_boucle, $serveur);
411
 
412
		while($row_auteur = spip_abstract_fetch($result_auteurs, $serveur)) {
413
			$nom_auteur = typo($row_auteur["nom"]);
414
			$email_auteur = $row_auteur["email"];
415
			if ($email_auteur) {
416
				$auteurs[] = "<a href=\"mailto:$email_auteur\">$nom_auteur</a>";
417
			} else {
418
				$auteurs[] = "$nom_auteur";
419
			}
420
		}
421
	}
422
	return (!$auteurs) ? "" : join($auteurs, ", ");
423
}
424
 
425
function sql_petitions($id_article, $table, $id_boucle, $serveur, &$Cache) {
426
	$retour = spip_abstract_fetsel(
427
		array('texte'),
428
		array('spip_petitions'),
429
		array("id_article=".intval($id_article)),
430
		'',array(),'','',1,
431
		$table, $id_boucle, $serveur);
432
 
433
	if (!$retour) return '';
434
	# cette page est invalidee par toute petition
435
	$Cache['varia']['pet'.$id_article] = 1;
436
	# ne pas retourner '' car le texte sert aussi de presence
437
	return ($retour['texte'] ? $retour['texte'] : ' ');
438
}
439
 
440
# retourne le chapeau d'un article, et seulement s'il est publie
441
 
442
function sql_chapo($id_article) {
443
	if ($id_article)
444
	return spip_abstract_fetsel(array('chapo'),
445
		array('spip_articles'),
446
		array("id_article=".intval($id_article),
447
		"statut='publie'"));
448
}
449
 
450
# retourne le champ 'accepter_forum' d'un article
451
function sql_accepter_forum($id_article) {
452
	static $cache = array();
453
 
454
	if (!$id_article) return;
455
 
456
	if (!isset($cache[$id_article])) {
457
		$row = spip_abstract_fetsel(array('accepter_forum'),
458
			array('spip_articles'),
459
			array("id_article=".intval($id_article)));
460
		$cache[$id_article] = $row['accepter_forum'];
461
	}
462
 
463
	return $cache[$id_article];
464
}
465
 
466
 
467
// Calcul de la rubrique associee a la requete
468
// (selection de squelette specifique par id_rubrique & lang)
469
 
470
function sql_rubrique_fond($contexte) {
471
 
472
	if ($id = intval($contexte['id_rubrique'])) {
473
		$row = spip_abstract_fetsel(array('lang'),
474
					    array('spip_rubriques'),
475
					    array("id_rubrique=$id"));
476
		if ($row['lang'])
477
			$lang = $row['lang'];
478
		return array ($id, $lang);
479
	}
480
 
481
	if ($id  = intval($contexte['id_breve'])) {
482
		$row = spip_abstract_fetsel(array('id_rubrique', 'lang'),
483
			array('spip_breves'),
484
			array("id_breve=$id"));
485
		$id_rubrique_fond = $row['id_rubrique'];
486
		if ($row['lang'])
487
			$lang = $row['lang'];
488
		return array($id_rubrique_fond, $lang);
489
	}
490
 
491
	if ($id = intval($contexte['id_syndic'])) {
492
		$row = spip_abstract_fetsel(array('id_rubrique'),
493
			array('spip_syndic'),
494
			array("id_syndic=$id"));
495
		$id_rubrique_fond = $row['id_rubrique'];
496
		$row = spip_abstract_fetsel(array('lang'),
497
			array('spip_rubriques'),
498
			array("id_rubrique='$id_rubrique_fond'"));
499
		if ($row['lang'])
500
			$lang = $row['lang'];
501
		return array($id_rubrique_fond, $lang);
502
	}
503
 
504
	if ($id = intval($contexte['id_article'])) {
505
		$row = spip_abstract_fetsel(array('id_rubrique', 'lang'),
506
			array('spip_articles'),
507
			array("id_article=$id"));
508
		$id_rubrique_fond = $row['id_rubrique'];
509
		if ($row['lang'])
510
			$lang = $row['lang'];
511
		return array($id_rubrique_fond, $lang);
512
	}
513
}
514
 
515
// Ajouter "&lang=..." si la langue de base n'est pas celle du site
516
function lang_parametres_forum($s) {
517
 
518
	// ne pas se fatiguer si le site est unilingue (plus rapide)
519
	if (strstr(lire_meta('langues_utilisees'), ',')
520
	// chercher l'identifiant qui nous donnera la langue
521
	AND preg_match(',id_(article|breve|rubrique|syndic)=([0-9]+),', $s, $r)){
522
		$objet = $r[1];
523
		$id = $r[2];
524
		list($lang) = spip_fetch_array(spip_query(
525
			"SELECT lang FROM spip_${objet}s WHERE id_$objet=$id"
526
		));
527
		// Si ce n'est pas la meme que celle du site, l'ajouter aux parametres
528
		if ($lang AND $lang <> lire_meta('langue_site'))
529
			$s .= "&lang=$lang";
530
	}
531
 
532
	return $s;
533
}
534
 
535
?>