diff --git a/ecrire/inc/plugin.php b/ecrire/inc/plugin.php index 37fc15cfe8e99d45befab2ec34e85c52bf009c86..aeef4c5a7df218039c88a97fe64906bf25ae56fe 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 2e9bcaf19eaf308153acbfd61e19af3aea3c9a45..7e288ee68126cbf7d443b01525b470edf657991b 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 6f8cb6a8dcb29b4363083f0e97cfa905e1a61abc..20b3d56e2d0ec8ff89ba4deb84f54c26b21616e8 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 e5e0b63f01c5e0e41fbe0f8de2b3136da41707d3..5792dfee6b7076574a8867c61deaf52a5da467f9 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',