From feda7d90f2872f3fe41839cb5523f1b99934df36 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Wed, 15 Apr 2026 11:52:53 +0200 Subject: [PATCH] feat(bisaya-course): enhance grammar focus and drills for lesson content - Added functions to normalize and build grammar curriculum focus entries, improving the structure and clarity of grammar lessons. - Implemented logic to merge existing grammar focus with newly defined curriculum focus, ensuring comprehensive coverage of key grammar points. - Introduced new drills for practicing past and future tense constructions, enhancing student engagement and understanding of temporal aspects in Bisaya. - Updated the `createBisayaCourseContent` function to incorporate these enhancements, ensuring lessons are enriched with relevant grammar exercises. --- .../scripts/create-bisaya-course-content.js | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) diff --git a/backend/scripts/create-bisaya-course-content.js b/backend/scripts/create-bisaya-course-content.js index 9467e4d..7767831 100644 --- a/backend/scripts/create-bisaya-course-content.js +++ b/backend/scripts/create-bisaya-course-content.js @@ -206,6 +206,117 @@ function mergeCorePatternsForLesson(didactics, exerciseDerived, minCount = 8) { return out; } +function normalizeGrammarFocusEntry(entry) { + if (!entry || typeof entry !== 'object') return null; + const title = normalizeText(entry.title || ''); + const text = normalizeText(entry.text || ''); + const example = normalizeText(entry.example || ''); + if (!title || !text) return null; + return { title, text, ...(example ? { example } : {}) }; +} + +function buildGrammarCurriculumFocus(lesson) { + const lessonNumber = Number(lesson?.lessonNumber || 0); + const title = normalizeText(lesson?.title || '').toLowerCase(); + const out = []; + + if (lessonNumber >= 1 && lessonNumber <= 10) { + out.push({ + title: 'Kernaussage + Ergänzung', + text: 'Im Alltag funktionieren kurze Muster am besten: Aussage zuerst, dann Ort/Zeit/Detail.', + example: 'Naa ko sa balay. / Moadto ko unya.' + }); + } + + if (lessonNumber >= 11 && lessonNumber <= 20) { + out.push({ + title: 'Präsens, Vergangenheit, Zukunft', + text: 'In diesem Kurs arbeitest du mit klaren Zeitmarkern: Gegenwart über Kontext oder nag-/ga-, Vergangenheit oft mit ni-, Zukunft mit mo-.', + example: 'Nagkaon ko. / Ni-kaon ko. / Mo-kaon ko.' + }); + } + + if (title.includes('zeitformen')) { + out.push( + { + title: 'Vergangenheit mit ni-', + text: 'ni- markiert häufig abgeschlossene Handlungen in der Vergangenheit.', + example: 'Ni-adto ko. (Ich bin gegangen.)' + }, + { + title: 'Zukunft/Absicht mit mo-', + text: 'mo- markiert häufig Zukünftiges oder eine geplante Handlung.', + example: 'Mo-adto ko. (Ich werde gehen.)' + } + ); + } + + if (lessonNumber >= 21) { + out.push({ + title: 'Aspekt statt starrer Zeiten', + text: 'Bisaya nutzt im Alltag oft Aspektmarker und Kontext statt fixer Tempusformen. Zeitwörter wie karon, ganiha, ugma helfen bei der Einordnung.', + example: 'Niadto ko ganiha. / Moadto ko ugma.' + }); + } + + return out.map((entry) => normalizeGrammarFocusEntry(entry)).filter(Boolean); +} + +function mergeGrammarFocusForLesson(existingFocus, curriculumFocus) { + const out = []; + const seen = new Set(); + const pushUnique = (entry) => { + const normalized = normalizeGrammarFocusEntry(entry); + if (!normalized) return; + const key = `${normalized.title.toLowerCase()}|${normalized.text.toLowerCase()}`; + if (seen.has(key)) return; + seen.add(key); + out.push(normalized); + }; + (Array.isArray(existingFocus) ? existingFocus : []).forEach(pushUnique); + (Array.isArray(curriculumFocus) ? curriculumFocus : []).forEach(pushUnique); + return out; +} + +function buildZeitformenDrills(lessonTitle) { + return [ + { + exerciseTypeName: 'transformation', + title: `${lessonTitle}: Vergangenheit bilden`, + instruction: 'Übersetze den Satz ins Bisaya.', + questionData: { + type: 'transformation', + text: 'Ich bin zum Markt gegangen.', + sourceLanguage: 'Deutsch', + targetLanguage: 'Bisaya' + }, + answerData: { + type: 'transformation', + correct: 'Ni-adto ko sa merkado.', + alternatives: ['Niadto ko sa merkado.', 'Niadto ko sa merkado.'] + }, + explanation: 'Vergangenheit wird hier mit ni- markiert.' + }, + { + exerciseTypeName: 'transformation', + title: `${lessonTitle}: Zukunft bilden`, + instruction: 'Übersetze den Satz ins Bisaya.', + questionData: { + type: 'transformation', + text: 'Ich werde morgen nach Hause gehen.', + sourceLanguage: 'Deutsch', + targetLanguage: 'Bisaya' + }, + answerData: { + type: 'transformation', + correct: 'Mo-adto ko sa balay ugma.', + alternatives: ['Moadto ko sa balay ugma.', 'Mo uli ko ugma.'] + }, + explanation: 'Zukünftiges wird hier mit mo- plus Zeitwort (ugma) markiert.' + } + ]; +} + function sanitizeGapFillHintText(lessonTitle, text, answers, glossLookup) { const source = String(text || ''); const normalizedAnswers = Array.isArray(answers) @@ -613,6 +724,9 @@ function generateExercisesFromDidactics(lesson) { buildTaskSentenceExercise(lesson, didactics, patternB), buildSpeakingExercise(lesson.title, didactics, patternA) ]; + if (String(lesson.title || '').toLowerCase().includes('zeitformen')) { + generated.push(...buildZeitformenDrills(lesson.title)); + } } else if (lesson.lessonType === 'review' || lesson.didacticMode === 'intensive_review') { generated = [ buildReviewChoiceExercise(lesson, didactics, patternA, lessonPool), @@ -4575,6 +4689,13 @@ async function createBisayaCourseContent() { // Erstelle Übungen const lessonDidactics = getLessonDidactics(lesson); + const mergedGrammarFocus = mergeGrammarFocusForLesson( + lessonDidactics.grammarFocus, + buildGrammarCurriculumFocus(lesson) + ); + if (mergedGrammarFocus.length > 0) { + await lesson.update({ grammarFocus: mergedGrammarFocus }); + } const derivedCorePatterns = deriveLessonCorePatternsFromExercises(exercises); const mergedCorePatterns = mergeCorePatternsForLesson(lessonDidactics, derivedCorePatterns, 8); if (mergedCorePatterns.length >= 8) {