cyberhybridhub/server/lib/pipeline/spelling_word_list.dart
nathanAndrinoid 4459852f83
Some checks failed
Admin portal tests / test (push) Has been cancelled
spelling
2026-06-05 03:22:35 +00:00

69 lines
2.3 KiB
Dart

import 'dart:math';
/// One spelling challenge: a displayed word and whether it is spelled correctly.
class SpellingChallenge {
const SpellingChallenge({
required this.displayedWord,
required this.isCorrectlySpelled,
required this.canonicalWord,
});
final String displayedWord;
final bool isCorrectlySpelled;
final String canonicalWord;
}
/// Curated commonly misspelled words for spelling quizzes.
abstract final class SpellingWordList {
static const List<({String correct, String misspelled})> pairs =
<({String correct, String misspelled})>[
(correct: 'accommodate', misspelled: 'acommodate'),
(correct: 'separate', misspelled: 'seperate'),
(correct: 'definitely', misspelled: 'definately'),
(correct: 'occurrence', misspelled: 'occurence'),
(correct: 'embarrass', misspelled: 'embarass'),
(correct: 'maintenance', misspelled: 'maintainance'),
(correct: 'recommend', misspelled: 'reccomend'),
(correct: 'privilege', misspelled: 'priviledge'),
(correct: 'necessary', misspelled: 'neccessary'),
(correct: 'rhythm', misspelled: 'rythm'),
];
/// Known misspelling from the curated list, if any.
static String? misspellingFor(String canonicalWord) {
final String normalized = canonicalWord.trim().toLowerCase();
for (final ({String correct, String misspelled}) pair in pairs) {
if (pair.correct == normalized) {
return pair.misspelled;
}
}
return null;
}
/// Fallback typo when [misspellingFor] has no curated entry.
static String generatedMisspelling(String canonicalWord) {
return misspellingFor(canonicalWord) ?? _naiveMisspelling(canonicalWord);
}
static String _naiveMisspelling(String word) {
final String lower = word.trim().toLowerCase();
if (lower.length <= 2) {
return '${lower}x';
}
final int dropAt = lower.length ~/ 2;
return lower.substring(0, dropAt) + lower.substring(dropAt + 1);
}
static SpellingChallenge randomChallenge([Random? random]) {
final Random rng = random ?? Random();
final ({String correct, String misspelled}) pair =
pairs[rng.nextInt(pairs.length)];
final bool showCorrect = rng.nextBool();
return SpellingChallenge(
displayedWord: showCorrect ? pair.correct : pair.misspelled,
isCorrectlySpelled: showCorrect,
canonicalWord: pair.correct,
);
}
}