From 3b8ecb71a3f60d32e2c8dddc595f561c47d99407 Mon Sep 17 00:00:00 2001
From: Fil <fil@rezo.net>
Date: Wed, 6 Apr 2005 22:12:46 +0000
Subject: [PATCH] =?UTF-8?q?un=20petit=20marteau=20au=20lieu=20d'un=20gros,?=
 =?UTF-8?q?=20pour=20=C3=A9chapper=20les=20caract=C3=A8res=20typograpqhiue?=
 =?UTF-8?q?s=20dans=20les=20tags=20html=20(pour=20faciliter=20l'=C3=A9crit?=
 =?UTF-8?q?ure=20de=20filtres=20apres=5Fpropre()=20--=20Paolo)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 ecrire/inc_texte.php3 | 52 ++++++++++++++++++++++++++-----------------
 1 file changed, 32 insertions(+), 20 deletions(-)

diff --git a/ecrire/inc_texte.php3 b/ecrire/inc_texte.php3
index 06a43bd49f..62c90f9bea 100644
--- a/ecrire/inc_texte.php3
+++ b/ecrire/inc_texte.php3
@@ -95,10 +95,6 @@ function spip_avant_typo ($letexte) {
 
 function spip_apres_typo ($letexte) {
 
-	// caracteres speciaux
-	$letexte = corriger_caracteres($letexte);
-	$letexte = str_replace("'", "&#8217;", $letexte);
-
 	// relecture des &nbsp;
 	if (!_DIR_RESTREINT AND $GLOBALS['revision_nbsp'])
 		$letexte = ereg_replace('&nbsp;', '<span class="spip-nbsp">&nbsp;</span>', $letexte);
@@ -197,17 +193,6 @@ function echappe_html($letexte, $source='SOURCEPROPRE', $no_transform=false) {
 		$les_echap[$num_echap] = $match;
 	}
 
-	//
-	// Echapper les tags html contenant des caracteres sensibles a la typo
-	//
-	$regexp_echap = "<[a-zA-Z!][^<>!':;\?]*[!':;\?][^<>]*>";
-	if (preg_match_all("/$regexp_echap/ims", $letexte, $regs, PREG_SET_ORDER))
-	foreach ($regs as $reg) {
-		$num_echap++;
-		$les_echap[$num_echap] = $reg[0];
-		$letexte = str_replace($reg[0], "@@SPIP_$source$num_echap@@", $letexte);
-	}
-
 	return array($letexte, $les_echap);
 }
 
@@ -472,24 +457,51 @@ function typo_en($letexte) {
 	return $letexte;
 }
 
-// Typographie generale : francaise si la langue est 'cpf', 'fr' ou 'eo',
-// sinon anglaise (minimaliste)
+//
+// Typographie generale
+//
 function typo_generale($letexte) {
-	global $spip_lang, $lang_typo;
+	global $spip_lang;
 
 	// Appeler la fonction de pre-traitement
 	$letexte = spip_avant_typo ($letexte);
 
-	if (!$lang = $lang_typo) {
+	// Caracteres de controle "illegaux"
+	$letexte = corriger_caracteres($letexte);
+
+	// Proteger les caracteres typographiques a l'interieur des tags html
+	$protege = "!':;?";
+	$illegal = "\x1\x2\x3\x4\x5";
+	if (preg_match_all("/<[a-z!][^<>!':;\?]*[!':;\?][^<>]*>/ims",
+	$letexte, $regs, PREG_SET_ORDER)) {
+		foreach ($regs as $reg) {
+			$insert = $reg[0];
+			// hack: on transforme les caracteres a proteger en les remplacant
+			// par des caracteres "illegaux". (cf corriger_caracteres())
+			$insert = strtr($insert, $protege, $illegal);
+			$letexte = str_replace($reg[0], $insert, $letexte);
+		}
+	}
+
+	// zouli apostrophe
+	$letexte = str_replace("'", "&#8217;", $letexte);
+
+	// typo francaise ou anglaise ?
+	// $lang_typo est fixee dans l'interface privee pour editer
+	// un texte anglais en interface francaise (ou l'inverse) ;
+	// sinon determiner la typo en fonction de la langue
+	if (!$lang = $GLOBALS['lang_typo']) {
 		include_ecrire('inc_lang.php3');
 		$lang = lang_typo($spip_lang);
 	}
-
 	if ($lang == 'fr')
 		$letexte = typo_fr($letexte);
 	else
 		$letexte = typo_en($letexte);
 
+	// Retablir les caracteres proteges
+	$letexte = strtr($letexte, $illegal, $protege);
+
 	// Appeler la fonction de post-traitement
 	return spip_apres_typo ($letexte);
 }
-- 
GitLab