Skip to content
Extraits de code Groupes Projets
inc_texte.php3 29,1 ko
Newer Older
<?php
Yannick Patois's avatar
Yannick Patois a validé

//
// Ce fichier ne sera execute qu'une fois
if (defined("_ECRIRE_INC_TEXTE")) return;
define("_ECRIRE_INC_TEXTE", "1");

Fil's avatar
 
Fil a validé
include_ecrire("inc_filtres.php3");
Yannick Patois's avatar
Yannick Patois a validé

//
// Initialisation de quelques variables globales
// (on peut les modifier globalement dans mes_fonctions.php3,
//  OU individuellement pour chaque type de page dans article.php3,
//  rubrique.php3, etc. cf doc...)
// Par securite ne pas accepter les variables passees par l'utilisateur
Yannick Patois's avatar
Yannick Patois a validé
//
function tester_variable($nom_var, $val){
Antoine Pitrou's avatar
Antoine Pitrou a validé
	if (!isset($GLOBALS[$nom_var])
		OR $_GET[$nom_var] OR $GLOBALS['HTTP_GET_VARS'][$nom_var]
		OR $_PUT[$nom_var] OR $GLOBALS['HTTP_PUT_VARS'][$nom_var]
		OR $_POST[$nom_var] OR $GLOBALS['HTTP_POST_VARS'][$nom_var]
		OR $_COOKIE[$nom_var] OR $GLOBALS['HTTP_COOKIE_VARS'][$nom_var]
		OR $_REQUEST[$nom_var]) {
		return false;
	}
	return true;
tester_variable('debut_intertitre', "\n<h3 class=\"spip\">");
tester_variable('fin_intertitre', "</h3>\n");
Fil's avatar
Fil a validé
tester_variable('ligne_horizontale', "\n<hr class=\"spip\" />\n");
ARNO*'s avatar
ARNO* a validé
tester_variable('ouvre_ref', '&nbsp;[');
tester_variable('ferme_ref', ']');
tester_variable('ouvre_note', '[');
tester_variable('ferme_note', '] ');
tester_variable('les_notes', '');
tester_variable('compt_note', 0);
tester_variable('nombre_surligne', 4);
tester_variable('url_glossaire_externe', "http://@lang@.wikipedia.org/wiki/");
Antoine Pitrou's avatar
Antoine Pitrou a validé

// On ne prend la $puce_rtl par defaut que si $puce n'a pas ete redefinie
Yannick Patois's avatar
Yannick Patois a validé

Antoine Pitrou's avatar
Antoine Pitrou a validé
//if (!tester_variable('puce', "<li class='spip_puce' style='list-style-image: url(puce.gif)'>")) {
ARNO*'s avatar
ARNO* a validé
if (!tester_variable('puce', "<img class='spip_puce' src='puce.gif' alt='-' border='0'>&nbsp;")) {
	tester_variable('puce_rtl', "<img class='spip_puce' src='puce_rtl.gif' alt='-' border='0'>&nbsp;");
Yannick Patois's avatar
Yannick Patois a validé


//
// Trouver une locale qui marche
//
$lang2 = strtoupper($GLOBALS['spip_lang']);
setlocale(LC_CTYPE, $GLOBALS['spip_lang']) ||
setlocale(LC_CTYPE, $lang2.'_'.$GLOBALS['spip_lang']) ||
setlocale(LC_CTYPE, $GLOBALS['spip_lang'].'_'.$lang2);
Yannick Patois's avatar
Yannick Patois a validé


Antoine Pitrou's avatar
Antoine Pitrou a validé
//
// Vignette pour les documents lies
//

function vignette_par_defaut($type_extension) {
	if ($GLOBALS['flag_ecrire'])
		$img = "../IMG/icones";
	else
		$img = "IMG/icones";

	$filename = "$img/$type_extension";

	// Glurps !
Fil's avatar
Fil a validé
	if (@file_exists($filename.'.png')) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$vig = "$filename.png";
	}
Fil's avatar
Fil a validé
	else if (@file_exists($filename.'.gif')) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$vig = "$filename.gif";
	}
Fil's avatar
Fil a validé
	else if (@file_exists($filename.'-dist.png')) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$vig = "$filename-dist.png";
	}
Fil's avatar
Fil a validé
	else if (@file_exists($filename.'-dist.gif')) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$vig = "$filename-dist.gif";
	}
Fil's avatar
Fil a validé
	else if (@file_exists("$img/defaut.png")) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$vig = "$img/defaut.png";
	}
Fil's avatar
Fil a validé
	else if (@file_exists("$img/defaut.gif")) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$vig = "$img/defaut.gif";
	}
Fil's avatar
Fil a validé
	else if (@file_exists("$img/defaut-dist.png")) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$vig = "$img/defaut-dist.png";
	}
Fil's avatar
Fil a validé
	else if (@file_exists("$img/defaut-dist.gif")) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$vig = "$img/defaut-dist.gif";
	}

	if ($size = @getimagesize($vig)) {
		$largeur = $size[0];
		$hauteur = $size[1];
	}

	return array($vig, $largeur, $hauteur);
}


Yannick Patois's avatar
Yannick Patois a validé

// ereg_ ou preg_ ?
function ereg_remplace($cherche_tableau, $remplace_tableau, $texte) {
	global $flag_pcre;
Yannick Patois's avatar
Yannick Patois a validé

	if ($flag_pcre) return preg_replace($cherche_tableau, $remplace_tableau, $texte);
Yannick Patois's avatar
Yannick Patois a validé

Yannick Patois's avatar
Yannick Patois a validé

	for ($i = 0; $i < $n; $i++) {
		$texte = ereg_replace(substr($cherche_tableau[$i], 1, -1), $remplace_tableau[$i], $texte);
Yannick Patois's avatar
Yannick Patois a validé
	}
Yannick Patois's avatar
Yannick Patois a validé
}

// Ne pas afficher le chapo si article virtuel
function nettoyer_chapo($chapo){
	if (substr($chapo,0,1) == "="){
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$chapo = "";
// points d'entree de pre- et post-traitement pour propre() et typo()
function spip_avant_propre ($letexte) {
	if (@function_exists('avant_propre'))
function spip_apres_propre ($letexte) {
	if (@function_exists('apres_propre'))
function spip_avant_typo ($letexte) {
	if (@function_exists('avant_typo'))
function spip_apres_typo ($letexte) {
	if (@function_exists('apres_typo'))
	// caracteres speciaux
	$letexte = corriger_caracteres($letexte);
	$letexte = str_replace("'", "&#8217;", $letexte);
Fil's avatar
Fil a validé
	// relecture des &nbsp;
	if ($GLOBALS['flag_ecrire'] AND $GLOBALS['revision_nbsp'])
		$letexte = ereg_replace('&nbsp;', '<span class="spip-nbsp">&nbsp;</span>', $letexte);
// Mise de cote des echappements
function echappe_html($letexte, $source, $no_transform=false) {
	global $flag_pcre;
Yannick Patois's avatar
Yannick Patois a validé

	if ($flag_pcre) {	// beaucoup plus rapide si on a pcre
		$regexp_echap_html = "<html>((.*?))<\/html>";
		$regexp_echap_code = "<code>((.*?))<\/code>";
		$regexp_echap_cadre = "<(cadre|frame)>((.*?))<\/(cadre|frame)>";
		$regexp_echap_poesie = "<(poesie|poetry)>((.*?))<\/(poesie|poetry)>";
		$regexp_echap = "/($regexp_echap_html)|($regexp_echap_code)|($regexp_echap_cadre)|($regexp_echap_poesie)/si";
		//echo creer_echappe_sans_pcre("cadre");
		$regexp_echap_html = "<html>(([^<]|<[^/]|</[^h]|</h[^t]|</ht[^m]|</htm[^l]|<\/html[^>])*)<\/html>";
		$regexp_echap_code = "<code>(([^<]|<[^/]|</[^c]|</c[^o]|</co[^d]|</cod[^e]|<\/code[^>])*)<\/code>";
		$regexp_echap_cadre = "(<[cf][ar][da][rm]e>(([^<]|<[^/]|</[^cf]|</[cf][^ar]|</[cf][ar][^da]|</[cf][ar][da][^rm]|</[cf][ar][da][rm][^e]|<\/[cf][ar][da][rm]e[^>])*)<\/[cf][ar][da][rm]e>)()"; // parentheses finales pour obtenir meme nombre de regs que pcre
		$regexp_echap_poesie = "(<poe[st][ir][ey]>(([^<]|<[^/]|</[^p]|</p[^o]|</po[^e]|</poe[^st]|</poe[st][^ir]|</poe[st][ir][^[ey]]|<\/poe[st][ir][ey][^>])*)<\/poe[st][ir][ey]>)()";
		$regexp_echap = "($regexp_echap_html)|($regexp_echap_code)|($regexp_echap_cadre)|($regexp_echap_poesie)";
Yannick Patois's avatar
Yannick Patois a validé

	while (($flag_pcre && preg_match($regexp_echap, $letexte, $regs))
		|| (!$flag_pcre && eregi($regexp_echap, $letexte, $regs))) {
Yannick Patois's avatar
Yannick Patois a validé

		if ($no_transform) {	// echappements bruts
			$les_echap[$num_echap] = $regs[0];
		}
		else
Fil's avatar
Fil a validé
		if ($regs[1]) {
			// Echapper les <html>...</ html>
			$les_echap[$num_echap] = $regs[2];
		}
		else
Fil's avatar
Fil a validé
		if ($regs[4]) {
			// Echapper les <code>...</ code>
			$lecode = entites_html($regs[5]);

Fil's avatar
Fil a validé
			// supprimer les sauts de ligne debut/fin (mais pas les espaces => ascii art).
			$lecode = ereg_replace("^\n+|\n+$", "", $lecode);

			// ne pas mettre le <div...> s'il n'y a qu'une ligne
			if (is_int(strpos($lecode,"\n")))
Fil's avatar
Fil a validé
				$lecode = nl2br("<div align='left' class='spip_code' dir='ltr'>".$lecode."</div>");
			else
				$lecode = "<span class='spip_code' dir='ltr'>".$lecode."</span>";

			$lecode = ereg_replace("\t", "&nbsp; &nbsp; &nbsp; &nbsp; ", $lecode);
			$lecode = ereg_replace("  ", " &nbsp;", $lecode);
			$les_echap[$num_echap] = "<tt>".$lecode."</tt>";
		}
		else
Fil's avatar
Fil a validé
		if ($regs[7]) {
			// Echapper les <cadre>...</cadre>
			$lecode = trim(entites_html($regs[9]));
			$total_lignes = count(explode("\n", $lecode));
			$les_echap[$num_echap] = "</p><form action=\"get\"><textarea readonly='readonly' cols='40' wrap='off' rows='$total_lignes' class='spip_cadre' dir='ltr'>".$lecode."</textarea></form><p class=\"spip\">";
		else
		if ($regs[12]) {
			$lecode = $regs[14];
			$lecode = ereg_replace("\n[[:space:]]*\n", "\n&nbsp;\n",$lecode);
			$lecode = ereg_replace("\r", "\n", $lecode);
			$lecode = "<div class=\"spip_poesie\"><div>".ereg_replace("\n+", "</div>\n<div>", $lecode)."</div></div>";
			
			$les_echap[$num_echap] = "</p>".propre($lecode)."<p class=\"spip\">";
Yannick Patois's avatar
Yannick Patois a validé

		$pos = strpos($letexte, $regs[0]);
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$letexte = substr($letexte,0,$pos)."@@SPIP_$source$num_echap@@"
			.substr($letexte,$pos+strlen($regs[0]));
Yannick Patois's avatar
Yannick Patois a validé
	}


	//
	// Insertion d'images et de documents utilisateur
	//
	while (eregi("<(IMG|DOC|EMB)([0-9]+)(\|([^\>]*))?".">", $letexte, $match)) {
		include_ecrire("inc_documents.php3");
		$num_echap++;

		$letout = quotemeta($match[0]);
		$letout = ereg_replace("\|", "\|", $letout);
		$id_document = $match[2];
		$align = $match[4];
		if (eregi("emb", $match[1]))
			$rempl = embed_document($id_document, $align);
		else
			$rempl = integre_image($id_document, $align, $match[1]);
Fil's avatar
Fil a validé
		$letexte = ereg_replace($letout, "@@SPIP_$source$num_echap@@", $letexte);
		$les_echap[$num_echap] = $rempl;
	}

	// Echapper les tags html contenant des caracteres sensibles a la typo
	$regexp_echap = "<[a-zA-Z!][^<>!':;\?]*[!':;\?][^<>]*>";
		if (preg_match_all("/$regexp_echap/", $letexte, $regs, PREG_SET_ORDER))
			while (list(,$reg) = each($regs)) {
				$num_echap++;
				$les_echap[$num_echap] = $reg[0];
				//echo htmlspecialchars($reg[0])."<p>";
				$pos = strpos($letexte, $les_echap[$num_echap]);
				$letexte = substr($letexte,0,$pos)."@@SPIP_$source$num_echap@@"
					.substr($letexte,$pos+strlen($les_echap[$num_echap]));
			}
	else
		while (ereg($regexp_echap, $letexte, $reg)) {
			$num_echap++;
			$les_echap[$num_echap] = $reg[0];
			$pos = strpos($letexte, $les_echap[$num_echap]);
			$letexte = substr($letexte,0,$pos)."@@SPIP_$source$num_echap@@"
				.substr($letexte,$pos+strlen($les_echap[$num_echap]));
		}
Yannick Patois's avatar
Yannick Patois a validé

	return array($letexte, $les_echap);
Yannick Patois's avatar
Yannick Patois a validé
}

// Traitement final des echappements
function echappe_retour($letexte, $les_echap, $source) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
	while (ereg("@@SPIP_$source([0-9]+)@@", $letexte, $match)) {
		$lenum = $match[1];
		$cherche = $match[0];
		$pos = strpos($letexte, $cherche);
		$letexte = substr($letexte, 0, $pos). $les_echap[$lenum] . substr($letexte, $pos + strlen($cherche));
Yannick Patois's avatar
Yannick Patois a validé
	}
	return $letexte;
}

function couper($texte, $taille=50) {
	$texte = substr($texte, 0, 400 + 2*$taille); /* eviter de travailler sur 10ko pour extraire 150 caracteres */

	// supprimer les tags
	$texte = supprimer_tags($texte);
	$texte = trim(ereg_replace("[\n\r]"," ", $texte));
	$texte .= "\n";	// marquer la fin

	// travailler en accents charset
	$texte = filtrer_entites($texte);

	// supprimer les liens
	$texte = ereg_replace("\[([^\[]*)->([^]]*)\]","\\1", $texte);
Yannick Patois's avatar
Yannick Patois a validé

	// supprimer les notes
	$texte = ereg_replace("\[\[([^]]|\][^]])*\]\]", "", $texte);
Yannick Patois's avatar
Yannick Patois a validé

	$texte = ereg_replace("[{}]", "", $texte);
Yannick Patois's avatar
Yannick Patois a validé

	// supprimer les tableaux
	$texte = ereg_replace("(^|\n)\|.*\|\n", "", $texte);

	// supprimer les traits, lignes etc
	$texte = ereg_replace("(^|\n)-[-#\*]*", "", $texte);

	// couper au mot precedent
	$long = substr($texte, 0, max($taille-4,1));
Fil's avatar
Fil a validé
	$court = ereg_replace("([^[:space:]][[:space:]]+)[^[:space:]]*\n?$", "\\1", $long);
	$points = '&nbsp;(...)';

	// trop court ? ne pas faire de (...)
	if (strlen($court) < max(0.75 * $taille,2)) {
		$points = '';
		$long = ereg_replace("&#?[a-z0-9]*;?$", "", substr($texte, 0, $taille));
		$texte = ereg_replace("([^[:space:]][[:space:]]+)[^[:space:]]*$", "\\1", $long);
		// encore trop court ? couper au caractere
		if (strlen($texte) < 0.75 * $taille)
			$texte = $long;
	} else
		$texte = $court;

	if (strpos("\n", $texte))	// la fin est encore la : c'est qu'on n'a pas de texte de suite
		$points = '';

	return trim($texte).$points;
Yannick Patois's avatar
Yannick Patois a validé
}

// prendre <intro>...</intro> sinon couper a la longueur demandee
Yannick Patois's avatar
Yannick Patois a validé
function couper_intro($texte, $long) {
	$texte = eregi_replace("(</?)intro>", "\\1intro>", $texte); // minuscules
	while ($fin = strpos($texte, "</intro>")) {
		$zone = substr($texte, 0, $fin);
		$texte = substr($texte, $fin + strlen("</intro>"));
		if ($deb = strpos($zone, "<intro>") OR substr($zone, 0, 7) == "<intro>")
			$zone = substr($zone, $deb + 7);
		$intro .= $zone;
	}

	if ($intro)
Yannick Patois's avatar
Yannick Patois a validé
	else
		$intro = couper($texte, $long);

	// supprimer un eventuel chapo redirecteur =http:/.....
	$intro = ereg_replace("^=[^[:space:]]+","",$intro);
Yannick Patois's avatar
Yannick Patois a validé

	return $intro;
}


Yannick Patois's avatar
Yannick Patois a validé

// Securite : empecher l'execution de code PHP
function interdire_scripts($source) {
	$source = eregi_replace("<(\%|\?|([[:space:]]*)script)", "&lt;\\1", $source);
	return $source;
Yannick Patois's avatar
Yannick Patois a validé
}

// Correction typographique francaise
Yannick Patois's avatar
Yannick Patois a validé
function typo_fr($letexte) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
	global $flag_strtr2;
	static $trans;
Antoine Pitrou's avatar
Antoine Pitrou a validé

	// Nettoyer 160 = nbsp ; 187 = raquo ; 171 = laquo ; 176 = deg ; 147 = ldquo; 148 = rdquo
Antoine Pitrou's avatar
Antoine Pitrou a validé
	if (!$trans) {
		$trans = array(
			"&nbsp;" => "~",
			"&raquo;" => "&#187;",
			"&laquo;" => "&#171;",
			"&rdquo;" => "&#148;",
			"&ldquo;" => "&#147;",
Antoine Pitrou's avatar
Antoine Pitrou a validé
			"&deg;" => "&#176;"
		);
		$chars = array(160 => '~', 187 => '&#187;', 171 => '&#171;', 148 => '&#148;', 147 => '&#147;', 176 => '&#176;');
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$charset = lire_meta('charset');
		include_ecrire('inc_charsets.php3');
Fil's avatar
 
Fil a validé

Antoine Pitrou's avatar
Antoine Pitrou a validé
		while (list($c, $r) = each($chars)) {
			$c = unicode2charset(charset2unicode(chr($c), 'iso-8859-1', 'forcer'));
			$trans[$c] = $r;
		}
Yannick Patois's avatar
Yannick Patois a validé
	}

Antoine Pitrou's avatar
Antoine Pitrou a validé
	if ($flag_strtr2)
		$letexte = strtr($letexte, $trans);
	else {
		reset($trans);
		while (list($c, $r) = each($trans))
			$letexte = str_replace($c, $r, $letexte);
	}
Fil's avatar
 
Fil a validé

Yannick Patois's avatar
Yannick Patois a validé
	$cherche1 = array(
Yannick Patois's avatar
Yannick Patois a validé
		/* 2 */ 	'/((^|[^\#0-9a-zA-Z\&])[\#0-9a-zA-Z]*)\;/',
		/* 3 */		'/&#187;|[!?]| -,|:([^0-9]|$)/',
		/* 4 */		'/&#171;|(M(M?\.|mes?|r\.?)|[MnN]&#176;) /'
Yannick Patois's avatar
Yannick Patois a validé
	);
	$remplace1 = array(
		/* 1		'<i class="spip">\1</i>', */
Yannick Patois's avatar
Yannick Patois a validé
		/* 2 */		'\1~;',
Yannick Patois's avatar
Yannick Patois a validé
	);
	$letexte = ereg_remplace($cherche1, $remplace1, $letexte);
	$letexte = ereg_replace(" *~+ *", "~", $letexte);

	$cherche2 = array(
Yannick Patois's avatar
Yannick Patois a validé
		'/~/'
	);
	$remplace2 = array(
		'\1:',
		'&nbsp;'
	);
Yannick Patois's avatar
Yannick Patois a validé
	$letexte = ereg_remplace($cherche2, $remplace2, $letexte);

Antoine Pitrou's avatar
Antoine Pitrou a validé
	return $letexte;
Yannick Patois's avatar
Yannick Patois a validé
}

Fil's avatar
Fil a validé
// rien sauf les ~ {}
function typo_en($letexte) {
Fil's avatar
Fil a validé
	$cherche1 = array(
		/* 1 */		'/{([^}]+)}/'
	);
	$remplace1 = array(
		/* 1 */		'<i class="spip">\1</i>'
	);
	// $letexte = ereg_remplace($cherche1, $remplace1, $letexte);

Antoine Pitrou's avatar
Antoine Pitrou a validé
	$letexte = str_replace("&nbsp;", "~", $letexte);
Fil's avatar
Fil a validé

	return ereg_replace(" *~+ *", "&nbsp;", $letexte);
}

// Typographie generale : francaise si la langue est 'cpf', 'fr' ou 'eo',
// sinon anglaise (minimaliste)
Yannick Patois's avatar
Yannick Patois a validé
function typo($letexte) {
	global $spip_lang, $lang_typo;
Yannick Patois's avatar
Yannick Patois a validé

	// echapper les codes <html>...</html> etc.
Yannick Patois's avatar
Yannick Patois a validé
	list($letexte, $les_echap) = echappe_html($letexte, "SOURCETYPO");

	// Appeler la fonction de pre-traitement
	$letexte = spip_avant_typo ($letexte);
Antoine Pitrou's avatar
Antoine Pitrou a validé
	if (!$lang = $lang_typo) {
		include_ecrire('inc_lang.php3');
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$lang = lang_typo($spip_lang);
Antoine Pitrou's avatar
Antoine Pitrou a validé
	if ($lang == 'fr')
Yannick Patois's avatar
Yannick Patois a validé
		$letexte = typo_fr($letexte);
	else
		$letexte = typo_en($letexte);
Antoine Pitrou's avatar
Antoine Pitrou a validé

	// Appeler la fonction de post-traitement
	$letexte = spip_apres_typo ($letexte);

	// reintegrer les echappements
Yannick Patois's avatar
Yannick Patois a validé
	$letexte = echappe_retour($letexte, $les_echap, "SOURCETYPO");

	return $letexte;
}

Fil's avatar
 
Fil a validé
// cette fonction est tordue : on lui passe un tableau correspondant au match
// de la regexp ci-dessous, et elle retourne le texte a inserer a la place
// et le lien "brut" a usage eventuel de redirection...
function extraire_lien ($regs) {
Fil's avatar
Fil a validé
	$lien_texte = $regs[1];
Fil's avatar
 
Fil a validé
	$lien_url = trim($regs[3]);
	$compt_liens++;
	$lien_interne = false;
	if (ereg('^(art(icle)?|rub(rique)?|br(.ve)?|aut(eur)?|mot|site|doc(ument)?|im(age|g))? *([[:digit:]]+)$', $lien_url, $match)) {
Fil's avatar
 
Fil a validé
		// Traitement des liens internes
Fil's avatar
Fil a validé
		if (@file_exists('inc-urls.php3')) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
			include_local('inc-urls.php3');
Fil's avatar
Fil a validé
		} elseif (@file_exists('inc-urls-dist.php3')) {
Antoine Pitrou's avatar
Antoine Pitrou a validé
			include_local('inc-urls-dist.php3');
		} else {
			include_ecrire('inc_urls.php3');
		}

Fil's avatar
 
Fil a validé
		$type_lien = $match[1];
		$lien_interne=true;
		$class_lien = "in";
		switch (substr($type_lien, 0, 2)) {
			case 'ru':
				$lien_url = generer_url_rubrique($id_lien);
				if (!$lien_texte) {
					$req = "select titre from spip_rubriques where id_rubrique=$id_lien";
					$row = @spip_fetch_array(@spip_query($req));
Fil's avatar
 
Fil a validé
					$lien_texte = $row['titre'];
				}
				break;
			case 'br':
				$lien_url = generer_url_breve($id_lien);
				if (!$lien_texte) {
					$req = "select titre from spip_breves where id_breve=$id_lien";
					$row = @spip_fetch_array(@spip_query($req));
Fil's avatar
 
Fil a validé
					$lien_texte = $row['titre'];
				}
				break;
			case 'au':
				$lien_url = generer_url_auteur($id_lien);
				if (!$lien_texte) {
					$req = "select nom from spip_auteurs where id_auteur = $id_lien";
					$row = @spip_fetch_array(@spip_query($req));
Fil's avatar
 
Fil a validé
					$lien_texte = $row['nom'];
				}
				break;
			case 'mo':
				$lien_url = generer_url_mot($id_lien);
				if (!$lien_texte) {
					$req = "select titre from spip_mots where id_mot=$id_lien";
					$row = @spip_fetch_array(@spip_query($req));
Fil's avatar
 
Fil a validé
					$lien_texte = $row['titre'];
				}
				break;
			case 'im':
			case 'do':
				$lien_url = generer_url_document($id_lien);
				if (!$lien_texte) {
					$req = "select titre,fichier from spip_documents where id_document=$id_lien";
					$row = @spip_fetch_array(@spip_query($req));
					$lien_texte = $row['titre'];
					if (!$lien_texte)
						$lien_texte = ereg_replace("^.*/","",$row['fichier']);
				}
Fil's avatar
Fil a validé
				break;
Fil's avatar
 
Fil a validé
			case 'si':
				$row = @spip_fetch_array(@spip_query("SELECT nom_site,url_site FROM spip_syndic WHERE id_syndic=$id_lien"));
Fil's avatar
 
Fil a validé
				if ($row) {
					$lien_url = $row['url_site'];
					if (!$lien_texte)
						$lien_texte = typo($row['nom_site']);
				}
				break;
			default:
				$lien_url = generer_url_article($id_lien);
				if (!$lien_texte) {
					$req = "select titre from spip_articles where id_article=$id_lien";
					$row = @spip_fetch_array(@spip_query($req));
Fil's avatar
 
Fil a validé
					$lien_texte = $row['titre'];
Fil's avatar
 
Fil a validé
				}
				break;
		}

		// supprimer les numeros des titres
		include_ecrire("inc_filtres.php3");
		$lien_texte = supprimer_numero($lien_texte);
Antoine Pitrou's avatar
Antoine Pitrou a validé
	}
	else if (ereg('^\?(.*)$', $lien_url, $regs)) {
		// Liens glossaire
		$lien_url = substr($lien_url, 1);
		$class_lien = "glossaire";
	}
	else {
		// Liens non automatiques
Fil's avatar
 
Fil a validé
		$class_lien = "out";
		// texte vide ?
		if ((!$lien_texte) and (!$lien_interne)) {
			$lien_texte = ereg_replace('"', '', $lien_url);
			if (strlen($lien_texte)>40)
				$lien_texte = substr($lien_texte,0,35).'...';
			$class_lien = "url";
			$lien_texte = "<html>$lien_texte</html>";
Fil's avatar
 
Fil a validé
		}
		// petites corrections d'URL
		if (ereg("^www\.[^@]+$",$lien_url))
			$lien_url = "http://".$lien_url;
Antoine Pitrou's avatar
Antoine Pitrou a validé
		else if (strpos($lien_url, "@") && email_valide($lien_url))
			$lien_url = "mailto:".$lien_url;
Fil's avatar
 
Fil a validé
	}

	$insert = "<a href=\"$lien_url\" class=\"spip_$class_lien\""
Fil's avatar
Fil a validé
		.">".typo($lien_texte)."</a>";
Fil's avatar
 
Fil a validé

	return array($insert, $lien_url);
}
// Traitement des listes (merci a Michael Parienti)
//
function traiter_listes ($texte) {
	$parags = split ("\n[[:space:]]*\n", $texte);
	unset($texte);

	// chaque paragraphe est traite a part
	while (list(,$para) = each($parags)) {
		$niveau = 0;
		$lignes = explode("\n-", "\n" . $para);

		// ne pas toucher a la premiere ligne
		list(,$debut) = each($lignes);
		$texte .= $debut;

		// chaque item a sa profondeur = nb d'etoiles
		unset ($type);
		while (list(,$item) = each($lignes)) {
Fil's avatar
Fil a validé
			ereg("^([*]*|[#]*)([^*#].*)", $item, $regs);
			$profond = strlen($regs[1]);

			if ($profond > 0) {
				unset ($ajout);

				// changement de type de liste au meme niveau : il faut
				// descendre un niveau plus bas, fermer ce niveau, et
				// remonter
				$nouv_type = (substr($item,0,1) == '*') ? 'ul' : 'ol';
				$change_type = ($type AND ($type <> $nouv_type) AND ($profond == $niveau)) ? 1 : 0;
				// d'abord traiter les descentes
				while ($niveau > $profond - $change_type) {
					$ajout .= $pile_li[$niveau];
					$ajout .= $pile_type[$niveau];
Fil's avatar
Fil a validé
					if (!$change_type)
						unset ($pile_li[$niveau]);
				// puis les identites (y compris en fin de descente)
				if ($niveau == $profond && !$change_type) {
Fil's avatar
Fil a validé
					$ajout .= $pile_li[$niveau];
				}

				// puis les montees (y compris apres une descente un cran trop bas)
				while ($niveau < $profond) {
					$niveau ++;
					$ajout .= "<$type class=\"spip\">";
					$pile_type[$niveau] = "</$type>";
				}
				$ajout .= "<li class=\"spip\">";
				$pile_li[$profond] = "</li>";
Antoine Pitrou's avatar
Antoine Pitrou a validé
			else {
			$texte .= $ajout . $regs[2];
		unset ($ajout);
		while ($niveau > 0) {
			$ajout .= $pile_li[$niveau];
			$ajout .= $pile_type[$niveau];
			$niveau --;
		}
		$texte .= $ajout;

		// paragraphe
		$texte .= "\n\n";
	}

	// sucrer les deux derniers \n
	return substr($texte, 0, -2);
}

Yannick Patois's avatar
Yannick Patois a validé
// Nettoie un texte, traite les raccourcis spip, la typo, etc.
Fil's avatar
Fil a validé
function traiter_raccourcis($letexte, $les_echap = false, $traiter_les_notes = 'oui') {
Antoine Pitrou's avatar
Antoine Pitrou a validé
	global $debut_intertitre, $fin_intertitre, $ligne_horizontale, $url_glossaire_externe;
Yannick Patois's avatar
Yannick Patois a validé
	global $compt_note;
	global $les_notes;
Yannick Patois's avatar
Yannick Patois a validé
	global $ouvre_ref;
	global $ferme_ref;
	global $ouvre_note;
	global $ferme_note;
Antoine Pitrou's avatar
Antoine Pitrou a validé
	global $flag_pcre;
Fil's avatar
Fil a validé
	global $lang_dir;
Yannick Patois's avatar
Yannick Patois a validé

	// echapper les <a href>, <html>...< /html>, <code>...< /code>
	if (!$les_echap)
		list($letexte, $les_echap) = echappe_html($letexte, "SOURCEPROPRE");

	// Appeler la fonction de pre_traitement
	$letexte = spip_avant_propre ($letexte);
	if (!$lang_dir) {
		include_ecrire('inc_lang.php3');
Fil's avatar
Fil a validé
		$lang_dir = lang_dir($GLOBALS['spip_lang']);
	if ($lang_dir == 'rtl' AND $GLOBALS['puce_rtl'])
		$puce = $GLOBALS['puce_rtl'];
	else
		$puce = $GLOBALS['puce'];
Yannick Patois's avatar
Yannick Patois a validé
	// Harmoniser les retours chariot
	$letexte = ereg_replace ("\r\n?", "\n",$letexte);

	// Corriger HTML
	$letexte = eregi_replace("</?p>","\n\n\n",$letexte);

	//
	// Notes de bas de page
	//
Antoine Pitrou's avatar
Antoine Pitrou a validé
	$texte_a_voir = $letexte;
	$texte_vu = '';
Yannick Patois's avatar
Yannick Patois a validé
	$regexp = "\[\[(([^]]|[^]]\][^]])*)\]\]";
	/* signifie : deux crochets ouvrants, puis pas-crochet-fermant ou
		crochet-fermant entoure de pas-crochets-fermants (c'est-a-dire
		tout sauf deux crochets fermants), puis deux fermants */
Antoine Pitrou's avatar
Antoine Pitrou a validé
	while (ereg($regexp, $texte_a_voir, $regs)) {
		$note_source = $regs[0];
Yannick Patois's avatar
Yannick Patois a validé
		$note_texte = $regs[1];
		$num_note = false;
Fil's avatar
Fil a validé

		// note auto ou pas ?
		if (ereg("^ *<([^>]*)>", $note_texte, $regs)){
			$num_note = $regs[1];
			$note_texte = ereg_replace ("^ *<([^>]*)>", "", $note_texte);
Fil's avatar
Fil a validé
		} else {
Yannick Patois's avatar
Yannick Patois a validé
			$compt_note++;
			$num_note = $compt_note;
Yannick Patois's avatar
Yannick Patois a validé
		}
Fil's avatar
Fil a validé

		// preparer la note
			if ($marqueur_notes) // ??????
			$ancre = $mn.urlencode($num_note);
ARNO*'s avatar
ARNO* a validé
			$insert = "$ouvre_ref<a href=\"#nb$ancre\" name=\"nh$ancre\" class=\"spip_note\">$num_note</a>$ferme_ref";
			$appel = "<html>$ouvre_note<a href=\"#nh$ancre\" name=\"nb$ancre\" class=\"spip_note\">$num_note</a>$ferme_note</html>";
Yannick Patois's avatar
Yannick Patois a validé
		} else {
			$insert = '';
Fil's avatar
Fil a validé
			$appel = '';
Yannick Patois's avatar
Yannick Patois a validé
		}
Fil's avatar
Fil a validé

		// l'ajouter "brut" dans les notes
		if ($note_texte) {
			if ($mes_notes)
				$mes_notes .= "\n\n";
Fil's avatar
Fil a validé
			$mes_notes .= $appel . $note_texte;
		}

		// dans le texte, mettre l'appel de note a la place de la note
		$pos = strpos($texte_a_voir, $note_source);
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$texte_vu .= substr($texte_a_voir, 0, $pos) . $insert;
		$texte_a_voir = substr($texte_a_voir, $pos + strlen($note_source));
Yannick Patois's avatar
Yannick Patois a validé
	}
Antoine Pitrou's avatar
Antoine Pitrou a validé
	$letexte = $texte_vu . $texte_a_voir;
Yannick Patois's avatar
Yannick Patois a validé

Antoine Pitrou's avatar
Antoine Pitrou a validé
	//
	// Raccourcis automatiques vers un glossaire
	// (on traite ce raccourci en deux temps afin de ne pas appliquer
	//  la typo sur les URLs, voir raccourcis liens ci-dessous)
	//
	if ($url_glossaire_externe) {
		$regexp = "\[\?+([^][<>]+)\]";
		while (ereg($regexp, $letexte, $regs)) {
			$terme = trim($regs[1]);
Fil's avatar
Fil a validé
			$terme_underscore = urlencode(ereg_replace('[[:space:]]+', '_', $terme));
			if (strstr($url_glossaire_externe,"%s"))
				$url = str_replace("%s", $terme_underscore, $url_glossaire_externe);
Fil's avatar
Fil a validé
			else
				$url = $url_glossaire_externe.$terme_underscore;
			$url = str_replace("@lang@", $GLOBALS['spip_lang'], $url);
Antoine Pitrou's avatar
Antoine Pitrou a validé
			$code = "[$terme->?$url]";
			$letexte = str_replace($regs[0], $code, $letexte);
		}
	}

Yannick Patois's avatar
Yannick Patois a validé
	//
Fil's avatar
 
Fil a validé
	// Raccourcis liens (cf. fonction extraire_lien ci-dessus)
Yannick Patois's avatar
Yannick Patois a validé
	//
	$regexp = "\[([^][]*)->(>?)([^]]*)\]";
Yannick Patois's avatar
Yannick Patois a validé
	$texte_a_voir = $letexte;
	$texte_vu = '';
Antoine Pitrou's avatar
Antoine Pitrou a validé
	while (ereg($regexp, $texte_a_voir, $regs)) {
Fil's avatar
 
Fil a validé
		list($insert, $lien) = extraire_lien($regs);
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$pos = strpos($texte_a_voir, $regs[0]);
		$texte_vu .= typo(substr($texte_a_voir, 0, $pos)) . $insert;
		$texte_a_voir = substr($texte_a_voir, $pos + strlen($regs[0]));
Yannick Patois's avatar
Yannick Patois a validé
	}
	$letexte = $texte_vu.typo($texte_a_voir); // typo de la queue du texte

	//
	// Tableaux
	//
	$letexte = ereg_replace("^\n?\|", "\n\n|", $letexte);
	$letexte = ereg_replace("\|\n?$", "|\n\n", $letexte);
Antoine Pitrou's avatar
Antoine Pitrou a validé

Yannick Patois's avatar
Yannick Patois a validé
	$tableBeginPos = strpos($letexte, "\n\n|");
	$tableEndPos = strpos($letexte, "|\n\n");
	while (is_integer($tableBeginPos) && is_integer($tableEndPos) && $tableBeginPos < $tableEndPos + 3) {
		$textBegin = substr($letexte, 0, $tableBeginPos);
		$textTable = substr($letexte, $tableBeginPos + 2, $tableEndPos - $tableBeginPos);
		$textEnd = substr($letexte, $tableEndPos + 3);
Antoine Pitrou's avatar
Antoine Pitrou a validé

Yannick Patois's avatar
Yannick Patois a validé
		$newTextTable = "\n<p><table class=\"spip\">";
		$rowId = 0;
		$lineEnd = strpos($textTable, "|\n");
		while (is_integer($lineEnd)) {
			$rowId++;
			$row = substr($textTable, 0, $lineEnd);
			$textTable = substr($textTable, $lineEnd + 2);
			if ($rowId == 1 && ereg("^(\\|[[:space:]]*\\{\\{[^}]+\\}\\}[[:space:]]*)+$", $row)) {
				$newTextTable .= '<tr class="row_first">';
			} else {
				$newTextTable .= '<tr class="row_'.($rowId % 2 ? 'odd' : 'even').'">';
			}
			$newTextTable .= ereg_replace("\|([^\|]+)", "<td>\\1</td>", $row);
			$newTextTable .= '</tr>';
			$lineEnd = strpos($textTable, "|\n");
		}
		$newTextTable .= "</table>\n<p>\n";
Yannick Patois's avatar
Yannick Patois a validé
		$letexte = $textBegin . $newTextTable . $textEnd;

		$tableBeginPos = strpos($letexte, "\n\n|");
		$tableEndPos = strpos($letexte, "|\n\n");
	}
Yannick Patois's avatar
Yannick Patois a validé
	//
	// Ensemble de remplacements implementant le systeme de mise
	// en forme (paragraphes, raccourcis...)
	//
	// ATTENTION : si vous modifiez cette partie, modifiez les DEUX
Antoine Pitrou's avatar
Antoine Pitrou a validé
	// branches de l'alternative (if (!flag_pcre).../else).
Yannick Patois's avatar
Yannick Patois a validé
	//

	$letexte = trim($letexte);
	// les listes
	if (ereg("\n-[*#]", "\n".$letexte))
		$letexte = traiter_listes($letexte);
Antoine Pitrou's avatar
Antoine Pitrou a validé
	if (!$flag_pcre) {
		/* note : on pourrait se passer de cette branche, car ereg_remplace() fonctionne
		   sans pcre ; toutefois les elements ci-dessous sont un peu optimises (str_replace
		   est plus rapide que ereg_replace), donc laissons les deux branches cohabiter, ca
		   permet de gagner un peu de temps chez les hergeurs nazes */
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$letexte = ereg_replace("(^|\n)(-{4,}|_{4,})", "@@SPIP_ligne_horizontale@@", $letexte);
		$letexte = ereg_replace("^- *", "$puce&nbsp;", $letexte);
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$letexte = ereg_replace("\n-- *", "\n<br />&mdash&nbsp;",$letexte);
		$letexte = ereg_replace("\n- *", "\n<br />$puce&nbsp;",$letexte);
		$letexte = ereg_replace("\n_ +", "\n<br />",$letexte);
Yannick Patois's avatar
Yannick Patois a validé
		$letexte = ereg_replace("(( *)\n){2,}", "\n<p>", $letexte);
Antoine Pitrou's avatar
Antoine Pitrou a validé
		$letexte = str_replace("{{{", "@@SPIP_debut_intertitre@@", $letexte);
		$letexte = str_replace("}}}", "@@SPIP_fin_intertitre@@", $letexte);
Yannick Patois's avatar
Yannick Patois a validé
		$letexte = str_replace("{{", "<b class=\"spip\">", $letexte);
		$letexte = str_replace("}}", "</b>", $letexte);
		$letexte = str_replace("{", "<i class=\"spip\">", $letexte);
		$letexte = str_replace("}", "</i>", $letexte);
		$letexte = eregi_replace("(<br[[:space:]]*/?".">)+(<p>|<br[[:space:]]*/?".">)", "\n<p class=\"spip\">", $letexte);
Yannick Patois's avatar
Yannick Patois a validé
		$letexte = str_replace("<p>", "<p class=\"spip\">", $letexte);
		$letexte = str_replace("\n", " ", $letexte);
		$letexte = str_replace("<quote>", "<div class=\"spip_quote\">", $letexte);
		$letexte = str_replace("<\/quote>", "</div>", $letexte);
Yannick Patois's avatar
Yannick Patois a validé
	}
	else {
		$cherche1 = array(
			/* 0 */ 	"/(^|\n)(----+|____+)/",
			/* 1 */ 	"/^- */",
Antoine Pitrou's avatar
Antoine Pitrou a validé
			/* 1bis */ 	"/\n-- */",
			/* 2 */ 	"/\n- */",
Yannick Patois's avatar
Yannick Patois a validé
			/* 4 */ 	"/(( *)\n){2,}/",
			/* 5 */ 	"/\{\{\{/",
			/* 6 */ 	"/\}\}\}/",
			/* 7 */ 	"/\{\{/",
			/* 8 */ 	"/\}\}/",
			/* 9 */ 	"/\{/",
			/* 10 */	"/\}/",
			/* 11 */	"/(<br[[:space:]]*\/?".">){2,}/",
			/* 12 */	"/<p>([\n]*)(<br[[:space:]]*\/?".">)+/",
			/* 15 */	"/<quote>/",
			/* 16 */	"/<\/quote>/"
Yannick Patois's avatar
Yannick Patois a validé
		);
		$remplace1 = array(
Antoine Pitrou's avatar
Antoine Pitrou a validé
			/* 0 */ 	"@@SPIP_ligne_horizontale@@",
Antoine Pitrou's avatar
Antoine Pitrou a validé
			/* 1bis */ 	"\n<br />&mdash;&nbsp;",
			/* 2 */ 	"\n<br />$puce&nbsp;",
			/* 3 */ 	"\n<br />",
Yannick Patois's avatar
Yannick Patois a validé
			/* 4 */ 	"\n<p>",
Antoine Pitrou's avatar
Antoine Pitrou a validé
			/* 5 */ 	"@@SPIP_debut_intertitre@@",
			/* 6 */ 	"@@SPIP_fin_intertitre@@",
Yannick Patois's avatar
Yannick Patois a validé
			/* 7 */ 	"<b class=\"spip\">",
			/* 8 */ 	"</b>",
			/* 9 */ 	"<i class=\"spip\">",
			/* 10 */	"</i>",
			/* 11 */	"\n<p class=\"spip\">",
			/* 12 */	"\n<p class=\"spip\">",
Antoine Pitrou's avatar
Antoine Pitrou a validé
			/* 15 */	"<blockquote class=\"spip\">",
			/* 16 */	"</blockquote>"
Yannick Patois's avatar
Yannick Patois a validé
		);
		$letexte = ereg_remplace($cherche1, $remplace1, $letexte);
	}

	// paragrapher
Antoine Pitrou's avatar
Antoine Pitrou a validé
	if (strpos(' '.$letexte, '<p class="spip">'))
		$letexte = '<p class="spip">'.str_replace('<p class="spip">', "</p>\n".'<p class="spip">', $letexte).'</p>';

	// intertitres & hr compliants
Antoine Pitrou's avatar
Antoine Pitrou a validé
	$letexte = ereg_replace('(<p class="spip">)?[[:space:]]*@@SPIP_debut_intertitre@@', $debut_intertitre, $letexte);
	$letexte = ereg_replace('@@SPIP_fin_intertitre@@[[:space:]]*(</p>)?', $fin_intertitre, $letexte);
	$letexte = ereg_replace('(<p class="spip">)?[[:space:]]*@@SPIP_ligne_horizontale@@[[:space:]]*(</p>)?', $ligne_horizontale, $letexte);
Yannick Patois's avatar
Yannick Patois a validé

	// Appeler la fonction de post-traitement
	$letexte = spip_apres_propre ($letexte);
Yannick Patois's avatar
Yannick Patois a validé
	// Reinserer les echappements
	$letexte = echappe_retour($letexte, $les_echap, "SOURCEPROPRE");
Fil's avatar
Fil a validé

	if ($mes_notes) {
		$mes_notes = traiter_raccourcis($mes_notes, $les_echap, 'non');
		if (ereg('<p class="spip">',$mes_notes))
			$mes_notes = ereg_replace('<p class="spip">', '<p class="spip_note">', $mes_notes);
		else
			$mes_notes = '<p class="spip_note">'.$mes_notes."</p>\n";
		$mes_notes = echappe_retour($mes_notes, $les_echap, "SOURCEPROPRE");
		$les_notes .= interdire_scripts($mes_notes);
Fil's avatar
Fil a validé
	}
Yannick Patois's avatar
Yannick Patois a validé

	return $letexte;
}


// Filtre a appliquer aux champs du type #TEXTE*
Yannick Patois's avatar
Yannick Patois a validé
function propre($letexte) {
	return interdire_scripts(traiter_raccourcis(trim($letexte)));
Fil's avatar
Fil a validé
//	$a=time(); $b=microtime();
//	interdire_scripts(traiter_raccourcis(trim($letexte)));
//	return time()-$a + microtime()-$b;
Yannick Patois's avatar
Yannick Patois a validé
}

?>