69 lines
2.3 KiB
Dart
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,
|
|
);
|
|
}
|
|
}
|