From b8bc1e211b112d606bc708f2bfd3ac2643ff5db6 Mon Sep 17 00:00:00 2001 From: shaoying Date: Wed, 21 Oct 2020 08:54:43 +0800 Subject: [PATCH] opt code --- base/nfs/nfs.go | 11 +- base/ssh/scripts.go | 12 +- core/chat/header.go | 44 +------- core/code/_trash.go | 59 ---------- core/code/autogen.go | 30 +++-- core/code/bench.go | 10 +- core/code/c.go | 253 ++++++++++++++++++----------------------- core/code/code.go | 2 +- core/code/code.shy | 13 ++- core/code/compile.go | 9 +- core/code/go.go | 138 ++++++++++++----------- core/code/inner.go | 46 +++++--- core/code/js.go | 189 +++++++++++++------------------ core/code/pack.go | 262 ++++++++++++++----------------------------- core/code/pprof.go | 10 +- core/code/sh.go | 111 +++++++++--------- core/code/shy.go | 44 ++++---- core/code/upgrade.go | 4 +- 18 files changed, 509 insertions(+), 738 deletions(-) delete mode 100644 core/code/_trash.go diff --git a/base/nfs/nfs.go b/base/nfs/nfs.go index 42b42b43..04f61ee3 100644 --- a/base/nfs/nfs.go +++ b/base/nfs/nfs.go @@ -149,11 +149,6 @@ func _file_list(m *ice.Message, root string, name string, level int, deep bool, } } func _file_show(m *ice.Message, name string) { - if strings.HasPrefix(name, "http") { - m.Cmdy("web.spide", "dev", "raw", "GET", name) - return // 远程文件 - } - if f, e := os.Open(path.Join(m.Option(DIR_ROOT), name)); e == nil { defer f.Close() @@ -176,6 +171,12 @@ func _file_show(m *ice.Message, name string) { return } + if b, ok := ice.BinPack["/"+name]; ok { + m.Info("binpack %v %v", len(b), name) + m.Echo(string(b)) + return // 打包文件 + } + // 远程文件 switch cb := m.Optionv(CAT_CB).(type) { case func(string, int): diff --git a/base/ssh/scripts.go b/base/ssh/scripts.go index 4ef586bf..4e17cf67 100644 --- a/base/ssh/scripts.go +++ b/base/ssh/scripts.go @@ -49,25 +49,27 @@ func Render(msg *ice.Message, cmd string, args ...interface{}) { } } func Script(m *ice.Message, name string) io.Reader { - if b, ok := ice.BinPack[name]; ok { - m.Debug("binpack %v %v", len(b), name) - return bytes.NewReader(b) - } - if strings.Contains(m.Option("_script"), "/") { name = path.Join(path.Dir(m.Option("_script")), name) } m.Option("_script", name) + m.Debug("name %v", name) if s, e := os.Open(path.Join(m.Option(nfs.DIR_ROOT), name)); e == nil { return s } + switch strings.Split(name, "/")[0] { case "etc", "var": m.Warn(true, ice.ErrNotFound) return nil } + if b, ok := ice.BinPack["/"+name]; ok { + m.Info("binpack %v %v", len(b), name) + return bytes.NewReader(b) + } + if msg := m.Cmd("web.spide", "dev", "GET", path.Join("/share/local/", name)); msg.Result(0) != ice.ErrWarn { bio := bytes.NewBuffer([]byte(msg.Result())) return bio diff --git a/core/chat/header.go b/core/chat/header.go index a26438fc..c8d4c026 100644 --- a/core/chat/header.go +++ b/core/chat/header.go @@ -3,11 +3,8 @@ package chat import ( ice "github.com/shylinux/icebergs" "github.com/shylinux/icebergs/base/aaa" - "github.com/shylinux/icebergs/base/nfs" "github.com/shylinux/icebergs/base/web" kit "github.com/shylinux/toolkits" - - "fmt" ) const ( @@ -40,27 +37,7 @@ func init() { }}, "pack": {Name: "pack", Help: "打包", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy("web.code.webpack", "pack") - - if f, _, e := kit.Create("usr/publish/webpack/" + m.Option("name") + ".js"); m.Assert(e) { - defer f.Close() - - f.WriteString(`Volcanos.meta.pack = ` + kit.Formats(kit.UnMarshal(m.Option("content")))) - } - - m.Option(nfs.DIR_ROOT, "") - if f, p, e := kit.Create("usr/publish/webpack/" + m.Option("name") + ".html"); m.Assert(e) { - f.WriteString(fmt.Sprintf(_pack, - m.Cmdx(nfs.CAT, "usr/volcanos/cache.css"), - m.Cmdx(nfs.CAT, "usr/volcanos/index.css"), - - m.Cmdx(nfs.CAT, "usr/volcanos/proto.js"), - m.Cmdx(nfs.CAT, "usr/volcanos/cache.js"), - m.Cmdx(nfs.CAT, "usr/publish/webpack/"+m.Option("name")+".js"), - m.Cmdx(nfs.CAT, "usr/volcanos/index.js"), - )) - m.Echo(p) - } + m.Cmdy("web.code.webpack", "create") }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Echo(m.Conf(HEADER, TITLE)) @@ -68,22 +45,3 @@ func init() { }, }, nil) } - -const _pack = ` - - - - - volcanos - - - - - - - - - - - -` diff --git a/core/code/_trash.go b/core/code/_trash.go deleted file mode 100644 index 80619ac6..00000000 --- a/core/code/_trash.go +++ /dev/null @@ -1,59 +0,0 @@ -package code - -func _pprof_show(m *ice.Message, zone string, id string) { - favor := m.Conf(PPROF, kit.Keys(kit.MDB_META, web.FAVOR)) - - m.Richs(PPROF, nil, zone, func(key string, val map[string]interface{}) { - val = val[kit.MDB_META].(map[string]interface{}) - - list := []string{} - task.Put(val, func(task *task.Task) error { - m.Sleep("1s") - m.Grows(PPROF, kit.Keys(kit.MDB_HASH, key), "", "", func(index int, value map[string]interface{}) { - // 压测命令 - m.Log_EXPORT(kit.MDB_META, PPROF, kit.MDB_ZONE, zone, kit.MDB_VALUE, kit.Format(value)) - cmd := kit.Format(value[kit.MDB_TYPE]) - arg := kit.Format(value[kit.MDB_TEXT]) - res := m.Cmd(mdb.ENGINE, value[kit.MDB_TYPE], value[kit.MDB_NAME], value[kit.MDB_TEXT], value[kit.MDB_EXTRA]).Result() - m.Cmd(web.FAVOR, favor, cmd, arg, res) - list = append(list, cmd+": "+arg, res) - }) - return nil - }) - - // 收藏程序 - msg := m.Cmd(web.CACHE, web.CATCH, kit.MIME_FILE, kit.Format(val[BINNARY])) - bin := msg.Append(kit.MDB_TEXT) - m.Cmd(web.FAVOR, favor, kit.MIME_FILE, bin, val[BINNARY]) - - // 性能分析 - msg = m.Cmd(web.SPIDE, "self", web.CACHE, http.MethodGet, kit.Select("/code/pprof/profile", val[SERVICE]), "seconds", kit.Select("5", kit.Format(val[SECONDS]))) - m.Cmd(web.FAVOR, favor, PPROF, msg.Append(kit.MDB_TEXT), kit.Keys(zone, "pd.gz")) - - // 结果摘要 - cmd := kit.Simple(m.Confv(PPROF, "meta.pprof"), "-text", val[BINNARY], msg.Append(kit.MDB_TEXT)) - res := strings.Split(m.Cmdx(cli.SYSTEM, cmd), "\n") - if len(res) > 20 { - res = res[:20] - } - m.Cmd(web.FAVOR, favor, web.TYPE_SHELL, strings.Join(cmd, " "), strings.Join(res, "\n")) - list = append(list, web.TYPE_SHELL+": "+strings.Join(cmd, " "), strings.Join(res, "\n")) - - // 结果展示 - u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) - p := kit.Format("%s:%s", u.Hostname(), m.Cmdx(tcp.PORT, aaa.Right)) - m.Option(cli.CMD_STDOUT, "var/daemon/stdout") - m.Option(cli.CMD_STDERR, "var/daemon/stderr") - m.Cmd(cli.DAEMON, m.Confv(PPROF, "meta.pprof"), "-http="+p, val[BINNARY], msg.Append(kit.MDB_TEXT)) - - url := u.Scheme + "://" + p + "/ui/top" - m.Cmd(web.FAVOR, favor, web.SPIDE, url, msg.Append(kit.MDB_TEXT)) - m.Set(ice.MSG_RESULT).Echo(url).Echo(" \n").Echo("\n") - m.Echo(strings.Join(list, "\n")).Echo("\n") - - m.Push("url", url) - m.Push(PPROF, msg.Append(kit.MDB_TEXT)) - m.Push(SERVICE, strings.Replace(kit.Format(val[SERVICE]), "profile", "", -1)) - m.Push("bin", bin) - }) -} diff --git a/core/code/autogen.go b/core/code/autogen.go index 5c829783..33fa5b7f 100644 --- a/core/code/autogen.go +++ b/core/code/autogen.go @@ -10,19 +10,15 @@ import ( "strings" ) -func _autogen_script(m *ice.Message, p string) { - // if b, e := kit.Render(m.Conf(AUTOGEN, "meta.shy"), m); m.Assert(e) { - if b, e := kit.Render(` -chapter {{.Option "name"}} -field {{.Option "name"}} web.code.{{.Option "name"}}.{{.Option "name"}} -`, m); m.Assert(e) { - m.Cmd(nfs.SAVE, p, string(b)) +func _autogen_script(m *ice.Message, dir string) { + if b, e := kit.Render(m.Conf(AUTOGEN, "meta.shy"), m); m.Assert(e) { + m.Cmd(nfs.SAVE, dir, string(b)) } } func _autogen_source(m *ice.Message, name string) { m.Cmd("nfs.file", "append", "src/main.shy", "\n", `source `+name+"/"+name+".shy", "\n") } -func _autogen_index(m *ice.Message, p string, from string, ctx string) { +func _autogen_index(m *ice.Message, dir string, from string, ctx string) { list := []string{} up, low := "", "" @@ -43,16 +39,17 @@ func _autogen_index(m *ice.Message, p string, from string, ctx string) { list = append(list, line) }) - m.Cmd(nfs.CAT, from) - m.Cmdy(nfs.SAVE, p, strings.Join(list, "\n")) + + m.Cmdy(nfs.SAVE, dir, strings.Join(list, "\n")) } func _autogen_main(m *ice.Message, file string, mod string, ctx string) { list := []string{} + m.Option(nfs.CAT_CB, func(line string, index int) { list = append(list, line) if strings.HasPrefix(line, "import (") { - list = append(list, ` _ "`+mod+"/src/"+ctx+`"`, "") + list = append(list, kit.Format(` _ "%s/src/%s"`, mod, ctx), "") } }) m.Cmd(nfs.CAT, file) @@ -76,7 +73,10 @@ func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ AUTOGEN: {Name: AUTOGEN, Help: "生成", Value: kit.Data( - kit.MDB_FIELD, "time,id,name,from", + kit.MDB_FIELD, "time,id,name,from", "shy", ` +chapter "{{.Option "name"}}" +field "{{.Option "name"}}" web.code.{{.Option "name"}}.{{.Option "name"}} +`, )}, }, Commands: map[string]*ice.Command{ @@ -95,13 +95,11 @@ func init() { mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { switch arg[0] { case "main": - m.Cmdy(nfs.DIR, "src") - m.Appendv(ice.MSG_APPEND, "path", "size", "time") + m.Cmdy(nfs.DIR, "src", "path,size,time") m.Sort(kit.MDB_PATH) case "from": m.Option(nfs.DIR_DEEP, true) - m.Cmdy(nfs.DIR, "usr/icebergs") - m.Appendv(ice.MSG_APPEND, "path", "size", "time") + m.Cmdy(nfs.DIR, "usr/icebergs", "path,size,time") m.Sort(kit.MDB_PATH) } }}, diff --git a/core/code/bench.go b/core/code/bench.go index d773a544..11025a9d 100644 --- a/core/code/bench.go +++ b/core/code/bench.go @@ -15,7 +15,7 @@ import ( "sync/atomic" ) -func _bench_http(m *ice.Message, kind, name, target string, arg ...string) { +func _bench_http(m *ice.Message, name, target string, arg ...string) { nconn := kit.Int64(kit.Select("10", m.Option(NCONN))) nreqs := kit.Int64(kit.Select("1000", m.Option(NREQS))) m.Echo("nconn: %d nreqs: %d\n", nconn, nreqs*nconn) @@ -49,6 +49,8 @@ func _bench_http(m *ice.Message, kind, name, target string, arg ...string) { m.Echo("body: %d\n", body) m.Option(ice.MSG_PROCESS, "_inner") } +func _bench_redis(m *ice.Message, name, target string, arg ...string) { +} const ( NCONN = "nconn" @@ -63,7 +65,7 @@ func init() { BENCH: {Name: BENCH, Help: "性能压测", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ZONE)}, }, Commands: map[string]*ice.Command{ - BENCH: {Name: "bench zone=auto id=auto auto insert", Help: "性能压测", Action: map[string]*ice.Action{ + BENCH: {Name: "bench zone id auto insert", Help: "性能压测", Action: map[string]*ice.Action{ mdb.CREATE: {Name: "create zone", Help: "创建", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, BENCH, "", mdb.HASH, arg) }}, @@ -81,7 +83,9 @@ func init() { cli.RUN: {Name: "run", Help: "运行", Hand: func(m *ice.Message, arg ...string) { switch m.Option(kit.MDB_TYPE) { case "http": - _bench_http(m, m.Option(kit.MDB_TYPE), m.Option(kit.MDB_NAME), m.Option(kit.MDB_TEXT)) + _bench_http(m, m.Option(kit.MDB_NAME), m.Option(kit.MDB_TEXT)) + case "redis": + _bench_redis(m, m.Option(kit.MDB_NAME), m.Option(kit.MDB_TEXT)) } }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { diff --git a/core/code/c.go b/core/code/c.go index 5a459828..bb4052c8 100644 --- a/core/code/c.go +++ b/core/code/c.go @@ -7,57 +7,16 @@ import ( "github.com/shylinux/icebergs/base/nfs" kit "github.com/shylinux/toolkits" - "bufio" "os" "path" "strings" ) -func _c_find(m *ice.Message, key string) { - for _, p := range strings.Split(m.Cmdx(cli.SYSTEM, FIND, ".", "-name", key), "\n") { - if p == "" { - continue - } - m.Push(kit.MDB_FILE, strings.TrimPrefix(p, "./")) - m.Push(kit.MDB_LINE, 1) - m.Push(kit.MDB_TEXT, "") - } -} -func _c_grep(m *ice.Message, key string) { - m.Split(m.Cmd(cli.SYSTEM, GREP, "--exclude-dir=.git", "--exclude-dir=pluged", "--exclude=.[a-z]*", - "-rn", "\\<"+key+"\\>", ".").Append(cli.CMD_OUT), "file:line:text", ":", "\n") -} func _c_tags(m *ice.Message, key string) { - if _, e := os.Stat(path.Join(m.Option("_path"), m.Conf(C, "meta.tags"))); e != nil { - // 创建索引 - m.Cmd(cli.SYSTEM, CTAGS, "-R", "-f", m.Conf(C, "meta.tags"), "./") + if _, e := os.Stat(path.Join(m.Option(cli.CMD_DIR), ".tags")); e != nil { + m.Cmd(cli.SYSTEM, "ctags", "-R", "-f", ".tags", "./") } - - for _, l := range strings.Split(m.Cmdx(cli.SYSTEM, GREP, "^"+key+"\\>", m.Conf(C, "meta.tags")), "\n") { - ls := strings.SplitN(l, "\t", 2) - if len(ls) < 2 { - continue - } - - ls = strings.SplitN(ls[1], "\t", 2) - file := ls[0] - ls = strings.SplitN(ls[1], ";\"", 2) - text := strings.TrimSuffix(strings.TrimPrefix(ls[0], "/^"), "$/") - line := kit.Int(text) - - p := path.Join(m.Option("_path"), file) - f, e := os.Open(p) - m.Assert(e) - bio := bufio.NewScanner(f) - for i := 1; bio.Scan(); i++ { - if i == line || bio.Text() == text { - m.Push(kit.MDB_FILE, strings.TrimPrefix(file, "./")) - m.Push(kit.MDB_LINE, i) - m.Push(kit.MDB_TEXT, bio.Text()) - } - } - } - m.Sort(kit.MDB_LINE, "int") + _go_tags(m, key) } func _c_help(m *ice.Message, section, key string) string { p := m.Cmd(cli.SYSTEM, MAN, section, key).Append(cli.CMD_OUT) @@ -78,150 +37,160 @@ func _c_help(m *ice.Message, section, key string) string { return string(res) } -const CC = "cc" -const C = "c" const H = "h" +const C = "c" +const CC = "cc" const MAN1 = "man1" const MAN2 = "man2" const MAN3 = "man3" const MAN8 = "man8" const ( - FIND = "find" - GREP = "grep" - CTAGS = "ctags" - MAN = "man" + FIND = "find" + GREP = "grep" + MAN = "man" ) func init() { - Index.Register(&ice.Context{Name: C, Help: "c", + Index.Register(&ice.Context{Name: C, Help: "系统", Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmd(mdb.SEARCH, mdb.CREATE, CC, C, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.PLUGIN, mdb.CREATE, CC, C, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.RENDER, mdb.CREATE, CC, C, c.Cap(ice.CTX_FOLLOW)) + m.Cmd(mdb.PLUGIN, mdb.CREATE, CC, m.Prefix(C)) + m.Cmd(mdb.RENDER, mdb.CREATE, CC, m.Prefix(C)) + m.Cmd(mdb.SEARCH, mdb.CREATE, CC, m.Prefix(C)) - m.Cmd(mdb.SEARCH, mdb.CREATE, C, C, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.PLUGIN, mdb.CREATE, C, C, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.RENDER, mdb.CREATE, C, C, c.Cap(ice.CTX_FOLLOW)) + m.Cmd(mdb.PLUGIN, mdb.CREATE, C, m.Prefix(C)) + m.Cmd(mdb.RENDER, mdb.CREATE, C, m.Prefix(C)) + m.Cmd(mdb.SEARCH, mdb.CREATE, C, m.Prefix(C)) - m.Cmd(mdb.SEARCH, mdb.CREATE, H, C, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.PLUGIN, mdb.CREATE, H, C, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.RENDER, mdb.CREATE, H, C, c.Cap(ice.CTX_FOLLOW)) + m.Cmd(mdb.PLUGIN, mdb.CREATE, H, m.Prefix(C)) + m.Cmd(mdb.RENDER, mdb.CREATE, H, m.Prefix(C)) + m.Cmd(mdb.SEARCH, mdb.CREATE, H, m.Prefix(C)) for _, k := range []string{MAN1, MAN2, MAN3, MAN8} { - m.Cmd(mdb.SEARCH, mdb.CREATE, k, MAN, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.PLUGIN, mdb.CREATE, k, MAN, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.RENDER, mdb.CREATE, k, MAN, c.Cap(ice.CTX_FOLLOW)) + m.Cmd(mdb.PLUGIN, mdb.CREATE, k, m.Prefix(MAN)) + m.Cmd(mdb.RENDER, mdb.CREATE, k, m.Prefix(MAN)) + m.Cmd(mdb.SEARCH, mdb.CREATE, k, m.Prefix(MAN)) } }}, - C: {Name: C, Help: "c", Action: map[string]*ice.Action{ - mdb.SEARCH: {Name: "search type name text", Hand: func(m *ice.Message, arg ...string) { - if arg[0] == kit.MDB_FOREACH { - return - } - m.Option(cli.CMD_DIR, m.Option("_path")) - _c_find(m, kit.Select("main", arg, 1)) - m.Cmdy(mdb.SEARCH, "man2", arg[1:]) - _c_tags(m, kit.Select("main", arg, 1)) - _c_grep(m, kit.Select("main", arg, 1)) - }}, + C: {Name: C, Help: "系统", Action: map[string]*ice.Action{ mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) { m.Echo(m.Conf(C, "meta.plug")) }}, mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1])) }}, + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { + if arg[0] == kit.MDB_FOREACH { + return + } + m.Option(cli.CMD_DIR, kit.Select("src", arg, 2)) + _go_find(m, kit.Select("main", arg, 1)) + m.Cmdy(mdb.SEARCH, MAN2, arg[1:]) + m.Cmdy(mdb.SEARCH, MAN3, arg[1:]) + _c_tags(m, kit.Select("main", arg, 1)) + _go_grep(m, kit.Select("main", arg, 1)) + }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}}, - MAN: {Name: MAN, Help: "man", Action: map[string]*ice.Action{ - mdb.SEARCH: {Name: "search type name text", Hand: func(m *ice.Message, arg ...string) { + MAN: {Name: MAN, Help: "手册", Action: map[string]*ice.Action{ + mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) { + m.Echo(m.Conf(MAN, "meta.plug")) + }}, + mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { + m.Echo(_c_help(m, strings.TrimPrefix(arg[0], MAN), strings.TrimSuffix(arg[1], "."+arg[0]))) + }}, + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { if arg[0] == kit.MDB_FOREACH { return } for _, k := range []string{"1", "2", "3", "8"} { if text := _c_help(m, k, kit.Select("main", arg, 1)); text != "" { - m.Push(kit.MDB_FILE, arg[1]+".man"+k) - m.Push(kit.MDB_LINE, "1") - m.Push(kit.MDB_TEXT, text) + for _, k := range kit.Split(m.Option(mdb.FIELDS)) { + switch k { + case kit.MDB_FILE: + m.Push(k, arg[1]+".man"+k) + case kit.MDB_LINE: + m.Push(k, 1) + case kit.MDB_TEXT: + m.Push(k, text) + default: + m.Push(k, "") + } + } } } }}, - mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) { - m.Echo(m.Conf(C, "meta.man.plug")) - }}, - mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { - m.Echo(_c_help(m, strings.TrimPrefix(arg[0], "man"), strings.TrimSuffix(arg[1], "."+arg[0]))) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}}, + }}, }, Configs: map[string]*ice.Config{ - C: {Name: C, Help: "c", Value: kit.Data( - "tags", ".tags", - "man.plug", kit.Dict( - "prefix", kit.Dict( - "NAME", "comment", - "LIBRARY", "comment", - "SYNOPSIS", "comment", - "DESCRIPTION", "comment", - "STANDARDS", "comment", - "SEE ALSO", "comment", - "HISTORY", "comment", - "BUGS", "comment", + MAN: {Name: MAN, Help: "手册", Value: kit.Data( + "plug", kit.Dict( + PREFIX, kit.Dict( + "NAME", COMMENT, + "LIBRARY", COMMENT, + "SYNOPSIS", COMMENT, + "DESCRIPTION", COMMENT, + "STANDARDS", COMMENT, + "SEE ALSO", COMMENT, + "HISTORY", COMMENT, + "BUGS", COMMENT, ), ), + )}, + C: {Name: C, Help: "系统", Value: kit.Data( "plug", kit.Dict( - "split", kit.Dict( + SPLIT, kit.Dict( "space", " ", - "operator", "{[(.,;!|<>)]}", + "operator", "{[(.,:;!|<>)]}", ), - "prefix", kit.Dict( - "//", "comment", - "/*", "comment", - "*", "comment", + PREFIX, kit.Dict( + "//", COMMENT, + "/*", COMMENT, + "*", COMMENT, ), - "keyword", kit.Dict( - "#include", "keyword", - "#define", "keyword", - "#ifndef", "keyword", - "#ifdef", "keyword", - "#else", "keyword", - "#endif", "keyword", + KEYWORD, kit.Dict( + "#include", KEYWORD, + "#define", KEYWORD, + "#ifndef", KEYWORD, + "#ifdef", KEYWORD, + "#else", KEYWORD, + "#endif", KEYWORD, - "if", "keyword", - "else", "keyword", - "for", "keyword", - "while", "keyword", - "do", "keyword", - "break", "keyword", - "continue", "keyword", - "switch", "keyword", - "case", "keyword", - "default", "keyword", - "return", "keyword", + "if", KEYWORD, + "else", KEYWORD, + "for", KEYWORD, + "while", KEYWORD, + "do", KEYWORD, + "break", KEYWORD, + "continue", KEYWORD, + "switch", KEYWORD, + "case", KEYWORD, + "default", KEYWORD, + "return", KEYWORD, - "typedef", "keyword", - "extern", "keyword", - "static", "keyword", - "const", "keyword", - "sizeof", "keyword", + "typedef", KEYWORD, + "extern", KEYWORD, + "static", KEYWORD, + "const", KEYWORD, + "sizeof", KEYWORD, - "union", "datatype", - "struct", "datatype", - "unsigned", "datatype", - "double", "datatype", - "void", "datatype", - "long", "datatype", - "char", "datatype", - "int", "datatype", + "union", DATATYPE, + "struct", DATATYPE, + "unsigned", DATATYPE, + "double", DATATYPE, + "void", DATATYPE, + "long", DATATYPE, + "char", DATATYPE, + "int", DATATYPE, - "assert", "function", - "zmalloc", "function", + "assert", FUNCTION, + "zmalloc", FUNCTION, - "NULL", "string", - "-1", "string", - "0", "string", - "1", "string", - "2", "string", + "NULL", STRING, + "-1", STRING, + "0", STRING, + "1", STRING, + "2", STRING, ), ), )}, diff --git a/core/code/code.go b/core/code/code.go index 450bb254..0ef63532 100644 --- a/core/code/code.go +++ b/core/code/code.go @@ -21,7 +21,7 @@ var Index = &ice.Context{Name: CODE, Help: "编程中心", func init() { web.Index.Register(Index, &web.Frame{}, INSTALL, AUTOGEN, COMPILE, PUBLISH, UPGRADE, - INNER, VIMER, FAVOR, BENCH, PPROF, + VIMER, INNER, FAVOR, BENCH, PPROF, C, SH, SHY, GO, JS, ) } diff --git a/core/code/code.shy b/core/code/code.shy index fcbc8c07..aaa46e14 100644 --- a/core/code/code.shy +++ b/core/code/code.shy @@ -6,6 +6,9 @@ chapter "code" # field "发布" web.code.publish # field "升级" web.code.upgrade +field "打包" web.code.binpack +field "打包" web.code.webpack + field "编辑" web.code.vimer field "查看" web.code.inner field "收藏" web.code.favor @@ -13,8 +16,8 @@ field "测试" web.code.bench field "优化" web.code.pprof return -field "查看" web.code.c -field "编辑" web.code.sh -field "测试" web.code.shy -field "收藏" web.code.go -field "优化" web.code.js +field "系统" web.code.c +field "命令" web.code.sh +field "脚本" web.code.shy +field "后端" web.code.go +field "前端" web.code.js diff --git a/core/code/compile.go b/core/code/compile.go index e8524219..dd0ccf51 100644 --- a/core/code/compile.go +++ b/core/code/compile.go @@ -29,14 +29,12 @@ func init() { Commands: map[string]*ice.Command{ COMPILE: {Name: "compile os=linux,darwin,windows arch=amd64,386,arm src=src/main.go@key 执行:button", Help: "编译", Action: map[string]*ice.Action{ mdb.INPUTS: {Name: "inputs", Help: "补全", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(nfs.DIR, "src") - m.Appendv(ice.MSG_APPEND, "path", "size", "time") + m.Cmdy(nfs.DIR, "src", "path,size,time") m.Sort(kit.MDB_PATH) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { if len(arg) == 0 { - // 目录列表 - m.Cmdy(nfs.DIR, m.Conf(COMPILE, kit.META_PATH), "time size path") + m.Cmdy(nfs.DIR, m.Conf(COMPILE, kit.META_PATH), "time,size,path") return } @@ -55,7 +53,8 @@ func init() { } // 编译目标 - file := path.Join(m.Conf(cmd, kit.META_PATH), kit.Keys(kit.Select("ice", path.Base(strings.TrimSuffix(main, ".go")), main != "src/main.go"), goos, arch)) + + file := path.Join(kit.Select("", m.Conf(cmd, kit.META_PATH), m.Option(cli.CMD_DIR) == ""), kit.Keys(kit.Select("ice", path.Base(strings.TrimSuffix(main, ".go")), main != "src/main.go"), goos, arch)) args := []string{"-ldflags"} list := []string{ fmt.Sprintf(`-X main.Time="%s"`, m.Time()), diff --git a/core/code/go.go b/core/code/go.go index cb1e16a6..c1800826 100644 --- a/core/code/go.go +++ b/core/code/go.go @@ -27,6 +27,8 @@ func _go_find(m *ice.Message, key string) { m.Push(k, 1) case kit.MDB_TEXT: m.Push(k, "") + default: + m.Push(k, "") } } } @@ -67,6 +69,8 @@ func _go_tags(m *ice.Message, key string) { m.Push(k, i) case kit.MDB_TEXT: m.Push(k, bio.Text()) + default: + m.Push(k, "") } } } @@ -101,6 +105,8 @@ func _go_help(m *ice.Message, key string) { m.Push(k, 1) case kit.MDB_TEXT: m.Push(k, string(res)) + default: + m.Push(k, "") } } } @@ -111,7 +117,7 @@ const MOD = "mod" const SUM = "sum" func init() { - Index.Register(&ice.Context{Name: GO, Help: "go", + Index.Register(&ice.Context{Name: GO, Help: "后端", Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Cmd(mdb.PLUGIN, mdb.CREATE, GO, m.Prefix(GO)) @@ -130,23 +136,23 @@ func init() { m.Cmd(mdb.RENDER, mdb.CREATE, SUM, m.Prefix(SUM)) }}, - SUM: {Name: SUM, Help: "sum", Action: map[string]*ice.Action{ + SUM: {Name: SUM, Help: "版本", Action: map[string]*ice.Action{ mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) { - m.Echo(m.Conf(GO, "meta.mod.plug")) + m.Echo(m.Conf(MOD, "meta.plug")) }}, mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1])) }}, }}, - MOD: {Name: MOD, Help: "mod", Action: map[string]*ice.Action{ + MOD: {Name: MOD, Help: "模块", Action: map[string]*ice.Action{ mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) { - m.Echo(m.Conf(GO, "meta.mod.plug")) + m.Echo(m.Conf(MOD, "meta.plug")) }}, mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1])) }}, }}, - DOC: {Name: DOC, Help: "doc", Action: map[string]*ice.Action{ + DOC: {Name: DOC, Help: "文档", Action: map[string]*ice.Action{ mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) { m.Echo(m.Conf(GO, "meta.plug")) }}, @@ -155,7 +161,7 @@ func init() { m.Echo(m.Cmdx(cli.SYSTEM, GO, "doc", strings.TrimSuffix(arg[1], "."+arg[0]))) }}, }}, - GO: {Name: GO, Help: "go", Action: map[string]*ice.Action{ + GO: {Name: GO, Help: "后端", Action: map[string]*ice.Action{ mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) { m.Echo(m.Conf(GO, "meta.plug")) }}, @@ -177,83 +183,85 @@ func init() { } m.Option(cli.CMD_DIR, kit.Select("src", arg, 2)) _go_find(m, kit.Select("main", arg, 1)) - _go_tags(m, kit.Select("main", arg, 1)) _go_help(m, kit.Select("main", arg, 1)) + _go_tags(m, kit.Select("main", arg, 1)) _go_grep(m, kit.Select("main", arg, 1)) }}, }}, }, Configs: map[string]*ice.Config{ - GO: {Name: GO, Help: "go", Value: kit.Data( - "mod.plug", kit.Dict( - "prefix", kit.Dict( - "#", "comment", + MOD: {Name: MOD, Help: "模块", Value: kit.Data( + "plug", kit.Dict( + PREFIX, kit.Dict( + "#", COMMENT, ), - "keyword", kit.Dict( - "module", "keyword", - "require", "keyword", - "replace", "keyword", - "=>", "keyword", + KEYWORD, kit.Dict( + "module", KEYWORD, + "require", KEYWORD, + "replace", KEYWORD, + "=>", KEYWORD, ), ), + )}, + GO: {Name: GO, Help: "后端", Value: kit.Data( "plug", kit.Dict( - "split", kit.Dict( + SPLIT, kit.Dict( "space", "\t ", "operator", "{[(&.,:;!|<>)]}", ), - "prefix", kit.Dict( - "//", "comment", - "/*", "comment", - "*", "comment", + PREFIX, kit.Dict( + "//", COMMENT, + "/*", COMMENT, + "*", COMMENT, ), - "keyword", kit.Dict( - "package", "keyword", - "import", "keyword", - "const", "keyword", - "func", "keyword", - "var", "keyword", - "type", "keyword", - "struct", "keyword", - "interface", "keyword", + KEYWORD, kit.Dict( + "package", KEYWORD, + "import", KEYWORD, + "const", KEYWORD, + "func", KEYWORD, + "var", KEYWORD, + "type", KEYWORD, + "struct", KEYWORD, + "interface", KEYWORD, - "if", "keyword", - "else", "keyword", - "for", "keyword", - "range", "keyword", - "break", "keyword", - "continue", "keyword", - "switch", "keyword", - "case", "keyword", - "default", "keyword", - "fallthrough", "keyword", + "if", KEYWORD, + "else", KEYWORD, + "for", KEYWORD, + "range", KEYWORD, + "break", KEYWORD, + "continue", KEYWORD, + "switch", KEYWORD, + "case", KEYWORD, + "default", KEYWORD, + "fallthrough", KEYWORD, - "go", "keyword", - "select", "keyword", - "return", "keyword", - "defer", "keyword", + "go", KEYWORD, + "select", KEYWORD, + "return", KEYWORD, + "defer", KEYWORD, - "map", "datatype", - "chan", "datatype", - "string", "datatype", - "error", "datatype", - "bool", "datatype", - "byte", "datatype", - "int", "datatype", - "int64", "datatype", - "float64", "datatype", + "map", DATATYPE, + "chan", DATATYPE, + "string", DATATYPE, + "error", DATATYPE, + "bool", DATATYPE, + "byte", DATATYPE, + "int", DATATYPE, + "int64", DATATYPE, + "float64", DATATYPE, - "len", "function", - "cap", "function", - "copy", "function", - "append", "function", - "msg", "function", - "m", "function", + "len", FUNCTION, + "cap", FUNCTION, + "copy", FUNCTION, + "append", FUNCTION, + "msg", FUNCTION, + "m", FUNCTION, - "nil", "string", - "-1", "string", - "0", "string", - "1", "string", - "2", "string", + "nil", STRING, + "-1", STRING, + "0", STRING, + "1", STRING, + "2", STRING, ), ), )}, diff --git a/core/code/inner.go b/core/code/inner.go index 25e87459..ffbff8b9 100644 --- a/core/code/inner.go +++ b/core/code/inner.go @@ -12,6 +12,19 @@ import ( "strings" ) +const ( + COMMENT = "comment" + KEYWORD = "keyword" + FUNCTION = "function" + DATATYPE = "datatype" + STRING = "string" +) +const ( + SPLIT = "split" + PREFIX = "prefix" + SUFFIX = "suffix" +) + func _inner_ext(name string) string { return strings.ToLower(kit.Select(path.Base(name), strings.TrimPrefix(path.Ext(name), "."))) } @@ -28,7 +41,7 @@ func _inner_list(m *ice.Message, ext, file, dir string, arg ...string) { return // 解析成功 } - if m.Conf(INNER, kit.Keys("meta.source", ext)) == "true" { + if m.Conf(INNER, kit.Keys(kit.META_SOURCE, ext)) == "true" { if m.Cmdy(nfs.CAT, path.Join(dir, file)); m.Result() != "" { return } @@ -100,39 +113,38 @@ func init() { ), "plug", kit.Dict( "makefile", kit.Dict( - "prefix", kit.Dict("#", "comment"), - "suffix", kit.Dict(":", "comment"), - "keyword", kit.Dict( - "ifeq", "keyword", - "ifneq", "keyword", - "else", "keyword", - "endif", "keyword", + PREFIX, kit.Dict("#", COMMENT), + SUFFIX, kit.Dict(":", COMMENT), + KEYWORD, kit.Dict( + "ifeq", KEYWORD, + "ifneq", KEYWORD, + "else", KEYWORD, + "endif", KEYWORD, ), ), "py", kit.Dict( - "prefix", kit.Dict("#", "comment"), - "keyword", kit.Dict("print", "keyword"), + PREFIX, kit.Dict("#", COMMENT), + KEYWORD, kit.Dict("print", KEYWORD), ), "csv", kit.Dict("display", true), "json", kit.Dict("link", true), "html", kit.Dict( - "split", kit.Dict( + SPLIT, kit.Dict( "space", " ", "operator", "<>", ), - "keyword", kit.Dict( - "head", "keyword", - "body", "keyword", + KEYWORD, kit.Dict( + "head", KEYWORD, + "body", KEYWORD, ), ), "css", kit.Dict( - "suffix", kit.Dict("{", "comment"), + SUFFIX, kit.Dict("{", COMMENT), ), - "md", kit.Dict("display", true, "profile", true), + "md", kit.Dict(), ), "show", kit.Dict( - "sh", []string{"sh"}, "py", []string{"python"}, "js", []string{"node"}, ), diff --git a/core/code/js.go b/core/code/js.go index ea990547..c5de7eb2 100644 --- a/core/code/js.go +++ b/core/code/js.go @@ -8,151 +8,120 @@ import ( "github.com/shylinux/icebergs/base/web" kit "github.com/shylinux/toolkits" - "net/http" - "os" "path" - "strings" ) -func _js_find(m *ice.Message, key string) { - for _, p := range strings.Split(m.Cmdx(cli.SYSTEM, "find", ".", "-name", key), "\n") { - if p == "" { - continue - } - m.Push("file", strings.TrimPrefix(p, "./")) - m.Push("line", 1) - m.Push("text", "") - } -} -func _js_grep(m *ice.Message, key string) { - m.Split(m.Cmd(cli.SYSTEM, "grep", "--exclude-dir=.git", "--exclude=.[a-z]*", "-rn", key, ".").Append(cli.CMD_OUT), "file:line:text", ":", "\n") -} - const JS = "js" -const TS = "ts" -const TSX = "tsx" const CSS = "css" const HTML = "html" const NODE = "node" func init() { - Index.Register(&ice.Context{Name: JS, Help: "js", + Index.Register(&ice.Context{Name: JS, Help: "前端", Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmd(mdb.SEARCH, mdb.CREATE, JS, JS, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.PLUGIN, mdb.CREATE, JS, JS, c.Cap(ice.CTX_FOLLOW)) - m.Cmd(mdb.RENDER, mdb.CREATE, JS, JS, c.Cap(ice.CTX_FOLLOW)) + m.Cmd(mdb.PLUGIN, mdb.CREATE, JS, m.Prefix(JS)) + m.Cmd(mdb.RENDER, mdb.CREATE, JS, m.Prefix(JS)) + m.Cmd(mdb.SEARCH, mdb.CREATE, JS, m.Prefix(JS)) }}, - NODE: {Name: NODE, Help: "node", Action: map[string]*ice.Action{ - "install": {Name: "install", Help: "下载", Hand: func(m *ice.Message, arg ...string) { - // 下载 - source := m.Conf(NODE, "meta.source") - p := path.Join(m.Conf("web.code._install", "meta.path"), path.Base(source)) - if _, e := os.Stat(p); e != nil { - msg := m.Cmd(web.SPIDE, "dev", web.CACHE, http.MethodGet, source) - m.Cmd(web.CACHE, web.WATCH, msg.Append(web.DATA), p) - } - - // 解压 - m.Option(cli.CMD_DIR, m.Conf("web.code._install", "meta.path")) - m.Cmd(cli.SYSTEM, "tar", "xvf", path.Base(source)) - m.Echo(p) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}}, - - JS: {Name: JS, Help: "js", Action: map[string]*ice.Action{ - mdb.SEARCH: {Name: "search type name text", Hand: func(m *ice.Message, arg ...string) { - if arg[0] == kit.MDB_FOREACH { - return - } - m.Option(cli.CMD_DIR, m.Option("_path")) - _js_find(m, kit.Select("main", arg, 1)) - _js_grep(m, kit.Select("main", arg, 1)) - }}, + JS: {Name: JS, Help: "前端", Action: map[string]*ice.Action{ mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) { m.Echo(m.Conf(JS, "meta.plug")) }}, mdb.RENDER: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.CAT, path.Join(arg[2], arg[1])) }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}}, + mdb.SEARCH: {Name: "search type name text", Hand: func(m *ice.Message, arg ...string) { + if arg[0] == kit.MDB_FOREACH { + return + } + m.Option(cli.CMD_DIR, kit.Select("src", arg, 2)) + _go_find(m, kit.Select("main", arg, 1)) + _go_grep(m, kit.Select("main", arg, 1)) + }}, + }}, + NODE: {Name: "node", Help: "前端", Action: map[string]*ice.Action{ + web.DOWNLOAD: {Name: "download", Help: "下载", Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(INSTALL, m.Conf(NODE, kit.META_SOURCE)) + }}, + }}, }, Configs: map[string]*ice.Config{ - NODE: {Name: NODE, Help: "服务器", Value: kit.Data( + NODE: {Name: NODE, Help: "前端", Value: kit.Data( "source", "https://nodejs.org/dist/v10.13.0/node-v10.13.0-linux-x64.tar.xz", )}, JS: {Name: JS, Help: "js", Value: kit.Data( "plug", kit.Dict( - "split", kit.Dict( + SPLIT, kit.Dict( "space", " \t", "operator", "{[(&.,;!|<>)]}", ), - "prefix", kit.Dict( - "//", "comment", - "/*", "comment", - "*", "comment", + PREFIX, kit.Dict( + "//", COMMENT, + "/*", COMMENT, + "*", COMMENT, ), - "keyword", kit.Dict( - "var", "keyword", - "new", "keyword", - "delete", "keyword", - "typeof", "keyword", - "function", "keyword", + KEYWORD, kit.Dict( + "var", KEYWORD, + "new", KEYWORD, + "delete", KEYWORD, + "typeof", KEYWORD, + "function", KEYWORD, - "if", "keyword", - "else", "keyword", - "for", "keyword", - "while", "keyword", - "break", "keyword", - "continue", "keyword", - "switch", "keyword", - "case", "keyword", - "default", "keyword", - "return", "keyword", + "if", KEYWORD, + "else", KEYWORD, + "for", KEYWORD, + "while", KEYWORD, + "break", KEYWORD, + "continue", KEYWORD, + "switch", KEYWORD, + "case", KEYWORD, + "default", KEYWORD, + "return", KEYWORD, - "window", "function", - "console", "function", - "document", "function", - "arguments", "function", - "event", "function", - "Date", "function", - "JSON", "function", + "window", FUNCTION, + "console", FUNCTION, + "document", FUNCTION, + "arguments", FUNCTION, + "event", FUNCTION, + "Date", FUNCTION, + "JSON", FUNCTION, - "0", "string", - "1", "string", - "10", "string", - "-1", "string", - "true", "string", - "false", "string", - "undefined", "string", - "null", "string", + "0", STRING, + "1", STRING, + "10", STRING, + "-1", STRING, + "true", STRING, + "false", STRING, + "undefined", STRING, + "null", STRING, - "__proto__", "function", - "setTimeout", "function", - "createElement", "function", - "appendChild", "function", - "removeChild", "function", - "parentNode", "function", - "childNodes", "function", + "__proto__", FUNCTION, + "setTimeout", FUNCTION, + "createElement", FUNCTION, + "appendChild", FUNCTION, + "removeChild", FUNCTION, + "parentNode", FUNCTION, + "childNodes", FUNCTION, - "Volcanos", "function", - "request", "function", - "require", "function", + "Volcanos", FUNCTION, + "request", FUNCTION, + "require", FUNCTION, - "cb", "function", - "cbs", "function", - "shy", "function", - "can", "function", - "sub", "function", - "msg", "function", - "res", "function", - "pane", "function", - "plugin", "function", + "cb", FUNCTION, + "cbs", FUNCTION, + "shy", FUNCTION, + "can", FUNCTION, + "sub", FUNCTION, + "msg", FUNCTION, + "res", FUNCTION, + "pane", FUNCTION, + "plugin", FUNCTION, - "-1", "string", - "0", "string", - "1", "string", - "2", "string", + "-1", STRING, + "0", STRING, + "1", STRING, + "2", STRING, ), ), )}, diff --git a/core/code/pack.go b/core/code/pack.go index 2c143778..4a86c50a 100644 --- a/core/code/pack.go +++ b/core/code/pack.go @@ -7,8 +7,6 @@ import ( "github.com/shylinux/icebergs/base/nfs" kit "github.com/shylinux/toolkits" - "bufio" - "bytes" "fmt" "io/ioutil" "os" @@ -20,12 +18,13 @@ func _pack_file(m *ice.Message, file string) string { list := "" if f, e := os.Open(file); e == nil { defer f.Close() + if b, e := ioutil.ReadAll(f); e == nil { list = fmt.Sprintf("%v", b) } } - list = strings.ReplaceAll(list, " ", ",") - if len(list) > 0 { + + if list = strings.ReplaceAll(list, " ", ","); len(list) > 0 { return fmt.Sprintf(`[]byte{%v}`, list[1:len(list)-1]) } return "[]byte{}" @@ -72,22 +71,57 @@ func _pack_contexts(m *ice.Message, pack *os.File) { pack.WriteString("\n") } -const ( - WEBPACK = "webpack" - BINPACK = "binpack" - MODPACK = "modpack" -) +const WEBPACK = "webpack" +const BINPACK = "binpack" func init() { Index.Merge(&ice.Context{ Commands: map[string]*ice.Command{ - WEBPACK: {Name: "webpack path auto 打包", Help: "打包", Action: map[string]*ice.Action{ - "pack": {Name: "pack", Help: "打包", Hand: func(m *ice.Message, arg ...string) { + BINPACK: {Name: "binpack path auto create", Help: "打包", Action: map[string]*ice.Action{ + mdb.CREATE: {Name: "create name=demo from=src/main.go", Help: "创建", Hand: func(m *ice.Message, arg ...string) { + name := kit.Keys(m.Option(kit.MDB_NAME), "go") + if pack, p, e := kit.Create(path.Join(m.Conf(PUBLISH, kit.META_PATH), BINPACK, name)); m.Assert(e) { + defer pack.Close() + + pack.WriteString(m.Cmdx(nfs.CAT, m.Option("from"))) + + pack.WriteString("\n") + pack.WriteString(`func init() {` + "\n") + pack.WriteString(` ice.BinPack = map[string][]byte{` + "\n") + + _pack_volcanos(m, pack, "usr/volcanos") + _pack_dir(m, pack, "usr/learning") + _pack_dir(m, pack, "usr/icebergs") + _pack_dir(m, pack, "usr/toolkits") + _pack_dir(m, pack, "usr/intshell") + _pack_contexts(m, pack) + + pack.WriteString(` }` + "\n") + pack.WriteString(`}` + "\n") + m.Echo(p) + } + + m.Option(cli.CMD_DIR, path.Join(m.Conf(PUBLISH, kit.META_PATH), BINPACK)) + m.Cmd(COMPILE, "windows", "amd64", name) + m.Cmd(COMPILE, "darwin", "amd64", name) + m.Cmd(COMPILE, "linux", "amd64", name) + }}, + }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { + m.Option(nfs.DIR_ROOT, path.Join(m.Conf(PUBLISH, kit.META_PATH))) + m.Option(nfs.DIR_TYPE, nfs.FILE) + + m.Cmdy(nfs.DIR, BINPACK).Table(func(index int, value map[string]string, head []string) { + m.PushDownload(value[kit.MDB_PATH]) + }) + }}, + + WEBPACK: {Name: "webpack path auto create", Help: "打包", Action: map[string]*ice.Action{ + mdb.CREATE: {Name: "create name=demo", Help: "创建", Hand: func(m *ice.Message, arg ...string) { css, _, e := kit.Create(path.Join(m.Conf(WEBPACK, kit.META_PATH), "cache.css")) m.Assert(e) defer css.Close() - js, p, e := kit.Create(path.Join(m.Conf(WEBPACK, kit.META_PATH), "cache.js")) + js, _, e := kit.Create(path.Join(m.Conf(WEBPACK, kit.META_PATH), "cache.js")) m.Assert(e) defer js.Close() @@ -117,191 +151,59 @@ func init() { js.WriteString(`_can_name = "` + path.Join("/", k) + "\"\n") js.WriteString(m.Cmdx(nfs.CAT, k)) } - m.Echo(p) - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(nfs.DIR_ROOT, m.Conf(PUBLISH, kit.META_PATH)) - m.Option(nfs.DIR_TYPE, nfs.FILE) - m.Option(nfs.DIR_DEEP, true) - if len(arg) == 0 { - m.Cmdy(nfs.DIR, WEBPACK).Table(func(index int, value map[string]string, head []string) { - // m.Push(kit.MDB_LINK, m.Cmdx(mdb.RENDER, web.RENDER.Download, "/publish/"+value[kit.MDB_PATH])) - }) - return - } + if f, _, e := kit.Create("usr/publish/webpack/" + m.Option("name") + ".js"); m.Assert(e) { + defer f.Close() - m.Cmdy(nfs.CAT, arg[0]) - }}, - BINPACK: {Name: "binpack path auto 打包", Help: "打包", Action: map[string]*ice.Action{ - "pack": {Name: "pack", Help: "打包", Hand: func(m *ice.Message, arg ...string) { - name := kit.Keys(kit.Select(m.Option(kit.MDB_NAME), "demo"), "go") - if pack, p, e := kit.Create(path.Join(m.Conf(PUBLISH, kit.META_PATH), BINPACK, name)); m.Assert(e) { - defer pack.Close() + f.WriteString(`Volcanos.meta.pack = ` + kit.Formats(kit.UnMarshal(kit.Select("{}", m.Option("content"))))) + } - pack.WriteString(m.Cmdx(nfs.CAT, "src/main.go")) + m.Option(nfs.DIR_ROOT, "") + if f, p, e := kit.Create("usr/publish/webpack/" + m.Option("name") + ".html"); m.Assert(e) { + f.WriteString(fmt.Sprintf(_pack, + m.Cmdx(nfs.CAT, "usr/volcanos/cache.css"), + m.Cmdx(nfs.CAT, "usr/volcanos/index.css"), - pack.WriteString("\n") - pack.WriteString(`func init() {` + "\n") - pack.WriteString(` ice.BinPack = map[string][]byte{` + "\n") - - _pack_volcanos(m, pack, "usr/volcanos") - _pack_dir(m, pack, "usr/learning") - _pack_dir(m, pack, "usr/icebergs") - _pack_dir(m, pack, "usr/intshell") - _pack_contexts(m, pack) - - pack.WriteString(` }` + "\n") - pack.WriteString(`}` + "\n") + m.Cmdx(nfs.CAT, "usr/volcanos/proto.js"), + m.Cmdx(nfs.CAT, "usr/volcanos/cache.js"), + m.Cmdx(nfs.CAT, "usr/publish/webpack/"+m.Option("name")+".js"), + m.Cmdx(nfs.CAT, "usr/volcanos/index.js"), + )) m.Echo(p) } - - m.Option(cli.CMD_DIR, path.Join(m.Conf(PUBLISH, kit.META_PATH), BINPACK)) - m.Cmd(COMPILE, "windows", "amd64", name) - m.Cmd(COMPILE, "darwin", "amd64", name) - m.Cmd(COMPILE, "linux", "amd64", name) }}, }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { m.Option(nfs.DIR_ROOT, m.Conf(PUBLISH, kit.META_PATH)) m.Option(nfs.DIR_TYPE, nfs.FILE) m.Option(nfs.DIR_DEEP, true) - m.Cmdy(nfs.DIR, BINPACK).Table(func(index int, value map[string]string, head []string) { - // m.Push(kit.MDB_LINK, m.Cmdx(mdb.RENDER, web.RENDER.Download, "/publish/"+value[kit.MDB_PATH])) + m.Cmdy(nfs.DIR, WEBPACK).Table(func(index int, value map[string]string, head []string) { + m.PushDownload(path.Join(m.Option(nfs.DIR_ROOT), value[kit.MDB_PATH])) }) }}, - MODPACK: {Name: "modpack path=auto auto 创建", Help: "打包", Meta: kit.Dict( - "style", "editor", "创建", kit.List("_input", "text", "name", "name"), - ), Action: map[string]*ice.Action{ - mdb.CREATE: {Name: "create", Help: "创建", Hand: func(m *ice.Message, arg ...string) { - m.Option("name", "hi") - m.Option("help", "hello") - for i := 0; i < len(arg)-1; i += 2 { - m.Option(arg[i], arg[i+1]) - } - - // 生成文件 - name := m.Option(kit.MDB_NAME) - os.Mkdir(path.Join("src/", name), ice.MOD_DIR) - kit.Fetch(m.Confv(MODPACK, "meta.base"), func(key string, value string) { - p := path.Join("src/", name, name+"."+key) - if _, e := os.Stat(p); e != nil && os.IsNotExist(e) { - if f, p, e := kit.Create(p); m.Assert(e) { - if b, e := kit.Render(value, m); m.Assert(e) { - if n, e := f.Write(b); m.Assert(e) { - m.Log_EXPORT(kit.MDB_FILE, p, kit.MDB_SIZE, n) - } - } - } - } - }) - defer m.Cmdy(nfs.DIR, "src/"+name) - - // 模块名称 - mod := "" - if f, e := os.Open("go.mod"); e == nil { - defer f.Close() - for bio := bufio.NewScanner(f); bio.Scan(); { - if strings.HasPrefix(bio.Text(), "module") { - mod = strings.Split(bio.Text(), " ")[1] - break - } - } - } - - // 检查模块 - begin, has := false, false - if f, e := os.Open("src/main.go"); e == nil { - for bio := bufio.NewScanner(f); bio.Scan(); { - if strings.HasPrefix(strings.TrimSpace(bio.Text()), "//") { - continue - } - if strings.HasPrefix(bio.Text(), "import") { - if strings.Contains(bio.Text(), mod+"/src/"+name) { - has = true - } - continue - } - if strings.HasPrefix(bio.Text(), "import (") { - begin = true - continue - } - if strings.HasPrefix(bio.Text(), ")") { - begin = false - continue - } - if begin { - if strings.Contains(bio.Text(), mod+"/src/"+name) { - has = true - } - } - } - f.Close() - } - if has { - return - } - - // 插入模块 - if f, e := os.Open("src/main.go"); m.Assert(e) { - defer f.Close() - if b, e := ioutil.ReadAll(f); m.Assert(e) { - if f, e := os.Create("src/main.go"); m.Assert(e) { - defer f.Close() - - for bio := bufio.NewScanner(bytes.NewBuffer(b)); bio.Scan(); { - f.WriteString(bio.Text()) - f.WriteString("\n") - if strings.HasPrefix(bio.Text(), "import (") { - m.Info("src/main.go import: %v", mod+"/src/"+name) - f.WriteString("\t_ \"" + mod + "/src/" + name + `"`) - f.WriteString("\n\n") - } - } - } - } - } - }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Option(nfs.DIR_ROOT, "src") - if m.Cmdy(nfs.DIR, kit.Select("", arg, 0)); len(m.Resultv()) > 0 { - m.Option("_display", "/plugin/local/code/inner.js") - } - }}, }, Configs: map[string]*ice.Config{ - WEBPACK: {Name: WEBPACK, Help: "webpack", Value: kit.Data( - kit.MDB_PATH, "usr/volcanos", - )}, + WEBPACK: {Name: WEBPACK, Help: "webpack", Value: kit.Data(kit.MDB_PATH, "usr/volcanos")}, BINPACK: {Name: BINPACK, Help: "binpack", Value: kit.Data()}, - MODPACK: {Name: MODPACK, Help: "modpack", Value: kit.Data( - "base", kit.Dict( - "shy", `title {{.Option "name"}} -`, - "go", `package {{.Option "name"}} - -import ( - ice "github.com/shylinux/icebergs" - "github.com/shylinux/icebergs/base/web" - "github.com/shylinux/icebergs/core/chat" - kit "github.com/shylinux/toolkits" -) - -var Index = &ice.Context{Name: "{{.Option "name"}}", Help: "{{.Option "help"}}", - Configs: map[string]*ice.Config{ - "{{.Option "name"}}": {Name: "{{.Option "name"}}", Help: "{{.Option "help"}}", Value: kit.Data()}, - }, - Commands: map[string]*ice.Command{ - "{{.Option "name"}}": {Name: "{{.Option "name"}}", Help: "{{.Option "help"}}", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Echo("hello {{.Option "name"}} world") - }}, - }, -} - -func init() { chat.Index.Register(Index, &web.Frame{}) } -`, - ), - )}, }, }, nil) } + +const _pack = ` + + + + + volcanos + + + + + + + + + + + +` diff --git a/core/code/pprof.go b/core/code/pprof.go index 0eb929f8..79332b88 100644 --- a/core/code/pprof.go +++ b/core/code/pprof.go @@ -25,12 +25,12 @@ const PPROF = "pprof" func init() { Index.Merge(&ice.Context{ Configs: map[string]*ice.Config{ - PPROF: {Name: "pprof", Help: "性能分析", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ZONE, + PPROF: {Name: PPROF, Help: "性能分析", Value: kit.Data(kit.MDB_SHORT, kit.MDB_ZONE, PPROF, []string{"go", "tool", "pprof"}, )}, }, Commands: map[string]*ice.Command{ - PPROF: {Name: "pprof zone=auto id=auto auto create", Help: "性能分析", Action: map[string]*ice.Action{ + PPROF: {Name: "pprof zone id auto create", Help: "性能分析", Action: map[string]*ice.Action{ mdb.CREATE: {Name: "create zone binnary service seconds", Help: "创建", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.INSERT, PPROF, "", mdb.HASH, arg) }}, @@ -38,7 +38,11 @@ func init() { m.Cmdy(mdb.INSERT, PPROF, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, arg[2:]) }}, mdb.MODIFY: {Name: "modify", Help: "编辑", Hand: func(m *ice.Message, arg ...string) { - m.Cmdy(mdb.MODIFY, PPROF, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg) + if m.Option(kit.MDB_ID) != "" { + m.Cmdy(mdb.MODIFY, PPROF, _sub_key(m, m.Option(kit.MDB_ZONE)), mdb.LIST, kit.MDB_ID, m.Option(kit.MDB_ID), arg) + } else { + m.Cmdy(mdb.MODIFY, PPROF, "", mdb.HASH, kit.MDB_ZONE, m.Option(kit.MDB_ZONE), arg) + } }}, mdb.REMOVE: {Name: "remove", Help: "删除", Hand: func(m *ice.Message, arg ...string) { m.Cmdy(mdb.DELETE, PPROF, "", mdb.HASH, kit.MDB_ZONE, m.Option(kit.MDB_ZONE)) diff --git a/core/code/sh.go b/core/code/sh.go index e89a9a0e..ac667fa2 100644 --- a/core/code/sh.go +++ b/core/code/sh.go @@ -13,24 +13,15 @@ import ( const SH = "sh" func init() { - Index.Register(&ice.Context{Name: SH, Help: "sh", + Index.Register(&ice.Context{Name: SH, Help: "命令", Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmd(mdb.SEARCH, mdb.CREATE, SH, SH, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.PLUGIN, mdb.CREATE, SH, SH, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.RENDER, mdb.CREATE, SH, SH, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.ENGINE, mdb.CREATE, SH, SH, c.Cap(ice.CTX_FOLLOW)) + m.Cmd(mdb.SEARCH, mdb.CREATE, SH, SH, c.Cap(ice.CTX_FOLLOW)) }}, - SH: {Name: SH, Help: "sh", Action: map[string]*ice.Action{ - mdb.SEARCH: {Name: "search type name text", Hand: func(m *ice.Message, arg ...string) { - if arg[0] == kit.MDB_FOREACH { - return - } - m.Option(cli.CMD_DIR, m.Option("_path")) - _c_find(m, kit.Select("main", arg, 1)) - m.Cmdy(mdb.SEARCH, "man1", arg[1:]) - _c_grep(m, kit.Select("main", arg, 1)) - }}, + SH: {Name: SH, Help: "命令", Action: map[string]*ice.Action{ mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) { m.Echo(m.Conf(SH, "meta.plug")) }}, @@ -39,65 +30,75 @@ func init() { }}, mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { m.Option(cli.CMD_DIR, arg[2]) - m.Cmdy(cli.SYSTEM, "sh", arg[1]) + m.Cmdy(cli.SYSTEM, SH, arg[1]) m.Set(ice.MSG_APPEND) }}, + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { + if arg[0] == kit.MDB_FOREACH { + return + } + m.Option(cli.CMD_DIR, kit.Select("src", arg, 2)) + _go_find(m, kit.Select("main", arg, 1)) + m.Cmdy(mdb.SEARCH, MAN1, arg[1:]) + m.Cmdy(mdb.SEARCH, MAN8, arg[1:]) + _go_grep(m, kit.Select("main", arg, 1)) + }}, - "man": {Hand: func(m *ice.Message, arg ...string) { + MAN: {Hand: func(m *ice.Message, arg ...string) { m.Echo(_c_help(m, arg[0], arg[1])) }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}}, + }}, }, Configs: map[string]*ice.Config{ - SH: {Name: SH, Help: "sh", Value: kit.Data( + SH: {Name: SH, Help: "命令", Value: kit.Data( "plug", kit.Dict( - "split", kit.Dict( + SPLIT, kit.Dict( "space", " ", "operator", "{[(.,;!|<>)]}", ), - "prefix", kit.Dict( - "#", "comment", + PREFIX, kit.Dict( + "#", COMMENT, ), - "suffix", kit.Dict( - "{", "comment", + SUFFIX, kit.Dict( + "{", COMMENT, ), - "keyword", kit.Dict( - "export", "keyword", - "source", "keyword", - "require", "keyword", + KEYWORD, kit.Dict( + "export", KEYWORD, + "source", KEYWORD, + "require", KEYWORD, - "if", "keyword", - "then", "keyword", - "else", "keyword", - "fi", "keyword", - "for", "keyword", - "while", "keyword", - "do", "keyword", - "done", "keyword", - "esac", "keyword", - "case", "keyword", - "in", "keyword", - "return", "keyword", + "if", KEYWORD, + "then", KEYWORD, + "else", KEYWORD, + "fi", KEYWORD, + "for", KEYWORD, + "while", KEYWORD, + "do", KEYWORD, + "done", KEYWORD, + "esac", KEYWORD, + "case", KEYWORD, + "in", KEYWORD, + "return", KEYWORD, - "shift", "keyword", - "local", "keyword", - "echo", "keyword", - "eval", "keyword", - "kill", "keyword", - "let", "keyword", - "cd", "keyword", + "shift", KEYWORD, + "local", KEYWORD, + "echo", KEYWORD, + "eval", KEYWORD, + "kill", KEYWORD, + "let", KEYWORD, + "cd", KEYWORD, - "xargs", "function", - "date", "function", - "find", "function", - "grep", "function", - "sed", "function", - "awk", "function", - "pwd", "function", - "ps", "function", - "ls", "function", - "rm", "function", - "go", "function", + "xargs", FUNCTION, + "date", FUNCTION, + "find", FUNCTION, + "grep", FUNCTION, + "sed", FUNCTION, + "awk", FUNCTION, + "pwd", FUNCTION, + "ps", FUNCTION, + "ls", FUNCTION, + "rm", FUNCTION, + "go", FUNCTION, ), ), )}, diff --git a/core/code/shy.go b/core/code/shy.go index 0cb4801a..0c13d028 100644 --- a/core/code/shy.go +++ b/core/code/shy.go @@ -13,23 +13,15 @@ import ( const SHY = "shy" func init() { - Index.Register(&ice.Context{Name: SHY, Help: "shy", + Index.Register(&ice.Context{Name: SHY, Help: "脚本", Commands: map[string]*ice.Command{ ice.CTX_INIT: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { - m.Cmd(mdb.SEARCH, mdb.CREATE, SHY, SHY, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.PLUGIN, mdb.CREATE, SHY, SHY, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.RENDER, mdb.CREATE, SHY, SHY, c.Cap(ice.CTX_FOLLOW)) m.Cmd(mdb.ENGINE, mdb.CREATE, SHY, SHY, c.Cap(ice.CTX_FOLLOW)) + m.Cmd(mdb.SEARCH, mdb.CREATE, SHY, SHY, c.Cap(ice.CTX_FOLLOW)) }}, - SHY: {Name: SHY, Help: "shy", Action: map[string]*ice.Action{ - mdb.SEARCH: {Name: "search type name text", Hand: func(m *ice.Message, arg ...string) { - if arg[0] == kit.MDB_FOREACH { - return - } - m.Option(cli.CMD_DIR, m.Option("_path")) - _c_find(m, kit.Select("main", arg, 1)) - _c_grep(m, kit.Select("main", arg, 1)) - }}, + SHY: {Name: SHY, Help: "脚本", Action: map[string]*ice.Action{ mdb.PLUGIN: {Hand: func(m *ice.Message, arg ...string) { m.Echo(m.Conf(SHY, "meta.plug")) }}, @@ -39,20 +31,28 @@ func init() { mdb.ENGINE: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy("web.wiki.word", path.Join(arg[2], arg[1])) }}, - }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {}}, + mdb.SEARCH: {Hand: func(m *ice.Message, arg ...string) { + if arg[0] == kit.MDB_FOREACH { + return + } + m.Option(cli.CMD_DIR, kit.Select("src", arg, 2)) + _go_find(m, kit.Select("main", arg, 1)) + _go_grep(m, kit.Select("main", arg, 1)) + }}, + }}, }, Configs: map[string]*ice.Config{ - SHY: {Name: SHY, Help: "shy", Value: kit.Data( + SHY: {Name: SHY, Help: "脚本", Value: kit.Data( "plug", kit.Dict( - "prefix", kit.Dict("#", "comment"), - "keyword", kit.Dict( - "title", "keyword", - "chapter", "keyword", - "section", "keyword", - "refer", "keyword", - "field", "keyword", - "label", "keyword", - "chain", "keyword", + PREFIX, kit.Dict("#", COMMENT), + KEYWORD, kit.Dict( + "title", KEYWORD, + "chapter", KEYWORD, + "section", KEYWORD, + "refer", KEYWORD, + "field", KEYWORD, + "label", KEYWORD, + "chain", KEYWORD, ), ), )}, diff --git a/core/code/upgrade.go b/core/code/upgrade.go index 605be0b8..f92a079b 100644 --- a/core/code/upgrade.go +++ b/core/code/upgrade.go @@ -16,8 +16,8 @@ func init() { Configs: map[string]*ice.Config{ UPGRADE: {Name: UPGRADE, Help: "升级", Value: kit.Dict(kit.MDB_HASH, kit.Dict( kit.MDB_PATH, "usr/upgrade", "system", kit.Dict(kit.MDB_LIST, kit.List( - kit.MDB_INPUT, "bin", "file", "ice.bin", "path", "bin/ice.bin", - kit.MDB_INPUT, "bin", "file", "ice.sh", "path", "bin/ice.sh", + kit.MDB_INPUT, "bin", kit.MDB_FILE, "ice.sh", kit.MDB_PATH, "bin/ice.sh", + kit.MDB_INPUT, "bin", kit.MDB_FILE, "ice.bin", kit.MDB_PATH, "bin/ice.bin", )), ))}, },