From 27938bc30dfe54e438c8a9a8c121be362d8bd3d2 Mon Sep 17 00:00:00 2001 From: shaoying Date: Sat, 12 Sep 2020 18:12:21 +0800 Subject: [PATCH] opt code --- .gitignore | 1 + base/ctx/cmd.go | 48 -------- base/mdb/mdb.go | 6 + base/nfs/nfs.go | 3 + base/web/route.go | 2 +- base/web/serve.go | 18 ++- base/web/spide.go | 5 + core/code/code.go | 199 ++------------------------------- core/code/inner.go | 22 +--- core/code/install.go | 99 +++++----------- core/code/publish.go | 40 +++++++ core/code/trash.go | 188 +++++++++++++++++++++++++++++++ core/code/vimer.go | 37 ++++++ core/{code => wiki}/qrcode.go | 4 +- core/{code => wiki}/video.go | 4 +- core/wiki/word.go | 33 +++--- misc/git/git.go | 7 -- misc/vim/favor.go | 2 +- misc/zsh/bash.go | 11 +- misc/zsh/bash.shy | 16 ++- misc/zsh/favor.go | 88 ++++++++++----- misc/zsh/input.go | 10 +- misc/zsh/sess.go | 79 +++++++++++++ misc/zsh/sync.go | 59 ++++------ misc/zsh/trash.go | 33 ++++++ misc/zsh/{auto.sh => trash.sh} | 0 misc/zsh/zsh.go | 59 +--------- misc/zsh/zsh.shy | 16 +-- type.go | 88 +++++++++------ 29 files changed, 633 insertions(+), 544 deletions(-) create mode 100644 core/code/trash.go create mode 100644 core/code/vimer.go rename core/{code => wiki}/qrcode.go (96%) rename core/{code => wiki}/video.go (95%) create mode 100644 misc/zsh/sess.go create mode 100644 misc/zsh/trash.go rename misc/zsh/{auto.sh => trash.sh} (100%) diff --git a/.gitignore b/.gitignore index 180e8921..4a03b309 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ pack/ # Output of the go coverage tool, specifically when used with LiteIDE *.out +*.log # Dependency directories (remove the comment below to include it) # vendor/ diff --git a/base/ctx/cmd.go b/base/ctx/cmd.go index 1ff678e2..36dd9544 100644 --- a/base/ctx/cmd.go +++ b/base/ctx/cmd.go @@ -20,9 +20,6 @@ func _command_list(m *ice.Message, all bool, name string) { m.Push("name", kit.Format(cmd.Name)) m.Push("help", kit.Simple(cmd.Help)[0]) m.Push("meta", kit.Format(cmd.Meta)) - if len(cmd.List) == 0 { - _command_make(m, cmd) - } m.Push("list", kit.Format(cmd.List)) }) return @@ -45,51 +42,6 @@ func _command_list(m *ice.Message, all bool, name string) { m.Push("help", kit.Simple(v.Help)[0]) } } -func _command_make(m *ice.Message, cmd *ice.Command) { - var list []string - switch name := cmd.Name.(type) { - case []string, []interface{}: - list = kit.Split(kit.Simple(name)[0]) - default: - list = kit.Split(strings.Split(kit.Format(name), ";")[0]) - } - - button := false - for i, v := range list { - if i == 0 { - continue - } - switch ls := kit.Split(v, ":="); ls[0] { - case "[", "]": - case "auto": - cmd.List = append(cmd.List, kit.List(kit.MDB_INPUT, "button", "name", "查看", "value", "auto")...) - cmd.List = append(cmd.List, kit.List(kit.MDB_INPUT, "button", "name", "返回", "value", "Last")...) - button = true - default: - kind, value := kit.Select("text", "button", button), "" - if len(ls) == 3 { - kind, value = ls[1], ls[2] - } else if len(ls) == 2 { - if strings.Contains(v, "=") { - value = ls[1] - } else { - kind = ls[1] - } - } - if kind == "button" { - button = true - } - cmd.List = append(cmd.List, kit.List(kit.MDB_INPUT, kind, "name", ls[0], "value", value)...) - } - } - if len(cmd.List) == 0 { - cmd.List = append(cmd.List, kit.List(kit.MDB_INPUT, "text", "name", "path")...) - } - if !button { - cmd.List = append(cmd.List, kit.List(kit.MDB_INPUT, "button", "name", "查看")...) - cmd.List = append(cmd.List, kit.List(kit.MDB_INPUT, "button", "name", "返回")...) - } -} const COMMAND = "command" diff --git a/base/mdb/mdb.go b/base/mdb/mdb.go index 40a37e57..fe317078 100644 --- a/base/mdb/mdb.go +++ b/base/mdb/mdb.go @@ -35,6 +35,9 @@ func _hash_select(m *ice.Message, prefix, key, field, value string) { } fields := strings.Split(kit.Select("time,hash,type,name,text", m.Option(FIELDS)), ",") m.Richs(prefix, key, value, func(key string, val map[string]interface{}) { + if val[kit.MDB_META] != nil { + val = val[kit.MDB_META].(map[string]interface{}) + } if field != "" && field != kit.MDB_HASH && value != val[field] && value != kit.MDB_FOREACH { return } @@ -149,6 +152,9 @@ func _list_select(m *ice.Message, prefix, key, field, value string) { } m.Push("", val, fields, val[kit.MDB_META]) }) + if m.Option(FIELDS) != "detail" { + m.Sort(kit.MDB_ID, "int_r") + } } func _list_modify(m *ice.Message, prefix, key string, field, value string, arg ...string) { m.Grows(prefix, key, field, value, func(index int, value map[string]interface{}) { diff --git a/base/nfs/nfs.go b/base/nfs/nfs.go index 569ab10a..b578cf1e 100644 --- a/base/nfs/nfs.go +++ b/base/nfs/nfs.go @@ -218,6 +218,9 @@ func _file_copy(m *ice.Message, name string, from ...string) { } } func _file_link(m *ice.Message, name string, from string) { + if from == "" { + return + } os.MkdirAll(path.Dir(name), 0760) os.Remove(name) os.Link(from, name) diff --git a/base/web/route.go b/base/web/route.go index bfd1888a..49e5a5fe 100644 --- a/base/web/route.go +++ b/base/web/route.go @@ -47,7 +47,7 @@ func init() { ROUTE: {Name: ROUTE, Help: "路由器", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ROUTE)}, }, Commands: map[string]*ice.Command{ - ROUTE: {Name: "route route=auto cmd=@key auto 启动 添加", Help: "路由", Action: map[string]*ice.Action{ + ROUTE: {Name: "route route cmd auto 启动 添加", Help: "路由", Action: map[string]*ice.Action{ "invite": {Name: "invite", Help: "添加", Hand: func(m *ice.Message, arg ...string) { m.Cmdy("web.code.install", "contexts", "base") }}, diff --git a/base/web/serve.go b/base/web/serve.go index 996f2e8b..f6df33ac 100644 --- a/base/web/serve.go +++ b/base/web/serve.go @@ -14,6 +14,7 @@ import ( "net/http" "net/url" "os" + "path" "strings" ) @@ -177,6 +178,11 @@ func _serve_main(m *ice.Message, w http.ResponseWriter, r *http.Request) bool { m.Info(" ") }() } + + if r.URL.Path == "/" && strings.Contains(r.Header.Get("User-Agent"), "curl") { + http.ServeFile(w, r, path.Join(m.Conf(SERVE, "meta.intshell.path"), m.Conf(SERVE, "meta.intshell.index"))) + return false + } } if strings.HasPrefix(r.URL.Path, "/debug") { @@ -243,11 +249,15 @@ func init() { "publish", true, ), + "intshell", kit.Dict( + "path", "usr/intshell", "index", "index.sh", "require", ".ish/pluged", + "repos", "https://github.com/shylinux/volcanos", "branch", "master", + ), + "static", kit.Dict("/", "usr/volcanos/"), - "volcanos", kit.Dict("path", "usr/volcanos", "branch", "master", - "repos", "https://github.com/shylinux/volcanos", - "require", ".ish/pluged", - "refresh", "5", + "volcanos", kit.Dict("refresh", "5", + "path", "usr/volcanos", "require", ".ish/pluged", + "repos", "https://github.com/shylinux/volcanos", "branch", "master", ), "page", kit.Dict( "index", "usr/volcanos/page/index.html", "share", "usr/volcanos/page/share.html", diff --git a/base/web/spide.go b/base/web/spide.go index f6fc1f87..176447e3 100644 --- a/base/web/spide.go +++ b/base/web/spide.go @@ -2,6 +2,7 @@ package web import ( ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/tcp" kit "github.com/shylinux/toolkits" @@ -203,6 +204,10 @@ func init() { // 请求地址 uri, arg := arg[0], arg[1:] + if strings.HasPrefix(uri, "ftp") { + m.Cmdy(cli.SYSTEM, "wget", uri) + return + } // if n := m.Cmd("spide_rewrite", uri).Append("to"); n != "" && n != uri { // m.Logs("rewrite", "from", uri, "to", n) // uri = n diff --git a/core/code/code.go b/core/code/code.go index ed2a9b1a..bb151c2f 100644 --- a/core/code/code.go +++ b/core/code/code.go @@ -1,210 +1,27 @@ package code import ( - "net/http" - ice "github.com/shylinux/icebergs" - "github.com/shylinux/icebergs/base/cli" - "github.com/shylinux/icebergs/base/mdb" - "github.com/shylinux/icebergs/base/nfs" "github.com/shylinux/icebergs/base/web" - kit "github.com/shylinux/toolkits" - - "net/url" - "os" - "path" - "runtime" - "strings" ) -const ( - VEDIO = "vedio" - QRCODE = "qrcode" -) +const CODE = "code" -const ( // CODE - // INSTALL = "_install" - PREPARE = "_prepare" - PROJECT = "_project" -) - -var Index = &ice.Context{Name: "code", Help: "编程中心", - Configs: map[string]*ice.Config{ - "_install": {Name: "install", Help: "安装", Value: kit.Data( - "path", "usr/install", "target", "usr/local", - "linux", "https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz", - "darwin", "https://dl.google.com/go/go1.14.6.darwin-amd64.tar.gz", - "windows", "https://golang.google.cn/dl/go1.14.6.windows-amd64.zip", - )}, - PREPARE: {Name: "prepare", Help: "配置", Value: kit.Data("path", "usr/prepare", - "script", ".ish/pluged/golang/init.sh", "export", kit.Dict( - "GOPROXY", "https://goproxy.cn,direct", - "GOPRIVATE", "https://github.com", - ), - )}, - PROJECT: {Name: "project", Help: "项目", Value: kit.Data("path", "usr/project")}, - - "login": {Name: "login", Help: "终端接入", Value: kit.Data()}, - }, +var Index = &ice.Context{Name: CODE, Help: "编程中心", + Configs: map[string]*ice.Config{}, Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Load() - m.Cmd(mdb.ENGINE, mdb.CREATE, BENCH) - m.Conf(INSTALL, "meta.contexts", _contexts) - }}, - ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Save(INSTALL) - }}, - - "_install": {Name: "install url 安装:button", Help: "安装", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - target := m.Conf("_install", kit.Keys("meta", runtime.GOOS)) - - p := path.Join(m.Conf("_install", "meta.path"), path.Base(target)) - if _, e := os.Stat(p); e != nil { - // 下载 - msg := m.Cmd(web.SPIDE, "dev", web.CACHE, http.MethodGet, target) - m.Cmd(web.CACHE, web.WATCH, msg.Append(web.DATA), p) - } - - os.MkdirAll(m.Conf("_install", kit.Keys("meta.target")), ice.MOD_DIR) - m.Cmdy(cli.SYSTEM, "tar", "xvf", p, "-C", m.Conf("_install", kit.Keys("meta.target"))) - }}, - PREPARE: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - export := []string{} - kit.Fetch(m.Confv(PREPARE, "meta.export"), func(key string, val string) { - export = append(export, key+"="+val) - }) - - m.Cmd(nfs.SAVE, m.Conf(PREPARE, "meta.script"), kit.Format(` -export GOROOT=%s GOPATH=%s:$GOPATH GOBIN=%s -export PATH=$GOBIN:$GOROOT/bin:$PATH -export %s -`, kit.Path(m.Conf("_install", kit.Keys("meta.target")), "go"), kit.Path("src"), kit.Path("bin"), strings.Join(export, " "))) - }}, - PROJECT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - }}, - - "login": {Name: "login key", Help: "登录", Meta: kit.Dict( - "detail", []string{"编辑", "删除", "清理", "清空"}, - ), Action: map[string]*ice.Action{}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) > 0 && arg[0] == "action" { - switch arg[1] { - case "modify", "编辑": - m.Richs(cmd, nil, m.Option("key"), func(key string, value map[string]interface{}) { - m.Logs(ice.LOG_MODIFY, cmd, key, "field", arg[2], "value", kit.Value(value, arg[2]), "->", arg[3]) - kit.Value(value, arg[2], arg[3]) - }) - - case "delete", "删除": - m.Logs(ice.LOG_DELETE, cmd, m.Option("key"), "value", m.Conf(cmd, kit.Keys(kit.MDB_HASH, m.Option("key")))) - m.Conf(cmd, kit.Keys(kit.MDB_HASH, m.Option("key")), "") - - case "prune", "清理": - m.Cmdy(cmd, "prune") - - case "clear", "清空": - m.Cmdy(cmd, "prune", "all") - } - return - } - - switch kit.Select("list", arg, 0) { - case "init": - if m.Option("sid") != "" && m.Conf(cmd, []string{kit.MDB_HASH, m.Option("sid"), "status"}) != "" { - // 复用会话 - m.Conf(cmd, []string{kit.MDB_HASH, m.Option("sid"), "status"}, "login") - m.Logs(ice.LOG_AUTH, "sid", m.Option("sid")) - m.Echo(m.Option("sid")) - return - } - - you := m.Conf(web.SHARE, kit.Keys(kit.MDB_HASH, m.Option("share"), "name")) - // 添加会话 - h := m.Rich(cmd, nil, kit.Dict( - "type", kit.Select("zsh", arg, 1), - "status", "login", - "you", you, - "pwd", m.Option("pwd"), - "pid", m.Option("pid"), - "pane", m.Option("pane"), - "hostname", m.Option("hostname"), - "username", m.Option("username"), - )) - m.Logs(ice.LOG_AUTH, "sid", h, "you", you) - m.Echo(h) - - case "exit": - // 退出会话 - m.Richs(cmd, nil, m.Option("sid"), func(key string, value map[string]interface{}) { - m.Logs(ice.LOG_AUTH, "sid", m.Option("sid")) - value["status"] = "logout" - m.Echo(key) - }) - - case "prune": - list := []string{} - m.Richs(cmd, nil, "*", func(key string, value map[string]interface{}) { - if len(arg) > 1 && arg[1] == "all" || value["status"] == "logout" { - list = append(list, key) - } - }) - - // 清理会话 - kit.Fetch(list, func(index int, value string) { - m.Logs(ice.LOG_DELETE, "login", value, "value", m.Conf(cmd, kit.Keys(kit.MDB_HASH, value))) - m.Conf(cmd, kit.Keys(kit.MDB_HASH, value), "") - }) - m.Echo("%d", len(list)) - - case "list": - // 会话列表 - m.Richs("login", nil, "*", func(key string, value map[string]interface{}) { - m.Push(key, value, []string{"time", "key", "type", "status", "you"}) - pwd := strings.Split(kit.Format(value["pwd"]), "/") - if len(pwd) > 3 { - m.Push("pwd", strings.Join(pwd[len(pwd)-3:len(pwd)], "/")) - } else { - m.Push("pwd", value["pwd"]) - } - m.Push(key, value, []string{"pid", "pane", "hostname", "username"}) - }) - - default: - // 会话详情 - m.Richs(cmd, nil, arg[0], func(key string, value map[string]interface{}) { - m.Push("detail", value) - }) - } - }}, - - "/miss/": {Name: "/miss/", Help: "任务", Action: map[string]*ice.Action{ - "pwd": {Name: "pwd", Help: "pwd", Hand: func(m *ice.Message, arg ...string) { - m.Render(ice.RENDER_RESULT) - m.Echo("hello world\n") - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - u, e := url.QueryUnescape(m.Option("arg")) - m.Assert(e) - args := kit.Split(u) - if len(arg) == 0 || arg[0] == "" { - return - } - - m.Render(ice.RENDER_RESULT) - if m.Cmdy(arg, args); len(m.Resultv()) == 0 { - m.Table() - } + m.Conf(PUBLISH, "meta.contexts", _contexts) }}, + ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Save() }}, }, } func init() { web.Index.Register(Index, &web.Frame{}, - INSTALL, - COMPILE, - UPGRADE, - PUBLISH, - BENCH, - PPROF, + INSTALL, COMPILE, PUBLISH, UPGRADE, + INNER, VIMER, BENCH, PPROF, + C, SH, GO, SHY, JS, ) } diff --git a/core/code/inner.go b/core/code/inner.go index 90e36526..cf31f215 100644 --- a/core/code/inner.go +++ b/core/code/inner.go @@ -46,10 +46,7 @@ func _vimer_save(m *ice.Message, ext, file, dir string, text string) { } } -const ( - INNER = "inner" - VIMER = "vimer" -) +const INNER = "inner" func init() { Index.Merge(&ice.Context{ @@ -84,23 +81,6 @@ func init() { } _inner_list(m, _inner_ext(arg[1]), arg[1], arg[0]) }}, - VIMER: {Name: "vimer path=usr/demo file=hi.sh line=1 刷新:button=auto 保存:button 运行:button 项目:button", Help: "编辑器", Meta: kit.Dict( - "display", "/plugin/local/code/vimer.js", "style", "editor", - ), Action: map[string]*ice.Action{ - web.UPLOAD: {Name: "upload path name", Help: "上传", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(web.CACHE, web.UPLOAD) - m.Cmdy(web.CACHE, web.WATCH, m.Option(web.DATA), path.Join(m.Option("path"), m.Option("name"))) - }}, - nfs.SAVE: {Name: "save type file path", Help: "保存", Hand: func(m *ice.Message, arg ...string) { - _vimer_save(m, arg[0], arg[1], arg[2], m.Option("content")) - }}, - - "cmd": {Name: "cmd type file path", Help: "命令", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(arg) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmdy(INNER, arg) - }}, }, Configs: map[string]*ice.Config{ INNER: {Name: "inner", Help: "阅读器", Value: kit.Data( diff --git a/core/code/install.go b/core/code/install.go index 1be6b08a..eb49a790 100644 --- a/core/code/install.go +++ b/core/code/install.go @@ -9,37 +9,11 @@ import ( "github.com/shylinux/icebergs/base/web" kit "github.com/shylinux/toolkits" - "fmt" "os" "path" "strings" ) -var _contexts = kit.Dict( - "tmux", ` -# 终端环境 -curl -fLo /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo && yum -y update -yum install -y tmux vim -`, - "base", ` -# 生产环境 -mkdir contexts; cd contexts -export ctx_dev={{.Option "httphost"}} ctx_log=/dev/stdout; curl $ctx_dev/publish/ice.sh |sh -bin/ice.sh`, - "miss", ` -# 开发环境 -yum install -y make git go -mkdir ~/.ssh &>/dev/null; touch ~/.ssh/config; [ -z "$(cat ~/.ssh/config|grep 'HOST {{.Option "hostname"}}')" ] && echo -e "HOST {{.Option "hostname"}}\n Port 9030" >> ~/.ssh/config -export ISH_CONF_HUB_PROXY={{.Option "userhost"}}:.ish/pluged/ -git clone $ISH_CONF_HUB_PROXY/github.com/shylinux/contexts && cd contexts -source etc/miss.sh - -touch ~/.gitconfig; [ -z "$(cat ~/.gitconfig|grep '\[url \"{{.Option "userhost"}}')" ] && echo -e "[url \"{{.Option "userhost"}}:ish/pluged/\"]\n insteadOf=\"https://github.com/\"\n" >> ~/.gitconfig -git clone https://github.com/shylinux/contexts && cd contexts -source etc/miss.sh -`, -) - const INSTALL = "install" func init() { @@ -47,39 +21,32 @@ func init() { Configs: map[string]*ice.Config{ INSTALL: {Name: INSTALL, Help: "安装", Value: kit.Data( kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_PATH, "usr/install", - "contexts", _contexts, + kit.MDB_FIELD, "time,step,size,total,name,link", )}, }, Commands: map[string]*ice.Command{ - INSTALL: {Name: "install name=auto port=auto path=auto auto", Help: "安装", Meta: kit.Dict(), Action: map[string]*ice.Action{ - "contexts": {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) { - u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) - m.Option("httphost", fmt.Sprintf("%s://%s:%s", u.Scheme, strings.Split(u.Host, ":")[0], kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ":"), 1))) - m.Option("hostport", fmt.Sprintf("%s:%s", strings.Split(u.Host, ":")[0], kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ":"), 1))) - m.Option("hostname", strings.Split(u.Host, ":")[0]) - - m.Option("userhost", fmt.Sprintf("%s@%s", m.Option(ice.MSG_USERNAME), strings.Split(u.Host, ":")[0])) - m.Option("hostpath", kit.Path("./.ish/pluged")) - - if buf, err := kit.Render(m.Conf(INSTALL, kit.Keys("meta.contexts", kit.Select("base", arg, 0))), m); m.Assert(err) { - m.Cmdy("web.wiki.spark", "shell", string(buf)) - } - }}, + INSTALL: {Name: "install name port path auto", Help: "安装", Meta: kit.Dict(), Action: map[string]*ice.Action{ "download": {Name: "download link", Help: "下载", Hand: func(m *ice.Message, arg ...string) { name := path.Base(arg[0]) - if m.Richs(INSTALL, "", name, func(key string, value map[string]interface{}) { - if _, e := os.Stat(path.Join(m.Conf(INSTALL, kit.META_PATH), kit.Format(value[kit.MDB_NAME]))); e == nil { - m.Push(key, value, []string{kit.MDB_TIME, kit.MDB_STEP, kit.MDB_SIZE, kit.MDB_TOTAL, kit.MDB_NAME, kit.MDB_LINK}) - m.Option("_process", "_progress") + p := path.Join(m.Conf(INSTALL, kit.META_PATH), name) + + m.Option("_process", "_progress") + m.Option(mdb.FIELDS, m.Conf(INSTALL, kit.META_FIELD)) + if m.Cmd(mdb.SELECT, m.Prefix(INSTALL), "", mdb.HASH, kit.MDB_NAME, name).Table(func(index int, value map[string]string, head []string) { + if _, e := os.Stat(p); e == nil { + m.Push("", value, kit.Split(m.Option(mdb.FIELDS))) } - }) != nil && len(m.Appendv(kit.MDB_NAME)) > 0 { - // 已经下载 - return + }); len(m.Appendv(kit.MDB_NAME)) > 0 { + return // 已经下载 } + // 占位 + m.Cmd(nfs.SAVE, p, "") + // 进度 m.Cmd(mdb.INSERT, m.Prefix(INSTALL), "", mdb.HASH, kit.MDB_NAME, name, kit.MDB_LINK, arg[0]) m.Richs(INSTALL, "", name, func(key string, value map[string]interface{}) { + value = value[kit.MDB_META].(map[string]interface{}) m.Optionv("progress", func(size int, total int) { s := size * 100 / total if s != kit.Int(value[kit.MDB_STEP]) && s%10 == 0 { @@ -89,23 +56,11 @@ func init() { }) }) - // 占位 - p := path.Join(m.Conf(INSTALL, kit.META_PATH), name) - if strings.Contains(p, "/") { - os.MkdirAll(path.Base(p), ice.MOD_DIR) - } - m.Cmd(cli.SYSTEM, "touch", p) - - m.Option("_process", "_progress") m.Gos(m, func(m *ice.Message) { // 下载 m.Option(cli.CMD_DIR, m.Conf(INSTALL, kit.META_PATH)) - if strings.HasPrefix(arg[0], "ftp") { - m.Cmdy(cli.SYSTEM, "wget", arg[0]) - } else { - msg := m.Cmd(web.SPIDE, web.SPIDE_DEV, web.SPIDE_CACHE, web.SPIDE_GET, arg[0]) - m.Cmdy(nfs.LINK, p, msg.Append(kit.MDB_FILE)) - } + msg := m.Cmd(web.SPIDE, web.SPIDE_DEV, web.SPIDE_CACHE, web.SPIDE_GET, arg[0]) + m.Cmdy(nfs.LINK, p, msg.Append(kit.MDB_FILE)) // 解压 m.Cmd(cli.SYSTEM, "tar", "xvf", name) @@ -117,7 +72,7 @@ func init() { case func(string): cb(p) default: - if m.Cmdy(cli.SYSTEM, "./configure", "--prefix="+kit.Path(path.Join(p, INSTALL)), arg[1:]); m.Append(cli.CMD_CODE) != "0" { + if m.Cmdy(cli.SYSTEM, "./configure", "--prefix="+kit.Path(path.Join(p, kit.Select("_install", m.Option("install")))), arg[1:]); m.Append(cli.CMD_CODE) != "0" { return } } @@ -125,16 +80,16 @@ func init() { if m.Cmdy(cli.SYSTEM, "make", "-j8"); m.Append(cli.CMD_CODE) != "0" { return } - if m.Cmdy(cli.SYSTEM, "make", "PREFIX="+kit.Path(path.Join(p, INSTALL)), "install"); m.Append(cli.CMD_CODE) != "0" { - return - } + + m.Cmdy(cli.SYSTEM, "mv", "INSTALL", "INSTALLS") + m.Cmdy(cli.SYSTEM, "make", "PREFIX="+kit.Path(path.Join(p, kit.Select("_install", m.Option("install")))), "install") }}, "spawn": {Name: "spawn link", Help: "新建", Hand: func(m *ice.Message, arg ...string) { port := m.Cmdx(tcp.PORT, "select") target := path.Join(m.Conf(cli.DAEMON, kit.META_PATH), port) source := path.Join(m.Conf(INSTALL, kit.META_PATH), kit.TrimExt(arg[0])) - m.Cmd(nfs.DIR, path.Join(source, kit.Select("install", m.Option("install")))).Table(func(index int, value map[string]string, head []string) { + m.Cmd(nfs.DIR, path.Join(source, kit.Select("_install", m.Option("install")))).Table(func(index int, value map[string]string, head []string) { m.Cmd(cli.SYSTEM, "cp", "-r", strings.TrimSuffix(value[kit.MDB_PATH], "/"), target) }) m.Echo(target) @@ -155,34 +110,30 @@ func init() { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) == 0 { // 源码列表 - m.Option(mdb.FIELDS, "time,step,size,total,name,link") + m.Option(mdb.FIELDS, m.Conf(INSTALL, kit.META_FIELD)) m.Cmdy(mdb.SELECT, m.Prefix(INSTALL), "", mdb.HASH) - m.Sort(kit.MDB_TIME, "time_r") return } arg[0] = path.Base(arg[0]) if key := strings.Split(strings.Split(arg[0], "-")[0], ".")[0]; len(arg) == 1 { - // 服务列表 u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) m.Cmd(cli.DAEMON).Table(func(index int, value map[string]string, head []string) { + // 服务列表 if strings.Contains(value[kit.MDB_NAME], key) { m.Push(kit.MDB_TIME, value[kit.MDB_TIME]) m.Push(kit.MDB_PORT, path.Base(value[kit.MDB_DIR])) m.Push(kit.MDB_STATUS, value[kit.MDB_STATUS]) m.Push(kit.MDB_NAME, value[kit.MDB_NAME]) - m.Push(kit.MDB_LINK, m.Cmdx(mdb.RENDER, web.RENDER.A, - kit.Format("http://%s:%s", u.Hostname(), path.Base(value[kit.MDB_DIR])))) + m.PushRender(kit.MDB_LINK, "a", kit.Format("http://%s:%s", u.Hostname(), path.Base(value[kit.MDB_DIR]))) } }) - m.Sort(kit.MDB_TIME, "time_r") return } // 目录列表 m.Option(nfs.DIR_ROOT, path.Join(m.Conf(cli.DAEMON, kit.META_PATH), arg[1])) m.Cmdy(nfs.DIR, kit.Select("./", arg, 2)) - m.Sort(kit.MDB_TIME, "time_r") }}, }, }, nil) diff --git a/core/code/publish.go b/core/code/publish.go index 9bf17d01..716945a5 100644 --- a/core/code/publish.go +++ b/core/code/publish.go @@ -10,6 +10,7 @@ import ( "os" "path" "runtime" + "strings" ) const PUBLISH = "publish" @@ -37,10 +38,24 @@ func init() { Configs: map[string]*ice.Config{ PUBLISH: {Name: PUBLISH, Help: "发布", Value: kit.Data( kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_PATH, "usr/publish", + "contexts", _contexts, )}, }, Commands: map[string]*ice.Command{ PUBLISH: {Name: "publish path=auto auto 火山架 冰山架 神农架", Help: "发布", Action: map[string]*ice.Action{ + "contexts": {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) { + u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) + m.Option("httphost", fmt.Sprintf("%s://%s:%s", u.Scheme, strings.Split(u.Host, ":")[0], kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ":"), 1))) + m.Option("hostport", fmt.Sprintf("%s:%s", strings.Split(u.Host, ":")[0], kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ":"), 1))) + m.Option("hostname", strings.Split(u.Host, ":")[0]) + + m.Option("userhost", fmt.Sprintf("%s@%s", m.Option(ice.MSG_USERNAME), strings.Split(u.Host, ":")[0])) + m.Option("hostpath", kit.Path("./.ish/pluged")) + + if buf, err := kit.Render(m.Conf(INSTALL, kit.Keys("meta.contexts", kit.Select("base", arg, 0))), m); m.Assert(err) { + m.Cmdy("web.wiki.spark", "shell", string(buf)) + } + }}, "ish": {Name: "ish", Help: "神农架", Hand: func(m *ice.Message, arg ...string) { _publish_file(m, "etc/conf/tmux.conf") m.Option(nfs.DIR_REG, ".*\\.(sh|vim|conf)") @@ -64,3 +79,28 @@ func init() { }, }, nil) } + +var _contexts = kit.Dict( + "tmux", ` +# 终端环境 +curl -fLo /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo && yum -y update +yum install -y tmux +`, + "base", ` +# 生产环境 +mkdir contexts; cd contexts +export ctx_dev={{.Option "httphost"}} ctx_log=/dev/stdout; curl $ctx_dev/publish/ice.sh |sh +bin/ice.sh`, + "miss", ` +# 开发环境 +yum install -y make git vim go +mkdir ~/.ssh &>/dev/null; touch ~/.ssh/config; [ -z "$(cat ~/.ssh/config|grep 'HOST {{.Option "hostname"}}')" ] && echo -e "HOST {{.Option "hostname"}}\n Port 9030" >> ~/.ssh/config +export ISH_CONF_HUB_PROXY={{.Option "userhost"}}:.ish/pluged/ +git clone $ISH_CONF_HUB_PROXY/github.com/shylinux/contexts && cd contexts +source etc/miss.sh + +touch ~/.gitconfig; [ -z "$(cat ~/.gitconfig|grep '\[url \"{{.Option "userhost"}}')" ] && echo -e "[url \"{{.Option "userhost"}}:ish/pluged/\"]\n insteadOf=\"https://github.com/\"\n" >> ~/.gitconfig +git clone https://github.com/shylinux/contexts && cd contexts +source etc/miss.sh +`, +) diff --git a/core/code/trash.go b/core/code/trash.go new file mode 100644 index 00000000..99d1fe9b --- /dev/null +++ b/core/code/trash.go @@ -0,0 +1,188 @@ +package code + +import ( + "net/http" + + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/cli" + "github.com/shylinux/icebergs/base/nfs" + "github.com/shylinux/icebergs/base/web" + kit "github.com/shylinux/toolkits" + + "net/url" + "os" + "path" + "runtime" + "strings" +) + +const ( // CODE + // INSTALL = "_install" + PREPARE = "_prepare" + PROJECT = "_project" +) + +const TRASH = "trash" + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{ + "_install": {Name: "install", Help: "安装", Value: kit.Data( + "path", "usr/install", "target", "usr/local", + "linux", "https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz", + "darwin", "https://dl.google.com/go/go1.14.6.darwin-amd64.tar.gz", + "windows", "https://golang.google.cn/dl/go1.14.6.windows-amd64.zip", + )}, + PREPARE: {Name: "prepare", Help: "配置", Value: kit.Data("path", "usr/prepare", + "script", ".ish/pluged/golang/init.sh", "export", kit.Dict( + "GOPROXY", "https://goproxy.cn,direct", + "GOPRIVATE", "https://github.com", + ), + )}, + PROJECT: {Name: "project", Help: "项目", Value: kit.Data("path", "usr/project")}, + + "login": {Name: "login", Help: "终端接入", Value: kit.Data()}, + }, + Commands: map[string]*ice.Command{ + "_install": {Name: "install url 安装:button", Help: "安装", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + target := m.Conf("_install", kit.Keys("meta", runtime.GOOS)) + + p := path.Join(m.Conf("_install", "meta.path"), path.Base(target)) + if _, e := os.Stat(p); e != nil { + // 下载 + msg := m.Cmd(web.SPIDE, "dev", web.CACHE, http.MethodGet, target) + m.Cmd(web.CACHE, web.WATCH, msg.Append(web.DATA), p) + } + + os.MkdirAll(m.Conf("_install", kit.Keys("meta.target")), ice.MOD_DIR) + m.Cmdy(cli.SYSTEM, "tar", "xvf", p, "-C", m.Conf("_install", kit.Keys("meta.target"))) + }}, + PREPARE: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + export := []string{} + kit.Fetch(m.Confv(PREPARE, "meta.export"), func(key string, val string) { + export = append(export, key+"="+val) + }) + + m.Cmd(nfs.SAVE, m.Conf(PREPARE, "meta.script"), kit.Format(` +export GOROOT=%s GOPATH=%s:$GOPATH GOBIN=%s +export PATH=$GOBIN:$GOROOT/bin:$PATH +export %s +`, kit.Path(m.Conf("_install", kit.Keys("meta.target")), "go"), kit.Path("src"), kit.Path("bin"), strings.Join(export, " "))) + }}, + PROJECT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + }}, + + "login": {Name: "login key", Help: "登录", Meta: kit.Dict( + "detail", []string{"编辑", "删除", "清理", "清空"}, + ), Action: map[string]*ice.Action{}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) > 0 && arg[0] == "action" { + switch arg[1] { + case "modify", "编辑": + m.Richs(cmd, nil, m.Option("key"), func(key string, value map[string]interface{}) { + m.Logs(ice.LOG_MODIFY, cmd, key, "field", arg[2], "value", kit.Value(value, arg[2]), "->", arg[3]) + kit.Value(value, arg[2], arg[3]) + }) + + case "delete", "删除": + m.Logs(ice.LOG_DELETE, cmd, m.Option("key"), "value", m.Conf(cmd, kit.Keys(kit.MDB_HASH, m.Option("key")))) + m.Conf(cmd, kit.Keys(kit.MDB_HASH, m.Option("key")), "") + + case "prune", "清理": + m.Cmdy(cmd, "prune") + + case "clear", "清空": + m.Cmdy(cmd, "prune", "all") + } + return + } + + switch kit.Select("list", arg, 0) { + case "init": + if m.Option("sid") != "" && m.Conf(cmd, []string{kit.MDB_HASH, m.Option("sid"), "status"}) != "" { + // 复用会话 + m.Conf(cmd, []string{kit.MDB_HASH, m.Option("sid"), "status"}, "login") + m.Logs(ice.LOG_AUTH, "sid", m.Option("sid")) + m.Echo(m.Option("sid")) + return + } + + you := m.Conf(web.SHARE, kit.Keys(kit.MDB_HASH, m.Option("share"), "name")) + // 添加会话 + h := m.Rich(cmd, nil, kit.Dict( + "type", kit.Select("zsh", arg, 1), + "status", "login", + "you", you, + "pwd", m.Option("pwd"), + "pid", m.Option("pid"), + "pane", m.Option("pane"), + "hostname", m.Option("hostname"), + "username", m.Option("username"), + )) + m.Logs(ice.LOG_AUTH, "sid", h, "you", you) + m.Echo(h) + + case "exit": + // 退出会话 + m.Richs(cmd, nil, m.Option("sid"), func(key string, value map[string]interface{}) { + m.Logs(ice.LOG_AUTH, "sid", m.Option("sid")) + value["status"] = "logout" + m.Echo(key) + }) + + case "prune": + list := []string{} + m.Richs(cmd, nil, "*", func(key string, value map[string]interface{}) { + if len(arg) > 1 && arg[1] == "all" || value["status"] == "logout" { + list = append(list, key) + } + }) + + // 清理会话 + kit.Fetch(list, func(index int, value string) { + m.Logs(ice.LOG_DELETE, "login", value, "value", m.Conf(cmd, kit.Keys(kit.MDB_HASH, value))) + m.Conf(cmd, kit.Keys(kit.MDB_HASH, value), "") + }) + m.Echo("%d", len(list)) + + case "list": + // 会话列表 + m.Richs("login", nil, "*", func(key string, value map[string]interface{}) { + m.Push(key, value, []string{"time", "key", "type", "status", "you"}) + pwd := strings.Split(kit.Format(value["pwd"]), "/") + if len(pwd) > 3 { + m.Push("pwd", strings.Join(pwd[len(pwd)-3:len(pwd)], "/")) + } else { + m.Push("pwd", value["pwd"]) + } + m.Push(key, value, []string{"pid", "pane", "hostname", "username"}) + }) + + default: + // 会话详情 + m.Richs(cmd, nil, arg[0], func(key string, value map[string]interface{}) { + m.Push("detail", value) + }) + } + }}, + + "/miss/": {Name: "/miss/", Help: "任务", Action: map[string]*ice.Action{ + "pwd": {Name: "pwd", Help: "pwd", Hand: func(m *ice.Message, arg ...string) { + m.Render(ice.RENDER_RESULT) + m.Echo("hello world\n") + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + u, e := url.QueryUnescape(m.Option("arg")) + m.Assert(e) + args := kit.Split(u) + if len(arg) == 0 || arg[0] == "" { + return + } + + m.Render(ice.RENDER_RESULT) + if m.Cmdy(arg, args); len(m.Resultv()) == 0 { + m.Table() + } + }}, + }, + }, nil) +} diff --git a/core/code/vimer.go b/core/code/vimer.go new file mode 100644 index 00000000..6e0ac2bb --- /dev/null +++ b/core/code/vimer.go @@ -0,0 +1,37 @@ +package code + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/nfs" + "github.com/shylinux/icebergs/base/web" + kit "github.com/shylinux/toolkits" + + "path" +) + +const VIMER = "vimer" + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{}, + Commands: map[string]*ice.Command{ + VIMER: {Name: "vimer path=usr/demo file=hi.sh line=1 刷新:button=auto 保存:button 运行:button 项目:button", Help: "编辑器", Meta: kit.Dict( + "display", "/plugin/local/code/vimer.js", "style", "editor", + ), Action: map[string]*ice.Action{ + web.UPLOAD: {Name: "upload path name", Help: "上传", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(web.CACHE, web.UPLOAD) + m.Cmdy(web.CACHE, web.WATCH, m.Option(web.DATA), path.Join(m.Option("path"), m.Option("name"))) + }}, + nfs.SAVE: {Name: "save type file path", Help: "保存", Hand: func(m *ice.Message, arg ...string) { + _vimer_save(m, arg[0], arg[1], arg[2], m.Option("content")) + }}, + + "cmd": {Name: "cmd type file path", Help: "命令", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(arg) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmdy(INNER, arg) + }}, + }, + }, nil) +} diff --git a/core/code/qrcode.go b/core/wiki/qrcode.go similarity index 96% rename from core/code/qrcode.go rename to core/wiki/qrcode.go index 75a24209..436bcff7 100644 --- a/core/code/qrcode.go +++ b/core/wiki/qrcode.go @@ -1,4 +1,4 @@ -package code +package wiki import ( ice "github.com/shylinux/icebergs" @@ -6,6 +6,8 @@ import ( kit "github.com/shylinux/toolkits" ) +const QRCODE = "qrcode" + func init() { Index.Register(&ice.Context{Name: QRCODE, Help: "二维码", Configs: map[string]*ice.Config{ diff --git a/core/code/video.go b/core/wiki/video.go similarity index 95% rename from core/code/video.go rename to core/wiki/video.go index 9644bda2..a9bf75d0 100644 --- a/core/code/video.go +++ b/core/wiki/video.go @@ -1,4 +1,4 @@ -package code +package wiki import ( ice "github.com/shylinux/icebergs" @@ -15,7 +15,7 @@ func init() { Index.Register(&ice.Context{Name: "m4v", Help: "视频", Configs: map[string]*ice.Config{ - VEDIO: {Name: "vedio", Help: "视频", Value: kit.Data()}, + VIDEO: {Name: "video", Help: "视频", Value: kit.Data()}, }, Commands: map[string]*ice.Command{ "list": {Name: "list name", Help: "列表", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { diff --git a/core/wiki/word.go b/core/wiki/word.go index 444ca181..a2107822 100644 --- a/core/wiki/word.go +++ b/core/wiki/word.go @@ -85,8 +85,22 @@ func _refer_show(m *ice.Message, name, text string, arg ...string) { m.Render(ice.RENDER_TEMPLATE, m.Conf(REFER, "meta.template")) } func _spark_show(m *ice.Message, name, text string, arg ...string) { + switch text = strings.TrimSpace(text); name { + case "shell", "redis", "mysql": + m.Echo(`
`, name) + for _, l := range strings.Split(text, "\n") { + m.Echo("
") + m.Echo(kit.Select(name+"> ", m.Conf(SPARK, kit.Keys("meta.prompt", name)))) + m.Echo("") + m.Echo(l) + m.Echo("") + m.Echo("
") + } + m.Echo("
") + return + } + m.Option("style", kit.Select("", name)) - text = strings.TrimSpace(text) m.Optionv("list", kit.Split(text, "\n")) _option(m, SPARK, name, text, arg...) @@ -373,7 +387,7 @@ func init() { } _refer_show(m, arg[0], arg[1], arg[2:]...) }}, - SPARK: {Name: "spark [name] text", Help: "感悟", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + SPARK: {Name: "spark [name] text", Help: "灵感", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) == 0 { m.Echo(`
`) return @@ -381,21 +395,6 @@ func init() { if len(arg) == 1 { arg = []string{"", arg[0]} } - switch arg[0] { - case "shell", "mysql", "redis": - arg[1] = strings.TrimSpace(arg[1]) - m.Echo(`
`, arg[0]) - for _, l := range strings.Split(arg[1], "\n") { - m.Echo("
") - m.Echo(kit.Select(arg[0]+"> ", m.Conf(SPARK, kit.Keys("meta.prompt", arg[0])))) - m.Echo("") - m.Echo(l) - m.Echo("") - m.Echo("
") - } - m.Echo("
") - return - } _spark_show(m, arg[0], kit.Select(arg[0], arg[1]), arg[2:]...) }}, diff --git a/misc/git/git.go b/misc/git/git.go index c6cb173b..2b4f3c34 100644 --- a/misc/git/git.go +++ b/misc/git/git.go @@ -75,13 +75,6 @@ var Index = &ice.Context{Name: GIT, Help: "代码库", m.Cmdy(code.INSTALL, "download", m.Conf(GIT, kit.META_SOURCE)) }}, "build": {Name: "build", Help: "构建", Hand: func(m *ice.Message, arg ...string) { - m.Optionv("prepare", func(p string) { - m.Option(cli.CMD_DIR, p) - m.Cmd(cli.SYSTEM, "mv", "INSTALL", "INSTALLS") - if m.Cmdy(cli.SYSTEM, "./configure", "--prefix="+kit.Path(path.Join(p, code.INSTALL))); m.Append(cli.CMD_CODE) != "0" { - return - } - }) m.Cmdy(code.INSTALL, "build", m.Conf(GIT, kit.META_SOURCE)) }}, "start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { diff --git a/misc/vim/favor.go b/misc/vim/favor.go index f676f5f7..c2002964 100644 --- a/misc/vim/favor.go +++ b/misc/vim/favor.go @@ -22,7 +22,7 @@ func init() { mdb.CREATE: {Name: "create topic", Help: "创建", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), "", mdb.HASH, arg) }}, - mdb.INSERT: {Name: "insert topic=数据结构 name=hi text=hello file=hi.c line=1", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + mdb.INSERT: {Name: "insert topic=数据结构 name=hi text=hello", Help: "添加", Hand: func(m *ice.Message, arg ...string) { m.Richs(m.Prefix(FAVOR), "", m.Option("topic"), func(key string, value map[string]interface{}) { m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, arg) }) diff --git a/misc/zsh/bash.go b/misc/zsh/bash.go index 7f935291..55701f49 100644 --- a/misc/zsh/bash.go +++ b/misc/zsh/bash.go @@ -1,12 +1,11 @@ package zsh import ( - "path" - ice "github.com/shylinux/icebergs" - "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/core/code" kit "github.com/shylinux/toolkits" + + "path" ) const BASH = "bash" @@ -19,7 +18,7 @@ func init() { )}, }, Commands: map[string]*ice.Command{ - BASH: {Name: "bash port=auto path=auto auto 启动:button 构建:button 下载:button", Help: "命令行", Action: map[string]*ice.Action{ + BASH: {Name: "bash port path auto 启动 构建 下载", Help: "命令行", Action: map[string]*ice.Action{ "download": {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(code.INSTALL, "download", m.Conf(BASH, kit.META_SOURCE)) }}, @@ -27,10 +26,6 @@ func init() { m.Cmdy(code.INSTALL, "build", m.Conf(BASH, kit.META_SOURCE)) }}, "start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { - m.Optionv("prepare", func(p string) []string { - m.Option(cli.CMD_DIR, p) - return []string{} - }) m.Cmdy(code.INSTALL, "start", m.Conf(BASH, kit.META_SOURCE), "bin/bash") }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { diff --git a/misc/zsh/bash.shy b/misc/zsh/bash.shy index c9d4ec09..c001f5ea 100644 --- a/misc/zsh/bash.shy +++ b/misc/zsh/bash.shy @@ -1,9 +1,10 @@ title "bash" refer ` 官网 https://www.gnu.org/software/bash/ -源码 http://ftp.gnu.org/gnu/bash/ 文档 https://www.gnu.org/software/bash/manual/bash.html +源码 http://ftp.gnu.org/gnu/bash/ ` + chapter "源码" field "bash" web.code.zsh.bash field "bash" web.code.inner args `[ usr/install/bash-4.2.53/ input.c 625 ]` @@ -13,16 +14,19 @@ spark shell ` wget http://mirrors.aliyun.com/gnu/bash/bash-4.2.53.tar.gz tar xvf bash-4.2.53.tar.gz && cd bash-4.2.53 -./configure --prefix=$PWD/install +./configure --prefix=$PWD/_install make -j4 && make install ` -section "使用体验" +section "启动" spark shell ` -cd ./install +cd ./_install ./bin/bash ` -chapter "应用" +chapter "应用" +web.code.zsh.sess contexts +field "会话" web.code.zsh.sess +field "收藏夹" web.code.zsh.favor field "同步流" web.code.zsh.sync -field "同步流" web.favor + diff --git a/misc/zsh/favor.go b/misc/zsh/favor.go index 9cdf3f58..06cebb80 100644 --- a/misc/zsh/favor.go +++ b/misc/zsh/favor.go @@ -2,38 +2,76 @@ package zsh import ( ice "github.com/shylinux/icebergs" - "github.com/shylinux/icebergs/base/web" + "github.com/shylinux/icebergs/base/mdb" kit "github.com/shylinux/toolkits" ) +const FAVOR = "favor" + func init() { Index.Merge(&ice.Context{ - Configs: map[string]*ice.Config{}, + Configs: map[string]*ice.Config{ + FAVOR: {Name: FAVOR, Help: "收藏夹", Value: kit.Data( + kit.MDB_SHORT, kit.MDB_TOPIC, kit.MDB_FIELD, "time,id,type,name,text", + )}, + }, Commands: map[string]*ice.Command{ - "/favor": {Name: "/favor", Help: "收藏", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if len(arg) > 0 && arg[0] != "sh" { - // 添加收藏 - m.Cmdy(web.FAVOR, kit.Select(m.Conf("zsh", "meta.history"), m.Option("tab")), - kit.Select(web.TYPE_SHELL, m.Option("type")), m.Option("note"), arg[0]) - return - } - - if m.Option("tab") == "" { - // 收藏列表 - m.Cmdy(web.FAVOR).Table() - return - } - - m.Echo("#/bin/sh\n\n") - m.Cmd(web.PROXY, m.Option("you"), web.FAVOR, m.Option("tab")).Table(func(index int, value map[string]string, head []string) { - switch value["type"] { - case web.TYPE_SHELL: - // 查看收藏 - if m.Option("note") == "" || m.Option("note") == value["name"] { - m.Echo("# %v\n%v\n\n", value["name"], value["text"]) - } + FAVOR: {Name: "favor topic id auto 创建 导出 导入", Help: "收藏夹", Action: map[string]*ice.Action{ + mdb.CREATE: {Name: "create topic", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), "", mdb.HASH, arg) + }}, + mdb.INSERT: {Name: "insert topic=数据结构 name=hi text=hello file=hi.c line=1", Help: "添加", Hand: func(m *ice.Message, arg ...string) { + m.Richs(m.Prefix(FAVOR), "", m.Option(kit.MDB_TOPIC), func(key string, value map[string]interface{}) { + m.Cmdy(mdb.INSERT, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, arg[2:]) + }) + }}, + mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { + m.Richs(m.Prefix(FAVOR), "", m.Option(kit.MDB_TOPIC), func(key string, value map[string]interface{}) { + m.Cmdy(mdb.MODIFY, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg) + }) + }}, + mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.DELETE, m.Prefix(FAVOR), "", mdb.HASH, kit.MDB_TOPIC, m.Option(kit.MDB_TOPIC)) + }}, + mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.EXPORT, m.Prefix(FAVOR), "", mdb.HASH) + }}, + mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.IMPORT, m.Prefix(FAVOR), "", mdb.HASH) + }}, + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + switch arg[0] { + case kit.MDB_TOPIC: + m.Option(mdb.FIELDS, "topic,count") + m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), "", mdb.HASH) } - }) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if len(arg) > 0 { + m.Option(mdb.FIELDS, kit.Select(m.Conf(m.Prefix(FAVOR), kit.META_FIELD), mdb.DETAIL, len(arg) > 1)) + m.Richs(m.Prefix(FAVOR), "", arg[0], func(key string, value map[string]interface{}) { + m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), kit.Keys(kit.MDB_HASH, key), mdb.LIST, kit.MDB_ID, arg[1:]) + }) + return + } + + m.Option(mdb.FIELDS, "time,count,topic") + m.Cmdy(mdb.SELECT, m.Prefix(FAVOR), "", mdb.HASH) + m.PushAction("删除") + }}, + + "/favor": {Name: "/favor", Help: "收藏", Action: map[string]*ice.Action{ + mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + m.Echo("#!/bin/sh\n\n") + m.Cmdy(m.Prefix(FAVOR), m.Option("tab")).Table(func(index int, value map[string]string, head []string) { + // 查看收藏 + if m.Option("note") == "" || m.Option("note") == value[kit.MDB_NAME] { + m.Echo("# %v\n%v\n\n", value[kit.MDB_NAME], value[kit.MDB_TEXT]) + } + }) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmdy(m.Prefix(FAVOR)).Table() }}, }, }, nil) diff --git a/misc/zsh/input.go b/misc/zsh/input.go index 1dcfe68c..37160cc5 100644 --- a/misc/zsh/input.go +++ b/misc/zsh/input.go @@ -1,17 +1,21 @@ package zsh import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/cli" + kit "github.com/shylinux/toolkits" + "strings" "unicode" - - ice "github.com/shylinux/icebergs" - kit "github.com/shylinux/toolkits" ) func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{}, Commands: map[string]*ice.Command{ + "/qrcode": {Name: "/qrcode", Help: "同步", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmdy(cli.PYTHON, "qrcode", "hi") + }}, "/input": {Name: "/input", Help: "补全", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { list := kit.Split(m.Option("line"), m.Option("break")) word := list[kit.Int(m.Option("index"))] diff --git a/misc/zsh/sess.go b/misc/zsh/sess.go new file mode 100644 index 00000000..f99099b8 --- /dev/null +++ b/misc/zsh/sess.go @@ -0,0 +1,79 @@ +package zsh + +import ( + ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/mdb" + "github.com/shylinux/icebergs/base/web" + kit "github.com/shylinux/toolkits" + + "fmt" + "io/ioutil" + "strings" +) + +const SESS = "sess" + +func init() { + Index.Merge(&ice.Context{ + Configs: map[string]*ice.Config{ + SESS: {Name: SESS, Help: "会话流", Value: kit.Data( + kit.MDB_FIELD, "time,hash,status,username,hostname,pid,pwd", + "contexts", `export ctx_dev={{.Option "httphost"}} ctx_temp=$(mktemp); curl -sL $ctx_dev >$ctx_temp; source $ctx_temp`, + )}, + }, + Commands: map[string]*ice.Command{ + SESS: {Name: "sess hash auto 导出 导入", Help: "会话流", Action: map[string]*ice.Action{ + "contexts": {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) { + u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) + m.Option("httphost", fmt.Sprintf("%s://%s:%s", u.Scheme, strings.Split(u.Host, ":")[0], kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ":"), 1))) + + if buf, err := kit.Render(m.Conf(m.Prefix(SESS), "meta.contexts"), m); m.Assert(err) { + m.Cmdy("web.wiki.spark", "shell", string(buf)) + } + }}, + mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.EXPORT, m.Prefix(SESS), "", mdb.HASH) + }}, + mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.IMPORT, m.Prefix(SESS), "", mdb.HASH) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Option(mdb.FIELDS, kit.Select(m.Conf(m.Prefix(SESS), kit.META_FIELD), mdb.DETAIL, len(arg) > 0)) + m.Cmdy(mdb.SELECT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, arg) + }}, + "/sess": {Name: "/sess", Help: "会话", Action: map[string]*ice.Action{ + "logout": {Name: "logout", Help: "退出", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(mdb.MODIFY, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option("sid"), kit.MDB_STATUS, "logout") + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Option(mdb.FIELDS, m.Conf(m.Prefix(SESS), kit.META_FIELD)) + if strings.TrimSpace(m.Option("sid")) == "" { + m.Option("sid", m.Cmdx(mdb.INSERT, m.Prefix(SESS), "", mdb.HASH, + "status", "login", "username", m.Option("username"), "hostname", m.Option("hostname"), "pid", m.Option("pid"), "pwd", m.Option("pwd"))) + } else { + m.Cmdy(mdb.MODIFY, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option("sid"), kit.MDB_STATUS, "login") + } + m.Echo(m.Option("sid")) + }}, + web.LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if f, _, e := m.R.FormFile(SUB); e == nil { + defer f.Close() + // 文件参数 + if b, e := ioutil.ReadAll(f); e == nil { + m.Option(SUB, string(b)) + } + } + + m.Option(mdb.FIELDS, m.Conf(m.Prefix(SESS), kit.META_FIELD)) + if strings.TrimSpace(m.Option("sid")) != "" { + msg := m.Cmd(mdb.SELECT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, strings.TrimSpace(m.Option("sid"))) + if m.Option("sid", msg.Append("hash")) != "" { + m.Option("username", msg.Append("username")) + m.Option("hostname", msg.Append("hostname")) + } + } + m.Render(ice.RENDER_RESULT) + }}, + }, + }, nil) +} diff --git a/misc/zsh/sync.go b/misc/zsh/sync.go index 03646ca7..e1837e46 100644 --- a/misc/zsh/sync.go +++ b/misc/zsh/sync.go @@ -2,14 +2,18 @@ package zsh import ( ice "github.com/shylinux/icebergs" + "github.com/shylinux/icebergs/base/aaa" "github.com/shylinux/icebergs/base/mdb" - "github.com/shylinux/icebergs/base/web" kit "github.com/shylinux/toolkits" - "io/ioutil" "strings" ) +const ( + ARG = "arg" + SUB = "sub" + PWD = "pwd" +) const SYNC = "sync" const SHELL = "shell" @@ -17,58 +21,43 @@ func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ SYNC: {Name: SYNC, Help: "同步流", Value: kit.Data( - kit.MDB_FIELD, "time,id,type,name,text", + kit.MDB_SHORT, kit.MDB_NAME, kit.MDB_FIELD, "time,id,type,name,text", )}, }, Commands: map[string]*ice.Command{ - web.LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if f, _, e := m.R.FormFile("sub"); e == nil { - defer f.Close() - // 文件参数 - if b, e := ioutil.ReadAll(f); e == nil { - m.Option("sub", string(b)) - } - } - - m.Option("you", m.Conf("zsh", "meta.proxy")) - m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) { - // 查找空间 - m.Option("you", kit.Select(m.Conf("zsh", "meta.proxy"), value["you"])) - }) - - m.Option("arg", strings.ReplaceAll(m.Option("arg"), "%20", " ")) - m.Logs(ice.LOG_AUTH, "you", m.Option("you"), "url", m.Option(ice.MSG_USERURL), "cmd", m.Optionv("cmds"), "sub", m.Optionv("sub")) - m.Option(ice.MSG_OUTPUT, ice.RENDER_RESULT) - }}, - - SYNC: {Name: "sync id=auto auto 导出 导入", Help: "同步流", Action: map[string]*ice.Action{ + SYNC: {Name: "sync id auto 导出 导入", Help: "同步流", Action: map[string]*ice.Action{ mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.EXPORT, m.Prefix(SYNC), "", mdb.LIST) }}, mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.IMPORT, m.Prefix(SYNC), "", mdb.LIST) }}, + FAVOR: {Name: "favor topic name", Help: "收藏", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(m.Prefix(FAVOR), mdb.INSERT, kit.MDB_TOPIC, m.Option(kit.MDB_TOPIC), + kit.MDB_TYPE, SHELL, kit.MDB_NAME, m.Option(kit.MDB_NAME), kit.MDB_TEXT, m.Option(kit.MDB_TEXT)) + }}, + mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { + switch arg[0] { + case kit.MDB_TOPIC: + m.Cmdy(m.Prefix(FAVOR)).Appendv(ice.MSG_APPEND, kit.MDB_TOPIC, kit.MDB_COUNT, kit.MDB_TIME) + } + }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Option(mdb.FIELDS, kit.Select(m.Conf(SYNC, kit.META_FIELD), mdb.DETAIL, len(arg) > 0)) m.Cmdy(mdb.SELECT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_ID, arg) + m.PushAction("收藏") }}, "/sync": {Name: "/sync", Help: "同步", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { switch arg[0] { case "history": - vs := strings.SplitN(strings.TrimSpace(m.Option("arg")), " ", 4) - if strings.Contains(m.Option("SHELL"), "zsh") { - vs = []string{vs[0], m.Time("2006-01-02"), m.Time("15:04:05"), strings.Join(vs[1:], " ")} - } + vs := strings.SplitN(strings.TrimSpace(m.Option(ARG)), " ", 4) m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_TYPE, SHELL, kit.MDB_NAME, vs[0], - kit.MDB_TEXT, kit.Select("", vs, 3), "pwd", m.Option("pwd"), kit.MDB_TIME, vs[1]+" "+vs[2]) + aaa.HOSTNAME, m.Option(aaa.HOSTNAME), aaa.USERNAME, m.Option(aaa.USERNAME), + kit.MDB_TEXT, strings.Join(vs[3:], " "), PWD, m.Option(PWD), kit.MDB_TIME, vs[1]+" "+vs[2]) default: - m.Richs("login", nil, m.Option("sid"), func(key string, value map[string]interface{}) { - kit.Value(value, kit.Keys("sync", arg[0]), kit.Dict( - "time", m.Time(), "text", m.Option("sub"), - "pwd", m.Option("pwd"), "cmd", arg[1:], - )) - }) + m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.HASH, kit.MDB_TYPE, SHELL, kit.MDB_NAME, arg[0], + kit.MDB_TEXT, m.Option(SUB), PWD, m.Option(PWD)) } }}, }, diff --git a/misc/zsh/trash.go b/misc/zsh/trash.go new file mode 100644 index 00000000..c68eaf6e --- /dev/null +++ b/misc/zsh/trash.go @@ -0,0 +1,33 @@ +package zsh + +import ( + ice "github.com/shylinux/icebergs" + kit "github.com/shylinux/toolkits" + + "net/url" +) + +func init() { + Index.Merge(&ice.Context{ + Commands: map[string]*ice.Command{ + "/help": {Name: "/help", Help: "帮助", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmdy("help") + }}, + "/login": {Name: "/login", Help: "登录", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmdy("login", "init", c.Name) + }}, + "/logout": {Name: "/logout", Help: "登出", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Cmdy("login", "exit") + }}, + + "/ish": {Name: "/ish", Help: "命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + if sub, e := url.QueryUnescape(m.Option("sub")); m.Assert(e) { + m.Cmdy(kit.Split(sub)) + if len(m.Resultv()) == 0 { + m.Table() + } + } + }}, + }, + }, nil) +} diff --git a/misc/zsh/auto.sh b/misc/zsh/trash.sh similarity index 100% rename from misc/zsh/auto.sh rename to misc/zsh/trash.sh diff --git a/misc/zsh/zsh.go b/misc/zsh/zsh.go index 7fe85e0f..684baf79 100644 --- a/misc/zsh/zsh.go +++ b/misc/zsh/zsh.go @@ -2,33 +2,23 @@ package zsh import ( ice "github.com/shylinux/icebergs" - "github.com/shylinux/icebergs/base/cli" "github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/core/code" kit "github.com/shylinux/toolkits" - "net/url" "path" ) -const ( - ZSH = "zsh" -) +const ZSH = "zsh" var Index = &ice.Context{Name: ZSH, Help: "命令行", Configs: map[string]*ice.Config{ ZSH: {Name: ZSH, Help: "命令行", Value: kit.Data( "source", "https://sourceforge.net/projects/zsh/files/zsh/5.8/zsh-5.8.tar.xz", - - "proxy", "tmux", "history", "zsh.history", "script", []interface{}{ - ".vim/syntax/sh.vim", "etc/conf/sh.vim", - ".bashrc", "etc/conf/bashrc", - ".zshrc", "etc/conf/zshrc", - }, )}, }, Commands: map[string]*ice.Command{ - ZSH: {Name: "zsh port=auto path=auto auto 启动:button 构建:button 下载:button", Help: "命令行", Action: map[string]*ice.Action{ + ZSH: {Name: "zsh port path auto 启动 构建 下载", Help: "命令行", Action: map[string]*ice.Action{ "download": {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(code.INSTALL, "download", m.Conf(ZSH, kit.META_SOURCE)) }}, @@ -36,55 +26,14 @@ var Index = &ice.Context{Name: ZSH, Help: "命令行", m.Cmdy(code.INSTALL, "build", m.Conf(ZSH, kit.META_SOURCE)) }}, "start": {Name: "start", Help: "启动", Hand: func(m *ice.Message, arg ...string) { - m.Optionv("prepare", func(p string) []string { - m.Option(cli.CMD_DIR, p) - return []string{} - }) m.Cmdy(code.INSTALL, "start", m.Conf(ZSH, kit.META_SOURCE), "bin/zsh") }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Cmdy(code.INSTALL, path.Base(m.Conf(ZSH, kit.META_SOURCE)), arg) }}, - ice.CTX_EXIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Save() - }}, - ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Load() - // m.Cmd("web.spide_rewrite", "create", "from", "https://sourceforge.net/projects/zsh/files/zsh/5.8/zsh-5.8.tar.xz", "to", "http://localhost:9020/publish/zsh-5.8.tar.gz") - - m.Conf(web.FAVOR, "meta.render.shell", m.AddCmd(&ice.Command{Name: "render type name text", Help: "渲染引擎", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - value, _ := m.Optionv(kit.MDB_VALUE).(map[string]interface{}) - m.Option("cmd_dir", kit.Value(value, "extra.pwd")) - m.Cmdy(cli.SYSTEM, kit.Select(kit.Format(value["text"]), arg, 2)) - }})) - m.Conf(web.FAVOR, "meta.render.cmd", m.AddCmd(&ice.Command{Name: "render type name text", Help: "渲染引擎", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - value, _ := m.Optionv(kit.MDB_VALUE).(map[string]interface{}) - m.Cmdy(kit.Split(kit.Format(kit.Select(kit.Format(value["text"], arg, 2))))) - }})) - m.Conf(web.FAVOR, "meta.render.bin", m.AddCmd(&ice.Command{Name: "render type name text", Help: "渲染引擎", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmdy(cli.SYSTEM, "file", arg[2]) - }})) - }}, - - "/help": {Name: "/help", Help: "帮助", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmdy("help") - }}, - "/login": {Name: "/login", Help: "登录", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmdy("login", "init", c.Name) - }}, - "/logout": {Name: "/logout", Help: "登出", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmdy("login", "exit") - }}, - - "/ish": {Name: "/ish", Help: "命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - if sub, e := url.QueryUnescape(m.Option("sub")); m.Assert(e) { - m.Cmdy(kit.Split(sub)) - if len(m.Resultv()) == 0 { - m.Table() - } - } - }}, + 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() }}, }, } diff --git a/misc/zsh/zsh.shy b/misc/zsh/zsh.shy index 5c0c090a..ed64acbf 100644 --- a/misc/zsh/zsh.shy +++ b/misc/zsh/zsh.shy @@ -5,22 +5,22 @@ refer ` 文档 http://zsh.sourceforge.net/Doc/Release/zsh_toc.html ` -field "安装" web.code.zsh.zsh -field "源码" web.code.inner args `[ usr/install/zsh-5.8/ Src/main.c 91 ]` +chapter "源码" +field zsh web.code.zsh.zsh +field zsh web.code.inner args `[ usr/install/zsh-5.8/ Src/main.c 91 ]` -chapter "安装" -section "编译安装" +section "构建" spark shell ` wget https://sourceforge.net/projects/zsh/files/zsh/5.8/zsh-5.8.tar.xz tar xvf zsh-5.8.tar.gz && cd zsh-5.8 -./configure --prefix=$PWD/install + +./configure --prefix=$PWD/_install make -j4 && make install ` -section "使用体验" +section "启动" spark shell ` -cd ./install +cd ./_install ./bin/zsh ` - diff --git a/type.go b/type.go index 63e115ce..b8e85ced 100644 --- a/type.go +++ b/type.go @@ -35,7 +35,7 @@ type Action struct { Hand func(m *Message, arg ...string) } type Command struct { - Name interface{} // string []string + Name string Help interface{} // string []string List []interface{} Meta map[string]interface{} @@ -143,6 +143,50 @@ func (c *Context) Register(s *Context, x Server, name ...string) *Context { s.server = x return s } + +func (c *Context) _split(name string) []interface{} { + button, list := false, []interface{}{} + for _, v := range kit.Split(kit.Select("key", name), " ", " ")[1:] { + if v == "auto" { + list = append(list, kit.List(kit.MDB_INPUT, "button", "name", "查看", "value", "auto")...) + list = append(list, kit.List(kit.MDB_INPUT, "button", "name", "返回")...) + button = true + continue + } + + ls, value := kit.Split(v, " ", ":=@"), "" + item := kit.Dict(kit.MDB_INPUT, kit.Select("text", "button", button)) + if kit.Value(item, kit.MDB_NAME, ls[0]); item[kit.MDB_INPUT] == "text" { + kit.Value(item, kit.MDB_VALUE, kit.Select("@key", "auto", strings.Contains(name, "auto"))) + } + + for i := 1; i < len(ls); i += 2 { + switch ls[i] { + case ":": + switch kit.Value(item, kit.MDB_INPUT, ls[i+1]); ls[i+1] { + case "textarea": + kit.Value(item, "style.width", "300") + kit.Value(item, "style.height", "150") + case "button": + button = true + } + case "=": + if value = kit.Select("", ls, i+1); len(ls) > i+1 && strings.Contains(ls[i+1], ",") { + kit.Value(item, kit.MDB_INPUT, "select") + kit.Value(item, "values", strings.Split(ls[i+1], ",")) + } else { + kit.Value(item, kit.MDB_VALUE, value) + } + case "@": + if len(ls) > i+1 { + kit.Value(item, kit.MDB_VALUE, "@"+ls[i+1]+"="+value) + } + } + } + list = append(list, item) + } + return list +} func (c *Context) Merge(s *Context, x Server) *Context { if c.Commands == nil { c.Commands = map[string]*Command{} @@ -155,48 +199,18 @@ func (c *Context) Merge(s *Context, x Server) *Context { } for k, v := range s.Commands { c.Commands[k] = v + if v.List == nil { + v.List = c._split(v.Name) + } if v.Meta == nil { v.Meta = kit.Dict() } + for k, a := range v.Action { if a.List == nil { - list := []interface{}{} - for _, v := range kit.Split(kit.Select(k, a.Name), " ", " ")[1:] { - item := kit.Dict(kit.MDB_INPUT, "text", kit.MDB_VALUE, "@key") - ls, value := kit.Split(v, " ", ":=@"), "" - kit.Value(item, kit.MDB_NAME, ls[0]) - for i := 1; i < len(ls); i += 2 { - switch ls[i] { - case ":": - kit.Value(item, kit.MDB_INPUT, ls[i+1]) - switch ls[i+1] { - case "textarea": - kit.Value(item, "style.width", "300") - kit.Value(item, "style.height", "150") - - } - case "=": - if len(ls) <= i+1 { - continue - } - if strings.Contains(ls[i+1], ",") { - kit.Value(item, kit.MDB_INPUT, "select") - kit.Value(item, "values", strings.Split(ls[i+1], ",")) - } else { - kit.Value(item, kit.MDB_VALUE, ls[i+1]) - value = ls[i+1] - } - case "@": - kit.Value(item, kit.MDB_VALUE, "@"+ls[i+1]+"="+value) - } - } - list = append(list, item) - } - if len(list) > 0 { - a.List = list - } + a.List = c._split(a.Name) } - if a.List != nil { + if len(a.List) > 0 { v.Meta[a.Help] = a.List v.Meta[k] = a.List }