From 2ea898094aabd2fd27aab3edc60f691591be69a1 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Tue, 13 May 2008 20:33:16 +0000
Subject: [PATCH] introduction d'un filtre supplementaire dans la fonction
 propre() : traiter_raccourci_liens va automatiquement detecter les sequences
 de la forme www.rezo.net ou http://rezo.net/ pour les rendre sous forme de
 lien actif. De maniere a rendre ca modifiable/surchargeable, j'en profite :
 une bonne partie des fonctions de propre() migrent dans la definition du
 pipeline. (oblige sans doute a purger tmp/charger_pipelines.php)

---
 ecrire/inc/plugin.php  |  1 +
 ecrire/inc/texte.php   | 43 +++++++++++++++++++++++++++++-------------
 ecrire/inc/utils.php   |  5 +++--
 ecrire/inc_version.php |  4 +++-
 4 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/ecrire/inc/plugin.php b/ecrire/inc/plugin.php
index 37fc15cfe8..aeef4c5a7d 100644
--- a/ecrire/inc/plugin.php
+++ b/ecrire/inc/plugin.php
@@ -373,6 +373,7 @@ function pipeline_precompile(){
 		$pipe = array_filter(explode('|',$pipeline));
 		// Eclater le pipeline en filtres et appliquer chaque filtre
 		foreach ($pipe as $fonc) {
+			$fonc = trim($fonc);
 			$s_call .= '$val = minipipe(\''.$fonc.'\', $val);'."\n";
 			if (isset($spip_matrice[$fonc])){
 				$file = $spip_matrice[$fonc];
diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php
index 2e9bcaf19e..7e288ee681 100644
--- a/ecrire/inc/texte.php
+++ b/ecrire/inc/texte.php
@@ -1224,26 +1224,43 @@ function traiter_poesie($letexte)
 	return $letexte;
 }
 
-// Nettoie un texte, traite les raccourcis autre qu'URL, la typo, etc.
-// http://doc.spip.org/@traiter_raccourcis
-function traiter_raccourcis($letexte) {
-
-	// Appeler les fonctions de pre_traitement
-	$letexte = pipeline('pre_propre', $letexte);
+// callback pour la fonction traiter_raccourci_liens()
+function autoliens_callback($r) {
+	if (strlen($r[1])) {
+		$l = preg_replace(',^http:/*,', '', $r[1]);
+		if (preg_match(
+		'/^(?:[^\W_]((?:[^\W_]|-){0,61}[^\W_])?\.)+[a-zA-Z]{2,6}\b/S', $l))
+			return inserer_attribut(expanser_liens('[->http://'.$l.']'),
+				'rel', 'nofollow');
+	}
+	return $r[0];
+}
 
-	$letexte = traiter_poesie($letexte);
+// extraire les liens ecrits en mode texte brut
+function traiter_raccourci_liens($texte) {
+	return preg_replace_callback(
+	',\[[^\[\]]*->.*?\]|<[^<>]*>|((http:|www\.)[^"\'\s\[\]]+),S',
+	'autoliens_callback', $texte);
+	return $texte;
+}
 
-	// Harmoniser les retours chariot
+// Harmonise les retours chariots et mange les paragraphes html
+function traiter_retours_chariots($letexte) {
 	$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);
+	return $letexte;
+}
+
+
+// Nettoie un texte, traite les raccourcis autre qu'URL, la typo, etc.
+// http://doc.spip.org/@traiter_raccourcis
+function traiter_raccourcis($letexte) {
 
-	$letexte = traiter_raccourci_glossaire($letexte);
-	$letexte = traiter_raccourci_ancre($letexte);
+	// Appeler les fonctions de pre_traitement
+	$letexte = pipeline('pre_propre', $letexte);
 
+	// Gerer les notes (ne passe pas dans le pipeline)
 	list($letexte, $mes_notes) = traite_raccourci_notes($letexte);
 
 	// A present on introduit des attributs class_spip*
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 6f8cb6a8dc..20b3d56e2d 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -76,15 +76,16 @@ function include_spip($f, $include = true) {
 
 // appel unitaire d'une fonction du pipeline
 // utilisee dans le script pipeline precompile
+// on passe $val par reference pour limiter les allocations memoire
 // http://doc.spip.org/@minipipe
-function minipipe($fonc,$val){
+function minipipe($fonc,&$val){
 
 	// fonction
 	if (function_exists($fonc))
 		$val = call_user_func($fonc, $val);
 
 	// Class::Methode
-	else if (preg_match("/^(\w*)::(\w*)$/", $fonc, $regs)
+	else if (preg_match("/^(\w*)::(\w*)$/S", $fonc, $regs)
 	AND $methode = array($regs[1], $regs[2])
 	AND is_callable($methode))
 		$val = call_user_func($methode, $val);
diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php
index e5e0b63f01..5792dfee6b 100644
--- a/ecrire/inc_version.php
+++ b/ecrire/inc_version.php
@@ -229,7 +229,9 @@ $spip_pipeline = array(
 	'nettoyer_raccourcis_typo' => '',
 	'pre_boucle' => '',
 	'post_boucle' => '',
-	'pre_propre' => '|extraire_multi',
+	'pre_propre' => '|extraire_multi|traiter_poesie|traiter_retours_chariots
+		|traiter_raccourci_liens|traiter_raccourci_glossaire
+		|traiter_raccourci_ancre',
 	'post_propre' => '',
 	'pre_typo' => '|extraire_multi',
 	'post_typo' => '|quote_amp',
-- 
GitLab