lib: implement basic kanji search

This commit is contained in:
2025-04-19 01:20:48 +02:00
parent 23f90c1127
commit 68eb46174f
6 changed files with 342 additions and 11 deletions
@@ -0,0 +1,40 @@
import 'package:equatable/equatable.dart';
class KanjiSearchRadical extends Equatable {
/// The radical symbol.
final String symbol;
/// The radical forms used in this kanji.
final List<String> forms;
/// The meaning of the radical.
final String meaning;
// ignore: public_member_api_docs
const KanjiSearchRadical({
required this.symbol,
this.forms = const [],
required this.meaning,
});
@override
List<Object> get props => [
symbol,
forms,
meaning,
];
Map<String, dynamic> toJson() => {
'symbol': symbol,
'forms': forms,
'meaning': meaning,
};
factory KanjiSearchRadical.fromJson(Map<String, dynamic> json) {
return KanjiSearchRadical(
symbol: json['symbol'] as String,
forms: (json['forms'] as List).map((e) => e as String).toList(),
meaning: json['meaning'] as String,
);
}
}
+116 -2
View File
@@ -1,3 +1,117 @@
class KanjiSearchResult {
// TODO: implement me
import 'package:equatable/equatable.dart';
import 'kanji_search_radical.dart';
class KanjiSearchResult extends Equatable {
/// The kanji symbol
final String kanji;
/// The school level that the kanji is taught in, if applicable.
final String? taughtIn;
/// The lowest JLPT exam that this kanji is likely to appear in, if applicable.
///
/// 'N5' or 'N4' or 'N3' or 'N2' or 'N1'.
final String? jlptLevel;
/// A number representing this kanji's frequency rank in newspapers, if applicable.
final int? newspaperFrequencyRank;
/// How many strokes this kanji is typically drawn in.
final int strokeCount;
/// The meanings of the kanji.
final List<String> meanings;
/// This character's kunyomi.
final List<String> kunyomi;
/// This character's onyomi.
final List<String> onyomi;
// /// Examples of this character's kunyomi being used.
// final List<YomiExample> kunyomiExamples;
// /// Examples of this character's onyomi being used.
// final List<YomiExample> onyomiExamples;
/// Information about this character's radical, if applicable.
final KanjiSearchRadical? radical;
// TODO: document more accurately what kind of parts?
/// The parts used in this kanji.
final List<String> parts;
const KanjiSearchResult({
required this.kanji,
this.taughtIn,
this.jlptLevel,
this.newspaperFrequencyRank,
required this.strokeCount,
required this.meanings,
this.kunyomi = const [],
this.onyomi = const [],
// this.kunyomiExamples = const [],
// this.onyomiExamples = const [],
this.radical,
this.parts = const [],
});
@override
// ignore: public_member_api_docs
List<Object?> get props => [
taughtIn,
jlptLevel,
newspaperFrequencyRank,
strokeCount,
meanings,
kunyomi,
onyomi,
// kunyomiExamples,
// onyomiExamples,
radical,
parts,
];
Map<String, dynamic> toJson() => {
'kanji': kanji,
'taughtIn': taughtIn,
'jlptLevel': jlptLevel,
'newspaperFrequencyRank': newspaperFrequencyRank,
'strokeCount': strokeCount,
'meanings': meanings,
'kunyomi': kunyomi,
'onyomi': onyomi,
// 'onyomiExamples': onyomiExamples,
// 'kunyomiExamples': kunyomiExamples,
'radical': radical?.toJson(),
'parts': parts,
// 'strokeOrderDiagramUri': strokeOrderDiagramUri,
// 'strokeOrderSvgUri': strokeOrderSvgUri,
// 'strokeOrderGifUri': strokeOrderGifUri,
// 'uri': uri,
};
factory KanjiSearchResult.fromJson(Map<String, dynamic> json) {
return KanjiSearchResult(
kanji: json['kanji'] as String,
taughtIn: json['taughtIn'] as String?,
jlptLevel: json['jlptLevel'] as String?,
newspaperFrequencyRank: json['newspaperFrequencyRank'] as int?,
strokeCount: json['strokeCount'] as int,
meanings: (json['meanings'] as List).map((e) => e as String).toList(),
kunyomi: (json['kunyomi'] as List).map((e) => e as String).toList(),
onyomi: (json['onyomi'] as List).map((e) => e as String).toList(),
// kunyomiExamples: (json['kunyomiExamples'] as List)
// .map((e) => YomiExample.fromJson(e))
// .toList(),
// onyomiExamples: (json['onyomiExamples'] as List)
// .map((e) => YomiExample.fromJson(e))
// .toList(),
radical: json['radical'] != null
? KanjiSearchRadical.fromJson(json['radical'])
: null,
parts: (json['parts'] as List).map((e) => e as String).toList(),
);
}
}