Files
Hirameki-SRS/lib/src/models/kanji_item.dart
2025-10-31 17:18:33 +01:00

56 lines
1.4 KiB
Dart

import 'subject.dart';
class KanjiItem extends Subject {
final List<String> onyomi;
final List<String> kunyomi;
KanjiItem({
required super.id,
required super.level,
required super.characters,
required super.meanings,
required this.onyomi,
required this.kunyomi,
});
factory KanjiItem.fromSubject(Map<String, dynamic> subj) {
final commonFields = Subject.parseCommonFields(subj);
final data = commonFields['data'] as Map<String, dynamic>;
final List<String> onyomi = <String>[];
final List<String> kunyomi = <String>[];
if (data['readings'] != null) {
for (final r in data['readings'] as List) {
final typ = r['type'] as String? ?? '';
final reading = r['reading'] as String? ?? '';
if (typ == 'onyomi') {
onyomi.add(_katakanaToHiragana(reading));
} else if (typ == 'kunyomi') {
kunyomi.add(reading);
}
}
}
return KanjiItem(
id: commonFields['id'] as int,
level: commonFields['level'] as int,
characters: commonFields['characters'] as String,
meanings: commonFields['meanings'] as List<String>,
onyomi: onyomi,
kunyomi: kunyomi,
);
}
}
String _katakanaToHiragana(String input) {
final buf = StringBuffer();
for (final r in input.runes) {
if (r >= 0x30A1 && r <= 0x30FA) {
buf.writeCharCode(r - 0x60);
} else {
buf.writeCharCode(r);
}
}
return buf.toString();
}