1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
| // Correction typographique francaise
// http://doc.spip.org/@typo_fr
function typo_fr($letexte) {
static $trans;
// Nettoyer 160 = nbsp ; 187 = raquo ; 171 = laquo ; 176 = deg ; 147 = ldquo; 148 = rdquo
if (!$trans) {
$trans = array(
" " => "~",
"»" => "»",
"«" => "«",
"”" => "",
"“" => "",
"°" => "°"
);
$chars = array(160 => '~', 187 => '»', 171 => '«', 148 => '', 147 => '', 176 => '°');
$chars_trans = array_keys($chars);
$chars = array_values($chars);
$chars_trans = implode(' ',array_map('chr',$chars_trans));
$chars_trans = unicode2charset(charset2unicode($chars_trans, 'iso-8859-1', 'forcer'));
$chars_trans = explode(" ",$chars_trans);
foreach($chars as $k=>$r)
$trans[$chars_trans[$k]] = $r;
}
$letexte = strtr($letexte, $trans);
$cherche1 = array(
/* 1 */ '/((?:^|[^\#0-9a-zA-Z\&])[\#0-9a-zA-Z]*)\;/S',
/* 2 */ '/»| --?,|(?::| %)(?:\W|$)/S',
/* 3 */ '/([^[<!?])([!?])/S',
/* 4 */ '/«|(?:M(?:M?\.|mes?|r\.?)|[MnN]°) /S'
);
$remplace1 = array(
/* 1 */ '\1~;',
/* 2 */ '~\0',
/* 3 */ '\1~\2',
/* 4 */ '\0~'
);
$letexte = preg_replace($cherche1, $remplace1, $letexte);
$letexte = preg_replace("/ *~+ */S", "~", $letexte);
$cherche2 = array(
'/([^-\n]|^)--([^-]|$)/S',
'/(http|https|ftp|mailto)~:/S',
'/~/'
);
$remplace2 = array(
'\1—\2',
'\1:',
' '
);
$letexte = preg_replace($cherche2, $remplace2, $letexte);
return $letexte;
}
// rien sauf les "~" et "-,"
// http://doc.spip.org/@typo_en
function typo_en($letexte) {
$cherche1 = array(
'/ --?,/S'
);
$remplace1 = array(
'~\0'
);
$letexte = preg_replace($cherche1, $remplace1, $letexte);
$letexte = str_replace(" ", "~", $letexte);
$letexte = ereg_replace(" *~+ *", "~", $letexte);
$cherche2 = array(
'/([^-\n]|^)--([^-]|$)/',
'/~/'
);
$remplace2 = array(
'\1—\2',
' '
);
$letexte = preg_replace($cherche2, $remplace2, $letexte);
return $letexte;
}
//
// Typographie generale
// note: $echapper = false lorsqu'on appelle depuis propre() [pour accelerer]
//
// http://doc.spip.org/@typo
function typo($letexte, $echapper=true) {
// Plus vite !
if (!$letexte) return $letexte;
// Echapper les codes <html> etc
if ($echapper)
$letexte = echappe_html($letexte, 'TYPO');
// Appeler les fonctions de pre-traitement
$letexte = pipeline('pre_typo', $letexte);
// old style
if (function_exists('avant_typo'))
$letexte = avant_typo($letexte);
// 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\x6\x7";
if (preg_match_all(",</?[a-z!][^<>]*[!':;\?~%][^<>]*>,imsS",
$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("'", "", $letexte);
// typo francaise ou anglaise ?
// $lang_objet 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_objet'])
$lang = $GLOBALS['spip_lang'];
lang_select($lang);
switch (lang_typo($lang)) {
case 'fr':
$letexte = typo_fr($letexte);
break;
default:
$letexte = typo_en($letexte);
break;
}
// Retablir les caracteres proteges
$letexte = strtr($letexte, $illegal, $protege); |
Partager