mirror of
https://github.com/fumiama/emozi.git
synced 2026-06-05 00:32:48 +08:00
feat(coder): add Stabilize
This commit is contained in:
30
coder.go
30
coder.go
@@ -2,6 +2,7 @@ package emozi
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
@@ -21,6 +22,12 @@ type Coder struct {
|
||||
|
||||
// NewCoder israndom 随机挑选声母韵母的颜文字, 否则固定使用第一个
|
||||
func NewCoder(israndom bool, cachettl time.Duration) (c Coder, err error) {
|
||||
if _, err = os.Stat(EmoziDatabasePath); err != nil {
|
||||
err = os.WriteFile(EmoziDatabasePath, 字数据库, 0644)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
c.db.DBPath = EmoziDatabasePath
|
||||
c.字表缓存 = make(map[rune][]字表, 4096)
|
||||
c.部首缓存 = make(map[rune]string, 4096)
|
||||
@@ -110,7 +117,7 @@ func (c *Coder) Add(w, r, p, f string) error {
|
||||
}
|
||||
c.mu.Lock()
|
||||
err = c.db.InsertUnique(主字表名, &字表{
|
||||
ID: 颜表ID(rw, s, y, t),
|
||||
ID: 字表ID(rw, s, y, t),
|
||||
W: rw, S: s, Y: y, T: t,
|
||||
R: rr, P: p, F: f,
|
||||
})
|
||||
@@ -138,7 +145,7 @@ func (c *Coder) Overlay(w, r, p, f string) error {
|
||||
func (c *Coder) overlay(w, p, f string, s 声母枚举, y 韵母枚举, t 声调枚举, rw rune, rr rune) error {
|
||||
c.mu.Lock()
|
||||
err := c.db.InsertUnique(附字表名, &字表{
|
||||
ID: 颜表ID(rw, s, y, t),
|
||||
ID: 字表ID(rw, s, y, t),
|
||||
W: rw, S: s, Y: y, T: t,
|
||||
R: rr, P: p, F: f,
|
||||
})
|
||||
@@ -160,7 +167,7 @@ func (c *Coder) ChangeOverlay(oldw, oldr, oldf, neww, newr, newf string) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
q := "WHERE ID=" + strconv.FormatInt(颜表ID(rw, s, y, t), 10)
|
||||
q := "WHERE ID=" + strconv.FormatInt(字表ID(rw, s, y, t), 10)
|
||||
x := 字表{}
|
||||
c.mu.RLock()
|
||||
err = c.db.Find(附字表名, &x, q)
|
||||
@@ -180,6 +187,23 @@ func (c *Coder) ChangeOverlay(oldw, oldr, oldf, neww, newr, newf string) error {
|
||||
return c.overlay(neww, newp, newf, ns, ny, nt, nrw, nrr)
|
||||
}
|
||||
|
||||
// Stabilize 将附加库中的一项固定到主库
|
||||
func (c *Coder) Stabilize(id int64) error {
|
||||
x := 字表{}
|
||||
q := "WHERE ID=" + strconv.FormatInt(id, 10)
|
||||
c.mu.Lock()
|
||||
defer c.mu.Unlock()
|
||||
err := c.db.Find(附字表名, &x, q)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = c.db.Insert(主字表名, &x)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return c.db.Del(附字表名, q)
|
||||
}
|
||||
|
||||
// OverlayRadical 添加一个部首
|
||||
func (c *Coder) OverlayRadical(r rune, e string) error {
|
||||
c.mu.Lock()
|
||||
|
||||
7
data.go
7
data.go
@@ -7,10 +7,11 @@ import (
|
||||
|
||||
// 字数据库 数据来自 https://github.com/shuowenjiezi/shuowen
|
||||
//
|
||||
//var 字数据库 []byte
|
||||
//go:embed 字.db
|
||||
var 字数据库 []byte
|
||||
|
||||
// DatabasePath 字数据库的路径 如找不到会向对应路径写入内嵌的字数据库
|
||||
var EmoziDatabasePath = "字.db"
|
||||
var EmoziDatabasePath = "字a.db"
|
||||
|
||||
const (
|
||||
主字表名 = "emozi"
|
||||
@@ -30,7 +31,7 @@ type 字表 struct {
|
||||
F string
|
||||
}
|
||||
|
||||
func 颜表ID(w rune, s 声母枚举, y 韵母枚举, t 声调枚举) int64 {
|
||||
func 字表ID(w rune, s 声母枚举, y 韵母枚举, t 声调枚举) int64 {
|
||||
return int64((uint64(w) << 32) | (uint64(s) << 16) | (uint64(y) << 8) | (uint64(t)))
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user