diff --git a/base/cli/daemon.go b/base/cli/daemon.go
index b746a058..eaf45086 100644
--- a/base/cli/daemon.go
+++ b/base/cli/daemon.go
@@ -148,6 +148,9 @@ func init() {
})
}
func Opens(m *ice.Message, arg ...string) {
+ if len(arg) == 0 || arg[0] == "" {
+ return
+ }
switch runtime.GOOS {
case DARWIN:
if kit.Ext(arg[0]) == "app" {
diff --git a/base/cli/runtime.go b/base/cli/runtime.go
index dd90c3d7..812e1123 100644
--- a/base/cli/runtime.go
+++ b/base/cli/runtime.go
@@ -147,10 +147,14 @@ const RUNTIME = "runtime"
func init() {
Index.MergeCommands(ice.Commands{
RUNTIME: {Name: "runtime info=bootinfo,ifconfig,diskinfo,hostinfo,userinfo,procstat,procinfo,bootinfo,api,cli,cmd,mod,env,path,chain,routine auto", Help: "运行环境", Actions: ice.MergeActions(ice.Actions{
- ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { _runtime_init(m) }},
- IFCONFIG: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy("tcp.host") }},
- DISKINFO: {Hand: func(m *ice.Message, arg ...string) { _runtime_diskinfo(m) }},
- HOSTINFO: {Hand: func(m *ice.Message, arg ...string) { _runtime_hostinfo(m) }},
+ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
+ aaa.White(m, ice.ETC_PATH)
+ aaa.White(m, ice.LICENSE)
+ _runtime_init(m)
+ }},
+ IFCONFIG: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy("tcp.host") }},
+ DISKINFO: {Hand: func(m *ice.Message, arg ...string) { _runtime_diskinfo(m) }},
+ HOSTINFO: {Hand: func(m *ice.Message, arg ...string) { _runtime_hostinfo(m) }},
HOSTNAME: {Hand: func(m *ice.Message, arg ...string) {
if len(arg) > 0 {
ice.Info.Hostname = mdb.Conf(m, RUNTIME, kit.Keys(NODE, mdb.NAME), mdb.Conf(m, RUNTIME, kit.Keys(BOOT, HOSTNAME), arg[0]))
diff --git a/base/nfs/cat.go b/base/nfs/cat.go
index 0a2333af..06b934e3 100644
--- a/base/nfs/cat.go
+++ b/base/nfs/cat.go
@@ -112,13 +112,19 @@ const CAT = "cat"
func init() {
Index.MergeCommands(ice.Commands{
- CAT: {Name: "cat path auto", Help: "文件", Actions: ice.MergeActions(ice.Actions{ice.CTX_INIT: mdb.AutoConfig(SOURCE, kit.DictList(
- HTML, CSS, JS, GO, SH, PY, SHY, CSV, JSON, CONFIGURE, PROTO, YAML, CONF, XML, YML, TXT, MD, strings.ToLower(ice.LICENSE), strings.ToLower(ice.MAKEFILE),
- ))}), Hand: func(m *ice.Message, arg ...string) {
+ CAT: {Name: "cat path auto", Help: "文件", Actions: ice.MergeActions(ice.Actions{
+ ice.CTX_INIT: mdb.AutoConfig(SOURCE, kit.DictList(
+ HTML, CSS, JS, GO, SH, PY, SHY, CSV, JSON, CONFIGURE, PROTO, YAML, CONF, XML, YML, TXT, MD, strings.ToLower(ice.LICENSE), strings.ToLower(ice.MAKEFILE),
+ )),
+ }), Hand: func(m *ice.Message, arg ...string) {
if len(arg) == 0 || strings.HasSuffix(arg[0], PS) {
m.Cmdy(DIR, arg)
} else {
- _cat_list(m.Logs(FIND, m.OptionSimple(DIR_ROOT), FILE, arg[0]), arg[0])
+ if arg[0] == "action" {
+ m.Cmdy(DIR, arg)
+ } else if !Show(m, arg[0]) {
+ _cat_list(m.Logs(FIND, m.OptionSimple(DIR_ROOT), FILE, arg[0]), arg[0])
+ }
}
}},
})
diff --git a/base/nfs/dir.go b/base/nfs/dir.go
index 4a983c43..3a8c7dcf 100644
--- a/base/nfs/dir.go
+++ b/base/nfs/dir.go
@@ -110,7 +110,7 @@ func _dir_list(m *ice.Message, root string, dir string, level int, deep bool, di
if m.IsCliUA() || m.Option(ice.MSG_USERROLE) == aaa.VOID {
break
}
- m.PushButton(TRASH)
+ m.PushButton(mdb.SHOW, TRASH)
default:
m.Push(field, "")
}
@@ -183,6 +183,10 @@ func init() {
}
}}, mdb.UPLOAD: {},
TRASH: {Hand: func(m *ice.Message, arg ...string) { m.Cmd(TRASH, mdb.CREATE, m.Option(PATH)) }},
+ mdb.SHOW: {Hand: func(m *ice.Message, arg ...string) {
+ Show(m, m.Option(PATH))
+ m.ProcessInner()
+ }},
}, Hand: func(m *ice.Message, arg ...string) {
root, dir := kit.Select(PWD, m.Option(DIR_ROOT)), kit.Select(PWD, arg, 0)
kit.If(strings.HasPrefix(dir, PS), func() { root = "" })
@@ -232,6 +236,17 @@ func Dir(m *ice.Message, field string) *ice.Message {
m.Copy(m.Cmd(DIR, PWD, kit.Dict(DIR_TYPE, TYPE_CAT)).Sort(field))
return m
}
+func Show(m *ice.Message, file string) bool {
+ switch strings.ToLower(kit.Ext(file)) {
+ case "png", "jpg":
+ m.EchoImages("/share/local/" + file)
+ case "mp4", "mov":
+ m.EchoVideos("/share/local/" + file)
+ default:
+ return false
+ }
+ return true
+}
func DirDeepAll(m *ice.Message, root, dir string, cb func(ice.Maps), arg ...string) *ice.Message {
m.Options(DIR_TYPE, CAT, DIR_ROOT, root, DIR_DEEP, ice.TRUE)
defer m.Options(DIR_TYPE, "", DIR_ROOT, "", DIR_DEEP, "")
diff --git a/base/web/serve.go b/base/web/serve.go
index 89d04233..1a1fc9bb 100644
--- a/base/web/serve.go
+++ b/base/web/serve.go
@@ -164,8 +164,12 @@ const SERVE = "serve"
func init() {
Index.MergeCommands(ice.Commands{
+ "/exit": {Hand: func(m *ice.Message, arg ...string) { m.Cmd(ice.EXIT) }},
SERVE: {Name: "serve name auto start", Help: "服务器", Actions: ice.MergeActions(ice.Actions{
- ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { cli.NodeInfo(m, ice.Info.Pathname, WORKER) }},
+ ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) {
+ cli.NodeInfo(m, ice.Info.Pathname, WORKER)
+ aaa.White(m, nfs.REQUIRE)
+ }},
DOMAIN: {Hand: func(m *ice.Message, arg ...string) {
kit.If(len(arg) > 0, func() { ice.Info.Domain, ice.Info.Localhost = arg[0], false })
m.Echo(ice.Info.Domain)
@@ -175,6 +179,7 @@ func init() {
}},
SERVE_START: {Hand: func(m *ice.Message, arg ...string) {
m.Go(func() {
+ cli.Opens(m, mdb.Config(m, cli.OPEN))
ssh.PrintQRCode(m, tcp.PublishLocalhost(m, _serve_address(m)))
return
opened := false
diff --git a/core/code/vimer.go b/core/code/vimer.go
index 3188c9cb..2955c82e 100644
--- a/core/code/vimer.go
+++ b/core/code/vimer.go
@@ -49,7 +49,7 @@ const VIMER = "vimer"
func init() {
web.Index.MergeCommands(ice.Commands{
- ice.REQUIRE_SRC: {Actions: ice.MergeActions(ctx.CmdAction(), aaa.RoleAction()), Hand: func(m *ice.Message, arg ...string) { web.ShareLocalFile(m, ice.SRC, path.Join(arg...)) }},
+ ice.REQUIRE_SRC: {Actions: ctx.CmdAction(), Hand: func(m *ice.Message, arg ...string) { web.ShareLocalFile(m, ice.SRC, path.Join(arg...)) }},
ice.REQUIRE_USR: {Hand: func(m *ice.Message, arg ...string) { web.ShareLocalFile(m, ice.USR, path.Join(arg...)) }},
ice.REQUIRE_MODULES: {Hand: func(m *ice.Message, arg ...string) {
p := path.Join(ice.USR_MODULES, path.Join(arg...))
diff --git a/core/wiki/draw.go b/core/wiki/draw.go
index 2b751746..f864962d 100644
--- a/core/wiki/draw.go
+++ b/core/wiki/draw.go
@@ -4,6 +4,7 @@ import (
"path"
ice "shylinux.com/x/icebergs"
+ "shylinux.com/x/icebergs/base/aaa"
"shylinux.com/x/icebergs/base/ctx"
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
@@ -29,7 +30,7 @@ func init() {
web.DREAM_TABLES: {Hand: func(m *ice.Message, arg ...string) {
kit.Switch(m.Option(mdb.TYPE), kit.Simple(web.SERVER, web.WORKER), func() { m.PushButton(kit.Dict(m.CommandKey(), "导图")) })
}},
- }, ctx.CmdAction(), WikiAction("", nfs.SVG)), Hand: func(m *ice.Message, arg ...string) {
+ }, aaa.RoleAction(ctx.COMMAND, ctx.RUN), ctx.CmdAction(), WikiAction("", nfs.SVG)), Hand: func(m *ice.Message, arg ...string) {
kit.If(!_wiki_list(m, arg...), func() {
_wiki_show(m, arg[0])
kit.If(m.IsErr(), func() { m.Option(ice.MSG_OUTPUT, "") })
diff --git a/core/wiki/feel.go b/core/wiki/feel.go
index 6d2f6246..442684d9 100644
--- a/core/wiki/feel.go
+++ b/core/wiki/feel.go
@@ -3,6 +3,7 @@ package wiki
import (
ice "shylinux.com/x/icebergs"
"shylinux.com/x/icebergs/base/ctx"
+ "shylinux.com/x/icebergs/base/nfs"
kit "shylinux.com/x/toolkits"
)
@@ -12,7 +13,8 @@ func init() {
Index.MergeCommands(ice.Commands{
FEEL: {Name: "feel path auto prev next record1 record2 upload actions", Help: "影音媒体", Actions: ice.MergeActions(ice.Actions{
"record1": {Help: "截图"}, "record2": {Help: "录屏"},
- }, WikiAction(ice.USR_LOCAL_IMAGE, "png|PNG|jpg|JPG|jpeg|mp4|m4v|mov|MOV|webm")), Hand: func(m *ice.Message, arg ...string) {
+ }, WikiAction("", "png|PNG|jpg|JPG|jpeg|mp4|m4v|mov|MOV|webm")), Hand: func(m *ice.Message, arg ...string) {
+ kit.If(nfs.Exists(m, ice.USR_LOCAL_IMAGE), func() { m.Option(nfs.DIR_ROOT, ice.USR_LOCAL_IMAGE) })
_wiki_list(m, kit.Slice(arg, 0, 1)...)
ctx.DisplayLocal(m, "")
}},
diff --git a/core/wiki/portal.css b/core/wiki/portal.css
index b62f68df..2df06a89 100644
--- a/core/wiki/portal.css
+++ b/core/wiki/portal.css
@@ -5,7 +5,7 @@ fieldset.web.wiki.portal>div.output>div.header div.story[data-name=navmenu] { di
fieldset.web.wiki.portal>div.output>div.header div.story[data-name=navmenu] div.item { padding:20px; height:var(--portal-header-height); }
fieldset.web.wiki.portal>div.output>div.header div.story[data-name=navmenu] div.item.space { padding:0px; margin:0 40px; }
fieldset.web.wiki.portal>div.output>div.layout { display:flex; justify-content:center; }
-fieldset.web.wiki.portal>div.output>div.layout>div.nav { padding:40px 40px; border-right:lightgray solid 1px; min-width:240px; overflow:auto; }
+fieldset.web.wiki.portal>div.output>div.layout>div.nav { padding:40px 40px; border-right:var(--plugin-border-color) solid 1px; min-width:240px; overflow:auto; }
fieldset.web.wiki.portal>div.output>div.layout>div.nav div.story[data-name=navmenu] div.item { padding:5px; }
fieldset.web.wiki.portal>div.output>div.layout>div.nav div.story[data-name=navmenu] div.list { padding-left:20px; }
fieldset.web.wiki.portal>div.output>div.layout>div.main { padding:40px; height:600px; min-width:400px; max-width:var(--portal-max-width); overflow:auto; }
@@ -14,24 +14,19 @@ fieldset.web.wiki.portal>div.output>div.layout>div.aside div.item { padding:5px;
fieldset.web.wiki.portal>div.output>div.layout>div.aside div.item.section { padding-left:20px; }
body.dark fieldset.web.wiki.portal>div.output>div.layout { background-color:var(--plugin-bg-color); --code-bg-color:var(--output-bg-color); }
body.dark fieldset.web.wiki.portal>div.output>div.layout>div.nav { border-right:gray solid 1px; }
-
fieldset.web.wiki.portal.home>div.output>div.layout>div.main p { white-space:pre-wrap; text-align:center; }
-
-fieldset.web.wiki.portal>div.output>div.layout>div.main>* { margin:10px auto; }
+fieldset.web.wiki.portal>div.output>div.layout>div.main>* { margin:20px auto; }
fieldset.web.wiki.portal>div.output>div.layout>div.main h2 { margin-top:40px; }
fieldset.web.wiki.portal>div.output>div.layout>div.main h3 { margin-top:20px; }
-fieldset.web.wiki.portal>div.output>div.layout>div.main p code { background-color:var(--code-bg-color); color:var(--code-fg-color); padding:0 10px; }
-fieldset.web.wiki.portal>div.output>div.layout>div.main div.story[data-type=spark][data-name=shell] { background-color:var(--code-bg-color); color:var(--code-fg-color); margin:10px auto; }
-fieldset.web.wiki.portal>div.output>div.layout>div.main fieldset:not(.hide) { display:flex; flex-wrap:wrap; }
-fieldset.web.wiki.portal>div.output>div.layout>div.main fieldset.inner.output div.content {
- background-color:var(--code-bg-color);
- color:var(--code-fg-color);
- --code-comment:silver;
- --code-keyword:orange;
- --code-package:silver;
- --code-datatype:silver;
- --code-function:cyan;
- --code-constant:silver;
- --code-string:silver;
- --code-object:silver;
+fieldset.web.wiki.portal>div.output>div.layout>div.main p code {
+ background-color:var(--code-bg-color); color:var(--code-fg-color); padding:0 10px;
+}
+fieldset.web.wiki.portal>div.output>div.layout>div.main div.story[data-type=spark][data-name=shell] {
+ background-color:var(--code-bg-color); color:var(--code-fg-color); padding:10px; margin:10px auto;
+}
+fieldset.web.wiki.portal>div.output>div.layout>div.main fieldset.inner.output div.content {
+ background-color:var(--code-bg-color); color:var(--code-fg-color); padding:10px 0;
+ --code-comment:silver; --code-keyword:orange; --code-package:silver;
+ --code-datatype:silver; --code-function:cyan;
+ --code-constant:silver; --code-string:silver; --code-object:silver;
}
diff --git a/core/wiki/portal.go b/core/wiki/portal.go
index 5bf5e1f8..a442de97 100644
--- a/core/wiki/portal.go
+++ b/core/wiki/portal.go
@@ -9,7 +9,6 @@ import (
"shylinux.com/x/icebergs/base/mdb"
"shylinux.com/x/icebergs/base/nfs"
"shylinux.com/x/icebergs/base/web"
- kit "shylinux.com/x/toolkits"
)
const PORTAL = "portal"
@@ -31,7 +30,7 @@ func init() {
m.Copy(m.Spawn([]byte(m.Cmdx(nfs.CAT, p))))
} else {
ctx.Run(m, arg...)
- m.Cmd(nfs.SAVE, p, kit.Dict(nfs.CONTENT, m.FormatMeta()))
+ m.Cmd(nfs.SAVE, p, ice.Maps{nfs.CONTENT: m.FormatMeta(), nfs.DIR_ROOT: ""})
}
}},
}, aaa.WhiteAction(ctx.COMMAND, ctx.RUN), aaa.RoleAction(ctx.COMMAND, ctx.RUN), ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) {
diff --git a/core/wiki/portal.js b/core/wiki/portal.js
index c73c7914..b9b1778b 100644
--- a/core/wiki/portal.js
+++ b/core/wiki/portal.js
@@ -13,6 +13,7 @@ Volcanos(chat.ONIMPORT, {
can.page.styleWidth(can, can.ui.nav, 240), can.page.styleWidth(can, can.ui.aside, 200)
can.page.ClassList.del(can, can._fields, ice.HOME)
}
+ can.isCmdMode() || can.onimport.layout(can, can.ConfHeight(), can.ConfWidth())
can.page.Select(can, can._output, wiki.STORY_ITEM, function(target) { var meta = target.dataset||{}
can.core.CallFunc([can.onimport, can.onimport[meta.name]? meta.name: meta.type||target.tagName.toLowerCase()], [can, meta, target])
meta.style && can.page.style(can, target, can.base.Obj(meta.style))
@@ -25,14 +26,14 @@ Volcanos(chat.ONIMPORT, {
select = target, can.onmotion.select(can, can.ui.aside, html.DIV_ITEM, target._menu)
} })
} },
- navmenu: function(can, meta, target) {
+ navmenu: function(can, meta, target) { var link
can.onimport.list(can, can.base.Obj(meta.data), function(event, item) {
can.page.Select(can, target, html.DIV_ITEM, function(target) { target != event.target && can.page.ClassList.del(can, target, html.SELECT) })
item.list && item.list.length > 0 || can.onaction.route(event, can, item.meta.link)
}, target, can.page.ClassList.has(can, target.parentNode, html.HEADER)? function(target, item) {
item.meta.link == nfs.SRC_DOCUMENT+can.db.current && can.onappend.style(can, html.SELECT, target)
}: function(target, item) { can.db.nav[can.base.trimPrefix(item.meta.link, nfs.SRC_DOCUMENT)] = target
- location.hash || item.list && item.list.length > 0 || can.onaction.route({}, can, item.meta.link, true)
+ location.hash || item.list && item.list.length > 0 || link || (link = can.onaction.route({}, can, item.meta.link, true))
})
},
button: function(can, meta, target) { var item = can.base.Obj(meta.meta)
@@ -60,7 +61,8 @@ Volcanos(chat.ONACTION, {
if (link.indexOf(can.db.current) < 0 || link.endsWith(nfs.PS)) { return can.isCmdMode()? can.user.jumps(can.db.prefix+link+params): (can.Option(nfs.PATH, link), can.Update()) }
}
var file = can.base.trimPrefix(link, can.db.current); can.isCmdMode() && can.user.jumps("#"+file)
- if (can.onmotion.cache(can, function(cache, key) { cache[key] = can._plugins, can._plugins = cache[file]||[]; return file }, can.ui.main, can.ui.aside)) { return }
+ if (can.onmotion.cache(can, function(cache, key) { cache[key] = can._plugins, can._plugins = cache[file]||[]; return file }, can.ui.main, can.ui.aside)) { return file }
can.onimport.content(can, file)
+ return link
},
})
diff --git a/core/wiki/wiki.go b/core/wiki/wiki.go
index e83ccce6..049c5c57 100644
--- a/core/wiki/wiki.go
+++ b/core/wiki/wiki.go
@@ -35,10 +35,9 @@ func _wiki_link(m *ice.Message, text string) string {
return text
}
func _wiki_list(m *ice.Message, arg ...string) bool {
- if m.Option(nfs.DIR_ROOT, _wiki_path(m)); len(arg) == 0 || kit.HasSuffix(arg[0], nfs.PS) {
+ if m.OptionDefault(nfs.DIR_ROOT, _wiki_path(m)); len(arg) == 0 || kit.HasSuffix(arg[0], nfs.PS) {
kit.If(m.Option(nfs.DIR_DEEP) != ice.TRUE, func() { m.Cmdy(nfs.DIR, kit.Slice(arg, 0, 1), kit.Dict(nfs.DIR_TYPE, nfs.DIR)) })
- m.Cmdy(nfs.DIR, kit.Slice(arg, 0, 1), kit.Dict(nfs.DIR_TYPE, nfs.CAT, nfs.DIR_REG, mdb.Config(m, lex.REGEXP)))
- m.SortStrR(mdb.TIME).StatusTimeCount()
+ m.Copy(m.Cmd(nfs.DIR, kit.Slice(arg, 0, 1), kit.Dict(nfs.DIR_TYPE, nfs.CAT, nfs.DIR_REG, mdb.Config(m, lex.REGEXP))).SortStr(nfs.PATH))
return true
} else {
ctx.DisplayLocal(m, path.Join(kit.PathName(2), kit.Keys(kit.FileName(2), nfs.JS)))
diff --git a/render.go b/render.go
index f3310ea5..3ec80dbf 100644
--- a/render.go
+++ b/render.go
@@ -47,7 +47,11 @@ func Render(m *Message, cmd string, args ...Any) string {
case RENDER_IMAGES:
return kit.Format(`
`, arg[0], m.Option(MSG_HEIGHT), m.Option(MSG_WIDTH))
case RENDER_VIDEOS:
- return kit.Format(`