Add verb conjugation
Added conjugation for verbs. A single verb now gets appended onto a noun phrase.
This commit is contained in:
parent
32638d3b97
commit
64b7ce434f
21
generic.go
21
generic.go
|
@ -34,6 +34,23 @@ func (g *generic) Random() (string, error) {
|
|||
sb := strings.Builder{}
|
||||
sb.WriteString(np)
|
||||
|
||||
ctime := models.CM_Present
|
||||
ctype := models.CT_I
|
||||
invert := false // TODO: implement this
|
||||
|
||||
if plural {
|
||||
ctype = models.CT_They
|
||||
}
|
||||
|
||||
v, err := g.randomVerb(ctype, ctime, invert)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
sb.WriteString(" ")
|
||||
sb.WriteString(v)
|
||||
sb.WriteString(" ")
|
||||
|
||||
return sb.String(), nil
|
||||
}
|
||||
|
||||
|
@ -121,7 +138,7 @@ func (g *generic) randomNoun(plural bool) (string, error) {
|
|||
return noun.Word, nil
|
||||
}
|
||||
|
||||
func (g *generic) randomVerb() (string, error) {
|
||||
func (g *generic) randomVerb(ctype models.ConjugationType, ctime models.ConjugationTime, invert bool) (string, error) {
|
||||
ids, err := g.db.GetVerbIds()
|
||||
if err != nil {
|
||||
return "", fmt.Errorf("[verb] get IDs error: %v", err)
|
||||
|
@ -137,7 +154,7 @@ func (g *generic) randomVerb() (string, error) {
|
|||
return "", fmt.Errorf("[verb] ID: %d; %v", ids[rid], err)
|
||||
}
|
||||
|
||||
return verb.Word, nil
|
||||
return verb.Conjugate(ctype, ctime, invert), nil
|
||||
}
|
||||
|
||||
func (g *generic) InitData(filename string) error {
|
||||
|
|
106
models/verb.go
106
models/verb.go
|
@ -1,5 +1,10 @@
|
|||
package models
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Verb struct {
|
||||
Id int
|
||||
|
||||
|
@ -8,21 +13,106 @@ type Verb struct {
|
|||
// Indefinite form
|
||||
Word string
|
||||
|
||||
ConjugationsPast []Conjugate
|
||||
ConjugationsPresent []Conjugate
|
||||
ConjugationsFuture []Conjugate
|
||||
//ConjugationsPast []Conjugate
|
||||
//ConjugationsPresent []Conjugate
|
||||
//ConjugationsFuture []Conjugate
|
||||
}
|
||||
|
||||
type ConjugateType int
|
||||
//type Conjugate struct {
|
||||
// Type ConjugateType
|
||||
// Form string
|
||||
//}
|
||||
|
||||
type ConjugationType int
|
||||
const (
|
||||
CT_I ConjugateType = iota
|
||||
CT_I ConjugationType = iota
|
||||
CT_You
|
||||
CT_It
|
||||
CT_We
|
||||
CT_They
|
||||
)
|
||||
|
||||
type Conjugate struct {
|
||||
Type ConjugateType
|
||||
Form string
|
||||
func (ct ConjugationType) String() string {
|
||||
switch ct {
|
||||
case CT_I:
|
||||
return "I"
|
||||
case CT_It:
|
||||
return "It"
|
||||
case CT_You:
|
||||
return "You"
|
||||
case CT_We:
|
||||
return "We"
|
||||
case CT_They:
|
||||
return "They"
|
||||
default:
|
||||
return "Unknown"
|
||||
}
|
||||
}
|
||||
|
||||
type ConjugationTime int
|
||||
const (
|
||||
CM_Present ConjugationTime = iota
|
||||
CM_Past
|
||||
CM_Future
|
||||
)
|
||||
|
||||
func (cm ConjugationTime) String() string {
|
||||
switch cm {
|
||||
case CM_Present:
|
||||
return "Present"
|
||||
case CM_Past:
|
||||
return "Past"
|
||||
case CM_Future:
|
||||
return "Future"
|
||||
default:
|
||||
return "Unknown"
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: implement inverted
|
||||
func (v Verb) Conjugate(conjugation ConjugationType, time ConjugationTime, inverted bool ) string {
|
||||
if !v.Regular {
|
||||
fmt.Printf("[verb] Irregular verbs not implemented! %q\n", v.Word)
|
||||
return v.Word
|
||||
}
|
||||
|
||||
//fmt.Printf("[verb] word: %s; type: %s; time: %s\n", v.Word, conjugation, time)
|
||||
|
||||
switch time {
|
||||
case CM_Present:
|
||||
if conjugation == CT_It {
|
||||
sfx := []string{"s", "x", "sh", "ch", "ss"}
|
||||
for _, s := range sfx {
|
||||
if strings.HasSuffix(v.Word, s) {
|
||||
return v.Word + "es"
|
||||
}
|
||||
}
|
||||
|
||||
if strings.HasSuffix(v.Word, "y") && !strings.ContainsAny(string(v.Word[len(v.Word)-2]), "aeiou") {
|
||||
return v.Word[:len(v.Word)-1] + "ies"
|
||||
}
|
||||
|
||||
return v.Word + "s"
|
||||
|
||||
} else {
|
||||
return v.Word
|
||||
}
|
||||
|
||||
case CM_Past:
|
||||
if strings.HasSuffix(v.Word, "e") {
|
||||
return v.Word + "d"
|
||||
}
|
||||
|
||||
if strings.HasSuffix(v.Word, "y") && !strings.ContainsAny(string(v.Word[len(v.Word)-2]), "aeiou") {
|
||||
return v.Word[:len(v.Word)-1] + "ied"
|
||||
}
|
||||
|
||||
return v.Word + "ed"
|
||||
|
||||
case CM_Future:
|
||||
return "will " + v.Word
|
||||
}
|
||||
|
||||
fmt.Printf("[verb] Unknown ConjugationTime: %d\n", conjugation)
|
||||
return v.Word
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue