diff --git a/backend/services/vocabService.js b/backend/services/vocabService.js index 8ecf39e..d67d6c4 100644 --- a/backend/services/vocabService.js +++ b/backend/services/vocabService.js @@ -92,9 +92,35 @@ export default class VocabService { return false; } + if (this._looksLikeFragmentMismatch(learning, reference)) { + return false; + } + return !this._isInstructionLikeText(learning) && !this._isInstructionLikeText(reference); } + _wordCount(value) { + return String(value || '') + .trim() + .replace(/[\p{P}\p{S}]+/gu, ' ') + .split(/\s+/) + .filter(Boolean) + .length; + } + + _looksLikeFragmentMismatch(left, right) { + const leftWords = this._wordCount(left); + const rightWords = this._wordCount(right); + const leftText = String(left || '').trim(); + const rightText = String(right || '').trim(); + const leftLooksSentence = leftWords >= 3 || /[?!.].+\S/.test(leftText); + const rightLooksSentence = rightWords >= 3 || /[?!.].+\S/.test(rightText); + const leftLooksShortFragment = leftWords <= 1 && leftText.length <= 12; + const rightLooksShortFragment = rightWords <= 1 && rightText.length <= 12; + + return (leftLooksShortFragment && rightLooksSentence) || (rightLooksShortFragment && leftLooksSentence); + } + _calculateSrsSchedule(item, { correct, rating = null } = {}) { const now = new Date(); const previousStage = Math.max(0, Number(item?.stage) || 0); diff --git a/frontend/src/dialogues/socialnetwork/VocabPracticeDialog.vue b/frontend/src/dialogues/socialnetwork/VocabPracticeDialog.vue index 8f563e2..694b777 100644 --- a/frontend/src/dialogues/socialnetwork/VocabPracticeDialog.vue +++ b/frontend/src/dialogues/socialnetwork/VocabPracticeDialog.vue @@ -42,15 +42,20 @@
{{ $t('socialnetwork.vocab.practice.correct') }}
{{ $t('socialnetwork.vocab.practice.wrong') }} -
-
{{ $t('socialnetwork.vocab.practice.acceptable') }}
- -
+
+
+ {{ $t('socialnetwork.vocab.practice.yourAnswer') }} + {{ submittedAnswer }} +
+
{{ $t('socialnetwork.vocab.practice.correctSolutions') }}
+ +
+
{{ $t('socialnetwork.vocab.practice.srsRateTitle') }}