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