inflect.mx raw
1 package transdb
2
3 import (
4 "git.mleku.dev/iskra"
5 "git.smesh.lol/iskradb/lattice"
6 )
7
8 // JA verb class codes stored in Bcooccur at MakeKey(lang, CoordVerbClass, dictForm).
9 const (
10 VerbClassUnknown uint8 = 0
11 VerbClassV1 uint8 = 1
12 VerbClassV1S uint8 = 2
13 VerbClassV5K uint8 = 3
14 VerbClassV5KS uint8 = 4
15 VerbClassV5G uint8 = 5
16 VerbClassV5S uint8 = 6
17 VerbClassV5M uint8 = 7
18 VerbClassV5N uint8 = 8
19 VerbClassV5B uint8 = 9
20 VerbClassV5R uint8 = 10
21 VerbClassV5T uint8 = 11
22 VerbClassV5U uint8 = 12
23 VerbClassV5Aru uint8 = 13
24 VerbClassVS uint8 = 14
25 VerbClassVK uint8 = 15
26 )
27
28 // VerbClassCode maps a JMdict POS string to a numeric code.
29 func VerbClassCode(s string) uint8 {
30 switch s {
31 case "v1": return VerbClassV1
32 case "v1-s": return VerbClassV1S
33 case "v5k": return VerbClassV5K
34 case "v5k-s": return VerbClassV5KS
35 case "v5g": return VerbClassV5G
36 case "v5s": return VerbClassV5S
37 case "v5m": return VerbClassV5M
38 case "v5n": return VerbClassV5N
39 case "v5b": return VerbClassV5B
40 case "v5r", "v5r-i", "v5aru": return VerbClassV5R
41 case "v5t": return VerbClassV5T
42 case "v5u", "v5u-s": return VerbClassV5U
43 case "vs", "vs-i", "vs-s", "vs-c": return VerbClassVS
44 case "vk": return VerbClassVK
45 }
46 return VerbClassUnknown
47 }
48
49 // VerbClassStr maps a numeric code back to the canonical JMdict POS string.
50 func VerbClassStr(code uint8) string {
51 switch code {
52 case VerbClassV1: return "v1"
53 case VerbClassV1S: return "v1-s"
54 case VerbClassV5K: return "v5k"
55 case VerbClassV5KS: return "v5k-s"
56 case VerbClassV5G: return "v5g"
57 case VerbClassV5S: return "v5s"
58 case VerbClassV5M: return "v5m"
59 case VerbClassV5N: return "v5n"
60 case VerbClassV5B: return "v5b"
61 case VerbClassV5R: return "v5r"
62 case VerbClassV5T: return "v5t"
63 case VerbClassV5U: return "v5u"
64 case VerbClassV5Aru: return "v5aru"
65 case VerbClassVS: return "vs"
66 case VerbClassVK: return "vk"
67 }
68 return ""
69 }
70
71 // RegisterVerbClass stores a verb class code via iskra.RegisterClassRecord.
72 func RegisterVerbClass(tree *lattice.Tree, pool *[]byte, lang uint8, dictForm string, code uint8) {
73 iskra.RegisterClassRecord(tree, pool, lang, dictForm, code)
74 }
75
76 // GetVerbClass retrieves the stored verb class string for a dict form.
77 func GetVerbClass(tree *lattice.Tree, lang uint8, dictForm string) (string, bool) {
78 code, ok := iskra.GetClassCode(tree, lang, dictForm)
79 if !ok {
80 return "", false
81 }
82 s := VerbClassStr(code)
83 if s == "" {
84 return "", false
85 }
86 return s, true
87 }
88
89 // InflectJA computes a JA verb surface form from dictForm + class + morph state.
90 func InflectJA(dictForm, verbClass string, state uint8) string {
91 if state == 0 {
92 return dictForm
93 }
94 forms := BuildVerbForms(dictForm, verbClass)
95 if f, ok := forms[state]; ok {
96 return f
97 }
98 return ""
99 }
100
101 // InflectJAFromTree uses the stored verb class to compute the inflected form.
102 func InflectJAFromTree(tree *lattice.Tree, lang uint8, dictForm string, state uint8) string {
103 class, ok := GetVerbClass(tree, lang, dictForm)
104 if !ok {
105 return ""
106 }
107 return InflectJA(dictForm, class, state)
108 }
109
110 // jaInflectFunc is the JA implementation of iskra.InflectFunc.
111 // Registered with iskra so InflectFromTree works for LangJA.
112 var jaInflectFuncRegistered = false
113
114 func ensureJAInflectRegistered() {
115 if jaInflectFuncRegistered {
116 return
117 }
118 iskra.RegisterInflectFunc(LangJA, func(dictForm string, classCode uint8, state uint8) string {
119 return InflectJA(dictForm, VerbClassStr(classCode), state)
120 })
121 jaInflectFuncRegistered = true
122 }
123