From 3d4755db4145d1f67d0da4fd793be1db1be12a19 Mon Sep 17 00:00:00 2001
From: jojohoch <joachim.hoch@iqb.hu-berlin.de>
Date: Fri, 9 Dec 2022 10:59:09 +0100
Subject: [PATCH] Convert the labels of variables for the schemer to plain text

HTML labels can cause errors in the Test Center for units in XML format.
---
 docs/release-notes-player.md                                | 4 ++++
 .../cloze/cloze-child-elements/toggle-button.ts             | 5 ++++-
 .../models/elements/compound-elements/likert/likert-row.ts  | 2 +-
 projects/common/models/elements/element.ts                  | 6 ++++++
 projects/common/models/elements/input-elements/drop-list.ts | 2 +-
 projects/common/models/elements/input-elements/dropdown.ts  | 5 ++++-
 .../elements/input-elements/radio-button-group-complex.ts   | 5 ++++-
 .../models/elements/input-elements/radio-button-group.ts    | 5 ++++-
 8 files changed, 28 insertions(+), 6 deletions(-)

diff --git a/docs/release-notes-player.md b/docs/release-notes-player.md
index 926ad8cdd..21fba67db 100644
--- a/docs/release-notes-player.md
+++ b/docs/release-notes-player.md
@@ -1,9 +1,13 @@
 Player
 ======
+
 ## 1.28.2
 ### Verbesserungen 
 - Ermöglicht die Interaktion mit Elementen, die sich hinter einem Rahmenelement befinden
 
+### Fehlerbehebungen
+- Behebt Fehler beim Hochladen von Aufgaben mit HTML-Sonderzeichen ins Testcenter
+
 ## 1.28.1
 ### Verbesserungen
 - Darstellung und Verhalten der Warnmeldung von Formelelementen
diff --git a/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/toggle-button.ts b/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/toggle-button.ts
index 106a94634..37e173e17 100644
--- a/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/toggle-button.ts
+++ b/projects/common/models/elements/compound-elements/cloze/cloze-child-elements/toggle-button.ts
@@ -53,7 +53,10 @@ export class ToggleButtonElement extends InputElement {
 
   private getAnswerSchemeValues(): AnswerSchemeValue[] {
     return this.options
-      .map((option, index) => ({ value: (index + 1).toString(), label: option.text }));
+      .map((option, index) => ({
+        value: (index + 1).toString(),
+        label: InputElement.stripHTML(option.text)
+      }));
   }
 
   getElementComponent(): Type<ElementComponent> {
diff --git a/projects/common/models/elements/compound-elements/likert/likert-row.ts b/projects/common/models/elements/compound-elements/likert/likert-row.ts
index a84d6eead..ac773cfd0 100644
--- a/projects/common/models/elements/compound-elements/likert/likert-row.ts
+++ b/projects/common/models/elements/compound-elements/likert/likert-row.ts
@@ -41,7 +41,7 @@ export class LikertRowElement extends InputElement {
     return [
       {
         value: !this.value && this.value !== 0 ? 'null' : (this.value as number + 1).toString(),
-        label: this.rowLabel.text
+        label: InputElement.stripHTML(this.rowLabel.text)
       } // TODO Image
     ];
   }
diff --git a/projects/common/models/elements/element.ts b/projects/common/models/elements/element.ts
index 647013a97..5a81785c1 100644
--- a/projects/common/models/elements/element.ts
+++ b/projects/common/models/elements/element.ts
@@ -125,6 +125,12 @@ export abstract class InputElement extends UIElement {
   }
 
   abstract getAnswerScheme(options?: unknown): AnswerScheme;
+
+  static stripHTML(htmlString: string): string {
+    const parser = new DOMParser();
+    const htmlDocument = parser.parseFromString(htmlString, 'text/html');
+    return htmlDocument.documentElement.textContent || '';
+  }
 }
 
 export abstract class TextInputElement extends InputElement {
diff --git a/projects/common/models/elements/input-elements/drop-list.ts b/projects/common/models/elements/input-elements/drop-list.ts
index ed39996e0..45532688d 100644
--- a/projects/common/models/elements/input-elements/drop-list.ts
+++ b/projects/common/models/elements/input-elements/drop-list.ts
@@ -86,7 +86,7 @@ export class DropListElement extends InputElement {
       return [this, ...valueDropLists]
         .map(dropList => dropList.value as DragNDropValueObject[])
         .flat()
-        .map(option => ({ value: option.id, label: option.text as string }));
+        .map(option => ({ value: option.id, label: InputElement.stripHTML(option.text) }));
     }
     return [];
   }
diff --git a/projects/common/models/elements/input-elements/dropdown.ts b/projects/common/models/elements/input-elements/dropdown.ts
index a9ee3d3ed..c56937718 100644
--- a/projects/common/models/elements/input-elements/dropdown.ts
+++ b/projects/common/models/elements/input-elements/dropdown.ts
@@ -40,7 +40,10 @@ export class DropdownElement extends InputElement implements PositionedUIElement
 
   private getAnswerSchemeValues(): AnswerSchemeValue[] {
     return this.options
-      .map((option, index) => ({ value: (index + 1).toString(), label: option.text }));
+      .map((option, index) => ({
+        value: (index + 1).toString(),
+        label: InputElement.stripHTML(option.text)
+      }));
   }
 
   getElementComponent(): Type<ElementComponent> {
diff --git a/projects/common/models/elements/input-elements/radio-button-group-complex.ts b/projects/common/models/elements/input-elements/radio-button-group-complex.ts
index 4cbba18d2..9bea4d8ef 100644
--- a/projects/common/models/elements/input-elements/radio-button-group-complex.ts
+++ b/projects/common/models/elements/input-elements/radio-button-group-complex.ts
@@ -41,7 +41,10 @@ export class RadioButtonGroupComplexElement extends InputElement implements Posi
 
   private getAnswerSchemeValues(): AnswerSchemeValue[] {
     return this.options
-      .map((option, index) => ({ value: (index + 1).toString(), label: option.text }));
+      .map((option, index) => ({
+        value: (index + 1).toString(),
+        label: InputElement.stripHTML(option.text)
+      }));
   }
 
   getElementComponent(): Type<ElementComponent> {
diff --git a/projects/common/models/elements/input-elements/radio-button-group.ts b/projects/common/models/elements/input-elements/radio-button-group.ts
index 61e4ec934..2bb84414d 100644
--- a/projects/common/models/elements/input-elements/radio-button-group.ts
+++ b/projects/common/models/elements/input-elements/radio-button-group.ts
@@ -48,7 +48,10 @@ export class RadioButtonGroupElement extends InputElement implements PositionedU
 
   private getAnswerSchemeValues(): AnswerSchemeValue[] {
     return this.options
-      .map((option, index) => ({ value: (index + 1).toString(), label: option.text }));
+      .map((option, index) => ({
+        value: (index + 1).toString(),
+        label: InputElement.stripHTML(option.text)
+      }));
   }
 
   getElementComponent(): Type<ElementComponent> {
-- 
GitLab