feat: erweitere Vokabelkurs mit neuen Zahlen und verbessere Sichtbarkeit der Zahlenreihen
All checks were successful
Deploy to production / deploy (push) Successful in 2m30s
All checks were successful
Deploy to production / deploy (push) Successful in 2m30s
This commit is contained in:
@@ -31,6 +31,7 @@ jobs:
|
|||||||
git diff --name-only "$BASE" "$HEAD" > changed-files.txt
|
git diff --name-only "$BASE" "$HEAD" > changed-files.txt
|
||||||
cat changed-files.txt
|
cat changed-files.txt
|
||||||
COMMIT_MESSAGE="$(git log -1 --pretty=%B "$HEAD" || true)"
|
COMMIT_MESSAGE="$(git log -1 --pretty=%B "$HEAD" || true)"
|
||||||
|
COURSE_SCRIPT_PATTERN='^backend/scripts/.*(bisaya|course|didactics|vocab)'
|
||||||
|
|
||||||
if echo "$COMMIT_MESSAGE" | grep -qi '\[force-deploy\]'; then
|
if echo "$COMMIT_MESSAGE" | grep -qi '\[force-deploy\]'; then
|
||||||
echo "force_deploy=true" >> "$GITHUB_OUTPUT"
|
echo "force_deploy=true" >> "$GITHUB_OUTPUT"
|
||||||
@@ -44,23 +45,30 @@ jobs:
|
|||||||
echo "changed=false" >> "$GITHUB_OUTPUT"
|
echo "changed=false" >> "$GITHUB_OUTPUT"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if grep -E "$COURSE_SCRIPT_PATTERN" changed-files.txt >/dev/null; then
|
||||||
|
echo "course_scripts_changed=true" >> "$GITHUB_OUTPUT"
|
||||||
|
else
|
||||||
|
echo "course_scripts_changed=false" >> "$GITHUB_OUTPUT"
|
||||||
|
fi
|
||||||
|
|
||||||
if grep -E '^frontend/' changed-files.txt >/dev/null; then
|
if grep -E '^frontend/' changed-files.txt >/dev/null; then
|
||||||
echo "frontend_changed=true" >> "$GITHUB_OUTPUT"
|
echo "frontend_changed=true" >> "$GITHUB_OUTPUT"
|
||||||
else
|
else
|
||||||
echo "frontend_changed=false" >> "$GITHUB_OUTPUT"
|
echo "frontend_changed=false" >> "$GITHUB_OUTPUT"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Auch Kurs-/Didaktik-Scripts muessen vor dem Sync auf dem Server
|
# Kurs-/Didaktik-Scripts werden vor dem Sync separat uebertragen.
|
||||||
# vorliegen; sie sind keine rein externen Datenartefakte.
|
# Fuer sie sind npm ci, Migrationen und ein Backend-Restart nicht noetig.
|
||||||
if grep -E '^backend/' changed-files.txt >/dev/null; then
|
if grep -E '^backend/' changed-files.txt \
|
||||||
|
| grep -Ev "$COURSE_SCRIPT_PATTERN" >/dev/null; then
|
||||||
echo "backend_app_changed=true" >> "$GITHUB_OUTPUT"
|
echo "backend_app_changed=true" >> "$GITHUB_OUTPUT"
|
||||||
else
|
else
|
||||||
echo "backend_app_changed=false" >> "$GITHUB_OUTPUT"
|
echo "backend_app_changed=false" >> "$GITHUB_OUTPUT"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# App-Code-Änderungen, die einen echten Deploy benötigen
|
# App-Code-Änderungen, die einen echten Deploy benötigen
|
||||||
# Backend-Sync-Scripts müssen vor ihrem Einsatz deployed werden.
|
if grep -E '^(frontend/|backend/)' changed-files.txt \
|
||||||
if grep -E '^(frontend/|backend/)' changed-files.txt >/dev/null; then
|
| grep -Ev "$COURSE_SCRIPT_PATTERN" >/dev/null; then
|
||||||
echo "app_changed=true" >> "$GITHUB_OUTPUT"
|
echo "app_changed=true" >> "$GITHUB_OUTPUT"
|
||||||
else
|
else
|
||||||
echo "app_changed=false" >> "$GITHUB_OUTPUT"
|
echo "app_changed=false" >> "$GITHUB_OUTPUT"
|
||||||
@@ -82,6 +90,17 @@ jobs:
|
|||||||
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
|
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
|
||||||
"echo SSH OK"
|
"echo SSH OK"
|
||||||
|
|
||||||
|
- name: Deploy vocab course scripts without app rebuild
|
||||||
|
if: steps.vocab_course_changes.outputs.course_scripts_changed == 'true' && steps.vocab_course_changes.outputs.backend_app_changed != 'true' && steps.vocab_course_changes.outputs.force_deploy != 'true'
|
||||||
|
shell: bash
|
||||||
|
run: |
|
||||||
|
set -euo pipefail
|
||||||
|
tar -czf - backend/scripts \
|
||||||
|
| ssh -i ~/.ssh/id_ed25519 \
|
||||||
|
-p "${{ secrets.PROD_PORT }}" \
|
||||||
|
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
|
||||||
|
"sudo -n -u yourpart tar -xzf - -C /opt/yourpart"
|
||||||
|
|
||||||
- name: Run deployment script
|
- name: Run deployment script
|
||||||
if: steps.vocab_course_changes.outputs.app_changed == 'true' || steps.vocab_course_changes.outputs.force_deploy == 'true'
|
if: steps.vocab_course_changes.outputs.app_changed == 'true' || steps.vocab_course_changes.outputs.force_deploy == 'true'
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
@@ -845,6 +845,7 @@ const BISAYA_DIDACTICS_24_43_BASE = {
|
|||||||
const NUMBERS_DIDACTIC = {
|
const NUMBERS_DIDACTIC = {
|
||||||
learningGoals: [
|
learningGoals: [
|
||||||
'Zahlen bis 20 sicher abrufen.',
|
'Zahlen bis 20 sicher abrufen.',
|
||||||
|
'Zusammengesetzte Zahlen wie 21 und 25 nach einem Muster bilden.',
|
||||||
'Runde Zahlen (30,40,..90,100) erkennen und nutzen.',
|
'Runde Zahlen (30,40,..90,100) erkennen und nutzen.',
|
||||||
'Große Zahlen (200, 1000, 2000) in Preisen und Mengen verstehen.'
|
'Große Zahlen (200, 1000, 2000) in Preisen und Mengen verstehen.'
|
||||||
],
|
],
|
||||||
@@ -853,16 +854,23 @@ const NUMBERS_DIDACTIC = {
|
|||||||
{ target: 'Unom', gloss: 'sechs' }, { target: 'Pito', gloss: 'sieben' }, { target: 'Walo', gloss: 'acht' }, { target: 'Siyam', gloss: 'neun' }, { target: 'Napulo', gloss: 'zehn' },
|
{ target: 'Unom', gloss: 'sechs' }, { target: 'Pito', gloss: 'sieben' }, { target: 'Walo', gloss: 'acht' }, { target: 'Siyam', gloss: 'neun' }, { target: 'Napulo', gloss: 'zehn' },
|
||||||
{ target: 'Napulo ug usa', gloss: 'elf' }, { target: 'Napulo ug duha', gloss: 'zwölf' }, { target: 'Napulo ug tulo', gloss: 'dreizehn' }, { target: 'Napulo ug upat', gloss: 'vierzehn' }, { target: 'Napulo ug lima', gloss: 'fünfzehn' },
|
{ target: 'Napulo ug usa', gloss: 'elf' }, { target: 'Napulo ug duha', gloss: 'zwölf' }, { target: 'Napulo ug tulo', gloss: 'dreizehn' }, { target: 'Napulo ug upat', gloss: 'vierzehn' }, { target: 'Napulo ug lima', gloss: 'fünfzehn' },
|
||||||
{ target: 'Napulo ug unom', gloss: 'sechzehn' }, { target: 'Napulo ug pito', gloss: 'siebzehn' }, { target: 'Napulo ug walo', gloss: 'achtzehn' }, { target: 'Napulo ug siyam', gloss: 'neunzehn' }, { target: 'Baynte', gloss: 'zwanzig' },
|
{ target: 'Napulo ug unom', gloss: 'sechzehn' }, { target: 'Napulo ug pito', gloss: 'siebzehn' }, { target: 'Napulo ug walo', gloss: 'achtzehn' }, { target: 'Napulo ug siyam', gloss: 'neunzehn' }, { target: 'Baynte', gloss: 'zwanzig' },
|
||||||
|
{ target: 'Kaluhaan ug usa', gloss: 'einundzwanzig' }, { target: 'Kaluhaan ug lima', gloss: 'fünfundzwanzig' }, { target: 'Kaluhaan ug siyam', gloss: 'neunundzwanzig' },
|
||||||
|
{ target: 'Katloan ug usa', gloss: 'einunddreißig' }, { target: 'Katloan ug lima', gloss: 'fünfunddreißig' }, { target: 'Kalim-an ug walo', gloss: 'achtundfünfzig' },
|
||||||
{ target: 'Traysenta', gloss: 'dreißig' }, { target: 'Kwarenta', gloss: 'vierzig' }, { target: 'Singkwenta', gloss: 'fünfzig' }, { target: 'Sesenta', gloss: 'sechzig' }, { target: 'Setenta', gloss: 'siebzig' },
|
{ target: 'Traysenta', gloss: 'dreißig' }, { target: 'Kwarenta', gloss: 'vierzig' }, { target: 'Singkwenta', gloss: 'fünfzig' }, { target: 'Sesenta', gloss: 'sechzig' }, { target: 'Setenta', gloss: 'siebzig' },
|
||||||
{ target: 'Otsenta', gloss: 'achtzig' }, { target: 'Nobenta', gloss: 'neunzig' }, { target: 'Usa ka gatos', gloss: 'einhundert' }, { target: 'Duha ka gatos', gloss: 'zweihundert' },
|
{ target: 'Otsenta', gloss: 'achtzig' }, { target: 'Nobenta', gloss: 'neunzig' }, { target: 'Usa ka gatos', gloss: 'einhundert' }, { target: 'Duha ka gatos', gloss: 'zweihundert' },
|
||||||
{ target: 'Usa ka libo', gloss: 'tausend' }, { target: 'Duha ka libo', gloss: 'zweitausend' }
|
{ target: 'Usa ka libo', gloss: 'tausend' }, { target: 'Duha ka libo', gloss: 'zweitausend' }
|
||||||
],
|
],
|
||||||
|
grammarFocus: [
|
||||||
|
{ title: '11 bis 19', text: 'Bei der nativen Bildung steht zuerst zehn und danach mit „ug“ die Einerzahl.', example: 'Napulo ug usa = elf; Napulo ug lima = fünfzehn.' },
|
||||||
|
{ title: 'Zahlen über 20', text: 'Dasselbe Muster funktioniert mit höheren Zehnern: Zehner + „ug“ + Einer. Bei Preisen hört man zusätzlich oft spanisch geprägte Kurzformen wie „baynte“.', example: 'Kaluhaan ug lima = fünfundzwanzig; Baynte = zwanzig.' }
|
||||||
|
],
|
||||||
speakingPrompts: [
|
speakingPrompts: [
|
||||||
{ title: 'Zähle bis 20', prompt: 'Zähle laut von Usa bis Baynte.' },
|
{ title: 'Zähle bis 20', prompt: 'Zähle laut von Usa bis Baynte.' },
|
||||||
{ title: 'Preisangaben', prompt: 'Nenne Preise mit Zahlwörtern, z.B. Singkwenta, Usa ka gatos oder Duha ka libo.' }
|
{ title: 'Zusammengesetzte Zahlen', prompt: 'Nenne 21, 25, 29, 31, 35 und 58 mit dem Muster Zehner + ug + Einer.', cue: 'Kaluhaan ug usa. Kaluhaan ug lima. Katloan ug usa.' },
|
||||||
|
{ title: 'Preisangaben', prompt: 'Nenne Preise mit Zahlwörtern, z.B. Kaluhaan ug lima, Singkwenta, Usa ka gatos oder Duha ka libo.' }
|
||||||
],
|
],
|
||||||
practicalTasks: [
|
practicalTasks: [
|
||||||
{ title: 'Zähllektionen', text: 'Mindestens einmal pro Woche eine 3–5 Minuten Zählübung: 1–20, dann runde Zahlen.' }
|
{ title: 'Zähllektionen', text: 'Mindestens einmal pro Woche eine 3–5 Minuten Zählübung: 1–20, dann 21, 25, 29 und runde Zahlen.' }
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
BISAYA_DIDACTICS_24_43_BASE['Zahlen & Zählen (Woche 3)'] = mergeDidactics({}, NUMBERS_DIDACTIC);
|
BISAYA_DIDACTICS_24_43_BASE['Zahlen & Zählen (Woche 3)'] = mergeDidactics({}, NUMBERS_DIDACTIC);
|
||||||
|
|||||||
@@ -1742,8 +1742,18 @@ export default {
|
|||||||
pushUnique(item?.reference, item?.learning);
|
pushUnique(item?.reference, item?.learning);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Begrenzen, damit die Vorbereitungsrunde kompakt bleibt
|
// Zahlenreihen muessen vollstaendig sichtbar bleiben: Ein pauschales
|
||||||
return out.slice(0, 30);
|
// Limit wuerde bei gemischten Checkpoints die Beispiele 11-19 und
|
||||||
|
// zusammengesetzte Zahlen wie 21/25 abschneiden.
|
||||||
|
const numberGlosses = new Set([
|
||||||
|
'eins', 'zwei', 'drei', 'vier', 'fünf', 'sechs', 'sieben', 'acht', 'neun', 'zehn',
|
||||||
|
'elf', 'zwölf', 'dreizehn', 'vierzehn', 'fünfzehn', 'sechzehn', 'siebzehn',
|
||||||
|
'achtzehn', 'neunzehn', 'zwanzig', 'einundzwanzig', 'fünfundzwanzig'
|
||||||
|
]);
|
||||||
|
const numberPatternCount = this.normalizedCorePatterns.filter((pattern) =>
|
||||||
|
numberGlosses.has(String(pattern?.gloss || '').trim().toLowerCase())
|
||||||
|
).length;
|
||||||
|
return numberPatternCount >= 10 ? out : out.slice(0, 30);
|
||||||
},
|
},
|
||||||
currentPrepItem() {
|
currentPrepItem() {
|
||||||
return this.prepItems[this.lessonPrepIndex] || null;
|
return this.prepItems[this.lessonPrepIndex] || null;
|
||||||
|
|||||||
Reference in New Issue
Block a user