From 31f8748684df4e2309ba83db1c1c67048b8ab5bc Mon Sep 17 00:00:00 2001 From: shy Date: Sun, 24 Dec 2023 12:23:15 +0800 Subject: [PATCH] add can.dir --- const.js | 1 + frame.js | 15 ++-- lib/page.js | 4 +- panel/footer.js | 142 +++++++++++++++++++++++++------------ panel/search.js | 2 +- plugin/local/code/xterm.js | 8 ++- 6 files changed, 119 insertions(+), 53 deletions(-) diff --git a/const.js b/const.js index a5018144..4c7e77e4 100644 --- a/const.js +++ b/const.js @@ -286,6 +286,7 @@ var http = { Accept: "Accept", ContentType: "Content-Type", ApplicationJSON: "application/json", ApplicationFORM: "application/x-www-form-urlencoded", } var html = {value: { + CODE_FONT_SIZE: 14, HEADER_HEIGHT: 48, RIVER_WIDTH: 230, PROJECT_WIDTH: 230, ACTION_HEIGHT: 32, STATUS_HEIGHT: 32, diff --git a/frame.js b/frame.js index f7e29a3f..622bb1da 100644 --- a/frame.js +++ b/frame.js @@ -39,7 +39,12 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { _engine: function(event, can, msg, panel, cmds, cb) { return false }, _plugin: function(event, can, msg, panel, cmds, cb) { if (cmds[0] == ctx.ACTION && cmds[1] == ctx.RUN) { var p = can.onengine.plugin(can, cmds[2]) - if (p) { return can.core.CallFunc(p, {can: p.can||panel, sub: msg._can, msg: msg, arg: cmds.slice(3), cmds: cmds.slice(3), cb: cb, meta: p.meta}), true } + if (p) { + if (cmds[3] == ctx.ACTION && typeof p.meta[cmds[4]] == code.FUNCTION) { + return can.core.CallFunc(p.meta[cmds[4]], {can: p.can||panel, sub: msg._can, msg: msg, arg: cmds.slice(5), cmds: cmds.slice(3), cb: cb, meta: p.meta}), true + } + return can.core.CallFunc(p, {can: p.can||panel, sub: msg._can, msg: msg, arg: cmds.slice(3), cmds: cmds.slice(3), cb: cb, meta: p.meta}), true + } } var p = can.onengine.plugin(can, cmds[0]), n = 1; if (!p) { return false } var func = p, _can = p.can||panel, _sup = _can @@ -191,13 +196,13 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { meta._help && add({type: html.BUTTON, name: ice.HELP, onclick: function(event) { can.onappend._float(can, {index: web.WIKI_WORD}, [meta._help]) }}, function() {}) }) }, - _action: function(can, list, action, meta, hold) { meta = meta||can.onaction||{}, action = action||can._action, hold || can.onmotion.clear(can, action) + _action: function(can, list, action, meta, hold, limit) { meta = meta||can.onaction||{}, action = action||can._action, hold || can.onmotion.clear(can, action) function run(event, button) { can.misc.Event(event, can, function(msg) { var _can = can._fields? can.sup: can; can.requestAction(event, button) var cb = meta[button]||meta[chat._ENGINE]; cb? can.core.CallFunc(cb, {event: event, can: can, button: button}): can.run(event, button == mdb.LIST? []: [ctx.ACTION, button].concat(_can.Input())) }) } var list = can.page.inputs(can, can.base.getValid(can.base.Obj(list), can.core.Value(can, [chat.ONACTION, mdb.LIST]), meta != can.onaction? can.core.Item(meta): [])||[]) - var limit = html.ACTION_BUTTON; if (list.length >= limit) { var rest = list.slice(limit-1); list = list.slice(0, limit-1), list.push({type: html.BUTTON, name: "more", onclick: function(event) { + limit = limit||html.ACTION_BUTTON; if (list.length >= limit) { var rest = list.slice(limit-1); list = list.slice(0, limit-1), list.push({type: html.BUTTON, name: "more", onclick: function(event) { can.user.carte(event, can, {_trans: meta._trans||can._trans}, can.core.List(rest, function(item) { return item.name }), function(event, button) { run(event, button) }) @@ -283,7 +288,9 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { ], onclick: function(event) { if (item.name == mdb.COUNT) { can.onappend._float(can, {index: ctx.CONFIG}, [can.ConfIndex()]) - } else if (can.base.isIn(item.name, mdb.TIME, cli.COST)) { + } else if (can.base.isIn(item.name, mdb.TIME)) { + can.onappend._float(can, {index: "can.debug"}, ["log", can.ConfIndex()]) + } else if (can.base.isIn(item.name, cli.COST)) { can.onappend._float(can, {index: "can.toast"}, [can.ConfIndex()]) } else if (can.base.isIn(item.name, nfs.SIZE)) { can.onappend._float(can, {title: "msg(报文)", index: ice.CAN_PLUGIN, display: "/plugin/story/json.js"}, [], function(sub) { diff --git a/lib/page.js b/lib/page.js index 2b6be130..708ab381 100644 --- a/lib/page.js +++ b/lib/page.js @@ -147,7 +147,7 @@ Volcanos("page", { return item.value == ""? undefined: {type: html.SPAN, list: [{text: lex.SP}, {text: item.name}, {text: mdb.EQ}, {className: code.STRING, text: JSON.stringify(item.value)}]} }): [] } var ui = {}; tag = tag||target.tagName.toLowerCase(), isclose = tag != mdb.META && tag != web.LINK, _field = field(target) - var inner = target.children.length > 0 && target.innerText != target.innerHTML? can.page.unicode.inner: "" + var inner = list || target.children.length > 0 && target.innerText != target.innerHTML? can.page.unicode.inner: "" return {view: mdb.VIEW, list: [ {view: [[html.ITEM, target.tagName && target.tagName.toLowerCase()]], list: [ {text: [(inner? can.page.unicode.close: ""), "", html.TOGGLE], _init: function(target) { ui.toggle = target }}, @@ -158,7 +158,7 @@ Volcanos("page", { {className: code.KEYWORD, text: can.page.trans(can, ice.LT+nfs.PS+tag+ice.GT), _init: function(target) { ui._close = target }}, ], onclick: inner && function(event) { ui.toggle.innerText = (can.onmotion.toggle(can, ui.list)? can.page.unicode.open: can.page.unicode.close)+lex.SP - if (target.children.length == 0) { return } + if (target.children.length == 0 && !list) { return } ui.inner && can.onmotion.toggle(can, ui.inner), can.onmotion.toggle(can, ui.close), can.onmotion.toggle(can, ui._close) if (!loaded) { if (can.page.tagis(target, ctx.STYLE, nfs.SCRIPT)) { can.page.Append(can, ui.list, [{text: target.innerHTML}]) } else { can.page.Append(can, ui.list, can.core.List(target.children, function(node) { return can.page.AppendView(can, node, "", null, false, cb) })) diff --git a/panel/footer.js b/panel/footer.js index 6cdf4aca..2fa47364 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -1,32 +1,33 @@ (function() { var NTIP = "ntip", NLOG = "nlog", NCMD = "ncmd", NKEY = "nkey" -Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(NKEY, can.core.Item(can.misc.localStorage(can)).length) - can._wss = can.ondaemon._init(can); if (can.user.mod.isCmd && can.misc.Search(can, ice.CMD) != web.CHAT_PORTAL) { return } can.Conf("version", can.base.trimPrefix(window._version, "?_v=").split("&")[0]) - can.onimport._title(can, msg, target), can.onimport._command(can, msg, target), can.onimport._storm(can, msg, target) +Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { + can.Conf(nfs.VERSION, can.base.trimPrefix(window._version, "?_v=").split("&")[0]) can.ConfHeight(can.page.height()), can.ConfWidth(can.page.width()) + can.Conf(NKEY, can.core.Item(can.misc.localStorage(can)).length) + can.onimport._title(can, msg, target), can.onimport._command(can, msg, target), can.onimport._storm(can, msg, target) can.onimport._state(can, msg, target), can.onimport._toast(can, msg, target) + can._wss = can.ondaemon._init(can) }, _title: function(can, msg, target) { can.user.isMobile || can.core.List(can.Conf(chat.TITLE)||msg.result, function(item) { if (can.base.contains(item, ice.AT)) { item = ''+item+'' } can.page.Append(can, target, [{view: [[html.ITEM, chat.TITLE], "", item], title: "联系站长"}]) }) }, - _storm: function(can, msg, target) { - can.ui.storm = can.page.Append(can, can._output, [html.MENU])._target - }, - _state: function(can, msg, target) { can.user.isMobile || can.core.List(can.base.Obj(can.Conf(chat.STATE)||msg.Option(chat.STATE), can.onexport.list).reverse(), function(item) { - can.page.Append(can, target, [{view: [[html.ITEM, chat.STATE]], list: [ - {text: [item, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [can.Conf(item)||"", "", item]}, - ], onclick: function(event) { can.onexport[item](can) }}]) - }) }, - _toast: function(can, msg, target) { can.ui.toast = can.page.Append(can, target, [{view: [[html.ITEM, chat.TOAST]], onclick: function(event) { can.onexport[NTIP](can) }}])._target }, _command: function(can, msg, target) { can.onappend.input(can, {type: html.TEXT, _className: "args trans", icon: icon.TERMINAL, name: ice.CMD, onkeydown: function(event) { can.onkeymap.input(event, can) - function close() { can.ui.cli && can.ui.cli.onaction.close() } if (event.key == code.ESCAPE) { return close() } if (event.key != code.ENTER) { return } - close(); switch (event.target.value) { + function close() { can.ui.cli && can.ui.cli.onaction.close() } if (event.key == code.ESCAPE) { return close() } if (event.key != code.ENTER) { return } close() + switch (event.target.value) { case web.CLEAR: case cli.CLOSE: break default: var list = can.core.Split(event.target.value, lex.SP) - can.onexport._float(can, "cli", list[0], list.slice(1), function(sub) { can.getActionSize(function(left) { can.page.style(can, sub._target, html.LEFT, left+10, html.RIGHT, "") }) }) + // can.onexport._float(can, "cli", list[0], list.slice(1), function(sub) { can.getActionSize(function(left) { can.page.style(can, sub._target, html.LEFT, left+html.PLUGIN_MARGIN, html.RIGHT, "") }) }) + can.onexport._float(can, "cli", {index: "can.console", display: "/plugin/local/code/xterm.js"}, list, function(sub) { can.getActionSize(function(left) { can.page.style(can, sub._target, html.LEFT, left+html.PLUGIN_MARGIN, html.RIGHT, "") }) }) } }}, "", target, [chat.TITLE]) }, + _storm: function(can, msg, target) { can.ui.storm = can.page.Append(can, can._output, [html.MENU])._target }, + _state: function(can, msg, target) { can.user.isMobile || can.core.List(can.base.Obj(can.Conf(chat.STATE)||msg.Option(chat.STATE), can.onexport.list).reverse(), function(item) { + can.page.Append(can, target, [{view: [[html.ITEM, chat.STATE]], list: [ + {text: [item, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [can.Conf(item)||"", "", item]}, + ], onclick: function(event) { can.core.CallFunc(can.onexport[item], [can]) }}]) }) + }, + _toast: function(can, msg, target) { can.ui.toast = can.page.Append(can, target, [{view: [[html.ITEM, chat.TOAST]], onclick: function(event) { can.onexport[NTIP](can) }}])._target }, _data: function(can, name, item) { can.db[name] = can.db[name]||can.request(), can.db[name].Push(item), can.onimport.count(can, name) }, count: function(can, name) { can.page.Select(can, can._output, can.core.Keys(html.SPAN, name), function(item) { item.innerHTML = can.Conf(name, parseInt(can.Conf(name)||"0")+1+"")+"" }) }, ntip: function(can, msg, time, title, content) { can.onimport._data(can, NTIP, {time: time, fileline: can.base.trimPrefix(msg.Option("log.caller"), location.origin+nfs.PS), title: title, content: content}), can.page.Modify(can, can.ui.toast, [time, title, content].join(lex.SP)) }, @@ -35,8 +36,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(NKEY, can. menu: function(can, cmds, cb, trans) { can.base.isString(cmds) && (cmds = [cmds]) return can.page.Append(can, can.ui.storm, [{view: cmds[0], list: can.core.List(can.base.getValid(cmds.slice(1), [cmds[0]]), function(item) { return {view: [[html.ITEM, item.name]], list: [{icon: item.icon}, {text: item.name}], onclick: function(event) { - can.onmotion.select(can, event.currentTarget.parentNode, html.DIV_ITEM, event.currentTarget) - cb(event, item.hash) + can.onmotion.select(can, event.currentTarget.parentNode, html.DIV_ITEM, event.currentTarget), cb(event, item.hash) }} }) }])._target }, @@ -56,23 +56,21 @@ Volcanos(chat.ONACTION, {_init: function(can) {}, }) }) }, }) Volcanos(chat.ONEXPORT, {list: [NTIP, NLOG, NCMD, NKEY, html.WIDTH, html.HEIGHT, nfs.VERSION], - height: function(can) { return can._target.offsetHeight }, + // height: function(can) { return can._target.offsetHeight }, + height: function(can) { can.onexport._float(can, html.HEIGHT, "can.view") }, + width: function(can) { can.onexport._float(can, html.WIDTH, "can.data") }, ntip: function(can) { can.onexport._float(can, NTIP, "can.toast") }, nlog: function(can) { can.onexport._float(can, NLOG, "can.debug") }, ncmd: function(can) { can.onexport._float(can, NCMD, "can.debug", [chat.ONREMOTE]) }, - nkey: function(can) { can.onexport._float(can, NLOG, "can.localStorage") }, + nkey: function(can) { can.onexport._float(can, NKEY, "can.localStorage") }, + version: function(can) { can.onexport._float(can, NKEY, "can.runtime") }, _float: function(can, name, index, args, cb) { can.ui[name]? can.ui[name].onaction.close(): can.onappend._float(can, index, args||[], function(sub) { can.ui[name] = sub - can.page.style(can, sub._target, {left: "", top: "", right: 0, bottom: can.onexport.height(can)}), can.base.isFunc(cb) && cb(sub) + can.page.style(can, sub._target, {left: html.RIVER_WIDTH, top: "", right: 0, bottom: html.ACTION_HEIGHT}), can.base.isFunc(cb) && cb(sub) can.onmotion.delay(can, function() { sub.onaction.close = function() { can.page.Remove(can, sub._target), delete(can.ui[name]) } }) }) }, }) Volcanos(chat.ONPLUGIN, { - toast: shy("提示", { - inputs: shy(function(can, sup, msg, arg) { var list = {}; can.core.List(sup.db[NTIP][arg[0]], function(item) { - if (!can.base.contains(item, arg[1]) || list[item]) { return } list[item] = true; msg.Push(arg[0], item) - }) }), - create: shy([wiki.CONTENT, wiki.TITLE], function(can, content, title) { can.user.toast(can, content, title) }), - }, [html.FILTER, ice.LIST, mdb.CREATE], function(can, msg, arg) { if (!can.db[NTIP]) { return } + toast: shy("提示", {}, [html.FILTER, ice.LIST], function(can, msg, arg) { if (!can.db[NTIP]) { return } arg[0]? can.db[NTIP].Table(function(value) { msg.append = [mdb.TIME, "title", "content"], (value.title == arg[0] || value.content.indexOf(arg[0]) > -1) && msg.Push(value) }): msg.Copy(can.db[NTIP]), msg.StatusTimeCount() @@ -82,13 +80,13 @@ Volcanos(chat.ONPLUGIN, { "w3schools": shy("教程", function(can) { can.user.open("https://www.w3schools.com/colors/colors_names.asp") }), "mozilla": shy("文档", function(can) { can.user.open("https://developer.mozilla.org/en-US/") }), "w3": shy("标准", function(can) { can.user.open("https://www.w3.org/TR/?tag=css") }), - }, ["type:select=error,log,info,warn,error,debug,onremote,wss", web.FILTER, ice.LIST, "prune", "w3schools", "mozilla", "w3"], function(can, msg, arg, cb) { var _can = can, can = msg._can + }, ["type:select=log,info,warn,error,debug,onremote,wss", web.FILTER, ice.LIST, "prune", "w3schools", "mozilla", "w3"], function(can, msg, arg, cb) { var _can = can, can = msg._can var stat = {}; var ui = can.page.Appends(can, can._output, [{view: [html.CONTENT, html.TABLE], list: [{type: html.TR, list: [ {text: [mdb.TEXT, html.TH]}, ]}].concat(can.core.List(can.misc._list, function(list) { stat[list[2]] = ((stat[list[2]]||0)+1); return (!arg || !arg[0] || arg[0] == "log" || arg[0] == list[2]) && {type: html.TR, list: [ {type: html.TD, list: can.core.List(list, function(item, index) { var vimer - if (index == 1) { var _ls = /(https*:\/\/[^/]+)\/*([^:]+):([0-9]+):([0-9]+)/.exec(list[1]); _ls[2] = _ls[2].split(ice.QS)[0] - return {view: [html.ITEM, html.SPAN], list: [{text: lex.SP+can.page.unicode.close+lex.SP}, {text: [(_ls[1] == location.origin? "": _ls[1])+_ls[2]+nfs.DF+_ls[3], "", nfs.PATH], onclick: function(event) { + if (index == 1) { var _ls = new RegExp("(https*://[^/]+)*/*([^:]+):([0-9]+):([0-9]+)").exec(list[1])||[]; _ls[2] = (_ls[2]||"").split(ice.QS)[0]||"" + return {view: [html.ITEM, html.SPAN], list: [{text: lex.SP+can.page.unicode.close+lex.SP}, {text: [(_ls[1] == location.origin? "": _ls[1]||"")+_ls[2]+nfs.DF+_ls[3], "", nfs.PATH], onclick: function(event) { if (can.onexport.record(can, list[1], web.LINK, {time: list[0], link: list[1], type: list[2], path: nfs.USR_VOLCANOS, file: _ls[2], line: _ls[3]})) { return } if (vimer) { return can.page.Remove(can, vimer._target), vimer = null } vimer = can.onappend.plugin(_can, {index: web.CODE_INNER, args: [nfs.USR_VOLCANOS, _ls[2], _ls[3]]}, function(sub) {}, event.target.parentNode) @@ -109,16 +107,10 @@ Volcanos(chat.ONPLUGIN, { {name: mdb.TIME, value: can.base.Time()}, {name: mdb.COUNT, value: can.page.Select(can, can._output, html.TR+html.NOT_HIDE).length+"x1"}, ].concat(can.core.List([log.INFO, log.WARN, log.ERROR, chat.ONREMOTE, html.WSS], function(item) { return {name: item, value: stat[item]||"0"} }))) }), - data: shy("网页数据", [mdb.KEY], function(can, msg, arg, cb) { var can = msg._can - can.onappend.style(can, "view") - var root = can.Conf("_target")||can._root - arg[0]? can.page.AppendData(can, can._output, arg[0], arg[0].split(nfs.PT).pop(), can.core.Value(root, arg[0]), function(prefix, value) { can.Option(mdb.KEY, prefix) })._target.click(): - can.page.AppendData(can, can._output, "", root._name, root, function(prefix, value) { can.Option(mdb.KEY, prefix) })._target.click() - }), view: shy("网页元素", [mdb.KEY], function(can, msg, arg, cb) { var can = msg._can if (can.Conf("_target")) { var ui = can.page.Append(can, can._output, [can.page.AppendView(can, can.Conf("_target"))]) - can.onmotion.delay(can, function() { can.page.SelectOne(can, ui._target, "div.item", function(target) { target.click() }) }) + can.onmotion.delay(can, function() { can.page.SelectOne(can, ui._target, html.DIV_ITEM, function(target) { target.click() }) }) } else if (arg[0]) { can.page.Append(can, can._output, [can.page.AppendView(can, can.page.SelectOne(can, document.body, arg[0]))]) } else { @@ -128,19 +120,81 @@ Volcanos(chat.ONPLUGIN, { list.push(p.tagName.toLowerCase()+(p.className? nfs.PT+p.className.replaceAll(lex.SP, nfs.PT).replace(".picker", ""): "")) } can.Option(mdb.KEY, list.reverse().join(ice.GT)) }), - ], true)]); - can.onmotion.delay(can, function() { can.page.Select(can, ui._target, "div.item.head,div.item.body", function(target) { target.click() }) }) + ], true)]); can.onmotion.delay(can, function() { can.page.Select(can, ui._target, "div.item.head,div.item.body", function(target) { target.click() }) }) } }), + data: shy("网页数据", [mdb.KEY], function(can, msg, arg, cb) { var can = msg._can, root = can.Conf("_target")||can._root + arg[0]? can.page.AppendData(can, can._output, arg[0], arg[0].split(nfs.PT).pop(), can.core.Value(root, arg[0]), function(prefix, value) { can.Option(mdb.KEY, prefix) })._target.click(): + can.page.AppendData(can, can._output, "", root._name, root, function(prefix, value) { can.Option(mdb.KEY, prefix) })._target.click() + can.onappend.style(can, "view") + }), + console: shy("网页终端", { + prompt: function(can, msg, arg, meta) { msg.detail = [] + msg._can.onimport.grow(msg._can, msg, "only", ["\r", + can.base.Time(null, "[%H:%M:%S]"), "can$ "].join("")) + }, + resize: function(can, msg, arg, meta) { msg.detail = [] + meta.prompt(can, msg, arg, meta) + }, + input: function(can, msg, arg, meta) { can = msg._can, msg.detail = [], can._list = can._list||[] + var text = atob(arg[0]); function grow(text) { can.onimport.grow(can, msg, "only", text) } + if (text == "\r") { var cmd = can._list.join("") + if (!cmd) { + grow("\r\n"), can._list = [] + } else { var res = window.eval(cmd) + grow("\r\n"+res+"\r\n"), can._list = [] + } + meta.prompt(can, msg, arg, meta) + } else if (arg[0] == "fw==") { + grow("\u0008 \u0008"), can._list.pop() + } else if (arg[0] == "FQ==") { + grow("\u0008 \u0008".repeat(can._list.length)), can._list = [] + } else { + grow(text), can._list = (can._list||[]).concat(text) + } + }, + }, [ice.CMD], function(can, msg, arg) { msg._can.Option("cmd", "") + msg.Display("/plugin/local/code/xterm.js") + }), runtime: shy("网页环境", [mdb.KEY], function(can, msg, arg) { - msg.Echo(JSON.stringify({ - href: location.href, + msg.Echo(JSON.stringify({href: location.href, version: window._version, height: can.page.height(), width: can.page.width(), userAgent: navigator.userAgent, history: history.length, boot: can.db._boot, - version: window._version, })).Display("/plugin/story/json.js") - }) -}) -})() + }), + dir: shy("网页目录", [nfs.PATH, ice.LIST, ice.BACK], async function(can, msg, arg, cb) { + async function list(key, root) { + msg._can._handle[key] = root + for await (const [name, handle] of root) { + if (can.base.beginWith(name, nfs.PT)) { continue } + if (handle.kind === 'file') { + msg.Push(nfs.PATH, key+name) + } else { + msg.Push(nfs.PATH, key+name+nfs.PS) + } + } + } + msg._can._handle = msg._can._handle||{} + var raw = arg[0]||"" + arg[0] = can.base.trimSuffix(raw, nfs.PS) + var key = arg[0].indexOf(nfs.PS) > -1? arg[0].slice(0, arg[0].lastIndexOf(nfs.PS)): "" + var handle = msg._can._handle[key] + + if (raw == "") { if (!msg._event.isTrusted) { return } + await list("", handle || await window.showDirectoryPicker()) + cb(msg) + } else { + if (can.base.endWith(raw, nfs.PS)) { + await list(key, await handle.getDirectoryHandle(arg[0])) + cb(msg) + } else { + const file = await handle.getFileHandle(arg[0]) + const reader = new FileReader() + reader.onload = () => { msg.Echo(reader.result), cb(msg) } + reader.readAsText(await file.getFile()) + } + } + }), +}) })() diff --git a/panel/search.js b/panel/search.js index 698289ee..6528a9c3 100644 --- a/panel/search.js +++ b/panel/search.js @@ -30,7 +30,7 @@ Volcanos(chat.ONACTION, {_init: function(can) { can.onmotion.hidden(can) }, list return event.ctrlKey? can.onaction.done(event, can): can.ui.input(event, event.target.value) } if (event.ctrlKey) { return event.key == "0"? can.onaction.clear(event, can): can.onkeymap.selectCtrlN(event, can, can.ui.content, [html.TBODY, html.TR], function(target) { target.firstChild.click() }) } event.key.length == 1 && can.onmotion.delayOnce(can, function() { can.onmotion.tableFilter(can, can.ui.content, event.target.value) }, 100, can._delay_filter = can._delay_filter||[]) - }})) + }}), null, null, null, 10) var key = can.misc.Search(can, "_search"); key && can.onmotion.delay(can, function() { can.onaction.onopensearch(can, can.request({}), "*", key) }, 1000) }, onopensearch: function(can, msg, type, word) { can.onimport.select(can, msg, [type||mdb.FOREACH, word||""]) }, diff --git a/plugin/local/code/xterm.js b/plugin/local/code/xterm.js index 4b050342..976630d8 100644 --- a/plugin/local/code/xterm.js +++ b/plugin/local/code/xterm.js @@ -39,7 +39,10 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireModules can.getHeaderTheme() == chat.BLACK? {background: "#061c3c9e", foreground:cli.WHITE, cursor: cli.WHITE}: {background: "#d5cfcf3b", foreground: cli.BLACK, cursor: cli.BLUE} ) }, - _connect: function(can, item, output, tabs, text) { var term = new Terminal({tabStopWidth: 4, cursorBlink: true, theme: can.onimport._theme(can, item)}) + _connect: function(can, item, output, tabs, text) { + var term = new Terminal({ + fontSize: html.CODE_FONT_SIZE, tabStopWidth: 4, cursorBlink: true, theme: can.onimport._theme(can, item), + }) term._item = item, term._output = output, output._term = term, output._tabs || (tabs? (output._tabs = tabs): can.onimport._tabs(can, item, output)) var fitAddon = new FitAddon.FitAddon(); term.loadAddon(fitAddon), term._fit = fitAddon, can.onmotion.delay(can, function() { fitAddon.fit() }) term.onTitleChange(function(title) { can.onexport.title(can, term, title) }), can.onexport.title(can, term, item.name) @@ -85,7 +88,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireModules }), can._output = term._output } }, - grow: function(can, msg, hash, text) { var arg = msg.detail.slice(1); arg = [hash||arg[0], text||arg[1]] + grow: function(can, msg, hash, text) { + var arg = msg.detail.slice(1); arg = [hash||arg[0], text||arg[1]] term = can.db[arg[0]]; arg[1] == "~~~end~~~"? can.onaction.delete(can, term._output): term.write(arg[1]); msg.Option(ice.LOG_DISABLE, ice.TRUE) }, layout: function(can) { function show(target, height, width) { var list = can.page.SelectChild(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT))