diff --git a/data.go b/data.go index 0b7e237d..4b2b4373 100644 --- a/data.go +++ b/data.go @@ -23,8 +23,11 @@ func (m *Message) Config(key string, arg ...interface{}) string { } return m.Conf(m.PrefixKey(), kit.Keym(key)) } -func (m *Message) ConfigSimple(key string) []string { - return []string{key, m.Config(key)} +func (m *Message) ConfigSimple(key ...string) (list []string) { + for _, k := range kit.Split(kit.Join(key)) { + list = append(list, k, m.Config(k)) + } + return } func (m *Message) Save(arg ...string) *Message { if len(arg) == 0 { diff --git a/go.sum b/go.sum index eb989d4e..c2dec59b 100644 --- a/go.sum +++ b/go.sum @@ -1,4 +1,6 @@ +github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e h1:MRM5ITcdelLK2j1vwZ3Je0FKVCfqOLp5zO6trqMLYs0= github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e/go.mod h1:XV66xRDqSt+GTGFMVlhk3ULuV0y9ZmzeVGR4mloJI3M= shylinux.com/x/toolkits v0.3.8 h1:72akO7wEm0T4xvxm4hZGsx6mO62sBzeY7QWAoLFzgRA= shylinux.com/x/toolkits v0.3.8/go.mod h1:8LbYHe7oxBIqb6s4MSOD+4d28QvPdvkyCVtwB/JW7AA= diff --git a/misc/bash/bash.go b/misc/bash/bash.go index 08e71c94..8d58deac 100644 --- a/misc/bash/bash.go +++ b/misc/bash/bash.go @@ -15,9 +15,6 @@ var Index = &ice.Context{Name: BASH, Help: "命令行", Configs: map[string]*ice cli.SOURCE, "http://mirrors.tencent.com/macports/distfiles/bash/5.1_1/bash-5.1.tar.gz", )}, }, Commands: map[string]*ice.Command{ - ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() }}, - ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() }}, - BASH: {Name: "bash path auto order build download", Help: "命令行", Action: ice.MergeAction(map[string]*ice.Action{ cli.ORDER: {Name: "order", Help: "加载", Hand: func(m *ice.Message, arg ...string) { m.Cmd(code.INSTALL, cli.ORDER, m.Config(cli.SOURCE), "_install/bin") diff --git a/misc/input/input.go b/misc/input/input.go index 0ceae52d..5c3e18c2 100644 --- a/misc/input/input.go +++ b/misc/input/input.go @@ -13,105 +13,22 @@ import ( "shylinux.com/x/icebergs/base/cli" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" - "shylinux.com/x/icebergs/base/web" "shylinux.com/x/icebergs/core/code" kit "shylinux.com/x/toolkits" ) -func _input_list(m *ice.Message, lib string) { - if lib == "" { - m.Richs(INPUT, "", 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(INPUT, "", lib, func(key string, value map[string]interface{}) { - m.Cmdy(nfs.DIR, kit.Value(value, kit.Keym(kit.MDB_STORE)), "time size line path") - }) -} -func _input_push(m *ice.Message, lib, text, code, weight string) { - if m.Richs(INPUT, "", lib, nil) == nil { - m.Rich(INPUT, "", kit.Data( - kit.MDB_STORE, path.Join(m.Conf(INPUT, kit.Keym(kit.MDB_STORE)), lib), - kit.MDB_FSIZE, m.Conf(INPUT, kit.Keym(kit.MDB_FSIZE)), - kit.MDB_LIMIT, m.Conf(INPUT, kit.Keym(kit.MDB_LIMIT)), - kit.MDB_LEAST, m.Conf(INPUT, kit.Keym(kit.MDB_LEAST)), - kit.MDB_ZONE, lib, - )) - } - - m.Richs(INPUT, "", lib, func(key string, value map[string]interface{}) { - prefix := kit.Keys(kit.MDB_HASH, key) - m.Conf(INPUT, kit.Keys(prefix, kit.Keym(kit.MDB_LIMIT)), 0) - m.Conf(INPUT, kit.Keys(prefix, kit.Keym(kit.MDB_LEAST)), 0) - n := m.Grow(INPUT, prefix, kit.Dict(TEXT, text, CODE, code, WEIGHT, weight)) - m.Log_IMPORT(CODE, code, TEXT, text) - m.Echo("%s: %d", lib, 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.Conf(INPUT, kit.Keym(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(FILE, path.Base(line[0])) - 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_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(INPUT, "", lib, func(key string, value map[string]interface{}) { - m.Grows(INPUT, 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_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.Conf(INPUT, kit.Keym(kit.MDB_STORE)), lib))) - prefix := kit.Keys(kit.MDB_HASH, m.Rich(INPUT, "", kit.Data( - kit.MDB_STORE, path.Join(m.Conf(INPUT, kit.Keym(kit.MDB_STORE)), lib), - kit.MDB_FSIZE, m.Conf(INPUT, kit.Keym(kit.MDB_FSIZE)), - kit.MDB_LIMIT, m.Conf(INPUT, kit.Keym(kit.MDB_LIMIT)), - kit.MDB_LEAST, m.Conf(INPUT, kit.Keym(kit.MDB_LEAST)), - kit.MDB_ZONE, lib, + 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, ))) // 加载词库 @@ -123,17 +40,97 @@ func _input_load(m *ice.Message, file string, libs ...string) { if len(line) < 2 || (len(line) > 2 && line[2] == "0") { continue } - m.Grow(INPUT, prefix, kit.Dict(TEXT, line[0], CODE, line[1], WEIGHT, kit.Select("999999", line, 2))) + m.Grow(m.PrefixKey(), prefix, kit.Dict(TEXT, line[0], CODE, line[1], WEIGHT, kit.Select("999999", line, 2))) } // 保存词库 - m.Conf(INPUT, kit.Keys(prefix, kit.Keym(kit.MDB_LIMIT)), 0) - m.Conf(INPUT, kit.Keys(prefix, kit.Keym(kit.MDB_LEAST)), 0) - n := m.Grow(INPUT, prefix, kit.Dict(TEXT, "成功", CODE, "z", WEIGHT, "0")) - m.Log_IMPORT(INPUT, lib, kit.MDB_COUNT, n) + 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" @@ -146,37 +143,8 @@ const ( WORD = "word" LINE = "line" ) -const ( - WUBI = "wubi" -) const INPUT = "input" -var Index = &ice.Context{Name: INPUT, Help: "输入法", - Configs: map[string]*ice.Config{ - INPUT: {Name: INPUT, Help: "输入法", Value: kit.Data( - kit.MDB_STORE, path.Join(ice.USR_LOCAL_EXPORT, INPUT), kit.MDB_FSIZE, "200000", - kit.MDB_LIMIT, "5000", kit.MDB_LEAST, "1000", - kit.MDB_SHORT, "zone", kit.SSH_REPOS, "wubi-dict", - )}, - }, - Commands: map[string]*ice.Command{ - ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() }}, - ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() }}, +var Index = &ice.Context{Name: INPUT, Help: "输入法"} - WUBI: {Name: "wubi method=word,line code auto", Help: "五笔", Action: map[string]*ice.Action{ - mdb.INSERT: {Name: "insert zone=person text code weight", Help: "添加", Hand: func(m *ice.Message, arg ...string) { - _input_push(m, kit.Select("person", m.Option(ZONE)), m.Option(TEXT), m.Option(CODE), m.Option(WEIGHT)) - }}, - mdb.EXPORT: {Name: "export file=usr/wubi-dict/person zone=person", Help: "导出", Hand: func(m *ice.Message, arg ...string) { - // _input_save(m, kit.Select("usr/wubi-dict/person", m.Option("file")), m.Option("zone")) - }}, - mdb.IMPORT: {Name: "import file=usr/wubi-dict/person zone", Help: "导入", Hand: func(m *ice.Message, arg ...string) { - _input_load(m, kit.Select("usr/wubi-dict/person", m.Option(FILE)), m.Option(ZONE)) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - _input_find(m, arg[0], arg[1], m.Option(ice.CACHE_LIMIT)) - }}, - }, -} - -func init() { code.Index.Register(Index, &web.Frame{}) } +func init() { code.Index.Register(Index, nil) } diff --git a/misc/input/input.shy b/misc/input/input.shy index 48392e55..6c17abe4 100644 --- a/misc/input/input.shy +++ b/misc/input/input.shy @@ -1,4 +1,4 @@ chapter "input" -field "五笔" web.wiki.alpha.alpha +field "五笔" web.code.input.wubi