extraire_multi mélange un /li /ul final avec le </div> de langue ajouté par code_echappement
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>
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://git.spip.net/spip/spip/src/branch/master/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);