1
0
forked from x/icebergs
icebergs/core/code/inner.go
2020-06-30 18:10:37 +08:00

223 lines
6.9 KiB
Go

package code
import (
ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/cli"
"github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits"
"path"
"strings"
)
const (
INNER = "inner"
VEDIO = "vedio"
QRCODE = "qrcode"
)
const (
LIST = "list"
SAVE = "save"
PLUG = "plug"
SHOW = "show"
)
func _inner_protect(m *ice.Message, name string) bool {
ls := strings.Split(name, "/")
return !m.Right(ls) && m.Conf(INNER, kit.Keys("meta.protect", ls[0])) == "true"
}
func _inner_source(m *ice.Message, name string) bool {
return m.Conf(INNER, kit.Keys("meta.source", _inner_ext(name))) == "true"
}
func _inner_ext(name string) string {
return strings.ToLower(kit.Select(path.Base(name), strings.TrimPrefix(path.Ext(name), ".")))
}
func _inner_sub(m *ice.Message, action string, name string, arg ...string) bool {
if _inner_protect(m, name) {
m.Push("file", "../")
return true
}
p := _inner_ext(name)
if m.Cmdy(kit.Keys(p, action), name, arg); len(m.Resultv()) > 0 && m.Result(0) != "warn: " {
return true
}
return false
}
func _inner_list(m *ice.Message, name string) {
if _inner_sub(m, LIST, name) {
return
}
if m.Set(ice.MSG_RESULT); strings.HasSuffix(name, "/") || _inner_source(m, name) {
m.Cmdy("nfs.dir", name, "file size time")
return
}
m.Echo(name)
}
func _inner_save(m *ice.Message, name, text string) {
if _inner_sub(m, SAVE, name) {
return
}
if f, p, e := kit.Create(name); m.Assert(e) {
defer f.Close()
m.Cmd(web.FAVOR, "inner.save", "shell", name, text)
if n, e := f.WriteString(text); m.Assert(e) {
m.Log_EXPORT("file", name, "size", n)
}
m.Echo(p)
}
}
func _inner_plug(m *ice.Message, name string) {
if _inner_sub(m, PLUG, name) {
return
}
p := _inner_ext(name)
if ls := m.Confv(INNER, kit.Keys("meta.plug", p)); ls != nil {
m.Echo(kit.Format(ls))
return
}
m.Echo("{}")
}
func _inner_show(m *ice.Message, name string) {
if _inner_sub(m, SHOW, name) {
return
}
p := _inner_ext(name)
if ls := kit.Simple(m.Confv(INNER, kit.Keys("meta.show", p))); len(ls) > 0 {
m.Cmdy(cli.SYSTEM, ls, name)
m.Set(ice.MSG_APPEND)
m.Cmd(web.FAVOR, "inner.run", "shell", name, m.Result())
return
}
switch m.Set(ice.MSG_RESULT); p {
case "go":
if strings.HasSuffix(name, "test.go") {
m.Cmdy(cli.SYSTEM, "go", "test", "-v", "./"+name)
} else {
m.Cmdy(cli.SYSTEM, "go", "run", "./"+name)
}
case "csv":
m.CSV(m.Cmdx("nfs.cat", name))
case "md":
m.Cmdy("web.wiki.md.note", name)
case "shy":
m.Echo(strings.ReplaceAll(strings.Join(m.Cmd("web.wiki.word", name).Resultv(), ""), "\n", " "))
}
}
func _inner_main(m *ice.Message, arg ...string) {
if len(arg) > 2 && arg[2] != "" {
m.Cmdy(web.STORY, web.INDEX, arg[2])
return
}
_inner_list(m, path.Join(arg...))
}
func init() {
Index.Merge(&ice.Context{
Configs: map[string]*ice.Config{
INNER: {Name: "inner", Help: "编辑器", Value: kit.Data(
"protect", kit.Dict("etc", "true", "var", "true", "usr", "true"),
"source", kit.Dict(
"url", "true",
"sh", "true",
"sh", "true",
"py", "true",
"shy", "true",
"go", "true",
"js", "true",
),
"plug", kit.Dict(
"py", kit.Dict(
"prefix", kit.Dict("#", "comment"),
"keyword", kit.Dict("print", "keyword"),
),
"md", kit.Dict("display", true, "profile", true),
"csv", kit.Dict("display", true),
),
"show", kit.Dict(
"sh", []string{"sh"},
"py", []string{"python"},
"js", []string{"node"},
),
)},
},
Commands: map[string]*ice.Command{
INNER: {Name: "inner path=usr/demo file=hi.qrc key auto", Help: "编辑器", Meta: map[string]interface{}{
"display": "/plugin/local/code/inner.js", "style": "editor",
}, Action: map[string]*ice.Action{
"cmd": {Name: "cmd arg", Help: "命令", Hand: func(m *ice.Message, arg ...string) {
if m.Cmdy(kit.Split(arg[0])); !m.Hand {
m.Cmdy(cli.SYSTEM, kit.Split(arg[0]))
}
}},
"favor": {Name: "favor", Help: "收藏", Hand: func(m *ice.Message, arg ...string) {
m.Cmd(web.FAVOR, arg, "extra", "extra.poster").Table(func(index int, value map[string]string, header []string) {
m.Push("image", kit.Format(`<a title="%s" href="%s" target="_blank"><img src="%s" width=200></a>`,
value["name"], value["text"], value["extra.poster"]))
m.Push("video", kit.Format(`<video src="%s" controls></video>`, value["text"]))
})
}},
"find": {Name: "find word", Help: "搜索", Hand: func(m *ice.Message, arg ...string) {
web.FavorList(m, arg[0], arg[1], arg[2:]...)
}},
"project": {Name: "project path", Help: "项目", Hand: func(m *ice.Message, arg ...string) {
_inner_list(m, path.Join("./", kit.Select("", arg, 0))+"/")
}},
"history": {Name: "history path name", Help: "历史", Hand: func(m *ice.Message, arg ...string) {
msg := m.Cmd(web.STORY, web.HISTORY, path.Join("./", arg[0], arg[1]))
m.Copy(msg, ice.MSG_APPEND, "time", "count", "key")
if len(arg) > 2 && arg[2] != "" {
m.Echo(m.Cmd(web.STORY, web.INDEX, arg[2]).Result())
}
}},
"commit": {Name: "commit path name", Help: "提交", Hand: func(m *ice.Message, arg ...string) {
msg := m.Cmd(web.STORY, web.CATCH, "", path.Join("./", arg[0], arg[1]))
m.Copy(msg, ice.MSG_APPEND, "time", "count", "key")
}},
"recover": {Name: "recover", Help: "复盘", Hand: func(m *ice.Message, arg ...string) {
msg := m.Cmd(web.STORY, web.HISTORY, path.Join("./", arg[0], arg[1])+".display")
m.Copy(msg, ice.MSG_APPEND, "time", "count", "key", "drama")
if len(arg) > 2 && arg[2] != "" {
m.Echo(m.Cmd(web.STORY, web.INDEX, arg[2]).Result())
}
}},
"record": {Name: "record", Help: "记录", Hand: func(m *ice.Message, arg ...string) {
msg := m.Cmd(web.STORY, web.CATCH, "display", path.Join("./", m.Option("path"), m.Option("name"))+".display", m.Option("display"))
m.Copy(msg, ice.MSG_APPEND, "time", "count", "key")
}},
"log": {Name: "log path name", Help: "日志", Hand: func(m *ice.Message, arg ...string) {
web.FavorList(m, "inner.run", "", "time", "id", "type", "name", "text")
}},
"run": {Name: "run path name", Help: "运行", Hand: func(m *ice.Message, arg ...string) {
_inner_show(m, path.Join("./", arg[0], arg[1]))
}},
PLUG: {Name: "plug path name", Help: "插件", Hand: func(m *ice.Message, arg ...string) {
_inner_plug(m, path.Join("./", arg[0], arg[1]))
}},
SAVE: {Name: "save path name content", Help: "保存", Hand: func(m *ice.Message, arg ...string) {
_inner_save(m, path.Join("./", arg[0], arg[1]), kit.Select(m.Option("content"), arg, 2))
}},
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")))
}},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { _inner_main(m, arg...) }},
},
}, nil)
}