56 lines
1.4 KiB
Dart
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();
|
|
}
|