diff --git a/frame.js b/frame.js index 093002fa..affe5fd9 100644 --- a/frame.js +++ b/frame.js @@ -68,9 +68,7 @@ Volcanos(chat.ONENGINE, {help: "搜索引擎", _init: function(can, meta, list, msg.option = can.core.List(msg.option, function(item) { return {_toast: true, _handle: true}[item] && delete(msg[item])? undefined: item }) can.onengine.signal(can, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds})) - can.getHeader("topic", function(topic) { - can.request(event, {topic: topic}) - }) + can.getHeader("topic", function(topic) { can.request(event, {topic: topic}) }) var names = msg.Option(chat._NAMES)||panel._names||((can.Conf("iceberg")||Volcanos.meta.iceberg)+panel._name) can.misc.Run(event, can, {names: names, daemon: msg._daemon}, cmds, function(msg) { Volcanos.meta.pack[keys] = msg, toast && toast.close(), toast = true, can.base.isFunc(cb) && cb(msg) diff --git a/lib/misc.js b/lib/misc.js index b19d2d0c..60178439 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -134,6 +134,7 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg var form = {cmds: cmds||msg.cmd}; msg.option && msg.option.forEach(function(item) { if (typeof msg.Option(item) == lang.OBJECT) { return } if (typeof msg.Option(item) == lang.FUNCTION) { return } + if (item == "_daemon") { return } !skip[item] && msg[item] && (form[item] = msg[item]) }) @@ -163,10 +164,14 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg try { var data = JSON.parse(event.data) } catch (e) { var data = {detail: [event.data]} } var msg = can.request(event); msg.Reply = function() { // 回复命令 - msg.Option({_handle: true, _target: (msg[ice.MSG_SOURCE]||[]).reverse().join(ice.PT)}) - msg._source = (msg[ice.MSG_TARGET]||[]).reverse().slice(1)||[] - msg.result = (msg.result||[]).concat(can.core.List(arguments)), can.misc.Log(html.WSS, ice.MSG_RESULT, msg.result, msg) - delete(msg._event), delete(msg._can), socket.send(JSON.stringify(msg)) + var res = can.request({}) + res.Option({_handle: ice.TRUE, _target: (msg[ice.MSG_SOURCE]||[]).reverse().join(ice.PT)}) + res._source = (msg[ice.MSG_TARGET]||[]).reverse().slice(1)||[] + res.result = (msg.result||[]).concat(can.core.List(arguments)), can.misc.Log(html.WSS, ice.MSG_RESULT, msg.result, msg) + res.append = msg.append, can.core.List(msg.append, function(key) { res[key] = msg[key] }) + res.Option("log.disable", msg.Option("log.disable")) + delete(msg._event), delete(msg._can) + socket.send(JSON.stringify(res)) }, msg.detail = data.detail, msg.Copy(data) try { // 执行命令 diff --git a/page/index.css b/page/index.css index d57771b7..bbcf2793 100644 --- a/page/index.css +++ b/page/index.css @@ -336,4 +336,4 @@ fieldset.plugin.location>div.action input[type=text] { fieldset.xterm>div.action>div.tabs:hover { background-color:black; } fieldset.xterm>div.action>div.tabs.select { background-color:black; } -fieldset.xterm>div.output { background-color:black; } +fieldset.xterm div.toggle { display:none; } diff --git a/plugin/local/code/xterm.js b/plugin/local/code/xterm.js index 01083b35..6304e7e0 100644 --- a/plugin/local/code/xterm.js +++ b/plugin/local/code/xterm.js @@ -1,176 +1,48 @@ -Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) { - can.onmotion.clear(can), can.onlayout.profile_auto(can), can.base.isFunc(cb) && cb(msg) - can.ConfWidth(can.ConfWidth()+20), can.onimport.layout(can), can.onappend._status(can) - - can.requireModules(["xterm/css/xterm.css", "xterm", "xterm-addon-fit", "xterm-addon-web-links"], function() { can.onmotion.delay(can, function() { - can.term = {}; if (can.Option(mdb.HASH) != "") { - var item = {hash: can.Option(mdb.HASH)}; msg.Table(function(value) { can.core.Value(item, value.key, value.value) }) - return can.onimport._connect(can, item) - } - - var hash = can.sup._hash||can.misc.SearchHash(can)||true, list = msg.Table(function(value) { - var item = can.onimport._item(can, value); value.hash == hash && (item.click(), hash = false) - }); hash && can.onimport._create(can, [mdb.TYPE, msg.Option("type")||"", mdb.NAME, "term"]) - }, 500) }) - }, - layout: function(can) { - if (can._full) { can.ConfHeight(window.innerHeight), can.ConfWidth(window.innerWidth+20) - can.onmotion.hidden(can, can._legend), can.onmotion.hidden(can, can._option), can.onmotion.hidden(can, can._action) - , can.onmotion.hidden(can, can._status) - } - - can.page.style(can, can.ui.content, html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth()) - var term = can.ui.content._term; if (!term) { return } - term._fit.fit(), can.onexport.term(can, term) - }, - _item: function(can, item) { - item._menu = shy(can.ondetail, can.ondetail.list, function(event, button, meta) { - can.request(event, item, item.extra), meta[button](event, can, button, item) - }) - item.nick = item.name+": "+item.type - return item._item = can.onimport.item(can, item, function(event) { - item._tabs? item._tabs.click(): item._tabs = can.onimport.tabs(can, [item], function(event) { - can.onimport._connect(can, item) - }), item._plugin && can.onmotion.toggle(can, item._plugin._target, true) - }, function(event) { can.user.carteRight(event, can, can.ondetail, can.ondetail.list, item._menu) }) - }, - _create: function(can, args, data) { - can.runAction({}, mdb.CREATE, args, function(msg) { - var current = can.onimport._item(can, {hash: msg.Result(), name: msg.Option(mdb.NAME), type: msg.Option(mdb.TYPE), extra: data}) - can.page.insertBefore(can, current, can.ui.project.firstChild).click() +Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) { can.onmotion.clear(can) + can.requireModules(["xterm/css/xterm.css", "xterm", "xterm-addon-fit", "xterm-addon-web-links"], function() { + var item = {hash: can.Option(mdb.HASH)}; msg.Table(function(value) { can.core.Value(item, value.key, value.value) }) + can.onimport.layout(can), can.onappend._status(can), can.onimport._connect(can, item) }) }, - _connect: function(can, item, target) { target = target||can.ui.content - can.sup._hash = item.hash, can.isCmdMode() && (location.hash = item.hash) - if (can.onmotion.cache(can, function() { return item.hash }, target, can.ui.profile)) { - can.runAction(can.request(event, item), "select"), item._term.focus() - return can.onexport.term(can, item._term) - } - - item.extra = can.base.Obj(item.extra, {}) + _connect: function(can, item) { item.extra = can.base.Obj(item.extra, {}) var term = new Terminal({theme: item.extra, cursorBlink: true, tabStopWidth: 4}) var fitAddon = new FitAddon.FitAddon(); term.loadAddon(fitAddon), term._fit = fitAddon + can.onmotion.delay(can, function() { fitAddon.fit() }) term.loadAddon(new WebLinksAddon.WebLinksAddon()) - term.open(target||can.ui.content) - term.onResize(function(size) { can.onimport._size(can, item, size) }) - can.onmotion.delay(can, function() { fitAddon.fit() }) - - var submode = false, keyskip = false - term.onKey(function(e) { var event = e.domEvent - if (submode) { keyskip = true; switch (event.key) { - case "l": target.nextSibling && target.nextSibling._term? target.nextSibling._term.focus(): - item._tabs && item._tabs.nextSibling && item._tabs.nextSibling.click(); - break - case "h": target.previousSibling && target.previousSibling._term? target.previousSibling._term.focus(): - item._tabs && item._tabs.previousSibling && item._tabs.previousSibling.click(); - break - case "n": can.onaction.create(event, can); break - break - default: keyskip = false - } } - submode = event.ctrlKey && event.key == "g" - can.onexport.term(can, term) - }) - term.onData(function(val) { - if (submode || keyskip) { keyskip = false; return } - can.onimport._input(can, item, val) - }) term.onTitleChange(function(title) { can.isCmdMode() && can.user.title(title) }) - term.onCursorMove(function(e) { can.onexport.term(can, term) }) + term.onResize(function(size) { can.onimport._resize(can, item, size) }) + term.onCursorMove(function() { can.onexport.term(can) }) + term.onData(function(val) { can.onimport._input(can, item, val) }) - can._current = item.hash - can.term[item.hash] = item._term = target._term = term, term._target = target, term._item = item - can.runAction(can.request(event, item), "select"), item._term.focus() - return can.onimport._plug(can, item), can.onexport.term(can, term) + can._current = term, term._item = item + term.open(can._output), term.focus() + }, + _resize: function(can, item, size) { + can.runAction(can.request({}, size, item), "resize", function() { can.onexport.term(can) }) }, _input: function(can, item, val) { can.runAction(can.request({}, item), "input", [btoa(val)], function() {}) }, - _size: function(can, item, size) { - can.runAction(can.request({}, size, item), "resize", []) - }, - _plug: function(can, item) { can.onmotion.clear(can, can.ui.profile) - can.onimport.plug(can, item.extra, can.ui.profile, function(sub) { item._plugin = sub - can.page.style(can, sub._output, html.MAX_WIDTH, can.ConfWidth()*3/4) - }) - }, - grow: function(can, msg, type) { var term = can.term[msg.Option(mdb.HASH)]; if (!term) { return } - function base64ToArrayBuffer(base64) { - var binary_string = window.atob(base64); - var len = binary_string.length; - var bytes = new Uint8Array(len); - for (var i = 0; i < len; i++) { - bytes[i] = binary_string.charCodeAt(i); - } - return new Blob([bytes.buffer]).text() + layout: function(can) { + if (can.ConfHeight() == window.innerHeight) { + can.page.style(can, can._output, html.HEIGHT, can.ConfHeight()+10, html.WIDTH, can.ConfWidth()+20, html.MAX_WIDTH, "") + } else { + can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth()+20, html.MAX_WIDTH, "") } - + can._current && can._current._fit.fit() + }, + grow: function(can, msg, type) { switch (type) { - // case "data": term.write(atob(msg.Option(mdb.TEXT))); break - // case "data": term.write(base64ToArrayBuffer(msg.Option(mdb.TEXT))); break - // case "data": term.write(unescape(msg.Option("escape"))); break - case "data": term.write((msg.Option("raw"))); break - case "exit": can.onmotion.clear(can, term._target); break + case ice.EXIT: can.onmotion.clear(can); break + default: can._current.write(msg.Option(mdb.TEXT)); break } }, }) -Volcanos(chat.ONACTION, {help: "操作数据", list: [mdb.CREATE, lex.SPLIT, mdb.PRUNES, "install", "full"], - _trans: {split: "分屏", theme: "主题"}, - full: function(event, can) { can._full = true, can.onimport.layout(can) }, - create: function(event, can) { - can.user.input(event, can, [mdb.TYPE, mdb.NAME, "background", ctx.INDEX, ctx.ARGS], function(args, data) { - can.onimport._create(can, args, data) - }) - }, - split: function(event, can) { can.request(event, {name: "term", nrow: 2, ncol: 2}) - can.user.input(event, can, [mdb.TYPE, mdb.NAME, "nrow", "ncol"], function(data) { - can.onimport.tabs(can, [data], function(event) { if (can.onmotion.cache(can, function() { return data.name }, can.ui.content)) { return } - can.core.List(parseInt(data.nrow), function(nrow) { var row = can.page.Append(can, can.ui.content, [{view: "row", style: {height: can.ConfHeight()/data.nrow}}]).first - can.core.List(parseInt(data.ncol), function(ncol) { var col = can.page.Append(can, row, [{view: "col", style: {height: can.ConfHeight()/data.nrow, width: can.ConfWidth()/data.ncol-2}}]).first - can.runAction({}, mdb.CREATE, [mdb.TYPE, data.type, mdb.NAME, can.core.Keys(data.name, nrow, ncol)], function(msg) { can.onimport._connect(can, {hash: msg.Result()}, col) }) - }) - }) - }) - }) - }, - install: function(event, can) { - can.request(event, {"hash": can._current}) - can.runAction(event, "install") - }, -}) -Volcanos(chat.ONDETAIL, {help: "操作数据", list: ["share", "plugin", "theme", "rename", "remove"], - share: function(event, can, button, item) { var msg = can.request(event); msg.Option("args", "") - can.onmotion.share(event, can, [{name: chat.TITLE, value: item.name}, {name: chat.TOPIC, values: [cli.WHITE, cli.BLACK]}], [ - mdb.NAME, can._index, mdb.TEXT, JSON.stringify([can.sup._hash]), - ]) - }, - plugin: function(event, can, button, item) { - can.user.input(event, can, [ctx.INDEX, ctx.ARGS], function(args, data) { - can.runAction(event, mdb.MODIFY, args), can.base.Copy(item.extra, data), can.onimport._plug(can, item) - }) - }, - theme: function(event, can, button, item) { - can.user.input(event, can, ["background", "selection", "cursor", "foreground"], function(args, data) { - can.runAction(event, mdb.MODIFY, args), can.base.Copy(item.extra, data), item._term.setOption("theme", data) - }) - }, - rename: function(event, can, button, item) { - can.user.input(event, can, [mdb.NAME], function(args) { - can.runAction(event, button, args), item.name = item._item.innerText = item._tabs.innerText = args[1] - }) - }, - remove: function(event, can, button, item) { - can.runAction(event, button) - }, -}) -Volcanos(chat.ONEXPORT, {help: "导出数据", list: [mdb.TOTAL, mdb.TYPE, "background", "rows", "cols", "cursorY", "cursorX", ctx.INDEX], - term: function(can, term) { item = term._item +Volcanos(chat.ONEXPORT, {help: "导出数据", list: [mdb.TYPE, html.BACKGROUND, "rows", "cols", "cursorY", "cursorX"], + term: function(can) { var term = can._current, item = term._item can.core.List(can.onexport.list, function(key) { - can.Status(key, can.base.getValid(item[key], item.extra[key], term[key], term.buffer.active[key], "")) - }) - can.Status(mdb.TOTAL, can.page.Select(can, can.ui.project, html.DIV_ITEM).length) - can.Status(mdb.TYPE, item[mdb.TYPE]||"") - return term + can.Status(key, can.base.getValid(item[key], item.extra[key], can._current[key], can._current.buffer.active[key], "")) + }), can.Status(mdb.TYPE, item[mdb.TYPE]||"") }, }) diff --git a/plugin/table.js b/plugin/table.js index 46c1c2b9..2ed2aa11 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -132,3 +132,12 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }, target) }, }) +Volcanos(chat.ONACTION, {help: "操作数据", + _trans: {"full": "全屏"}, + full: function(event, can) { + can.onmotion.hidden(can, can._legend), can.onmotion.hidden(can, can._option), can.onmotion.hidden(can, can._action), can.onmotion.hidden(can, can._status) + can.ConfHeight(window.innerHeight), can.ConfWidth(window.innerWidth) + can.onimport.layout(can) + }, +}) +