diff --git a/evap/static/ts/src/text-answer-warnings.ts b/evap/static/ts/src/text-answer-warnings.ts index 6a622ebe16..609cf314ae 100644 --- a/evap/static/ts/src/text-answer-warnings.ts +++ b/evap/static/ts/src/text-answer-warnings.ts @@ -6,8 +6,29 @@ function isTextMeaningless(text: string): boolean { return text.length > 0 && ["", "ka", "na", "none", "keine", "keines", "keiner"].includes(text.replace(/\W/g, "")); } +function containsPhrase(arr: string[], sub: string[]): boolean { + for (let i = 0; i <= arr.length - sub.length; i++) { + let j; + for (j = 0; j < sub.length; j++) { + if (j == sub.length - 1 && arr[i + j].length > sub[j].length) { + if (!arr[i + j].startsWith(sub[j])) break; + if (null !== RegExp("^[!?.]*$", "").exec(arr[i + j].substring(sub[j].length))) return true; + } + if (arr[i + j] !== sub[j]) break; + } + if (j >= sub.length) return true; + } + return false; +} + +function matchesTriggerString(text: string, triggerString: string): boolean { + const words = text.split(" "); + const triggerWords = triggerString.split(" "); + return containsPhrase(words, triggerWords); +} + function doesTextContainTriggerString(text: string, triggerStrings: string[]): boolean { - return triggerStrings.some(triggerString => text.includes(triggerString)); + return triggerStrings.some(triggerString => matchesTriggerString(text, triggerString)); } function updateTextareaWarning(textarea: HTMLTextAreaElement, textAnswerWarnings: string[][]) { @@ -35,7 +56,7 @@ function updateTextareaWarning(textarea: HTMLTextAreaElement, textAnswerWarnings export function initTextAnswerWarnings(textareas: NodeListOf, textAnswerWarnings: string[][]) { textAnswerWarnings = textAnswerWarnings.map(triggerStrings => triggerStrings.map(normalize)); - + console.log(textAnswerWarnings); textareas.forEach(textarea => { let warningDelayTimer: ReturnType; textarea.addEventListener("input", () => { @@ -53,4 +74,5 @@ export const testable = { normalize, isTextMeaningless, doesTextContainTriggerString, + matchesTriggerString, }; diff --git a/evap/static/ts/tests/unit/text-answer-warnings.ts b/evap/static/ts/tests/unit/text-answer-warnings.ts index ffd776c574..8b9edfb539 100644 --- a/evap/static/ts/tests/unit/text-answer-warnings.ts +++ b/evap/static/ts/tests/unit/text-answer-warnings.ts @@ -34,3 +34,14 @@ test.each([ const normalized = testable.normalize(text); expect(testable.isTextMeaningless(normalized)).toBe(false); }); + +test.each([ + ["", "s.o.", false], + ["s.o.", "s.o.", true], + ["s.o.s", "s.o.", false], + ["Antwort: s.o.", "s.o.", true], + ["siehe oben?!", "siehe oben", true], +])("matchesTriggerString(%p, %p) should return %p", (a, b, expected) => { + const result = testable.matchesTriggerString(a, b); + expect(result).toBe(expected); +});