Valider 7d4b92a8 rédigé par esj's avatar esj
Parcourir les fichiers

Multi-base: les boucles référençant des connexions externes...

Multi-base: les boucles référençant des connexions externes {{{<BOUCLE1(A:...}}} ou les pages appelées ainsi (paramètre d'URL {{{&connect=...}}} calculent à présent correctement les modèles contenus dans les champs SQL soumis aux filtre '''typo()''' et '''propre()'''. C'est un pas en avant dans la résolution complète de #716.

Différences avec les versions précédentes:

	* (bug de PCRE) les notes nommées {{{ [[<*> ...}}} ne peuvent plus contenir d'espaces entre les deux crochets et le chevron;

	* les fonctions redéfinissables {{{avant_propre}}} et {{{apres_propre}}} sont évacuées, faisant double emploi avec les pipelines {{{pre_propre}}} et {{{post_propre}}}.

	* surtout: le pipeline {{{pre_propre}}} recevra un texte où les raccourcis de liens ({{{ [->art1] }}} etc) seront déjà expansés.

Test:
{{{
Doc 2239 centré
<doc2239|center>

Je mets 2 fois un raccourci de glossaire
[?SPIP]  [?SPIP] 
puis un [raccourci->art1]
et un autre, automatique, [->art3634].

Suivre la note
[[elle est terminée par un  [raccourci->art1]]].

Un moment de poésie.
<poesie>
un 
   haiku
sur
2 lignes
</poesie>

Elle préfère parler d'un {accroissement de la dispersionsalariale} [[
 [{Perspectives économiques}->http://www.oecd.org/document/4/0,3343,fr_2649_201185_20347588_1_1_1_1,00.html]
- Vol. 2007-1, n¡~81, mai 2007, p. ~184. ]]

Elle aussi préfère parler d'un {accroissement de la dispersion salariale}
mais sur une seule ligne  [[  [{Perspectives économiques}->http://www.oecd.org/document/4/0,3343,fr_2649_201185_20347588_1_1_1_1,00.html]
- Vol. 2007-1, n¡~81, mai 2007, p. ~184. ]].

Une Juliette [[<*> sans numéro.]].
}}}
parent cc71b049
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+7 −8
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -116,20 +116,19 @@ function balise_LOGO__dist ($p) {
			$code_lien = "''";
		$code_lien .= ", '". $align . "'";
	}

	if ($p->id_boucle AND $p->boucles[$p->id_boucle]->sql_serveur) {
		$p->code = "''";
		spip_log("Logo distant indisponible");
	// cas des documents
	} elseif ($type_objet == 'DOCUMENT') {
	$connect = $p->id_boucle ?$p->boucles[$p->id_boucle]->sql_serveur :'';
	if ($type_objet == 'DOCUMENT') {
		$p->code = "calcule_logo_document($_id_objet, '" .
			$p->descr['documents'] .
			'\', $doublons, '. intval($flag_fichier).", $code_lien, '".
			// #LOGO_DOCUMENT{x,y} donne la taille maxi
			texte_script($params)
			."')";
			."'," . _q($connect) .")";
	}
	else {
	elseif ($connect) {
		$p->code = "''";
		spip_log("Les logos distants ne sont pas prevus");
	} else {
		$p->code = "affiche_logos(calcule_logo('$id_objet', '" .
			(($suite_logo == '_SURVOL') ? 'off' : 
			(($suite_logo == '_NORMAL') ? 'on' : 'ON')) .
+50 −53
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -289,6 +289,24 @@ function echappe_retour($letexte, $source='', $filtre = "") {
	return $letexte;
}

// Reinserer le javascript de confiance (venant des modeles)

function echappe_retour_modeles($letexte)
{
	$letexte = echappe_retour($letexte);

	// Dans l'espace prive, securiser ici
	if (!_DIR_RESTREINT)
		$letexte = interdire_scripts($letexte);

	// Reinserer les echappements des modeles 

	if (defined('_PROTEGE_JS_MODELES'))
		$letexte = echappe_retour($letexte,"javascript"._PROTEGE_JS_MODELES);

	return trim($letexte);
}

// http://doc.spip.org/@nettoyer_raccourcis_typo
function nettoyer_raccourcis_typo($texte){
	$texte = pipeline('nettoyer_raccourcis_typo',$texte);
@@ -297,7 +315,7 @@ function nettoyer_raccourcis_typo($texte){
		foreach ($regs as $reg) {
			list ($titre,,)= traiter_raccourci_lien_atts($reg[1]);
			$titre = calculer_url($reg[3], $titre, 'titre');
			$titre = typo(supprimer_tags($titre));
			$titre = corriger_typo(supprimer_tags($titre));
			$texte = str_replace($reg[0], $titre, $texte);
		}

@@ -500,7 +518,7 @@ function safehtml($t) {
// avec protection prealable des balises HTML et SPIP

// http://doc.spip.org/@typo
function typo($letexte, $echapper=true) {
function typo($letexte, $echapper=true, $connect='') {

	// Plus vite !
	if (!$letexte) return $letexte;
@@ -512,9 +530,10 @@ function typo($letexte, $echapper=true) {
	//
	// Installer les modeles, notamment images et documents ;
	//
	// NOTE : dans propre() ceci s'execute avant les tableaux a cause du "|",
	// et apres les liens a cause du traitement de [<imgXX|right>->URL]
	$letexte = traiter_modeles($mem = $letexte, false, $echapper ? 'TYPO' : '');
	// NOTE : propre() l'a deja fait
	// sauf pour les textes renvoyes par calculer_url()

	$letexte = traiter_modeles($mem = $letexte, false, $echapper ? 'TYPO' : '', $connect);
	if ($letexte != $mem) $echapper = true;
	unset($mem);

@@ -524,7 +543,8 @@ function typo($letexte, $echapper=true) {
	if ($echapper)
		$letexte = echappe_retour($letexte, 'TYPO');

	// l'espace prive securise ici
	// Dans l'espace prive, securiser ici
	if (!_DIR_RESTREINT)
		$letexte = interdire_scripts($letexte);

	return $letexte;
@@ -1167,21 +1187,19 @@ function traiter_raccourci_glossaire($letexte)
// Regexp des raccouris, aussi utilisee pour la fusion de sauvegarde Spip
define('_RACCOURCI_LIEN', ",\[([^][]*)->(>?)([^]]*)\],msS");

// http://doc.spip.org/@traiter_raccourcis_propre
function traiter_raccourcis_propre($letexte)
function expanser_liens($letexte, $connect='')
{
	$inserts = array();
	if (preg_match_all(_RACCOURCI_LIEN, $letexte, $matches, PREG_SET_ORDER)) {
		$i = 0;
		foreach ($matches as $regs) {
			$inserts[++$i] = traiter_raccourci_lien($regs);
			$inserts[++$i] = traiter_raccourci_lien($regs, $connect);
			$letexte = str_replace($regs[0], "@@SPIP_ECHAPPE_LIEN_$i@@",
				$letexte);
		}
	}

	$letexte = typo($letexte, /* echap deja fait, accelerer */ false);

	$letexte = corriger_typo(traiter_modeles($letexte, false, false, $connect));
	foreach ($inserts as $i => $insert) {
		$letexte = str_replace("@@SPIP_ECHAPPE_LIEN_$i@@", $insert, $letexte);
	}
@@ -1195,9 +1213,9 @@ function traiter_raccourcis_propre($letexte)
// 1=>texte (ou texte|hreflang ou texte|bulle ou texte|bulle{hreflang})
// 2=>double fleche (historiquement, liens ouvrants)
// 3=>url
//
// A terme, il faudrait tenir compte de $connect
// http://doc.spip.org/@traiter_raccourci_lien
function traiter_raccourci_lien($regs) {
function traiter_raccourci_lien($regs, $connect='') {

	list(,$texte, ,$url) = $regs;
	list($texte, $bulle, $hlang) = traiter_raccourci_lien_atts($texte);
@@ -1209,8 +1227,14 @@ function traiter_raccourci_lien($regs) {
		$hlang = $lang;
	$lang = ($hlang ? ' hreflang="'.$hlang.'"' : '') . $bulle;

	# ici bien passer le lien pour traiter [<doc3>->url]
	return typo("<a href=\"$lien\" class=\"$class\"$lang>$texte</a>");
	# Penser au cas [<imgXX|right>->URL]
	# ceci s'execute heureusement avant les tableaux et leur "|".
	# Attention, le texte initial est deja echappe mais pas forcement
	# celui retourne par calculer_url.

	$texte = typo($texte, true, $connect);

	return "<a href=\"$lien\" class=\"$class\"$lang>$texte</a>";
}

// Repere dans la partie texte d'un raccourci [texte->...]
@@ -1288,7 +1312,7 @@ function traiter_poesie($letexte)
	return $letexte;
}

// Nettoie un texte, traite les raccourcis spip, la typo, etc.
// Nettoie un texte, traite les raccourcis autre qu'URL, la typo, etc.
// http://doc.spip.org/@traiter_raccourcis
function traiter_raccourcis($letexte) {

@@ -1296,24 +1320,19 @@ function traiter_raccourcis($letexte) {

	// Appeler les fonctions de pre_traitement
	$letexte = pipeline('pre_propre', $letexte);
	// old style
	if (function_exists('avant_propre'))
		$letexte = avant_propre($letexte);

	$letexte = traiter_raccourcis_propre($letexte);
	$letexte = traiter_poesie($letexte);

	// Harmoniser les retours chariot
	$letexte = preg_replace(",\r\n?,S", "\n", $letexte);

	// Recuperer les paragraphes HTML
	$letexte = preg_replace(",<p[>[:space:]],iS", "\n\n\\0", $letexte);
	$letexte = preg_replace(",</p[>[:space:]],iS", "\\0\n\n", $letexte);
	$letexte = preg_replace(',<p[>]\s,iS', "\n\n\\0", $letexte);
	$letexte = preg_replace(',</p[>]\s,iS', "\\0\n\n", $letexte);

	$letexte = traiter_raccourci_glossaire($letexte);
	$letexte = traiter_raccourci_ancre($letexte);


	list($letexte, $mes_notes) = traite_raccourci_notes($letexte);

	// A present on introduit des attributs class_spip*
@@ -1372,9 +1391,6 @@ function traiter_raccourcis($letexte) {

	// Appeler les fonctions de post-traitement
	$letexte = pipeline('post_propre', $letexte);
	// old style
	if (function_exists('apres_propre'))
		$letexte = apres_propre($letexte);

	if ($mes_notes) traiter_les_notes($mes_notes);

@@ -1411,7 +1427,7 @@ function traite_raccourci_notes($letexte)
		$num_note = false;

		// note auto ou pas ?
		if (preg_match(",^ *<([^>]*)>,", $note_texte, $regs)){
		if (preg_match(",^<([^>]*)>,", $note_texte, $regs)){
			$num_note = $regs[1];
			$note_texte = str_replace($regs[0], "", $note_texte);
		} else {
@@ -1481,30 +1497,11 @@ function traiter_les_notes($mes_notes) {

// Filtre a appliquer aux champs du type #TEXTE*
// http://doc.spip.org/@propre
function propre($letexte) {
	if (!$letexte) return $letexte;

	// Echapper les <a href>, <html>...< /html>, <code>...< /code>
	$letexte = echappe_html($letexte);

	// Traiter le texte
	$letexte = traiter_raccourcis($letexte);

	// Reinserer les echappements
	$letexte = echappe_retour($letexte);

	// Vider les espaces superflus
	$letexte = trim($letexte);
function propre($t, $connect='') {

	// Dans l'espace prive, securiser ici
	if (!_DIR_RESTREINT)
		$letexte = interdire_scripts($letexte);

	// Reinserer le javascript de confiance (venant des modeles)
	if (defined('_PROTEGE_JS_MODELES'))
		$letexte = echappe_retour($letexte,"javascript"._PROTEGE_JS_MODELES);

	return $letexte;
	return !$t ? '' :
		echappe_retour_modeles(
			traiter_raccourcis(
				expanser_liens(echappe_html($t),$connect)));
}

?>
+9 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -422,7 +422,15 @@ function balise_LANG_dist ($p) {
	return $p;
}


function balise_CHAPO_dist ($p) {
	$_chapo = champ_sql('chapo', $p);
	if ((!$p->etoile) OR (strpos($_chapo, '$Pile[$SP') === false))
		$p->code = $_chapo;
	else
		$p->code = "nettoyer_chapo($_chapo)";
	$p->interdire_scripts = false;
	return $p;
}
// #LESAUTEURS
// les auteurs d'un article (ou d'un article syndique)
// http://www.spip.net/fr_article902.html
+2 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -250,6 +250,8 @@ function calculer_boucle_nonrec($id_boucle, &$boucles) {
	} else {

		$corps = $init . '
	$connect = ' .
	_q($boucle->sql_serveur) . ';

	// RESULTATS
	while ($Pile[$SP] = @sql_fetch($result,"' .
+10 −10
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -352,31 +352,31 @@ function lister_objets_avec_logos ($type) {

// fonction appelee par la balise #LOGO_DOCUMENT
// http://doc.spip.org/@calcule_logo_document
function calcule_logo_document($id_document, $doubdoc, &$doublons, $flag_fichier, $lien, $align, $params) {
function calcule_logo_document($id_document, $doubdoc, &$doublons, $flag_fichier, $lien, $align, $params, $connect='') {
	include_spip('inc/documents');

	if (!$id_document) return '';
	if ($doubdoc) $doublons["documents"] .= ','.$id_document;

	if (!($row = sql_select(array('extension', 'id_vignette', 'fichier', 'mode'), array('spip_documents'), array("id_document = $id_document"))))
	if (!($row = sql_fetsel(array('extension', 'id_vignette', 'fichier', 'mode'), array('spip_documents'), array("id_document = $id_document"), '','','','','','','',$connect))) {
		// pas de document. Ne devrait pas arriver
		spip_log("Erreur du compilateur doc $id_document inconnu");
		return ''; 
	}

	$row = sql_fetch($row);
	$extension = $row['extension'];
	$id_vignette = $row['id_vignette'];
	$fichier = get_spip_doc($row['fichier']);
	$mode = $row['mode'];

	// Y a t il une vignette personnalisee ?
	// Ca va echouer si c'est en mode distant. A revoir.
	if ($id_vignette) {
		if ($res = sql_select(array('fichier'),
		$vignette = sql_fetsel(array('fichier'),
			   array('spip_documents'),
				array("id_document = $id_vignette"))) {
			$vignette = sql_fetch($res);
			   array("id_document = $id_vignette"), '','','','','','','',$connect);
		if (@file_exists(get_spip_doc($vignette['fichier'])))
			$logo = generer_url_document($id_vignette);
		}
	} else if ($mode == 'vignette') {
		$logo = generer_url_document($id_document);
		if (!@file_exists($logo))
Chargement en cours