diff --git a/ecrire/inc_texte.php3 b/ecrire/inc_texte.php3
index 1103fa4e1f7da2dcc4005b2a94558cd104ae5b1b..76ee52e7b2770b13e60eb44279f20f0a5e8b5f07 100644
--- a/ecrire/inc_texte.php3
+++ b/ecrire/inc_texte.php3
@@ -130,6 +130,39 @@ function nettoyer_chapo($chapo){
 	return $chapo;
 }
 
+// points d'entree de pre- et post-traitement pour propre() et typo()
+function spip_avant_propre ($letexte, $ref_echap) {
+	if (@function_exists('avant_propre'))
+		return avant_propre ($letexte, $ref_echap);
+
+	return $letexte;
+}
+
+function spip_apres_propre ($letexte, $ref_echap) {
+	if (@function_exists('apres_propre'))
+		return apres_propre ($letexte, $ref_echap);
+
+	return $letexte;
+}
+
+function spip_avant_typo ($letexte, $ref_echap) {
+	if (@function_exists('avant_typo'))
+		return avant_typo ($letexte, $ref_echap);
+
+	return $letexte;
+}
+
+function spip_apres_typo ($letexte, $ref_echap) {
+	if (@function_exists('apres_typo'))
+		return apres_typo ($letexte, $ref_echap);
+
+	// else
+	$letexte = corriger_caracteres($letexte);
+	$letexte = str_replace("'", "’", $letexte);
+	return $letexte;
+}
+
+
 
 // Mise de cote des echappements
 function echappe_html($letexte,$source) {
@@ -384,8 +417,12 @@ function typo_en($letexte) {
 function typo($letexte) {
 	global $spip_lang, $lang_typo;
 
+	// echapper les codes <html>...</html> etc.
 	list($letexte, $les_echap) = echappe_html($letexte, "SOURCETYPO");
 
+	// Appeler la fonction de pre-traitement
+	$letexte = spip_avant_typo ($letexte, &$les_echap);
+
 	if (!$lang = $lang_typo) {
 		include_ecrire('inc_lang.php3');
 		$lang = lang_typo($spip_lang);
@@ -396,8 +433,10 @@ function typo($letexte) {
 	else
 		$letexte = typo_en($letexte);
 
-	$letexte = corriger_caracteres($letexte);
-	$letexte = str_replace("'", "&#8217;", $letexte);
+	// Appeler la fonction de post-traitement
+	$letexte = spip_apres_typo ($letexte, &$les_echap);
+
+	// reintegrer les echappements
 	$letexte = echappe_retour($letexte, $les_echap, "SOURCETYPO");
 
 	return $letexte;
@@ -603,7 +642,6 @@ function traiter_listes ($texte) {
 	return substr($texte, 0, -2);
 }
 
-
 // Nettoie un texte, traite les raccourcis spip, la typo, etc.
 function traiter_raccourcis($letexte, $les_echap = false, $traiter_les_notes = 'oui') {
 	global $debut_intertitre, $fin_intertitre, $ligne_horizontale, $url_glossaire_externe;
@@ -617,6 +655,13 @@ function traiter_raccourcis($letexte, $les_echap = false, $traiter_les_notes = '
 	global $flag_pcre;
 	global $lang_dir;
 
+	// 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, &$les_echap);
+
 	// Puce
 	if (!$lang_dir) {
 		include_ecrire('inc_lang.php3');
@@ -630,10 +675,6 @@ function traiter_raccourcis($letexte, $les_echap = false, $traiter_les_notes = '
 	// Harmoniser les retours chariot
 	$letexte = ereg_replace ("\r\n?", "\n",$letexte);
 
-	// echapper les <a href>, <html>...< /html>, <code>...< /code>
-	if (!$les_echap)
-		list($letexte, $les_echap) = echappe_html($letexte, "SOURCEPROPRE");
-
 	// Corriger HTML
 	$letexte = eregi_replace("</?p>","\n\n\n",$letexte);
 
@@ -851,6 +892,9 @@ function traiter_raccourcis($letexte, $les_echap = false, $traiter_les_notes = '
 	$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);
 
+	// Appeler la fonction de post-traitement
+	$letexte = spip_apres_propre ($letexte, &$les_echap);
+
 	// Reinserer les echappements
 	$letexte = echappe_retour($letexte, $les_echap, "SOURCEPROPRE");