Skip to content

Commit d7d7bd4

Browse files
committed
fix(markdown): avec @selector, il faut toujours chercher l'élément le plus récent (en incluant toujours un élément temporaire qui contient le contenu pas encore affiché)
1 parent 0bbf198 commit d7d7bd4

4 files changed

Lines changed: 49 additions & 58 deletions

File tree

app/js/markdown/custom/variablesDynamic/checkConditionalBlock.mjs

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -15,40 +15,35 @@ export function checkConditionalBlock(
1515
condition = condition.replace(
1616
/@SELECTOR\["([^"]+)"\]/g,
1717
function (match, cssSelector) {
18-
const element = getLastElement(cssSelector, document);
19-
if (element)
20-
return (
21-
'"' +
22-
element.textContent
23-
.trim()
24-
.replaceAll('"', '\\"')
25-
.replace(/\n/g, " ") +
26-
'"'
27-
);
28-
// Sinon, on utilise un élément HTML temporaire pour afficher le message pas encore affiché, et on applique le sélecteur à cet élément,
18+
// On crée un élément temporaire qui contient le contenu en cours de construction
2919
const tempElement = document.createElement("div");
3020
tempElement.innerHTML = cumulativeOutput;
31-
const selectorAppliedToTempElement = getLastElement(
32-
cssSelector,
33-
tempElement,
34-
);
35-
let foundText = "";
36-
if (selectorAppliedToTempElement) {
37-
foundText = selectorAppliedToTempElement.textContent.trim();
38-
if (foundText !== "") {
39-
// Si le texte trouvé est un bloc spécial (readcsv ou !useLLM), on indique qu'il faut une évaluation différée de la condition avec le sélecteur
40-
const isSpecialBlock =
41-
foundText.includes("readcsv") || foundText.includes("!useLLM");
42-
if (isSpecialBlock) {
43-
return `!DIFFER_EVALUATION:SELECTOR["${cssSelector}"]`;
44-
}
21+
// On le rend complètement invisible et hors du flux
22+
tempElement.style.cssText =
23+
"position: absolute; visibility: hidden; pointer-events: none;";
24+
// On ajoute temporairement cet élément au document
25+
document.body.appendChild(tempElement);
26+
// Maintenant on cherche le dernier élément qui correspond au sélecteur CSS dans tout le document en incluant l'élément temporaire
27+
const selectorAppliedToDocument = getLastElement(cssSelector, document);
28+
let value = selectorAppliedToDocument
29+
? selectorAppliedToDocument.textContent.trim()
30+
: "";
31+
// On retire l'élément temporaire du document
32+
document.body.removeChild(tempElement);
33+
// Si on a trouvé une valeur, on l'utilise directement
34+
if (value !== "") {
35+
// Si on a trouvé une valeur, on teste si c'est un bloc spécial
36+
const isSpecialBlock =
37+
value.includes("readcsv") || value.includes("!useLLM");
38+
if (isSpecialBlock) {
39+
// Si c'est un bloc spécial, on indique qu'il faut une évaluation différée de la condition avec le sélecteur
40+
return `!DIFFER_EVALUATION:SELECTOR["${cssSelector}"]`;
4541
}
42+
return '"' + value.replaceAll('"', '\\"').replace(/\n/g, " ") + '"';
43+
} else {
44+
// Si on n'a pas trouvé de valeur, on indique qu'il faut une évaluation différée de la condition avec le sélecteur
45+
return `!DIFFER_EVALUATION:SELECTOR["${cssSelector}"]`;
4646
}
47-
// Si l'élément temporaire contenait bien du texte et n'était pas un bloc spécial, on retourne ce texte
48-
// Sinon, on indique qu'il faut une évaluation différée de la condition avec le sélecteur
49-
return foundText
50-
? '"' + foundText.replaceAll('"', '\\"').replace(/\n/g, " ") + '"'
51-
: `!DIFFER_EVALUATION:SELECTOR["${cssSelector}"]`;
5247
},
5348
);
5449
// Gestion du cas où la condition nécessite une évaluation différée

app/js/markdown/custom/variablesDynamic/processSimpleBlock.mjs

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -86,37 +86,33 @@ export function processSimpleBlock(message, dynamicVariables) {
8686
const selectorMatch = varName.match(/SELECTOR\["([^"]+)"\]/);
8787
if (selectorMatch) {
8888
const cssSelector = selectorMatch[1];
89-
// On cherche d'abord dans ce qui est déjà affiché le dernier élément correspondant au sélecteur
90-
const selectorAppliedToPreviousDisplayedContent = getLastElement(
89+
// On crée un élément temporaire qui contient le contenu en cours de construction
90+
const tempElement = document.createElement("div");
91+
tempElement.innerHTML = output;
92+
// On le rend complètement invisible et hors du flux
93+
tempElement.style.cssText =
94+
"position: absolute; visibility: hidden; pointer-events: none;";
95+
// On ajoute temporairement cet élément au document
96+
document.body.appendChild(tempElement);
97+
// Maintenant on cherche le dernier élément qui correspond au sélecteur CSS dans tout le document en incluant l'élément temporaire
98+
const selectorAppliedToDocument = getLastElement(
9199
cssSelector,
92100
document,
93101
);
94-
const value = selectorAppliedToPreviousDisplayedContent
95-
? selectorAppliedToPreviousDisplayedContent.textContent.trim()
102+
let value = selectorAppliedToDocument
103+
? selectorAppliedToDocument.textContent.trim()
96104
: "";
97-
// Si on a trouvé une valeur, on l'utilise directement
105+
// On retire l'élément temporaire du document
106+
document.body.removeChild(tempElement);
98107
if (value !== "") {
99-
output += value;
100-
continue;
101-
}
102-
// Sinon, on utilise un élément HTML temporaire pour afficher le message pas encore affiché, et on applique le sélecteur à cet élément,
103-
const tempElement = document.createElement("div");
104-
tempElement.innerHTML = output;
105-
const selectorAppliedToTempElement = getLastElement(
106-
cssSelector,
107-
tempElement,
108-
);
109-
if (selectorAppliedToTempElement) {
110-
let foundText = selectorAppliedToTempElement.textContent.trim();
111-
if (foundText !== "") {
112-
// Si le texte trouvé est un bloc spécial (readcsv ou !useLLM), on laisse la variable telle quelle pour qu'elle soit traitée plus tard
113-
const isSpecialBlock =
114-
foundText.includes("readcsv") || foundText.includes("!useLLM");
115-
if (isSpecialBlock) {
116-
foundText = `\`@${varName}\``;
117-
}
108+
// Si on a trouvé une valeur, on teste si c'est un bloc spécial
109+
const isSpecialBlock =
110+
value.includes("readcsv") || value.includes("!useLLM");
111+
if (isSpecialBlock) {
112+
// Si c'est un bloc spécial, on laisse la référence à la variable pour une évaluation différée
113+
value = `\`@${varName}\``;
118114
}
119-
output += foundText;
115+
output += value;
120116
continue;
121117
} else {
122118
// Si on n'a rien trouvé, on laisse la référence à la variable

app/script.min.js

Lines changed: 2 additions & 2 deletions
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)