From 6d7cf18dce40f2f392b26585ac9bb65c8ead7345 Mon Sep 17 00:00:00 2001 From: shylinux Date: Tue, 4 Jul 2023 11:05:02 +0800 Subject: [PATCH] opt some --- base/ctx/command.go | 1 + base/nfs/dir.go | 14 ++++++----- base/nfs/pack.go | 6 +++++ base/web/space.go | 24 +++++++++--------- core/chat/pod.go | 2 ++ core/code/compile.go | 1 - core/code/publish.go | 39 +++++++++++++++++++++-------- core/wiki/portal.css | 57 +++++++++++++++++++------------------------ core/wiki/portal.go | 14 +++++++++-- core/wiki/portal.js | 58 ++++++++++++++++++++++++++------------------ core/wiki/refer.go | 2 +- core/wiki/spark.go | 55 ++++++++++++++++++++++------------------- core/wiki/word.go | 4 ++- 13 files changed, 163 insertions(+), 114 deletions(-) diff --git a/base/ctx/command.go b/base/ctx/command.go index 0ca870e1..88cfa2ba 100644 --- a/base/ctx/command.go +++ b/base/ctx/command.go @@ -77,6 +77,7 @@ func init() { if len(arg) == 0 { m.Cmdy("", mdb.SEARCH, COMMAND, ice.OptionFields(INDEX)) DisplayStory(m.Options(nfs.DIR_ROOT, "ice."), "spide.js?split=.") + m.StatusTimeCount() return } kit.If(len(arg) == 0, func() { arg = append(arg, "") }) diff --git a/base/nfs/dir.go b/base/nfs/dir.go index 11f402b9..464fcf23 100644 --- a/base/nfs/dir.go +++ b/base/nfs/dir.go @@ -128,12 +128,14 @@ func _dir_list(m *ice.Message, root string, dir string, level int, deep bool, di } const ( - PWD = "./" - SRC = "src/" - BIN = "bin/" - USR = "usr/" - USR_INSTALL = "usr/install/" - REQUIRE = "/require/" + PWD = "./" + SRC = "src/" + BIN = "bin/" + USR = "usr/" + USR_PORTAL = "usr/portal/" + USR_INSTALL = "usr/install/" + SRC_DOCUMENT = "src/document/" + REQUIRE = "/require/" TYPE_ALL = "all" TYPE_BIN = "bin" diff --git a/base/nfs/pack.go b/base/nfs/pack.go index 42c67900..28847d6a 100644 --- a/base/nfs/pack.go +++ b/base/nfs/pack.go @@ -133,6 +133,12 @@ func Exists(m optionMessage, p string) bool { } return false } +func ExistsFile(m optionMessage, p string) bool { + if s, e := OptionFiles(m).StatFile(p); e == nil && !s.IsDir() { + return true + } + return false +} func NewReadCloser(r io.Reader) io.ReadCloser { return file.NewReadCloser(r) } func NewWriteCloser(w func([]byte) (int, error), c func() error) io.WriteCloser { return file.NewWriteCloser(w, c) diff --git a/base/web/space.go b/base/web/space.go index 4a4abd44..f447e7c7 100644 --- a/base/web/space.go +++ b/base/web/space.go @@ -171,8 +171,12 @@ const SPACE = "space" func init() { Index.MergeCommands(ice.Commands{ SPACE: {Name: "space name cmds auto", Help: "空间站", Actions: ice.MergeActions(ice.Actions{ - ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { - aaa.White(m, "space", "main") + ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { aaa.White(m, SPACE, ice.MAIN) }}, + ice.MAIN: {Hand: func(m *ice.Message, arg ...string) { + kit.If(mdb.Config(m, ice.MAIN), func(cmd string) { RenderPodCmd(m, "", cmd) }, func() { + m.RenderResult(nfs.Template(m.Options(nfs.VERSION, renderVersion(m)), "main.html")) + }) + m.Optionv(ice.MSG_ARGS, kit.Simple(m.Optionv(ice.MSG_ARGS))) }}, tcp.DIAL: {Name: "dial dev=ops name", Hand: func(m *ice.Message, arg ...string) { if strings.HasPrefix(m.Option(ice.DEV), HTTP) { @@ -211,16 +215,14 @@ func init() { ctx.ProcessOpen(m, m.MergePod(m.Option(mdb.NAME), arg)) } }}, - ice.MAIN: {Hand: func(m *ice.Message, arg ...string) { - kit.If(mdb.Config(m, ice.MAIN), func(cmd string) { RenderPodCmd(m, "", cmd) }, func() { - m.RenderResult(nfs.Template(m.Options(nfs.VERSION, renderVersion(m)), "main.html")) - }) - m.Optionv(ice.MSG_ARGS, kit.Simple(m.Optionv(ice.MSG_ARGS))) - }}, nfs.PS: {Hand: func(m *ice.Message, arg ...string) { _space_fork(m) }}, }, mdb.HashAction(mdb.SHORT, mdb.NAME, mdb.FIELD, "time,type,name,text", ctx.ACTION, OPEN, REDIAL, kit.Dict("a", 3000, "b", 1000, "c", 1000)), mdb.ClearOnExitHashAction()), Hand: func(m *ice.Message, arg ...string) { if len(arg) < 2 { - mdb.HashSelect(m, arg...).Sort("").Table(func(value ice.Maps) { + mdb.HashSelect(m.Spawn(), arg...).Sort("").Table(func(index int, value ice.Maps, field []string) { + if kit.IsIn(value[mdb.TYPE], CHROME, "send") { + return + } + m.Push("", value, field) if kit.IsIn(value[mdb.TYPE], SERVER, WORKER) { m.Push(mdb.LINK, tcp.PublishLocalhost(m, m.MergePod(value[mdb.NAME]))) } else { @@ -228,10 +230,8 @@ func init() { } m.PushButton(kit.Select(OPEN, LOGIN, value[mdb.TYPE] == LOGIN), mdb.REMOVE) }) + kit.If(!m.IsCliUA(), func() { m.Cmdy("web.code.publish", "contexts", "misc") }) kit.If(len(arg) == 1, func() { m.EchoIFrame(m.MergePod(arg[0])) }) - if !m.IsCliUA() { - m.Cmdy("web.code.publish", "contexts", "misc") - } } else { _space_send(m, arg[0], kit.Simple(kit.Split(arg[1]), arg[2:])...) } diff --git a/core/chat/pod.go b/core/chat/pod.go index c9ebf203..e538a6ff 100644 --- a/core/chat/pod.go +++ b/core/chat/pod.go @@ -25,6 +25,8 @@ func init() { m.RenderRedirect(m.Cmdv(web.SPACE, arg[0], "web.code.git.repos", nfs.REMOTE, nfs.REMOTE) + "/info/refs?service=" + m.Option("service")) } else if m.Option(cli.GOOS) != "" && m.Option(cli.GOARCH) != "" { m.RenderDownload(path.Join(ice.USR_LOCAL_WORK, arg[0], ice.USR_PUBLISH, kit.Keys(ice.ICE, m.Option(cli.GOOS), m.Option(cli.GOARCH)))) + } else if m.IsCliUA() { + m.RenderDownload(path.Join(ice.USR_LOCAL_WORK, arg[0], ice.BIN_ICE_BIN)) } else if len(arg) == 1 { if m.Cmd(web.SPACE, arg[0]).Length() == 0 && nfs.Exists(m, path.Join(ice.USR_LOCAL_WORK, arg[0])) { m.Cmd(web.DREAM, cli.START, kit.Dict(mdb.NAME, arg[0])) diff --git a/core/code/compile.go b/core/code/compile.go index 189f2a80..f0ac9c20 100644 --- a/core/code/compile.go +++ b/core/code/compile.go @@ -67,7 +67,6 @@ func init() { kit.Switch(m.Option(mdb.TYPE), kit.Simple(web.SERVER, web.WORKER), func() { kit.If(cli.SystemFind(m, GO), func() { kit.If(nfs.Exists(m, path.Join(ice.USR_LOCAL_WORK, m.Option(mdb.NAME), "src/main.go")), func() { - m.PushButton(kit.Dict(m.CommandKey(), "编译")) }) }) diff --git a/core/code/publish.go b/core/code/publish.go index 14767519..874a97b6 100644 --- a/core/code/publish.go +++ b/core/code/publish.go @@ -1,6 +1,7 @@ package code import ( + "fmt" "os" "path" "runtime" @@ -37,6 +38,7 @@ func _publish_file(m *ice.Message, file string, arg ...string) string { } func _publish_contexts(m *ice.Message, arg ...string) { m.Option(nfs.DIR_ROOT, "") + m.OptionDefault(ice.MSG_USERNAME, "demo") for _, k := range kit.Default(arg, ice.MISC) { m.Options(web.DOMAIN, web.UserHost(m), cli.CTX_ENV, kit.Select("", lex.SP+kit.JoinKV(mdb.EQ, lex.SP, cli.CTX_POD, m.Option(ice.MSG_USERPOD)), m.Option(ice.MSG_USERPOD) != "")) switch k { @@ -47,6 +49,12 @@ func _publish_contexts(m *ice.Message, arg ...string) { m.Option(web.DOMAIN, m.Cmd(web.SPIDE, ice.SHY).Append(web.CLIENT_ORIGIN)) case ice.CORE: m.Option(web.DOMAIN, m.Cmd(web.SPIDE, ice.DEV).Append(web.CLIENT_ORIGIN)) + case nfs.SOURCE: + m.Options(nfs.SOURCE, ice.Info.Make.Remote) + case nfs.BINARY: + case "wget", "curl": + case "manual": + m.Options(nfs.BINARY, "ice.linux.amd64") default: // _publish_file(m, ice.ICE_BIN) } @@ -74,17 +82,28 @@ func init() { _publish_list(m, kit.ExtReg(SH, VIM, CONF)) }}, ice.CONTEXTS: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, arg...) }}, - mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.DIR, arg[1:], nfs.DIR_CLI_FIELDS) }}, - mdb.CREATE: {Hand: func(m *ice.Message, arg ...string) { _publish_file(m, m.Option(nfs.PATH)) }}, - nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) { nfs.Trash(m, path.Join(ice.USR_PUBLISH, m.Option(nfs.PATH))) }}, - "binary": {Hand: func(m *ice.Message, arg ...string) { - m.Options(web.DOMAIN, web.UserHost(m), "binary", "ice.linux.amd64") - m.EchoScript(strings.TrimSpace(nfs.Template(m, kit.Keys("binary", SH)))) - }}, - "source": {Hand: func(m *ice.Message, arg ...string) { - m.Options(web.DOMAIN, web.UserHost(m), "source", ice.Info.Make.Remote) - m.EchoScript(strings.TrimSpace(nfs.Template(m, kit.Keys("source", SH)))) + nfs.SOURCE: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, nfs.SOURCE) }}, + nfs.BINARY: {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, nfs.BINARY) }}, + "manual": {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, "manual") }}, + "wget": {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, "wget") }}, + "curl": {Hand: func(m *ice.Message, arg ...string) { _publish_contexts(m, "curl") }}, + "version": {Hand: func(m *ice.Message, arg ...string) { + defer m.Echo("").Echo("
") + for _, cpu := range []string{cli.AMD64, cli.X86, cli.ARM} { + m.Echo("") + for _, sys := range []string{cli.LINUX, cli.WINDOWS, cli.DARWIN} { + m.Echo("") + if file := fmt.Sprintf("ice.%s.%s", sys, cpu); nfs.Exists(m, "usr/publish/"+file) { + m.EchoAnchor(file, "/publish/"+file) + } + m.Echo("") + } + m.Echo("") + } }}, + mdb.INPUTS: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(nfs.DIR, arg[1:], nfs.DIR_CLI_FIELDS) }}, + mdb.CREATE: {Hand: func(m *ice.Message, arg ...string) { _publish_file(m, m.Option(nfs.PATH)) }}, + nfs.TRASH: {Hand: func(m *ice.Message, arg ...string) { nfs.Trash(m, path.Join(ice.USR_PUBLISH, m.Option(nfs.PATH))) }}, }, ctx.ConfAction(mdb.FIELD, nfs.PATH), aaa.RoleAction()), Hand: func(m *ice.Message, arg ...string) { if m.Option(nfs.DIR_ROOT, ice.USR_PUBLISH); len(arg) == 0 { _publish_list(m).Cmdy("", ice.CONTEXTS) diff --git a/core/wiki/portal.css b/core/wiki/portal.css index e3057325..621a9b57 100644 --- a/core/wiki/portal.css +++ b/core/wiki/portal.css @@ -1,44 +1,37 @@ -fieldset.web.wiki.portal { --code-bg-color:black; --code-fg-color:silver; } -body.light fieldset.web.wiki.portal { --code-bg-color:black; --code-fg-color:white; } -fieldset.web.wiki.portal>div.output>div.header { background-color:rgb(22 31 49); color:var(--code-fg-color); height:64px; } +fieldset.web.wiki.portal { --portal-max-width:1200px; --portal-header-height:64px; } +fieldset.web.wiki.portal.home { --portal-max-width:1400px; } +fieldset.web.wiki.portal>div.output>div.header { background-color:rgb(22 31 49); color:var(--code-fg-color); height:var(--portal-header-height); --hover-bg-color:var(--plugin-bg-color); } fieldset.web.wiki.portal>div.output>div.header div.story[data-name=navmenu] { display:flex; justify-content:center; } -fieldset.web.wiki.portal>div.output>div.header div.story[data-name=navmenu] div.item { padding:20px; height:64px; } +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; width:240px; overflow:auto; --hover-bg-color:var(--plugin-bg-color); } -fieldset.web.wiki.portal>div.output>div.layout>div.nav div.story[data-name=navmenu] div.item { padding:10px; } -fieldset.web.wiki.portal>div.output>div.layout>div.nav div.story[data-name=navmenu] div.list div.item { padding-left:40px; } -fieldset.web.wiki.portal>div.output>div.layout>div.main { white-space:pre-wrap; padding:40px; height:600px; min-width:200px; max-width:1000px; overflow:auto; --hover-bg-color:var(--plugin-bg-color); } -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.aside { padding:40px 20px; width:200px; overflow:auto; width:200px; --hover-bg-color:var(--plugin-bg-color); } +fieldset.web.wiki.portal>div.output>div.layout>div.nav { padding:40px 40px; border-right:lightgray solid 1px; overflow:auto; min-width:240px; } +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; } +fieldset.web.wiki.portal>div.output>div.layout>div.aside { padding:40px 20px; overflow:auto; min-width:200px; } 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.header { color:var(--code-fg-color); } -body.dark fieldset.web.wiki.portal>div.output>div.layout { background-color:var(--code-bg-color); } +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; } -body.light 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); } -fieldset.web.wiki.portal.home>div.output>div.layout>div.main>* { margin:auto; } -fieldset.web.wiki.portal.home>div.output>div.layout>div.main { padding:0; max-width:100%; } -fieldset.web.wiki.portal.home>div.output>div.layout>div.main h2 { text-align:center; max-width:1000px; margin:0 auto;} -fieldset.web.wiki.portal.home>div.output>div.layout>div.main p { white-space:pre-wrap; } -fieldset.web.wiki.portal.home>div.output>div.layout>div.main p { text-align:center; max-width:1000px; } +fieldset.web.wiki.portal.home>div.output>div.layout>div.main>div.story.flex>* { padding:20px; } fieldset.web.wiki.portal.home>div.output>div.layout>div.main div.story.flex { display:flex; justify-content:center; } -fieldset.web.wiki.portal.home>div.output>div.layout>div.main>div.story.flex>* { padding:40px 40px; } +fieldset.web.wiki.portal.home>div.output>div.layout>div.main h2 { text-align:center; } +fieldset.web.wiki.portal.home>div.output>div.layout>div.main>h2 { margin-top:40px; } +fieldset.web.wiki.portal.home>div.output>div.layout>div.main p { white-space:pre-wrap; text-align:center; } +fieldset.web.wiki.portal.home>div.output>div.layout>div.main input.story[type=button] { font-family:system-ui; font-weight:bold; padding:20px 40px; margin:10px; height:64px; } -fieldset.web.wiki.portal>div.output>div.layout>div.main h1 { margin:10px 0; } -fieldset.web.wiki.portal>div.output>div.layout>div.main h2 { margin:20px auto 0; max-width:1000px; } -fieldset.web.wiki.portal>div.output>div.layout>div.main h3 { margin:10px auto 0; max-width:1000px; } -fieldset.web.wiki.portal>div.output>div.layout>div.main ul { margin:0; } -fieldset.web.wiki.portal>div.output>div.layout>div.main ul>li { white-space:pre-wrap; } -fieldset.web.wiki.portal>div.output>div.layout>div.main p { white-space:initial; } -fieldset.web.wiki.portal>div.output>div.layout>div.main p { max-width:1000px; } -fieldset.web.wiki.portal>div.output>div.layout>div.main p code { background-color:black; color:white; 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); } -fieldset.web.wiki.portal>div.output>div.layout>div.main input.story[type=button] { background-color:blue; color:var(--code-fg-color); font-family:system-ui; font-weight:bold; padding:20px 40px; margin:10px; height:60px; border-radius:0; } -fieldset.web.wiki.portal>div.output>div.layout>div.main iframe { height:50%; min-height:400px; width:100%; } -fieldset.web.wiki.portal>div.output>div.layout>div.main fieldset.inner.output div.content { padding:20px; border-radius:10px; } -fieldset.web.wiki.portal>div.output>div.layout>div.main fieldset.inner.output { +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: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 table { width:100%; text-align:center; } +fieldset.web.wiki.portal>div.output>div.layout>div.main iframe { height:50%; width:100%; } +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; diff --git a/core/wiki/portal.go b/core/wiki/portal.go index 6539b9e2..b6cb01d2 100644 --- a/core/wiki/portal.go +++ b/core/wiki/portal.go @@ -4,10 +4,12 @@ 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" "shylinux.com/x/icebergs/base/web" + kit "shylinux.com/x/toolkits" ) const PORTAL = "portal" @@ -24,9 +26,17 @@ func init() { mdb.IsSearchForEach(m, arg, func() []string { return []string{web.LINK, PORTAL, m.MergePodCmd("", "") + nfs.PS} }) }}, nfs.PS: {Hand: func(m *ice.Message, arg ...string) { web.RenderCmd(m, "", arg) }}, + ice.RUN: {Hand: func(m *ice.Message, arg ...string) { + if p := path.Join("usr/portal/", path.Join(arg...)); nfs.ExistsFile(m, p) && !(m.Option(ice.DEBUG) == ice.TRUE && aaa.Right(m.Spawn(), arg)) { + 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())) + } + }}, }, ctx.CmdAction()), Hand: func(m *ice.Message, arg ...string) { - if m.Push(HEADER, m.Cmdx(WORD, path.Join(ice.SRC_DOCUMENT, INDEX_SHY))); len(arg) > 0 { - m.Push(NAV, m.Cmdx(WORD, path.Join(ice.SRC_DOCUMENT, path.Join(arg...), INDEX_SHY))) + if m.Push(HEADER, m.Cmdx(WORD, path.Join(nfs.SRC_DOCUMENT, INDEX_SHY))); len(arg) > 0 { + m.Push(NAV, m.Cmdx(WORD, path.Join(nfs.SRC_DOCUMENT, path.Join(arg...), INDEX_SHY))) } m.Display("") }}, diff --git a/core/wiki/portal.js b/core/wiki/portal.js index cc7b4d99..37628d38 100644 --- a/core/wiki/portal.js +++ b/core/wiki/portal.js @@ -1,54 +1,64 @@ Volcanos(chat.ONIMPORT, { - _init: function(can, msg) { can.require(["/plugin/local/wiki/word.js"]), can.db = {nav: {}}, can.Conf(html.PADDING, 0) - can.onmotion.clear(can), can.sup.onexport.link = function() { return "/wiki/portal/" } - can.ui = can.onappend.layout(can, ["header", ["nav", "main", "aside"]], html.FLOW) - can.ui.header.innerHTML = msg.Append("header"), can.ui.nav.innerHTML = msg.Append("nav") + _init: function(can, msg) { can.require(["/plugin/local/wiki/word.js"]), can.Conf(html.PADDING, 40) + can.db = {nav: {}}, can.sup.onexport.link = function() { return "/wiki/portal/" } can.db.prefix = location.pathname.indexOf("/wiki/portal/") == 0? "/wiki/portal/": "/chat/cmd/web.wiki.portal/" can.db.current = can.isCmdMode()? can.base.trimPrefix(location.pathname, can.db.prefix): can.Option(nfs.PATH) - if (can.isCmdMode()) { can.onappend.style(can, html.OUTPUT), can.ConfHeight(can.page.height()), can.ConfWidth(can.page.width()) } - can.page.ClassList.del(can, can._fields, "home") - if (msg.Append("nav") == "") { + can.onmotion.clear(can) + can.ui = can.onappend.layout(can, [html.HEADER, [html.NAV, html.MAIN, html.ASIDE]], html.FLOW), can.onimport._scroll(can) + can.ui.header.innerHTML = msg.Append(html.HEADER), can.ui.nav.innerHTML = msg.Append(html.NAV) + if (msg.Append(html.NAV) == "") { can.onmotion.hidden(can, can.ui.nav), can.onmotion.hidden(can, can.ui.aside) - can.db.current == "" && can.onappend.style(can, "home"), can.onimport.content(can, "content.shy") + can.db.current == "" && can.onappend.style(can, ice.HOME), can.onimport.content(can, "content.shy") + } else { + 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.ui.layout(can.ConfHeight(), can.ConfWidth()), can.ConfHeight(can.ui.main.offsetHeight), can.ConfWidth(can.ui.main.offsetWidth) 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)) }) - var file = nfs.SRC_DOCUMENT+can.db.current+(can.isCmdMode()? can.base.trimPrefix(location.hash, "#"): can.Option(nfs.FILE)) + var file = can.db.current+(can.isCmdMode()? can.base.trimPrefix(location.hash, "#"): can.Option(nfs.FILE)) var nav = can.db.nav[file]; nav && nav.click() }, + _scroll: function(can) { can.ui.main.onscroll = function(event) { var top = can.ui.main.scrollTop, select + can.page.SelectChild(can, can.ui.main, "h1,h2,h3", function(target) { if (!select && target.offsetTop > top) { + select = target, can.onmotion.select(can, can.ui.aside, html.DIV_ITEM, target._menu) + } }) + } }, + layout: function(can, height, width) { can.onmotion.delay(can, function() { + if (can.isCmdMode()) { can.onappend.style(can, html.OUTPUT), can.ConfHeight(can.page.height()), can.ConfWidth(can.page.width()) } + can.ui.layout(height, width), can.ConfHeight(can.ui.main.offsetHeight), can.ConfWidth(can.ui.main.offsetWidth) + can.core.List(can._plugins, function(sub) { sub.onimport.size(sub, can.base.Min(can.ConfHeight()/2, 300, 600), sub.Conf("_width")||(can.ConfWidth()-2*can.Conf(html.PADDING)), true) }) + }, 100) }, navmenu: function(can, meta, target) { 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, "header")? function(target, item) { + }, target, can.page.ClassList.has(can, target.parentNode, html.HEADER)? function(target, item) { if (item.meta.name == "_") { target.innerHTML = "", can.onappend.style(can, html.SPACE, target) } - }: function(target, item) { can.db.nav[item.meta.link] = target + 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) }) }, button: function(can, meta, target) { var item = can.base.Obj(meta.meta) target.onclick = function(event) { can.onaction.route(event, can, item.route) } }, - field: function(can, meta, target, width) { var item = can.base.Obj(meta.meta); item.inputs = item.list, item.feature = item.meta - can.onappend._init(can, item, [chat.PLUGIN_STATE_JS], function(sub) { - sub.run = function(event, cmds, cb, silent) { can.runActionCommand(event, item.index, cmds, cb, true) } - sub.onimport.size(sub, parseInt(item.height)||can.base.Min(can.ConfHeight()/2, 300, 600), parseInt(item.width)||can.base.Max(width||can.ConfWidth(), 1000)) + field: function(can, meta, target) { var item = can.base.Obj(meta.meta), width = item.width + can.onappend.plugin(can, item, function(sub) { can._plugins = (can._plugins||[]).concat([sub]) + sub.onimport.size(sub, can.base.Min(can.ConfHeight()/2, 300, 600), sub.Conf("_width", width)||(can.ConfWidth()-2*can.Conf(html.PADDING)), true) }, can.ui.main, target) }, content: function(can, file) { can.runActionCommand(event, web.WIKI_WORD, [nfs.SRC_DOCUMENT+can.db.current+file], function(msg) { can.ui.main.innerHTML = msg.Result(), can.onmotion.clear(can, can.ui.aside) can.page.Select(can, can.ui.main, wiki.STORY_ITEM, function(target) { var meta = target.dataset||{} - meta.type == wiki.TITLE && can.onappend.style(can, meta.name, can.onimport.item(can, {name: meta.text}, function(event) { target.scrollIntoView() }, function() {}, can.ui.aside)) + meta.type == wiki.TITLE && can.onappend.style(can, meta.name, target._menu = can.onimport.item(can, {name: meta.text}, function(event) { target.scrollIntoView() }, function() {}, can.ui.aside)) can.core.CallFunc([can.onimport, can.onimport[meta.name]? meta.name: meta.type||target.tagName.toLowerCase()], [can, meta, target, can.ui.main.offsetWidth-80]) var _meta = can.base.Obj(meta.meta); _meta && _meta.style && can.page.style(can, target, can.base.Obj(_meta.style)) meta.style && can.page.style(can, target, can.base.Obj(meta.style)) - }) + }), can.onmotion.select(can, can.ui.aside, html.DIV_ITEM, 0) can.page.Select(can, can.ui.main, "a", function(target) { - target.innerText = target.innerText || target.href || "http://localhost:9020" - target.href = target.href || target.innerText + target.innerText = target.innerText || target.href, target.href = target.href || target.innerText, target.target = target || "_blank" }) }) }, @@ -56,13 +66,13 @@ Volcanos(chat.ONIMPORT, { Volcanos(chat.ONACTION, { route: function(event, can, route, internal) { var link = can.base.trimPrefix(route||"", nfs.SRC_DOCUMENT); if (!link || link == can.db.current) { return } - if (!internal) { - if (link == nfs.PS) { return can.isCmdMode()? can.user.jumps(can.db.prefix): (can.Option(nfs.PATH, ""), can.Update()) } + if (!internal) { var params = ""; (can.misc.Search(can, log.DEBUG) == ice.TRUE && (params = "?debug=true")) + if (link == nfs.PS) { return can.isCmdMode()? can.user.jumps(can.db.prefix+params): (can.Option(nfs.PATH, ""), can.Update()) } if (can.base.beginWith(link, web.HTTP, nfs.PS)) { return can.user.opens(link) } - if (link.indexOf(can.db.current) < 0 || link.endsWith(nfs.PS)) { return can.isCmdMode()? can.user.jumps(can.db.prefix+link): (can.Option(nfs.PATH, link), can.Update()) } + 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() { 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 } can.onimport.content(can, file) }, }) diff --git a/core/wiki/refer.go b/core/wiki/refer.go index b6b30ec0..fb6bdcb2 100644 --- a/core/wiki/refer.go +++ b/core/wiki/refer.go @@ -15,7 +15,7 @@ func _refer_show(m *ice.Message, text string, arg ...string) { if ls := kit.SplitWord(v); len(ls) == 1 { p := kit.QueryUnescape(ls[0]) list = append(list, []string{kit.Select(ls[0], path.Base(strings.Split(p, mdb.QS)[0])), ls[0], p}) - } else { + } else if len(ls) > 1 { list = append(list, append(ls, kit.QueryUnescape(ls[1]))) } } diff --git a/core/wiki/spark.go b/core/wiki/spark.go index c75a1b8c..bf885523 100644 --- a/core/wiki/spark.go +++ b/core/wiki/spark.go @@ -1,10 +1,14 @@ package wiki import ( + "fmt" + "path" "strings" ice "shylinux.com/x/icebergs" + "shylinux.com/x/icebergs/base/aaa" "shylinux.com/x/icebergs/base/cli" + "shylinux.com/x/icebergs/base/ctx" "shylinux.com/x/icebergs/base/lex" "shylinux.com/x/icebergs/base/mdb" "shylinux.com/x/icebergs/base/nfs" @@ -46,16 +50,12 @@ func _spark_show(m *ice.Message, name, text string, arg ...string) *ice.Message return _wiki_template(m.Options(mdb.LIST, kit.SplitLine(text)), name, name, text, arg...) } func _spark_tabs(m *ice.Message, arg ...string) { - m.Echo(`
`) - { - m.Echo(`
`) - { - kit.For(arg[1:], func(k, v string) { m.Echo(`
%s
`, k) }) - } - m.Echo(`
`) - kit.For(arg[1:], func(k, v string) { m.Cmdy("", arg[0], v) }) - } - m.Echo(`
`) + defer m.Echo(`
`).Echo(`
`) + func() { + defer m.Echo(`
`).Echo(`
`) + kit.For(arg[1:], func(k, v string) { m.Echo(`
%s
`, k) }) + }() + kit.For(arg[1:], func(k, v string) { m.Cmdy("", arg[0], v) }) } const ( @@ -70,18 +70,31 @@ func init() { ice.CTX_INIT: {Hand: func(m *ice.Message, arg ...string) { ice.AddRender(ice.RENDER_SCRIPT, func(msg *ice.Message, args ...ice.Any) string { return m.Cmdx(SPARK, SHELL, args) }) }}, + "inner": {Hand: func(m *ice.Message, arg ...string) { + if strings.Contains(arg[0], lex.NL) { + + } else if nfs.Exists(m, arg[0]) { + arg = append(arg, kit.Simple(ctx.ARGS, kit.Join(nfs.SplitPath(m, arg[0]), lex.SP))...) + arg[0] = m.Cmdx(nfs.CAT, arg[0]) + } else if p := path.Join(path.Dir(m.Option(ice.MSG_SCRIPT)), arg[0]); nfs.Exists(m, p) { + arg = append(arg, kit.Simple(ctx.ARGS, kit.Join(nfs.SplitPath(m, p), lex.SP))...) + arg[0] = m.Cmdx(nfs.CAT, p) + } + m.Cmdy(FIELD, "", "web.code.inner", ice.MSG_RESULT, arg[0], ctx.DISPLAY, "/plugin/local/code/inner.js", ctx.STYLE, "output", arg[1:]) + }}, + "demo": {Hand: func(m *ice.Message, arg ...string) { + if aaa.Right(m.Spawn(), arg[0]) { + m.Cmdy(FIELD, "", arg[0], arg[1:]) + } else { + m.Cmdy(SPARK, fmt.Sprintf("http://localhost:9020/chat/cmd/%s", arg[0]), arg[1:]) + m.Cmdy(IFRAME, fmt.Sprintf("http://localhost:9020/chat/cmd/%s", arg[0]), arg[1:]) + } + }}, }), Hand: func(m *ice.Message, arg ...string) { if kit.Ext(arg[0]) == "md" { _spark_md(m, arg...) } else if arg[0] == SHELL && kit.IsIn(kit.Select("", arg, 1), cli.ALPINE, cli.CENTOS, cli.LINUX, cli.MACOS, cli.DARWIN, cli.WINDOWS) { _spark_tabs(m, arg...) - } else if arg[0] == "inner" { - if !strings.Contains(arg[1], lex.NL) && nfs.Exists(m, arg[1]) { - arg = append(arg, kit.Simple("args", kit.Join(nfs.SplitPath(m, arg[1]), " "))...) - arg[1] = m.Cmdx(nfs.CAT, arg[1]) - } - m.Cmdy("field", "", "web.code.inner", "result", arg[1], "display", "/plugin/local/code/inner.js", "style", "output", arg[2:]) - } else { arg = _name(m, arg) meta := kit.Dict() @@ -93,13 +106,5 @@ func init() { _spark_show(m, arg[0], strings.TrimSpace(arg[1])) } }}, - "style": {Hand: func(m *ice.Message, arg ...string) { - switch arg[0] { - case "end": - m.Echo("") - default: - m.Echo(`
`, "story", arg[0]) - } - }}, }) } diff --git a/core/wiki/word.go b/core/wiki/word.go index 3d7ce493..15534f97 100644 --- a/core/wiki/word.go +++ b/core/wiki/word.go @@ -47,7 +47,9 @@ func init() { }) m.Cut("path,size,time") }}, "play": {Help: "演示"}, - ice.STORY: {Hand: func(m *ice.Message, arg ...string) { m.Cmdy(arg[0], ice.RUN, arg[2:]) }}, + ice.STORY: {Hand: func(m *ice.Message, arg ...string) { + m.Cmdy(arg[0], ice.RUN, arg[2:]) + }}, code.COMPLETE: {Hand: func(m *ice.Message, arg ...string) { ls := kit.Split(m.Option(mdb.TEXT)) kit.If(kit.IsIn(ls[0], IMAGE, VIDEO, AUDIO), func() { m.Cmdy(FEEL).CutTo(nfs.PATH, mdb.NAME) })