lib: implement basic kanji search
This commit is contained in:
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -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(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user