Valider 119b2058 rédigé par esj's avatar esj
Parcourir les fichiers

Correction du traitement des blocs multi de [14718] qui ne tenait pas compte...

Correction du traitement des blocs multi de [14718] qui ne tenait pas compte du cas {{{forcer_lang=true}}} où la langue du contexte a priorité sur la langue de l'objet (bug péniblement entr'aperàu par Kent1). On en profite pour optimiser ce code en calculant  au chargement du fichier la RegExp calculée, plutôt qu'à chaque appel.
parent 5f6d641a
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+47 −39
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -531,6 +531,11 @@ function typo($letexte, $echapper=true, $connect=null) {

define('_EXTRAIRE_MULTI', "@<multi>(.*?)</multi>@sS");

define('_TYPO_PROTEGER', "!':;?~%-");
define('_TYPO_PROTECTEUR', "\x1\x2\x3\x4\x5\x6\x7\x8");

define('_TYPO_BALISE', ",</?[a-z!][^<>]*[".preg_quote(_TYPO_PROTEGER)."][^<>]*>,imsS");

// http://doc.spip.org/@corriger_typo
function corriger_typo($letexte, $lang='') {

@@ -546,14 +551,10 @@ function corriger_typo($letexte, $lang='') {

	if (!$lang) $lang = lang_typo();
	$typo2 = '';

	if ($typographie = charger_fonction($lang, 'typographie')) {
	$typographie = charger_fonction($lang, 'typographie');

	// Proteger les caracteres typographiques a l'interieur des tags html
		$protege = "!':;?~%-";
		$illegal = "\x1\x2\x3\x4\x5\x6\x7\x8";
		if (preg_match_all(',</?[a-z!][^<>]*['.preg_quote($protege).'][^<>]*>,imsS',
		$letexte, $regs, PREG_SET_ORDER)) {
	if ($typographie AND preg_match_all(_TYPO_BALISE, $letexte, $regs, PREG_SET_ORDER)) {
		foreach ($regs as $reg) {
			$insert = $reg[0];
			// hack: on transforme les caracteres a proteger en les remplacant
@@ -563,18 +564,26 @@ function corriger_typo($letexte, $lang='') {
		}
	}

		// trouver les blocs multi
	// simplifier les blocs multi,
	// et si la selection est differente de la langue de l'objet, 
	// (langue de l'objet absente du multi ou langue imposee par forcer_lang)
	// la typographier selon les regles de celle trouvee si definies

	if (preg_match_all(_EXTRAIRE_MULTI, $letexte, $regs, PREG_SET_ORDER)) {
		foreach ($regs as $reg) {
				// chercher la version de la langue courante
			// chercher la version de la langue du contexte
			// (= lang_typo() sauf parfois avec forcer_lang = true)
			$trads = extraire_trads($reg[1]);
				$l = approcher_langue($trads, $lang);
				if ($l)
			$l = approcher_langue($trads, $GLOBALS['spip_lang']);
			if ($l) {
				$trad = $trads[$l];
				else {
				if ($lang != $GLOBALS['spip_lang']
				AND $typo2 = charger_fonction($GLOBALS['spip_lang'], 'typographie', true)) {
					$trad = $typo2($trad);
					$trad = code_echappement($trad, 'multi');
				}  
			} else {
				// langue absente, prendre la premiere dispo
				  // mais typographier le texte 
				  // selon les regles de celle-ci si definies
				$l = key($trads);
				$trad = $trads[$l];
				if ($typo2 = charger_fonction($l, 'typographie', true)) {
@@ -586,13 +595,12 @@ function corriger_typo($letexte, $lang='') {
		}
	}

		$letexte = $typographie($letexte);
	if ($typographie) $letexte = $typographie($letexte);

	// Retablir les caracteres proteges
	$letexte = strtr($letexte, $illegal, $protege);
		// et les citations en un autre langue
	// et les citations en d'autres langues
	if ($typo2!=='') $letexte = echappe_retour($letexte, 'multi');
	}

	$letexte = pipeline('post_typo', $letexte);