diff --git a/base/cli/daemon.go b/base/cli/daemon.go index 73b36fe8..18404113 100644 --- a/base/cli/daemon.go +++ b/base/cli/daemon.go @@ -42,7 +42,7 @@ func _daemon_exec(m *ice.Message, cmd *exec.Cmd) { m.Cmd(mdb.MODIFY, DAEMON, "", mdb.HASH, mdb.HASH, h, STATUS, STOP) } - switch cb := m.Optionv(kit.Keycb(DAEMON)).(type) { + switch cb := m.OptionCB(DAEMON).(type) { case func(string): m.Sleep300ms() cb(m.Conf(DAEMON, kit.Keys(mdb.HASH, h, kit.Keym(STATUS)))) @@ -82,11 +82,15 @@ const ( STATUS = "status" ERROR = "error" START = "start" + CLEAR = "clear" RESTART = "restart" RELOAD = "reload" STOP = "stop" - CODE = "code" - BACK = "back" + + CODE = "code" + COST = "cost" + BACK = "back" + FROM = "from" OPEN = "open" CLOSE = "close" diff --git a/base/lex/matrix.go b/base/lex/matrix.go index 8c71aecc..5ccefb0b 100644 --- a/base/lex/matrix.go +++ b/base/lex/matrix.go @@ -395,7 +395,7 @@ func init() { mdb.CREATE: {Name: "create nlang=32 ncell=128", Help: "创建", Hand: func(m *ice.Message, arg ...string) { mat := NewMatrix(m, kit.Int(kit.Select("32", m.Option(NLANG))), kit.Int(kit.Select("128", m.Option(NCELL)))) h := m.Rich(m.Prefix(MATRIX), "", kit.Data(mdb.TIME, m.Time(), MATRIX, mat, NLANG, mat.nlang, NCELL, mat.ncell)) - switch cb := m.Optionv(kit.Keycb(MATRIX)).(type) { + switch cb := m.OptionCB(MATRIX).(type) { case func(string, *Matrix): cb(h, mat) } diff --git a/base/mdb/engine.go b/base/mdb/engine.go index 15a2afd4..d5f8d62b 100644 --- a/base/mdb/engine.go +++ b/base/mdb/engine.go @@ -17,7 +17,7 @@ func init() { }}, }, HashAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) > 1 { - m.Optionv(kit.Keycb(SELECT), func(fields []string, value map[string]interface{}) { + m.OptionCB(SELECT, func(fields []string, value map[string]interface{}) { m.Cmdy(kit.Keys(value[TEXT], value[NAME]), m.CommandKey(), arg[0], arg[1], kit.Select("", arg, 2), kit.Slice(arg, 3)) }) diff --git a/base/mdb/hash.go b/base/mdb/hash.go index 995df283..8bf658dd 100644 --- a/base/mdb/hash.go +++ b/base/mdb/hash.go @@ -60,10 +60,8 @@ func _hash_select(m *ice.Message, prefix, chain, field, value string) { value = RANDOMS } fields := _hash_fields(m) - m.Debug("what %v", 123) m.Richs(prefix, chain, value, func(key string, val map[string]interface{}) { - m.Debug("what %v", 123) - switch val = kit.GetMeta(val); cb := m.Optionv(kit.Keycb(SELECT)).(type) { + switch val = kit.GetMeta(val); cb := m.OptionCB(SELECT).(type) { case func(fields []string, value map[string]interface{}): cb(fields, val) default: @@ -74,7 +72,7 @@ func _hash_select(m *ice.Message, prefix, chain, field, value string) { } } }) - if m.Option(FIELDS) != DETAIL { + if !m.FieldsIsDetail() { m.SortTimeR(TIME) } } @@ -118,7 +116,7 @@ func _hash_import(m *ice.Message, prefix, chain, file string) { func _hash_prunes(m *ice.Message, prefix, chain string, arg ...string) { fields := _hash_fields(m) m.Richs(prefix, chain, FOREACH, func(key string, val map[string]interface{}) { - switch val = kit.GetMeta(val); cb := m.Optionv(kit.Keycb(PRUNES)).(type) { + switch val = kit.GetMeta(val); cb := m.OptionCB(PRUNES).(type) { case func(string, map[string]interface{}) bool: if !cb(key, val) { return diff --git a/base/mdb/list.go b/base/mdb/list.go index 3d10366b..f06744c4 100644 --- a/base/mdb/list.go +++ b/base/mdb/list.go @@ -51,7 +51,7 @@ func _list_select(m *ice.Message, prefix, chain, field, value string) { } fields := _list_fields(m) m.Grows(prefix, chain, kit.Select(m.Option(ice.CACHE_FIELD), field), kit.Select(m.Option(ice.CACHE_VALUE), value), func(index int, val map[string]interface{}) { - switch val = kit.GetMeta(val); cb := m.Optionv(kit.Keycb(SELECT)).(type) { + switch val = kit.GetMeta(val); cb := m.OptionCB(SELECT).(type) { case func(fields []string, value map[string]interface{}): cb(fields, val) default: @@ -166,6 +166,9 @@ func ListAction(fields ...string) map[string]*ice.Action { NEXT: {Name: "next", Help: "下一页", Hand: func(m *ice.Message, arg ...string) { NextPage(m, m.Config(COUNT), kit.Slice(arg, 1)...) }}, + SELECT: {Name: "select", Help: "列表", Hand: func(m *ice.Message, arg ...string) { + ListSelect(m, arg...) + }}, }, fields...) } func ListSelect(m *ice.Message, arg ...string) *ice.Message { diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 2c10597c..83d8a98c 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -64,10 +64,8 @@ const ( RANDOMS = "%" ) const ( - FIELDS = "fields" DETAIL = "detail" RANDOM = "random" - REPEAT = "repeat" CREATE = "create" REMOVE = "remove" @@ -80,11 +78,13 @@ const ( PRUNES = "prunes" EXPORT = "export" IMPORT = "import" + UPLOAD = "upload" REVERT = "revert" NEXT = "next" PREV = "prev" + PAGE = "page" ) const ( CACHE_CLEAR_ON_EXIT = "cache.clear.on.exit" diff --git a/base/mdb/plugin.go b/base/mdb/plugin.go index 72d31f77..f3f6056b 100644 --- a/base/mdb/plugin.go +++ b/base/mdb/plugin.go @@ -17,7 +17,7 @@ func init() { }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) > 1 { - m.Optionv(kit.Keycb(SELECT), func(fields []string, value map[string]interface{}) { + m.OptionCB(SELECT, func(fields []string, value map[string]interface{}) { m.Cmdy(kit.Keys(value[TEXT], value[NAME]), m.CommandKey(), arg[0], arg[1], kit.Select("", arg, 2), kit.Slice(arg, 3)) }) diff --git a/base/mdb/render.go b/base/mdb/render.go index ce7bb24f..7e66ffbf 100644 --- a/base/mdb/render.go +++ b/base/mdb/render.go @@ -17,7 +17,7 @@ func init() { }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) > 1 { - m.Optionv(kit.Keycb(SELECT), func(fields []string, value map[string]interface{}) { + m.OptionCB(SELECT, func(fields []string, value map[string]interface{}) { m.Cmdy(kit.Keys(value[TEXT], value[NAME]), m.CommandKey(), arg[0], arg[1], kit.Select("", arg, 2), kit.Slice(arg, 3)) }) diff --git a/base/mdb/search.go b/base/mdb/search.go index 1eb80cd6..64b66441 100644 --- a/base/mdb/search.go +++ b/base/mdb/search.go @@ -18,7 +18,7 @@ func init() { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { msg := m.Spawn(c) if len(arg) > 1 { - msg.Optionv(kit.Keycb(SELECT), func(fields []string, value map[string]interface{}) { + msg.OptionCB(SELECT, func(fields []string, value map[string]interface{}) { m.OptionFields(kit.Select("ctx,cmd,type,name,text", kit.Select(m.OptionFields(), arg, 2))) m.Cmdy(kit.Keys(value[TEXT], value[NAME]), m.CommandKey(), arg[0], arg[1], kit.Select("", arg, 2)) }) diff --git a/base/mdb/zone.go b/base/mdb/zone.go index 96c13f63..c2e5dd18 100644 --- a/base/mdb/zone.go +++ b/base/mdb/zone.go @@ -11,7 +11,7 @@ import ( ) func _zone_fields(m *ice.Message) []string { - return kit.Split(kit.Select("zone,id,time,type,name,text", kit.Join(kit.Simple(m.Optionv(FIELDS))))) + return kit.Split(kit.Select("zone,id,time,type,name,text", m.OptionFields())) } func _zone_select(m *ice.Message, prefix, chain, zone string, id string) { if zone == RANDOM { @@ -19,7 +19,7 @@ func _zone_select(m *ice.Message, prefix, chain, zone string, id string) { } fields := _zone_fields(m) - cb := m.Optionv(kit.Keycb(SELECT)) + cb := m.OptionCB(SELECT) m.Richs(prefix, chain, kit.Select(FOREACH, zone), func(key string, val map[string]interface{}) { if val = kit.GetMeta(val); zone == "" { if m.OptionFields() == DETAIL { @@ -38,8 +38,16 @@ func _zone_select(m *ice.Message, prefix, chain, zone string, id string) { cb(key, value, val) case func(string, map[string]interface{}): cb(key, value) + case func(map[string]interface{}): + cb(value) + case func(map[string]string): + res := map[string]string{} + for k, v := range value { + res[k] = kit.Format(v) + } + cb(res) default: - if m.Option(FIELDS) == DETAIL { + if m.FieldsIsDetail() { m.Push(DETAIL, value) } else { m.Push(key, value, fields, val) @@ -90,7 +98,7 @@ func _zone_import(m *ice.Message, prefix, chain, file string) { count := 0 list := map[string]string{} - zkey := kit.Select(head[0], m.Option(FIELDS)) + zkey := kit.Select(head[0], m.OptionFields()) for { line, e := r.Read() @@ -187,7 +195,7 @@ func ZoneAction(args ...interface{}) map[string]*ice.Action { NEXT: {Name: "next", Help: "下一页", Hand: func(m *ice.Message, arg ...string) { NextPageLimit(m, arg[0], arg[1:]...) }}, - SELECT: &ice.Action{Name: "select hash auto", Help: "列表", Hand: func(m *ice.Message, arg ...string) { + SELECT: {Name: "select", Help: "列表", Hand: func(m *ice.Message, arg ...string) { ZoneSelect(m, arg...) }}, }) @@ -200,3 +208,12 @@ func ZoneSelect(m *ice.Message, arg ...string) *ice.Message { } return m } +func ZoneSelectAll(m *ice.Message, arg ...string) *ice.Message { + m.Option(ice.CACHE_LIMIT, "-1") + return ZoneSelect(m, arg...) +} +func ZoneSelectCB(m *ice.Message, zone string, cb interface{}) *ice.Message { + m.OptionCB(SELECT, cb) + m.Option(ice.CACHE_LIMIT, "-1") + return ZoneSelect(m, zone) +} diff --git a/base/nfs/cat.go b/base/nfs/cat.go index 60f61d87..7f241fdb 100644 --- a/base/nfs/cat.go +++ b/base/nfs/cat.go @@ -78,7 +78,7 @@ func _cat_list(m *ice.Message, name string) { } defer f.Close() - switch cb := m.Optionv(kit.Keycb(CAT)).(type) { + switch cb := m.OptionCB(CAT).(type) { case func(string, int) string: list := []string{} for bio, i := bufio.NewScanner(f), 0; bio.Scan(); i++ { @@ -114,8 +114,7 @@ func _cat_list(m *ice.Message, name string) { const ( CAT_CONTENT = "cat_content" - - TEMPLATE = "template" + TEMPLATE = "template" SOURCE = "source" TARGET = "target" @@ -123,6 +122,8 @@ const ( MASTER = "master" BRANCH = "branch" REPOS = "repos" + + LOAD = "load" ) const ( HTML = "html" diff --git a/base/nfs/dir.go b/base/nfs/dir.go index 700a8f22..296f0cac 100644 --- a/base/nfs/dir.go +++ b/base/nfs/dir.go @@ -50,7 +50,7 @@ func _dir_list(m *ice.Message, root string, name string, level int, deep bool, d p := path.Join(root, name, f.Name()) if !(dir_type == TYPE_CAT && f.IsDir() || dir_type == TYPE_DIR && !f.IsDir()) && (dir_reg == nil || dir_reg.MatchString(f.Name())) { - switch cb := m.Optionv(kit.Keycb(DIR)).(type) { + switch cb := m.OptionCB(DIR).(type) { case func(f os.FileInfo, p string): cb(f, p) continue diff --git a/base/ssh/scripts.go b/base/ssh/scripts.go index ac8ce550..a8958ed7 100644 --- a/base/ssh/scripts.go +++ b/base/ssh/scripts.go @@ -254,7 +254,7 @@ func init() { }, Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}}, SOURCE: {Name: "source file", Help: "脚本解析", Action: ice.MergeAction(map[string]*ice.Action{ - mdb.REPEAT: {Name: "repeat", Help: "执行", Hand: func(m *ice.Message, arg ...string) { + "repeat": {Name: "repeat", Help: "执行", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(SCREEN, m.Option(mdb.TEXT)) m.ProcessInner() }}, diff --git a/base/tcp/client.go b/base/tcp/client.go index ad28b1ca..3802b222 100644 --- a/base/tcp/client.go +++ b/base/tcp/client.go @@ -42,7 +42,7 @@ func _client_dial(m *ice.Message, arg ...string) { defer c.Close() } - switch cb := m.Optionv(kit.Keycb(CLIENT)).(type) { + switch cb := m.OptionCB(CLIENT).(type) { case func(net.Conn, error): cb(c, e) case func(net.Conn): diff --git a/base/tcp/server.go b/base/tcp/server.go index faf52db5..a889585f 100644 --- a/base/tcp/server.go +++ b/base/tcp/server.go @@ -36,7 +36,7 @@ func _server_listen(m *ice.Message, arg ...string) { defer l.Close() } - switch cb := m.Optionv(kit.Keycb(SERVER)).(type) { + switch cb := m.OptionCB(SERVER).(type) { case func(net.Listener, error): cb(l, e) case func(net.Listener): diff --git a/base/web/web.go b/base/web/web.go index c0133899..c4b1322a 100644 --- a/base/web/web.go +++ b/base/web/web.go @@ -75,7 +75,7 @@ func (web *Frame) Start(m *ice.Message, arg ...string) bool { defer m.Event(SERVE_STOP) web.Message, web.Server = m, &http.Server{Handler: web} - switch cb := m.Optionv(kit.Keycb(SERVE)).(type) { + switch cb := m.OptionCB(SERVE).(type) { case func(http.Handler): cb(web) // 启动框架 default: diff --git a/base/yac/matrix.go b/base/yac/matrix.go index 73e09460..6cae988d 100644 --- a/base/yac/matrix.go +++ b/base/yac/matrix.go @@ -355,7 +355,7 @@ func init() { mdb.TIME, m.Time(), mdb.NAME, m.Option(mdb.NAME), MATRIX, mat, NLANG, mat.nlang, NCELL, mat.ncell, )) - switch cb := m.Optionv(kit.Keycb(MATRIX)).(type) { + switch cb := m.OptionCB(MATRIX).(type) { case func(string, *Matrix): cb(h, mat) } @@ -394,7 +394,7 @@ func init() { for stream := lex.NewStream(bytes.NewBufferString(m.Option(mdb.TEXT))); stream.Scan(); { hash, _ := mat.Parse(m, func(m *ice.Message, nhash string, hash int, word []string, begin int, stream *lex.Stream) (int, []string) { - switch cb := m.Optionv(kit.Keycb(MATRIX)).(type) { + switch cb := m.OptionCB(MATRIX).(type) { case func(string, int, []string, int, *lex.Stream) (int, []string): return cb(nhash, hash, word, begin, stream) } diff --git a/core/chat/node.go b/core/chat/node.go index 0d9cbdd9..c4b881b8 100644 --- a/core/chat/node.go +++ b/core/chat/node.go @@ -49,7 +49,7 @@ func init() { }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) == 0 { - m.Option(mdb.FIELDS, "time,type,name,share") + m.OptionFields("time,type,name,share") m.Cmdy(mdb.SELECT, RIVER, _river_key(m, NODE), mdb.HASH) m.Table(func(index int, value map[string]string, head []string) { m.PushAnchor(value[mdb.NAME], m.MergeURL2("/chat/pod/"+kit.Keys(m.Option(ice.POD), value[mdb.NAME]))) diff --git a/core/chat/room.go b/core/chat/room.go index f27317f1..d9797f8b 100644 --- a/core/chat/room.go +++ b/core/chat/room.go @@ -29,7 +29,7 @@ func init() { }}, mdb.INSERT: {Name: "insert zone type=hi name=hello text=world", Help: "发送", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, m.Prefix(ROOM), "", mdb.ZONE, m.Option(mdb.ZONE), arg[2:]) - m.Cmdy(mdb.SELECT, m.Prefix(ROOM), kit.KeyHash(m.Option(mdb.ZONE)), mdb.HASH, ice.Option{mdb.FIELDS, "time,space"}).Table(func(index int, value map[string]string, head []string) { + m.Cmdy(mdb.SELECT, m.Prefix(ROOM), kit.KeyHash(m.Option(mdb.ZONE)), mdb.HASH, ice.Option{"fields", "time,space"}).Table(func(index int, value map[string]string, head []string) { m.Cmdy(web.SPACE, value[web.SPACE], "toast", m.Option("text"), m.Option("name")) }) }}, diff --git a/core/code/install.go b/core/code/install.go index 05337d19..65f463ec 100644 --- a/core/code/install.go +++ b/core/code/install.go @@ -136,7 +136,7 @@ func _install_service(m *ice.Message, arg ...string) { m.Fields(len(arg[1:]), "time,port,status,pid,cmd,dir") m.Cmd(mdb.SELECT, cli.DAEMON, "", mdb.HASH).Table(func(index int, value map[string]string, head []string) { if strings.Contains(value[ice.CMD], "bin/"+arg[0]) { - m.Push("", value, kit.Split(m.Option(mdb.FIELDS))) + m.Push("", value, kit.Split(m.OptionFields())) } }) diff --git a/core/code/webpack.go b/core/code/webpack.go index 07969550..bec34940 100644 --- a/core/code/webpack.go +++ b/core/code/webpack.go @@ -24,8 +24,8 @@ const ( PAGE_INDEX_CSS = "page/index.css" PAGE_CACHE_JS = "page/cache.js" PAGE_INDEX_JS = "page/index.js" - PAGE_CMD_CSS = "page/cmd.css" - PAGE_CMD_JS = "page/cmd.js" + PAGE_CAN_CSS = "page/can.css" + PAGE_CAN_JS = "page/can.js" ) const DEVPACK = "devpack" @@ -97,15 +97,15 @@ func init() { m.Echo(p) } - m.Cmd(nfs.COPY, _volcanos(m, PAGE_CMD_CSS), _volcanos(m, PAGE_INDEX_CSS), _volcanos(m, PAGE_CACHE_CSS)) - m.Cmd(nfs.COPY, _volcanos(m, PAGE_CMD_JS), _volcanos(m, ice.PROTO_JS), _volcanos(m, PAGE_CACHE_JS)) + m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_CSS), _volcanos(m, PAGE_INDEX_CSS), _volcanos(m, PAGE_CACHE_CSS)) + m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_JS), _volcanos(m, ice.PROTO_JS), _volcanos(m, PAGE_CACHE_JS)) }}, mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { m.Cmd(nfs.SAVE, _volcanos(m, PAGE_CACHE_JS)) m.Cmd(nfs.SAVE, _volcanos(m, PAGE_CACHE_CSS)) - m.Cmd(nfs.COPY, _volcanos(m, PAGE_CMD_CSS), _volcanos(m, PAGE_INDEX_CSS), _volcanos(m, PAGE_CACHE_CSS)) - m.Cmd(nfs.COPY, _volcanos(m, PAGE_CMD_JS), _volcanos(m, ice.PROTO_JS), _volcanos(m, PAGE_CACHE_JS)) + m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_CSS), _volcanos(m, PAGE_INDEX_CSS), _volcanos(m, PAGE_CACHE_CSS)) + m.Cmd(nfs.COPY, _volcanos(m, PAGE_CAN_JS), _volcanos(m, ice.PROTO_JS), _volcanos(m, PAGE_CACHE_JS)) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Option(nfs.DIR_DEEP, true) diff --git a/core/mall/asset.go b/core/mall/asset.go index 96b272ea..29d6cbeb 100644 --- a/core/mall/asset.go +++ b/core/mall/asset.go @@ -27,7 +27,7 @@ func _sub_amount(m *ice.Message, arg []string) { func _asset_check(m *ice.Message, account string) { amount := 0 - m.Option(kit.Keycb(mdb.SELECT), func(key string, value map[string]interface{}) { + m.OptionCB(mdb.SELECT, func(key string, value map[string]interface{}) { amount += kit.Int(kit.Value(value, AMOUNT)) }) m.Cmd(mdb.SELECT, m.Prefix(ASSET), "", mdb.ZONE, account, ice.OptionFields(m.Config(mdb.FIELD))) @@ -37,8 +37,8 @@ func _asset_check(m *ice.Message, account string) { func _asset_insert(m *ice.Message, account string, arg ...string) { m.Cmdy(mdb.INSERT, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account) m.Cmdy(mdb.INSERT, m.Prefix(ASSET), "", mdb.ZONE, account, arg) - - amount := kit.Int(m.Cmd(mdb.SELECT, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account, ice.Option{mdb.FIELDS, "time,account,amount,count"}).Append(AMOUNT)) + m.OptionFields("time,account,amount,count") + amount := kit.Int(m.Cmd(mdb.SELECT, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account).Append(AMOUNT)) amount += kit.Int(_sub_value(m, AMOUNT, arg...)) m.Cmdy(mdb.MODIFY, m.Prefix(ASSET), "", mdb.HASH, ACCOUNT, account, AMOUNT, amount) } diff --git a/core/team/plan.go b/core/team/plan.go index f3236d5f..5125fe1c 100644 --- a/core/team/plan.go +++ b/core/team/plan.go @@ -42,7 +42,7 @@ func _plan_scope(m *ice.Message, tz int, arg ...string) (time.Time, time.Time) { func _plan_list(m *ice.Message, begin_time, end_time time.Time) *ice.Message { m.Option(ice.CACHE_LIMIT, "100") m.Fields(0, "begin_time,close_time,zone,id,level,status,score,type,name,text,pod,extra") - m.Option(kit.Keycb(mdb.SELECT), func(key string, fields []string, value, val map[string]interface{}) { + m.OptionCB(mdb.SELECT, func(key string, fields []string, value, val map[string]interface{}) { begin, _ := time.ParseInLocation(ice.MOD_TIME, kit.Format(value[BEGIN_TIME]), time.Local) if begin_time.After(begin) || begin.After(end_time) { return diff --git a/core/wiki/field.go b/core/wiki/field.go index 0266acd3..206eb800 100644 --- a/core/wiki/field.go +++ b/core/wiki/field.go @@ -42,6 +42,7 @@ func _field_show(m *ice.Message, name, text string, arg ...string) { name = strings.ReplaceAll(name, ice.SP, "_") meta[mdb.NAME], meta[mdb.INDEX] = name, text + msg := m.Spawn() // 扩展参数 for i := 0; i < len(arg)-1; i += 2 { @@ -63,6 +64,20 @@ func _field_show(m *ice.Message, name, text string, arg ...string) { case "content": meta[arg[i]] = arg[i+1] + case SPARK: + msg.Echo(strings.TrimSpace(arg[i+1])) + meta["msg"] = msg.FormatMeta() + + case TABLE: + ls := kit.Split(arg[i+1], ice.NL, ice.NL, ice.NL) + head := kit.Split(ls[0]) + for _, l := range ls[1:] { + for i, v := range kit.Split(l) { + msg.Push(head[i], v) + } + } + meta["msg"] = msg.FormatMeta() + case ARGS: args := kit.Simple(m.Optionv(arg[i])) diff --git a/core/wiki/word.go b/core/wiki/word.go index db7bd9fc..3f00603d 100644 --- a/core/wiki/word.go +++ b/core/wiki/word.go @@ -39,7 +39,8 @@ func init() { ice.DisplayLocal(""), ), Action: ice.MergeAction(map[string]*ice.Action{ mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(nfs.DIR, "src/", kit.Dict(nfs.DIR_DEEP, ice.TRUE, nfs.DIR_REG, ".*\\.shy"), "path,time") + m.Cmdy(nfs.DIR, "src/", kit.Dict(nfs.DIR_DEEP, ice.TRUE, nfs.DIR_REG, ".*\\.shy"), "path,line,time") + m.Cmdy(nfs.DIR, "src/help/", kit.Dict(nfs.DIR_DEEP, ice.TRUE, nfs.DIR_REG, ".*\\.shy"), "path,line,time") }}, web.STORY: {Name: "story", Help: "运行", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(arg[0], ctx.ACTION, ice.RUN, arg[2:]) diff --git a/misc.go b/misc.go index 244745c4..b3eaf212 100644 --- a/misc.go +++ b/misc.go @@ -16,7 +16,10 @@ func (m *Message) Length() (max int) { max = l } } - return max + if max > 0 { + return max + } + return len(m.Resultv()) } func (m *Message) CSV(text string, head ...string) *Message { bio := bytes.NewBufferString(text) @@ -94,8 +97,10 @@ func (m *Message) FieldsIsDetail() bool { return false } -func (m *Message) IsErr(str string) bool { return m.Result(1) == str } -func (m *Message) IsErrNotFound() bool { return m.Result(1) == ErrNotFound } +func (m *Message) IsErr(arg ...string) bool { + return len(arg) > 0 && m.Result(1) == arg[0] || m.Result(0) == ErrWarn +} +func (m *Message) IsErrNotFound() bool { return m.Result(1) == ErrNotFound } func (m *Message) OptionCB(key string, cb ...interface{}) interface{} { if len(cb) > 0 { return m.Optionv(kit.Keycb(key), cb...) @@ -197,7 +202,7 @@ func (m *Message) cmd(arg ...interface{}) *Message { ok := false run := func(msg *Message, ctx *Context, cmd *Command, key string, arg ...string) { if ok = true; cbs != nil { - msg.Option(kit.Keycb(kit.Slice(kit.Split(list[0], PT), -1)[0]), cbs) + msg.OptionCB(kit.Slice(kit.Split(list[0], PT), -1)[0], cbs) } for k, v := range opts { msg.Option(k, v) diff --git a/misc/input/wubi.go b/misc/input/wubi.go index c4ab80e6..6123bbb2 100644 --- a/misc/input/wubi.go +++ b/misc/input/wubi.go @@ -1,7 +1,13 @@ package input import ( + "strings" + "shylinux.com/x/ice" + "shylinux.com/x/icebergs/base/cli" + "shylinux.com/x/icebergs/base/ctx" + "shylinux.com/x/icebergs/base/mdb" + kit "shylinux.com/x/toolkits" ) type wubi struct { @@ -19,4 +25,22 @@ type wubi struct { list string `name:"list method=word,line code auto" help:"五笔"` } -func init() { ice.Cmd("web.code.input.wubi", wubi{}) } +func (w wubi) Input(m *ice.Message, arg ...string) { + if arg[0] = strings.TrimSpace(arg[0]); strings.HasPrefix(arg[0], "ice") { + switch list := kit.Split(arg[0]); list[1] { + case "add": // ice add 想你 shwq [person [9999]] + m.Cmd(w, ctx.ACTION, mdb.INSERT, mdb.TEXT, list[2], cli.CODE, list[3], + mdb.ZONE, kit.Select("person", list, 4), mdb.VALUE, kit.Select("999999", list, 5), + ) + m.Echo(list[3] + ice.NL) + } + return + } + + m.Option(ice.CACHE_LIMIT, "10") + m.Cmd(w, "word", arg[0]).Table(func(index int, value map[string]string, head []string) { + m.Echo(value[mdb.TEXT] + ice.NL) + }) +} + +func init() { ice.CodeCtxCmd(wubi{}) } diff --git a/misc/ssh/connect.go b/misc/ssh/connect.go index 92d5cc20..6b862922 100644 --- a/misc/ssh/connect.go +++ b/misc/ssh/connect.go @@ -138,7 +138,7 @@ func _ssh_conn(m *ice.Message, cb func(*ssh.Client), arg ...string) { return m.Option(aaa.PASSWORD), nil })) - m.Option(kit.Keycb(tcp.CLIENT), func(c net.Conn) { + m.OptionCB(tcp.CLIENT, func(c net.Conn) { conn, chans, reqs, err := ssh.NewClientConn(c, m.Option(tcp.HOST)+":"+m.Option(tcp.PORT), &ssh.ClientConfig{ User: m.Option(aaa.USERNAME), Auth: methods, BannerCallback: func(message string) error { return nil }, HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error { return nil }, diff --git a/misc/ssh/service.go b/misc/ssh/service.go index 936ebbd4..92c47905 100644 --- a/misc/ssh/service.go +++ b/misc/ssh/service.go @@ -123,7 +123,7 @@ func init() { m.Cmd(SERVICE, mdb.IMPORT, AUTHKEY, m.Option(AUTHKEY)) } - m.Option(kit.Keycb(tcp.SERVER), func(c net.Conn) { m.Go(func() { _ssh_accept(m, kit.Hashs(m.Option(tcp.PORT)), c) }) }) + m.OptionCB(tcp.SERVER, func(c net.Conn) { m.Go(func() { _ssh_accept(m, kit.Hashs(m.Option(tcp.PORT)), c) }) }) m.Go(func() { m.Cmdy(tcp.SERVER, tcp.LISTEN, mdb.TYPE, SSH, mdb.NAME, tcp.PORT, tcp.PORT, m.Option(tcp.PORT)) }) diff --git a/misc/vim/input.go b/misc/vim/input.go index aa8abcd6..3a7ef650 100644 --- a/misc/vim/input.go +++ b/misc/vim/input.go @@ -5,6 +5,7 @@ import ( ice "shylinux.com/x/icebergs" "shylinux.com/x/icebergs/base/cli" + "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/mdb" kit "shylinux.com/x/toolkits" ) @@ -13,46 +14,29 @@ const INPUT = "input" func init() { Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ - INPUT: {Name: INPUT, Help: "输入法", Value: kit.Data( - mdb.FIELD, "time,id,type,name,text", - )}, + INPUT: {Name: INPUT, Help: "输入法", Value: kit.Data(mdb.FIELD, "time,id,type,name,text")}, }, Commands: map[string]*ice.Command{ "/input": {Name: "/input", Help: "输入法", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if m.Cmdy(TAGS, arg[0]); len(m.Result()) > 0 { + if m.Cmdy(TAGS, ctx.ACTION, INPUT, arg[0], m.Option("pre")); m.Length() > 0 { + m.Cmd(m.PrefixKey(), mdb.INSERT, kit.SimpleKV("", "tags", arg[0], m.Result())) return // 代码补全 } - - if arg[0] = strings.TrimSpace(arg[0]); strings.HasPrefix(arg[0], "ice ") { - switch list := kit.Split(arg[0]); list[1] { - case "add": // ice add 想你 shwq [person [9999]] - m.Cmd("web.code.input.wubi", mdb.INSERT, mdb.TEXT, list[2], cli.CODE, list[3], - mdb.ZONE, kit.Select("person", list, 4), mdb.VALUE, kit.Select("999999", list, 5), - ) - arg[0] = list[3] - default: // 执行命令 - if m.Cmdy(list[1:]); strings.TrimSpace(m.Result()) == "" { - m.Table() - } - if strings.TrimSpace(m.Result()) == "" { - m.Cmdy(cli.SYSTEM, list[1:]) - } - m.Cmd(INPUT, mdb.INSERT, mdb.TYPE, "cmd", mdb.NAME, strings.TrimSpace(strings.Join(list[1:], ice.SP)), mdb.TEXT, m.Result()) - m.Echo("%s\n", arg[0]) - return - } + if m.Cmdy("web.code.input.wubi", ctx.ACTION, INPUT, arg[0]); m.Length() > 0 { + m.Cmd(m.PrefixKey(), mdb.INSERT, kit.SimpleKV("", "wubi", arg[0], m.Result())) + return // 五笔输入 + } + if arg[0] = strings.TrimSpace(arg[0]); strings.HasPrefix(arg[0], "ice") { + list := kit.Split(arg[0]) + if m.Cmdy(list[1:]); m.IsErrNotFound() { + m.SetResult().Cmdy(cli.SYSTEM, list[1:]) + } + if len(m.Resultv()) == 0 { + m.Table() + } + m.Cmd(m.PrefixKey(), mdb.INSERT, kit.SimpleKV("", "cmds", strings.TrimSpace(strings.Join(list[1:], ice.SP)), m.Result())) + return // 本地命令 } - - // 词汇列表 - m.Option(ice.CACHE_LIMIT, "10") - m.Cmd("web.code.input.wubi", "word", arg[0]).Table(func(index int, value map[string]string, head []string) { - m.Echo("%s\n", value[mdb.TEXT]) - }) - m.Cmd(INPUT, mdb.INSERT, mdb.TYPE, "wubi", mdb.NAME, arg[0], mdb.TEXT, m.Result()) - }}, - INPUT: {Name: "input id auto export import", Help: "输入法", Action: ice.MergeAction(map[string]*ice.Action{ - mdb.INSERT: {}, - }, mdb.ListAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - mdb.ListSelect(m, arg...) }}, + INPUT: {Name: "input id auto export import", Help: "输入法", Action: mdb.ListAction()}, }}) } diff --git a/misc/vim/tags.go b/misc/vim/tags.go index a1f4e724..c1cce54e 100644 --- a/misc/vim/tags.go +++ b/misc/vim/tags.go @@ -14,64 +14,68 @@ import ( const TAGS = "tags" func init() { + const ( + MODULE = "module" + PATTERN = "pattern" + + ONIMPORT = "onimport" + ONACTION = "onaction" + ONEXPORT = "onexport" + + defs_pattern = "4\n%s\n/\\<%s: /\n" + func_pattern = "4\n%s\n/\\<%s: \\(shy\\|func\\)/\n" + libs_pattern = "4\nusr/volcanos/lib/%s.js\n/\\<%s: \\(shy\\|func\\)/\n" + ) Index.Merge(&ice.Context{Configs: map[string]*ice.Config{ TAGS: {Name: TAGS, Help: "索引", Value: kit.Data( - mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,id,type,name,text,file,line", + mdb.SHORT, mdb.ZONE, mdb.FIELD, "time,id,type,name,text,path,file,line", )}, }, Commands: map[string]*ice.Command{ "/tags": {Name: "/tags", Help: "跳转", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - switch m.Option("module") { - case "onimport", "onaction", "onexport": - m.Echo("4\n%s\n/\\<%s: \\(shy\\|func\\)/\n", m.Option(BUF), m.Option("pattern")) - case "msg": - m.Echo("4\nusr/volcanos/lib/%s.js\n/\\<%s: \\(shy\\|func\\)/\n", "misc", m.Option("pattern")) + switch m.Option(MODULE) { + case ONIMPORT, ONACTION, ONEXPORT: + m.Echo(func_pattern, m.Option(BUF), m.Option(PATTERN)) + case "msg", "res": + m.Echo(libs_pattern, ice.MISC, m.Option(PATTERN)) default: - if mdb.ZoneSelect(m, m.Option("module")); m.Length() > 0 { - switch m.Append(mdb.TYPE) { - case "function": - m.Echo("4\nusr/volcanos%s\n/\\<%s: \\(shy\\|func\\)/\n", m.Append(nfs.FILE), m.Option("pattern")) - default: - m.Echo("4\nusr/volcanos%s\n/\\<%s: /\n", m.Append(nfs.FILE), m.Option("pattern")) + if mdb.ZoneSelectCB(m, m.Option(MODULE), func(value map[string]string) { + if value[mdb.NAME] == m.Option(PATTERN) { + m.Echo(kit.Select(defs_pattern, func_pattern, value[mdb.TYPE] == "function"), + path.Join(value[nfs.PATH], value[nfs.FILE]), m.Option(PATTERN)) } - return + }); m.Length() == 0 { + m.Echo(defs_pattern, "usr/volcanos/proto.js", m.Option(PATTERN)) } - m.Echo("4\n%s\n/\\<%s: /\n", "usr/volcanos/proto.js", m.Option("pattern")) } }}, TAGS: {Name: "tags zone id auto", Help: "索引", Action: ice.MergeAction(map[string]*ice.Action{ - mdb.INSERT: {Name: "insert zone=core type name=hi text=hello file line", Help: "添加"}, - code.INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) { - m.ProcessCommand(code.INNER, []string{ - kit.Select(ice.PWD, path.Dir(m.Option(nfs.FILE))), - path.Base(m.Option(nfs.FILE)), - m.Option(nfs.LINE), - }, arg...) - }}, "listTags": {Name: "listTags", Help: "索引", Hand: func(m *ice.Message, arg ...string) { - kit.Fetch(kit.UnMarshal(m.Option("content")), func(index int, value map[string]interface{}) { + kit.Fetch(kit.UnMarshal(m.Option(mdb.TEXT)), func(index int, value map[string]interface{}) { m.Cmd(TAGS, mdb.INSERT, mdb.ZONE, value[mdb.ZONE], kit.Simple(value)) }) - m.ProcessRefresh30ms() + m.ProcessRefresh300ms() }}, - }, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(ice.CACHE_LIMIT, "-1") - if mdb.ZoneSelect(m, arg...); len(arg) == 0 { - m.Action("listTags", mdb.CREATE, mdb.EXPORT, mdb.IMPORT) - } else { - if m.IsCliUA() { - if m.Length() == 0 { + mdb.INSERT: {Name: "insert zone=core type name=hi text=hello path file line", Help: "添加"}, + code.INNER: {Name: "inner", Help: "源码", Hand: func(m *ice.Message, arg ...string) { + m.ProcessCommand(code.INNER, m.OptionSplit("path,file,line"), arg...) + }}, + INPUT: {Name: "input name text", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + mdb.ZoneSelectCB(m, kit.Slice(kit.Split(m.Option(mdb.TEXT), ice.PT), -1)[0], func(value map[string]string) { + if !strings.Contains(value[mdb.NAME], m.Option(mdb.NAME)) { return } - m.Sort(mdb.NAME) - m.Echo("func\n").Table(func(index int, value map[string]string, head []string) { - m.Echo(arg[0] + ice.PT + value[mdb.NAME] + ice.NL) - m.Echo("%s: %s: %s // %s\n", value[mdb.TYPE], value[mdb.NAME], strings.Split(value[mdb.TEXT], ice.NL)[0], value[nfs.FILE]) - }) - return - } - m.Action(mdb.INSERT) - m.PushAction(code.INNER) - m.StatusTimeCount() + if m.Length() == 0 { + m.Echo("func" + ice.NL) + } + m.Echo(value[mdb.NAME] + ice.NL) + m.Echo("%s: %s"+ice.NL, value[mdb.NAME], strings.Split(value[mdb.TEXT], ice.NL)[0]) + }) + }}, + }, mdb.ZoneAction()), Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if mdb.ZoneSelectAll(m, arg...); len(arg) == 0 { + m.Action("listTags", mdb.CREATE, mdb.EXPORT, mdb.IMPORT) + } else { + m.Action(mdb.INSERT).PushAction(code.INNER).StatusTimeCount() } }}, }}) diff --git a/option.go b/option.go index 30798758..f53c0864 100644 --- a/option.go +++ b/option.go @@ -96,7 +96,7 @@ func (m *Message) Upload(dir string) { m.Cmdy(SPIDE, DEV, SAVE, p, "GET", m.MergeURL2(path.Join("/share/cache", up[0]))) } } -func (m *Message) Action(arg ...interface{}) { +func (m *Message) Action(arg ...interface{}) *Message { for i, v := range arg { switch v.(type) { case string: @@ -105,6 +105,7 @@ func (m *Message) Action(arg ...interface{}) { } } m.Option(MSG_ACTION, kit.Format(arg)) + return m } func (m *Message) Status(arg ...interface{}) { list := kit.List() diff --git a/render.go b/render.go index fabecbf5..54e07ccf 100644 --- a/render.go +++ b/render.go @@ -93,11 +93,11 @@ func (m *Message) RenderCmd(index string, args ...interface{}) { - + - - + + `, list)) } @@ -149,11 +149,12 @@ func (m *Message) PushDownload(key string, arg ...interface{}) { // [name] file } } -func (m *Message) PushAction(list ...interface{}) { +func (m *Message) PushAction(list ...interface{}) *Message { m.Set(MSG_APPEND, ACTION) m.Table(func(index int, value map[string]string, head []string) { m.PushButton(list...) }) + return m } func (m *Message) PushPodCmd(cmd string, arg ...string) { if m.Length() > 0 && len(m.Appendv(POD)) == 0 {