bug dans `inserer_attribut` suite à #5667
Depuis l'intégration du retrait du slash sur les balises fermantes cf #5667 le filtre a changé de comportement comme l'indique @marcimat dans !5959 (merged)
InsérerAttribut, qui sur
<a><img></a>
insérait dans la balise<img>
et actuellement insère dans<a>
les attributs.
Le problème vient de https://git.spip.net/spip/spip/-/blob/master/ecrire/inc/filtres.php#L1980 qui cherche le pattern />
.
Autre point, je me demande si on ne pourrait pas améliorer les perfs du filtre en utilisant un simple str_replace()
au lieu de preg_replace()
comme c'est fait ici https://github.com/WPPlugins/theme-file-maker/blob/4f2f53048c6394afa9126b767ae6502421a1a90f/theme-page-maker.php#L28
diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 19ee5d40dc..f37fe0f844 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -1982,7 +1982,7 @@ function inserer_attribut(?string $balise, string $attribut, ?string $val, bool
$balise = preg_replace(',\s?/>,S', $insert . '>', $balise, 1);
} // sinon une balise <a ...> ... </a>
else {
- $balise = preg_replace(',\s?>,S', $insert . '>', $balise, 1);
+ $balise = str_replace('>', $insert . '>', $balise);
}
}
Et donc, si on va dans ce sens, le patch complet pour améliorer et corriger le bug serait :
diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 19ee5d40dc..ef7e97a693 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -1977,12 +1977,12 @@ function inserer_attribut(?string $balise, string $attribut, ?string $val, bool
// Remplacer l'ancien attribut du meme nom
$balise = $r[1] . $insert . $r[5];
} else {
- // preferer une balise " />" (comme <img />)
- if (preg_match(',/>,', $balise)) {
- $balise = preg_replace(',\s?/>,S', $insert . '>', $balise, 1);
+ // preferer une balise img
+ if (preg_match(',<img,', $balise)) {
+ $balise = str_replace('<img', '<img' . $insert, $balise);
} // sinon une balise <a ...> ... </a>
else {
- $balise = preg_replace(',\s?>,S', $insert . '>', $balise, 1);
+ $balise = str_replace('>', $insert . '>', $balise);
}
}