From 504a32a74653ee5b188b0bdd61b779d79712976a Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Thu, 21 May 2026 10:51:36 +0200 Subject: [PATCH] backend: accept parenthetical variants in answer checking (use _isEquivalentAnswer) --- backend/services/vocabService.js | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/backend/services/vocabService.js b/backend/services/vocabService.js index 1610413..0683d3d 100644 --- a/backend/services/vocabService.js +++ b/backend/services/vocabService.js @@ -4065,21 +4065,19 @@ export default class VocabService { // Für Lückentext: Normalisiere und vergleiche if (exerciseTypeId === 1) { // gap_fill - const normalize = (str) => String(str || '').trim().toLowerCase(); const correctAnswers = parsedAnswerData.answers || parsedAnswerData.correct || []; const correctAnswersArray = Array.isArray(correctAnswers) ? correctAnswers : [correctAnswers]; - + // userAnswer ist ein Array von Antworten if (Array.isArray(userAnswer)) { if (userAnswer.length !== correctAnswersArray.length) return false; return userAnswer.every((ans, idx) => { const correct = correctAnswersArray[idx]; - return normalize(ans) === normalize(correct); + return this._isEquivalentAnswer(ans, correct); }); } else { // Fallback: Einzelne Antwort - const normalizedUserAnswer = normalize(userAnswer); - return correctAnswersArray.some(correct => normalize(correct) === normalizedUserAnswer); + return correctAnswersArray.some((correct) => this._isEquivalentAnswer(userAnswer, correct)); } } @@ -4110,20 +4108,19 @@ export default class VocabService { if (parsedQuestionData.type === 'sentence_building' || parsedQuestionData.type === 'dialog_completion' || parsedQuestionData.type === 'situational_response' || parsedQuestionData.type === 'pattern_drill') { const candidateAnswers = parsedAnswerData.correct ?? parsedAnswerData.correctAnswer ?? parsedAnswerData.answers ?? parsedAnswerData.modelAnswer ?? []; - const normalizedUser = this._normalizeTextAnswer(userAnswer); const answers = Array.isArray(candidateAnswers) ? candidateAnswers : [candidateAnswers]; if (parsedQuestionData.type === 'situational_response') { const keywords = parsedQuestionData.keywords || parsedAnswerData.keywords || []; if (keywords.length > 0) { + const normalizedUser = this._normalizeTextAnswer(userAnswer); return keywords.every((keyword) => normalizedUser.includes(this._normalizeTextAnswer(keyword))); } } return answers - .map((answer) => this._normalizeTextAnswer(answer)) .filter(Boolean) - .some((answer) => answer === normalizedUser); + .some((answer) => this._isEquivalentAnswer(userAnswer, answer)); } // Für andere Typen: einfacher String-Vergleich inkl. hinterlegter Alternativen @@ -4133,8 +4130,9 @@ export default class VocabService { ? parsedAnswerData.alternatives : []; const correctAnswersArray = [...primaryAnswersArray, ...alternativeAnswersArray]; - const normalizedUserAnswer = this._normalizeTextAnswer(userAnswer); - return correctAnswersArray.some(correct => this._normalizeTextAnswer(correct) === normalizedUserAnswer); + return correctAnswersArray + .filter(Boolean) + .some((correct) => this._isEquivalentAnswer(userAnswer, correct)); } async getGrammarExerciseProgress(hashedUserId, lessonId) {