fix: escape HTML tags in lesson validation messages

Prevent HTML elements like <details>, <option>, <form> from being
rendered as actual elements in hint messages by properly escaping
them with &lt; &gt; and wrapping in <kbd> tags.
This commit is contained in:
2025-12-30 12:25:22 +01:00
parent a8db5b69cf
commit 2f2969da11
6 changed files with 15 additions and 15 deletions

View File

@@ -55,7 +55,7 @@
{ {
"type": "attribute_value", "type": "attribute_value",
"value": { "selector": "details", "attr": "open", "value": true }, "value": { "selector": "details", "attr": "open", "value": true },
"message": "Add the <kbd>open</kbd> attribute to <details>" "message": "Add the <kbd>open</kbd> attribute to <kbd>&lt;details&gt;</kbd>"
} }
] ]
}, },
@@ -79,17 +79,17 @@
{ {
"type": "element_count", "type": "element_count",
"value": { "selector": "details", "min": 3 }, "value": { "selector": "details", "min": 3 },
"message": "Create at least 3 <details> elements for the FAQ" "message": "Create at least 3 <kbd>&lt;details&gt;</kbd> elements for the FAQ"
}, },
{ {
"type": "element_count", "type": "element_count",
"value": { "selector": "summary", "min": 3 }, "value": { "selector": "summary", "min": 3 },
"message": "Each <kbd>&lt;details&gt;</kbd> needs a <summary> for the question" "message": "Each <kbd>&lt;details&gt;</kbd> needs a <kbd>&lt;summary&gt;</kbd> for the question"
}, },
{ {
"type": "element_count", "type": "element_count",
"value": { "selector": "details p", "min": 3 }, "value": { "selector": "details p", "min": 3 },
"message": "Each <kbd>&lt;details&gt;</kbd> needs a <p> for the answer" "message": "Each <kbd>&lt;details&gt;</kbd> needs a <kbd>&lt;p&gt;</kbd> for the answer"
} }
] ]
} }

View File

@@ -31,7 +31,7 @@
{ {
"type": "element_count", "type": "element_count",
"value": { "selector": "option", "min": 3 }, "value": { "selector": "option", "min": 3 },
"message": "Add at least 3 <option> elements inside datalist" "message": "Add at least 3 <kbd>&lt;option&gt;</kbd> elements inside <kbd>&lt;datalist&gt;</kbd>"
}, },
{ {
"type": "element_exists", "type": "element_exists",

View File

@@ -36,7 +36,7 @@
{ {
"type": "element_exists", "type": "element_exists",
"value": "form[method='dialog']", "value": "form[method='dialog']",
"message": "Add a <form method=\"dialog\"> for closing" "message": "Add a <kbd>&lt;form method=\"dialog\"&gt;</kbd> for closing"
}, },
{ {
"type": "element_exists", "type": "element_exists",
@@ -70,7 +70,7 @@
{ {
"type": "element_exists", "type": "element_exists",
"value": "form[method='dialog']", "value": "form[method='dialog']",
"message": "Add a <form method=\"dialog\"> for the buttons" "message": "Add a <kbd>&lt;form method=\"dialog\"&gt;</kbd> for the buttons"
}, },
{ {
"type": "element_count", "type": "element_count",

View File

@@ -26,17 +26,17 @@
{ {
"type": "element_exists", "type": "element_exists",
"value": "summary", "value": "summary",
"message": "Füge ein <kbd>&lt;summary&gt;</kbd> innerhalb von details hinzu" "message": "Füge ein <kbd>&lt;summary&gt;</kbd> innerhalb von <kbd>&lt;details&gt;</kbd> hinzu"
}, },
{ {
"type": "parent_child", "type": "parent_child",
"value": { "parent": "details", "child": "summary" }, "value": { "parent": "details", "child": "summary" },
"message": "Das <kbd>&lt;summary&gt;</kbd> muss innerhalb von <details> sein" "message": "Das <kbd>&lt;summary&gt;</kbd> muss innerhalb von <kbd>&lt;details&gt;</kbd> sein"
}, },
{ {
"type": "parent_child", "type": "parent_child",
"value": { "parent": "details", "child": "p" }, "value": { "parent": "details", "child": "p" },
"message": "Füge ein <kbd>&lt;p&gt;</kbd> innerhalb von <details> für den versteckten Inhalt hinzu" "message": "Füge ein <kbd>&lt;p&gt;</kbd> innerhalb von <kbd>&lt;details&gt;</kbd> für den versteckten Inhalt hinzu"
} }
] ]
}, },
@@ -55,7 +55,7 @@
{ {
"type": "attribute_value", "type": "attribute_value",
"value": { "selector": "details", "attr": "open", "value": true }, "value": { "selector": "details", "attr": "open", "value": true },
"message": "Füge das <kbd>open</kbd>-Attribut zu <details> hinzu" "message": "Füge das <kbd>open</kbd>-Attribut zu <kbd>&lt;details&gt;</kbd> hinzu"
} }
] ]
}, },
@@ -79,7 +79,7 @@
{ {
"type": "element_count", "type": "element_count",
"value": { "selector": "details", "min": 3 }, "value": { "selector": "details", "min": 3 },
"message": "Erstelle mindestens 3 <details>-Elemente für das FAQ" "message": "Erstelle mindestens 3 <kbd>&lt;details&gt;</kbd>-Elemente für das FAQ"
}, },
{ {
"type": "element_count", "type": "element_count",

View File

@@ -31,7 +31,7 @@
{ {
"type": "element_count", "type": "element_count",
"value": { "selector": "option", "min": 3 }, "value": { "selector": "option", "min": 3 },
"message": "Füge mindestens 3 <option>-Elemente in die Datalist ein" "message": "Füge mindestens 3 <kbd>&lt;option&gt;</kbd>-Elemente in die <kbd>&lt;datalist&gt;</kbd> ein"
}, },
{ {
"type": "element_exists", "type": "element_exists",

View File

@@ -36,7 +36,7 @@
{ {
"type": "element_exists", "type": "element_exists",
"value": "form[method='dialog']", "value": "form[method='dialog']",
"message": "Füge ein <form method=\"dialog\"> zum Schließen hinzu" "message": "Füge ein <kbd>&lt;form method=\"dialog\"&gt;</kbd> zum Schließen hinzu"
}, },
{ {
"type": "element_exists", "type": "element_exists",
@@ -70,7 +70,7 @@
{ {
"type": "element_exists", "type": "element_exists",
"value": "form[method='dialog']", "value": "form[method='dialog']",
"message": "Füge ein <form method=\"dialog\"> für die Buttons hinzu" "message": "Füge ein <kbd>&lt;form method=\"dialog\"&gt;</kbd> für die Buttons hinzu"
}, },
{ {
"type": "element_count", "type": "element_count",