1
0
mirror of https://github.com/fumiama/emozi.git synced 2026-06-05 00:32:48 +08:00

feat: add cmd

This commit is contained in:
源文雨
2024-02-15 17:14:56 +09:00
parent 96223b1b74
commit 7e641e891e
11 changed files with 712 additions and 488 deletions

View File

@@ -68,20 +68,34 @@ func (c *Coder) Close() error {
// Encode 从汉字序列生成 EmoziString 返回 EmoziString 多音字选择数列表
func (c *Coder) Encode(enableRandom bool, s string, selections ...int) (EmoziString, []int, error) {
sb := strings.Builder{}
lstbuf := make([]字表, 0, len(s)/2)
buflen := len(s) / 2
if buflen < 4 {
buflen = 4
}
lstbuf := make([]字表, 0, buflen)
var lst []字表
write := func(x *字表) {
var write func(x *字表)
randomwrite := func(x *字表) {
sb.WriteString(c.声母(enableRandom, x.S))
sb.WriteString(c.韵母(enableRandom, x.Y))
sb.WriteString(c.声调(enableRandom, x.T))
sb.WriteString(c.部首(x.R))
}
norandomwrite := func(x *字表) {
sb.WriteString(c.声母(false, x.S))
sb.WriteString(c.韵母(false, x.Y))
sb.WriteString(c.声调(false, x.T))
sb.WriteString(c.部首(x.R))
write = randomwrite
}
write = norandomwrite
多音字计数 := 0
多音字数表 := []int{}
var err error
for _, ch := range s { // nolint: go-staticcheck
lst, lstbuf, err = c.查字(ch, lstbuf)
if err != nil || len(lst) == 0 {
//fmt.Println("写入未知字:", string(ch), ch)
sb.WriteRune(ch)
continue
}
@@ -121,6 +135,7 @@ func (c *Coder) Decode(es EmoziString, forcedecode bool) (string, error) {
} else {
s = es.String()
}
// fmt.Println(len(s), s)
lstbuf := make([]字表, 0, len(s)/8)
read := func(s string) (string, int) {
sum := 0
@@ -129,21 +144,25 @@ func (c *Coder) Decode(es EmoziString, forcedecode bool) (string, error) {
return "", 0
}
sum += n
// fmt.Println(n, sm, s[0:sum])
ym, n := c.逆韵母(s[sum:])
if n == 0 {
return "", 0
}
sum += n
// fmt.Println(n, ym, s[sum-n:sum])
t, n := c.逆声调(s[sum:])
if n == 0 {
return "", 0
}
sum += n
// fmt.Println(n, t, s[sum-n:sum])
rs, n := c.逆部首(s[sum:])
if n == 0 {
return "", 0
}
sum += n
// fmt.Println(n, rs, s[sum-n:sum])
var possibles []rune
var err error
if len(rs) == 0 { // 意符为空
@@ -223,41 +242,49 @@ func (c *Coder) AddChar(w, r, p, f string) error {
// AddCharOverlay 向附加库添加一个新字, 覆盖在主库之上
//
// w: 字, r: 部首, p: 不带声调的拼音(可空), f: 带声调的拼音
func (c *Coder) AddCharOverlay(w, r, p, f string) error {
// 返回: 字表ID, 文字描述, error
func (c *Coder) AddCharOverlay(w, r, p, f string) (int64, string, error) {
if p == "" {
p = 去调(f)
}
s, y, t, rw, rr, err := 拆音识字(w, r, p, f)
if err != nil {
return err
return 0, "", err
}
return c.addcharoverlay(w, p, f, s, y, t, rw, rr)
}
func (c *Coder) addcharoverlay(w, p, f string, s 声母枚举, y 韵母枚举, t 声调枚举, rw rune, rr rune) error {
func (c *Coder) addcharoverlay(w, p, f string, s 声母枚举, y 韵母枚举, t 声调枚举, rw rune, rr rune) (int64, string, error) {
id := 字表ID(rw, s, y, t)
c.mu.Lock()
err := c.db.InsertUnique(附字表名, &字表{
ID: 字表ID(rw, s, y, t),
ID: id,
W: rw, S: s, Y: y, T: t,
R: rr, P: p, F: f,
})
c.mu.Unlock()
if err != nil {
return errors.New("已有同音同形的字 '" + w + "'")
return 0, "", errors.New("已有同音同形的字 '" + w + "'")
}
return nil
sb := strings.Builder{}
sb.WriteString(s.String())
sb.WriteString(", ")
sb.WriteString(y.String())
sb.WriteString(", ")
sb.WriteString(t.String())
return id, sb.String(), nil
}
// ChangeCharOverlay 更改附加库的一项
func (c *Coder) ChangeCharOverlay(oldw, oldr, oldf, neww, newr, newf string) error {
func (c *Coder) ChangeCharOverlay(oldw, oldr, oldf, neww, newr, newf string) (int64, string, error) {
s, y, t, rw, rr, err := 拆音识字(oldw, oldr, 去调(oldf), oldf)
if err != nil {
return err
return 0, "", err
}
newp := 去调(newf)
ns, ny, nt, nrw, nrr, err := 拆音识字(neww, newr, newp, newf)
if err != nil {
return err
return 0, "", err
}
q := "WHERE ID=" + strconv.FormatInt(字表ID(rw, s, y, t), 10)
x := 字表{}
@@ -265,16 +292,16 @@ func (c *Coder) ChangeCharOverlay(oldw, oldr, oldf, neww, newr, newf string) err
err = c.db.Find(附字表名, &x, q)
c.mu.RUnlock()
if err != nil {
return err
return 0, "", err
}
if x.R != rr {
return errors.New("提供的旧部首 '" + string(rr) + "' 与记载的 '" + string(x.R) + "' 不符")
return 0, "", errors.New("提供的旧部首 '" + string(rr) + "' 与记载的 '" + string(x.R) + "' 不符")
}
c.mu.Lock()
err = c.db.Del(附字表名, q)
c.mu.Unlock()
if err != nil {
return err
return 0, "", err
}
return c.addcharoverlay(neww, newp, newf, ns, ny, nt, nrw, nrr)
}