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