/
JMdictJsonElement.kt
100 lines (88 loc) · 2.88 KB
/
JMdictJsonElement.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package org.edrdg.jmdict.simplified.conversion.jmdict
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import org.edrdg.jmdict.simplified.conversion.CommonJsonElement
import org.edrdg.jmdict.simplified.conversion.OutputDictionaryEntry
sealed class JMdictJsonElement : CommonJsonElement() {
@Serializable
data class Word(
val id: String,
val kanji: List<Kanji>,
val kana: List<Kana>,
val sense: List<Sense>,
) : OutputDictionaryEntry<Word> {
override val allLanguages: Set<String>
get() = sense
.flatMap { sense -> sense.gloss.map { it.lang } }
.toSet()
override fun onlyWithLanguages(languages: Set<String>): Word =
copy(
sense = sense.map { s ->
s.copy(
gloss = s.gloss.filter {
languages.contains(it.lang) || languages.contains("all")
}
)
}.filter { it.gloss.isNotEmpty() }
)
override val isCommon: Boolean
get() = kanji.any { it.common } || kana.any { it.common }
override fun toJsonString() = Json.encodeToString(this)
}
@Serializable
data class Kanji(
val common: Boolean,
val text: String,
val tags: List<Tag>,
)
@Serializable
data class Kana(
val common: Boolean,
val text: String,
val tags: List<Tag>,
val appliesToKanji: List<String>,
)
@Serializable
data class Sense(
val partOfSpeech: List<Tag>,
val appliesToKanji: List<String>,
val appliesToKana: List<String>,
val related: List<Xref>,
val antonym: List<Xref>,
val field: List<Tag>,
val dialect: List<Tag>,
val misc: List<Tag>,
val info: List<String>,
val languageSource: List<LanguageSource>,
val gloss: List<Gloss>,
)
@Serializable
data class LanguageSource(
val lang: String,
val full: Boolean,
val wasei: Boolean,
val text: String?,
)
@Serializable
data class Gloss(
val lang: String,
val gender: Gender?,
val type: GlossType?,
val text: String,
)
@Serializable
enum class Gender(val value: String) {
@SerialName("masculine") MASCULINE("masculine"),
@SerialName("feminine") FEMININE("feminine"),
@SerialName("neuter") NEUTER("neuter");
}
@Serializable
enum class GlossType(val value: String) {
@SerialName("literal") LITERAL("literal"),
@SerialName("figurative") FIGURATIVE("figurative"),
@SerialName("explanation") EXPLANATION("explanation"),
@SerialName("trademark") TRADEMARK("trademark");
}
}