1
0
mirror of https://shylinux.com/x/icebergs synced 2025-04-25 17:18:05 +08:00
icebergs/misc/input/input.go
2021-10-26 04:19:03 +08:00

151 lines
4.2 KiB
Go

package input
import (
"bufio"
"bytes"
"encoding/csv"
"fmt"
"os"
"path"
"strings"
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/cli"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/core/code"
kit "shylinux.com/x/toolkits"
)
func _input_load(m *ice.Message, file string, libs ...string) {
if f, e := os.Open(file); m.Assert(e) {
defer f.Close()
// 清空数据
lib := kit.Select(path.Base(file), libs, 0)
m.Assert(os.RemoveAll(path.Join(m.Config(kit.MDB_STORE), lib)))
m.Cmd(mdb.DELETE, m.PrefixKey(), "", mdb.HASH, kit.MDB_ZONE, lib)
prefix := kit.Keys(kit.MDB_HASH, m.Rich(m.PrefixKey(), "", kit.Data(
kit.MDB_STORE, path.Join(m.Config(kit.MDB_STORE), lib),
m.ConfigSimple(kit.MDB_FSIZE, kit.MDB_LIMIT, kit.MDB_LEAST),
kit.MDB_ZONE, lib, kit.MDB_COUNT, 0,
)))
// 加载词库
for bio := bufio.NewScanner(f); bio.Scan(); {
if strings.HasPrefix(bio.Text(), "#") {
continue
}
line := kit.Split(bio.Text())
if len(line) < 2 || (len(line) > 2 && line[2] == "0") {
continue
}
m.Grow(m.PrefixKey(), prefix, kit.Dict(TEXT, line[0], CODE, line[1], WEIGHT, kit.Select("999999", line, 2)))
}
// 保存词库
m.Conf(m.PrefixKey(), kit.Keys(prefix, kit.Keym(kit.MDB_LIMIT)), 0)
m.Conf(m.PrefixKey(), kit.Keys(prefix, kit.Keym(kit.MDB_LEAST)), 0)
n := m.Grow(m.PrefixKey(), prefix, kit.Dict(TEXT, "成功", CODE, "z", WEIGHT, "0"))
m.Log_IMPORT(m.PrefixKey(), lib, kit.MDB_COUNT, n)
m.Echo("%s: %d", lib, n)
}
}
func _input_push(m *ice.Message, lib, text, code, weight string) {
if m.Richs(m.PrefixKey(), "", lib, nil) == nil {
m.Rich(m.PrefixKey(), "", kit.Data(
kit.MDB_STORE, path.Join(m.Config(kit.MDB_STORE), lib),
kit.MDB_FSIZE, m.Config(kit.MDB_FSIZE),
kit.MDB_LIMIT, m.Config(kit.MDB_LIMIT),
kit.MDB_LEAST, m.Config(kit.MDB_LEAST),
kit.MDB_ZONE, lib,
))
}
m.Richs(m.PrefixKey(), "", lib, func(key string, value map[string]interface{}) {
prefix := kit.Keys(kit.MDB_HASH, key)
m.Conf(m.PrefixKey(), kit.Keys(prefix, kit.Keym(kit.MDB_LIMIT)), 0)
m.Conf(m.PrefixKey(), kit.Keys(prefix, kit.Keym(kit.MDB_LEAST)), 0)
n := m.Grow(m.PrefixKey(), prefix, kit.Dict(TEXT, text, CODE, code, WEIGHT, weight))
m.Log_IMPORT(CODE, code, TEXT, text)
m.Echo("%s: %d", lib, n)
})
}
func _input_save(m *ice.Message, file string, lib ...string) {
if f, p, e := kit.Create(file); m.Assert(e) {
defer f.Close()
n := 0
m.Option(ice.CACHE_LIMIT, -2)
for _, lib := range lib {
m.Richs(m.PrefixKey(), "", lib, func(key string, value map[string]interface{}) {
m.Grows(m.PrefixKey(), kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) {
if value[CODE] != "z" {
fmt.Fprintf(f, "%s %s %s\n", value[TEXT], value[CODE], value[WEIGHT])
n++
}
})
})
}
m.Log_EXPORT(FILE, p, kit.MDB_COUNT, n)
m.Echo("%s: %d", p, n)
}
}
func _input_find(m *ice.Message, method, word, limit string) {
switch method {
case LINE:
case WORD:
word = "^" + word + ","
}
// 搜索词汇
res := m.Cmdx(cli.SYSTEM, "grep", "-rn", word, m.Config(kit.MDB_STORE))
bio := csv.NewReader(bytes.NewBufferString(strings.Replace(res, ":", ",", -1)))
for i := 0; i < kit.Int(limit); i++ {
if line, e := bio.Read(); e != nil {
break
} else if len(line) < 3 {
} else {
// 输出词汇
m.Push(kit.MDB_ID, line[3])
m.Push(CODE, line[2])
m.Push(TEXT, line[4])
m.Push(WEIGHT, line[6])
}
}
m.SortIntR(WEIGHT)
}
func _input_list(m *ice.Message, lib string) {
if lib == "" {
m.Richs(m.PrefixKey(), "", kit.MDB_FOREACH, func(key string, value map[string]interface{}) {
m.Push("", kit.GetMeta(value), kit.Split("time,zone,count,store"))
})
return
}
m.Option(nfs.DIR_DEEP, true)
m.Option(nfs.DIR_TYPE, nfs.CAT)
m.Richs(m.PrefixKey(), "", lib, func(key string, value map[string]interface{}) {
m.Cmdy(nfs.DIR, kit.Value(value, kit.Keym(kit.MDB_STORE)), "time size line path")
})
}
const (
ZONE = "zone"
FILE = "file"
CODE = "code"
TEXT = "text"
WEIGHT = "weight"
)
const (
WORD = "word"
LINE = "line"
)
const INPUT = "input"
var Index = &ice.Context{Name: INPUT, Help: "输入法"}
func init() { code.Index.Register(Index, nil) }