extraire_multi mélange un /li /ul final avec le </div> de langue ajouté par code_echappement #4189

Closed
opened 4 years ago by JLuc · 11 comments
JLuc commented 4 years ago

Quand la langue de la chaîne n'est pas la langue désirée,
extraire_multi appelle code_echappement qui insère <div lang='fr'> au début, ok,
mais qui colle aussi un </div> immédiatement à la fin.

En général c'est OK, mais pas quand la dernière ligne du texte est le dernier item d'une énumération,
car alors ce </div> ajouté est pris comme partie prenante de cette dernière ligne par l'appel suivant à propre,
et le HTML qui sort de ce |propre sera mal emboité car il finira par </div></li></ul> au lieu de </li></ul></div>

Cf #4187

Dans le cas où le texte se termine par une liste, il faut insérer \n\n</div> pour s'assurer que le /div ajouté par code_echappement reste en dehors de la liste.

Cf simulation avec https://zone.spip.net/trac/spip-zone/changeset/111853/spip-zone

Et pour corriger, dans le corps de extraire_multi (https://core.spip.net/projects/spip/repository/entry/spip/ecrire/inc/filtres.php#L1595 ),
il faut insérer 2 fins de lignes quand ça se termine par /ul,
entre les 2 lignes suivantes :

	$mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span';
	$trad = code_echappement($trad, 'multi', false, $mode);

Ce qui donne :

	$mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span';
	if ($mode=='div' and (substr(rtrim($trad_propre), -5)=='</ul>')
		$trad .= "\n\n";
	$trad = code_echappement($trad, 'multi', false, $mode);
Quand la langue de la chaîne n'est pas la langue désirée, extraire_multi appelle code_echappement qui insère `<div lang='fr'>` au début, ok, mais qui colle aussi un `</div>` immédiatement à la fin. En général c'est OK, mais pas quand la dernière ligne du texte est le dernier item d'une énumération, car alors ce `</div>` ajouté est pris comme partie prenante de cette dernière ligne par l'appel suivant à propre, et le HTML qui sort de ce |propre sera mal emboité car il finira par `</div></li></ul>` au lieu de `</li></ul></div>` Cf #4187 Dans le cas où le texte se termine par une liste, il faut insérer `\n\n</div>` pour s'assurer que le /div ajouté par code_echappement reste en dehors de la liste. Cf simulation avec https://zone.spip.net/trac/spip-zone/changeset/111853/spip-zone Et pour corriger, dans le corps de extraire_multi (https://core.spip.net/projects/spip/repository/entry/spip/ecrire/inc/filtres.php#L1595 ), il faut insérer 2 fins de lignes quand ça se termine par /ul, entre les 2 lignes suivantes : ``` $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span'; $trad = code_echappement($trad, 'multi', false, $mode); ``` Ce qui donne : ``` $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span'; if ($mode=='div' and (substr(rtrim($trad_propre), -5)=='</ul>') $trad .= "\n\n"; $trad = code_echappement($trad, 'multi', false, $mode); ```
Poster

Plutôt

$mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span';
if ($mode=='div' and (substr(rtrim($trad_propre), -5)=='</ul>'))
    $trad .= "\n\n";
$trad = code_echappement($trad, 'multi', false, $mode);
Plutôt ``` $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span'; if ($mode=='div' and (substr(rtrim($trad_propre), -5)=='</ul>')) $trad .= "\n\n"; $trad = code_echappement($trad, 'multi', false, $mode); ```
b_b commented 4 years ago
Owner

Version cible mise à 3.2

**Version cible mise à 3.2**
Poster

Le fix a été testé par jack31 dans le cas de la page de description des plugins, où il se manifeste dans tous les spips ( #4187 )

Le fix a été testé par jack31 dans le cas de la page de description des plugins, où il se manifeste dans tous les spips ( #4187 )
Poster

Ce bug révèle peut être un pb conceptuel dans la manière qu'a extraire_multi de parfois ajouter des div en début et fin de texte lors de ses traitements intermédiaires. Ç'a peut être été conçu à l'origine avec l'idée qu'il n'y aurait que des éléments inlines dans une chaîne traitée, et pas de balises html, alors que maintenant il y a des blocs et des balises. Et l'astuce initiale, qu'on peut qualifier de hack, se trouve devenue foireuse dans certains cas.

Ce bug révèle peut être un pb conceptuel dans la manière qu'a extraire_multi de parfois ajouter des div en début et fin de texte lors de ses traitements intermédiaires. Ç'a peut être été conçu à l'origine avec l'idée qu'il n'y aurait que des éléments inlines dans une chaîne traitée, et pas de balises html, alors que maintenant il y a des blocs et des balises. Et l'astuce initiale, qu'on peut qualifier de hack, se trouve devenue foireuse dans certains cas.
Owner

Il faudrait vérifier si ça entraine des cas foireux, mais j'ai l'impression qu'un patch plus générique serait simplement

diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index a7f568a93f..4ed581557e 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
`` -1701,6 +1701,9 `` function extraire_multi($letexte, $lang = null, $options = array()) {
 					include_spip('inc/texte');
 					$trad_propre = preg_replace(",(^]*>|

$),Uims", "", propre($trad)); $mode = preg_match(',[:space:]],iS', $trad_propre) ? 'div' : 'span'; + if ($mode === 'div') { + $trad = rtrim($trad) . "\n\n"; + } $trad = code_echappement($trad, 'multi', false, $mode); $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l)); if (lang_dir($l) !== lang_dir($lang)) {

Version cible mise à 4.0
Statut changé à En cours

Il faudrait vérifier si ça entraine des cas foireux, mais j'ai l'impression qu'un patch plus générique serait simplement <pre> diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php index a7f568a93f..4ed581557e 100644 --- a/ecrire/inc/filtres.php +++ b/ecrire/inc/filtres.php `` -1701,6 +1701,9 `` function extraire_multi($letexte, $lang = null, $options = array()) { include_spip('inc/texte'); $trad_propre = preg_replace(",(^<p[^>]*>|</p>$),Uims", "", propre($trad)); $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span'; + if ($mode === 'div') { + $trad = rtrim($trad) . "\n\n"; + } $trad = code_echappement($trad, 'multi', false, $mode); $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l)); if (lang_dir($l) !== lang_dir($lang)) { </pre> **Version cible mise à 4.0** **Statut changé à En cours**
Poster

En effet c'est tentant.

En effet c'est tentant.

J'ai testé de rajouter ces trois lignes et ça règle le problème d'affichage.
(test effectué en English sur un site monolingue et en recherchant des plugins à ajouter avec un mot qui génère une longue liste : "multi". Ensuite j'ai activé plusieurs langues dans l'espace privé et ai activé le plugin multilang sans constater de souci particulier.)

J'ai testé de rajouter ces trois lignes et ça règle le problème d'affichage. (test effectué en English sur un site monolingue et en recherchant des plugins à ajouter avec un mot qui génère une longue liste : "multi". Ensuite j'ai activé plusieurs langues dans l'espace privé et ai activé le plugin multilang sans constater de souci particulier.)
Owner

intégré par 2731ba0520 alea jacta est
Statut changé à Fermé

intégré par https://git.spip.net/spip/spip/commit/2731ba05209cf61588923a5cd8cc4442cad6878e alea jacta est **Statut changé à Fermé**

Je viens de voir qu'il y avait également le problème en 3.2.11. Si on applique le même patch ça règle le souci.

Je viens de voir qu'il y avait également le problème en 3.2.11. Si on applique le même patch ça règle le souci.
b_b commented 2 years ago
Owner

Trop tard pour un report, peut-être dans une prochaine 3.2, faut voir, je laisser les autres décider...

Trop tard pour un report, peut-être dans une prochaine 3.2, faut voir, je laisser les autres décider...

Oui, j'ai bien compris que pour la 3.2.11 c'était trop tard, mais si c'est reporté maintenant ça permettra de corriger ce bug d'affichage pour la prochaine 3.2.12.

Oui, j'ai bien compris que pour la 3.2.11 c'était trop tard, mais si c'est reporté maintenant ça permettra de corriger ce bug d'affichage pour la prochaine 3.2.12.
Sign in to join this conversation.
No Milestone
No project
No Assignees
4 Participants
Notifications
Due Date

No due date set.

Dependencies

This issue currently doesn't have any dependencies.

Loading…
There is no content yet.