Skip to content

Commit 84f0db3

Browse files
committed
fix(utils): gestion des styles pour chaque message avec <style scoped> - prise en compte de toutes les règles, dont celles qui impliquent des propriétés avec des parenthèses et des virgules
1 parent ba5cad8 commit 84f0db3

3 files changed

Lines changed: 35 additions & 18 deletions

File tree

app/js/utils/css.mjs

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,40 @@
11
export function scopeStyles(htmlString, prefix) {
2-
// Trouve toutes les balises <style scoped>...</style>
32
return htmlString.replace(
43
/<style\s+[^>]*scoped[^>]*>([\s\S]*?)<\/style>/gi,
54
(match, css) => {
6-
// Préfixe chaque sélecteur CSS avec le préfix choisi
7-
const scopedCSS = css.replace(/(^|})([^@}]+)/g, (full, brace, rules) => {
8-
const scopedRules = rules
9-
.split(",")
10-
.map((sel) => sel.trim())
11-
.filter(Boolean)
12-
.map((sel) => {
13-
// On évite de doubler le préfixe
14-
if (sel.startsWith(`${prefix}`)) return sel;
15-
return `${prefix} ${sel}`;
16-
})
17-
.join(", ");
18-
return `${brace} ${scopedRules}`;
19-
});
20-
// On désactive l'effet typewriter pour la balise style
5+
// Nettoie le CSS et supprime les commentaires
6+
let cleanCSS = css.replace(/\/\*[\s\S]*?\*\//g, "");
7+
8+
// Extrait chaque bloc de règle CSS : sélecteur(s) { propriétés }
9+
const ruleRegex = /([^{}]+)\{([^{}]*)\}/g;
10+
11+
const scopedCSS = cleanCSS.replace(
12+
ruleRegex,
13+
(fullMatch, selectors, properties) => {
14+
// Traite chaque sélecteur séparé par des virgules
15+
const scopedSelectors = selectors
16+
.split(",")
17+
.map((sel) => sel.trim())
18+
.filter(Boolean)
19+
.map((sel) => {
20+
// Évite de doubler le préfixe
21+
if (sel.startsWith(prefix)) return sel;
22+
23+
// Gère les @-rules (media queries, keyframes, etc.)
24+
if (sel.startsWith("@")) return sel;
25+
26+
// Ajoute le préfixe
27+
// Si on a une règle sur le message lui-même, il ne faut pas considérer le sélecteur comme enfant du message, mais comme portant sur le message lui-même
28+
const sep = sel === ".message" ? "" : " ";
29+
return `${prefix}${sep}${sel}`;
30+
})
31+
.join(", ");
32+
33+
// Reconstruit la règle complète
34+
return `${scopedSelectors} { ${properties} }`;
35+
},
36+
);
37+
// On désactive l'effet typewriter pour la balise style avec \`
2138
return `\\\`<style>${scopedCSS}</style>\\\``;
2239
},
2340
);

app/script.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app/script.min.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)