1
0
forked from x/icebergs
This commit is contained in:
IT 老营长 @云轩领航-创始人 2023-07-04 11:05:02 +08:00
parent b7726ae301
commit 6d7cf18dce
13 changed files with 163 additions and 114 deletions

View File

@ -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, "") })

View File

@ -132,7 +132,9 @@ const (
SRC = "src/"
BIN = "bin/"
USR = "usr/"
USR_PORTAL = "usr/portal/"
USR_INSTALL = "usr/install/"
SRC_DOCUMENT = "src/document/"
REQUIRE = "/require/"
TYPE_ALL = "all"

View File

@ -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)

View File

@ -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:])...)
}

View File

@ -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]))

View File

@ -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(), "编译"))
})
})

View File

@ -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...) }},
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("<table>").Echo("</table>")
for _, cpu := range []string{cli.AMD64, cli.X86, cli.ARM} {
m.Echo("<tr>")
for _, sys := range []string{cli.LINUX, cli.WINDOWS, cli.DARWIN} {
m.Echo("<td>")
if file := fmt.Sprintf("ice.%s.%s", sys, cpu); nfs.Exists(m, "usr/publish/"+file) {
m.EchoAnchor(file, "/publish/"+file)
}
m.Echo("</td>")
}
m.Echo("</tr>")
}
}},
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))))
}},
}, 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)

View File

@ -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;

View File

@ -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("")
}},

View File

@ -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)
},
})

View File

@ -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])))
}
}

View File

@ -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,17 +50,13 @@ 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(`<div class="story" data-type="spark_tabs">`)
{
m.Echo(`<div class="tabs">`)
{
defer m.Echo(`<div class="story" data-type="spark_tabs">`).Echo(`</div>`)
func() {
defer m.Echo(`<div class="tabs">`).Echo(`</div>`)
kit.For(arg[1:], func(k, v string) { m.Echo(`<div class="item">%s</div>`, k) })
}
m.Echo(`</div>`)
}()
kit.For(arg[1:], func(k, v string) { m.Cmdy("", arg[0], v) })
}
m.Echo(`</div>`)
}
const (
SHELL = "shell"
@ -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("<a>http://localhost:9020/chat/cmd/%s</a>", 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("</div>")
default:
m.Echo(`<div class="%s %s">`, "story", arg[0])
}
}},
})
}

View File

@ -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) })