From b02f8be174d9266b88a08b6910e458317bbefb38 Mon Sep 17 00:00:00 2001 From: shylinux Date: Tue, 14 Mar 2023 12:08:55 +0800 Subject: [PATCH] opt xterm.js --- frame.js | 21 ++++--- index.css | 18 ++++-- lib/misc.js | 7 ++- lib/page.js | 7 ++- lib/user.js | 25 ++++++-- panel/action.js | 4 +- panel/search.js | 2 +- plugin/local/code/inner.js | 38 ++++++------ plugin/local/code/vimer.js | 1 - plugin/local/code/xterm.js | 120 +++++++++++++++++++++++++++---------- plugin/state.js | 13 ++-- proto.js | 10 ++-- 12 files changed, 176 insertions(+), 90 deletions(-) diff --git a/frame.js b/frame.js index 5260370a..82549f37 100644 --- a/frame.js +++ b/frame.js @@ -146,6 +146,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { msg.RunAction(event, can.core.Value(sub, chat._OUTPUTS_CURRENT), [ctx.ACTION, button]) || msg.RunAction(event, sub, [ctx.ACTION, button]) || sub.runAction(event, button) }) }) }), can.base.isFunc(cb) && cb(sub) + sub.isCmdMode() && meta.index != web.CODE_VIMER && can.page.insertBefore(can, can.user.header(can), sub._output, sub._fields) }); return sub }, _option: function(can, meta, option, skip) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []), opts = can.base.Obj(meta.opts, {}) @@ -155,11 +156,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { list: {name: web.REFRESH, cb: function(event) { can.Update(event) }}, back: {name: "goback", cb: function(event) { can.onimport._back(can) }}, refresh: {name: web.REFRESH, cb: function(event) { can.Update(event) }}, - next: {name: mdb.NEXT}, - prev: {name: mdb.PREV}, - // create: {name: mdb.CREATE}, - // insert: {name: mdb.CREATE}, - play: {name: web.PLAY}, + next: {name: mdb.NEXT}, prev: {name: mdb.PREV}, play: {name: web.PLAY}, + // create: {name: mdb.CREATE}, insert: {name: mdb.CREATE}, "": {name: mdb.DELETE, cb: function(event) { can.onaction.close(event, can) }}, }[item.name||""]; if (!icon) { return } item.style = "icons" can.page.Append(can, option, [{view: [[html.ITEM, html.ICON, icon.name, item.name], html.DIV, can.page.unicode[icon.name]], title: item.name, onclick: icon.cb||function(event) { @@ -167,6 +165,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { msg.RunAction(event, can.core.Value(can, chat._OUTPUTS_CURRENT), cmds) || msg.RunAction(event, can, cmds) || can.Update(event, cmds) }}]) }) + can.core.List(args.slice(can.core.List(meta.inputs, function(item) { if (item.type == mdb.TEXT) { return item } }).length), function(item, index) { meta.inputs.push({type: mdb.TEXT, name: "args"+index, value: item}) }) + function add(item, next) { item = can.base.isString(item)? {type: html.TEXT, name: item}: item, item.type != html.BUTTON && index++ return Volcanos(item.name, {_root: can._root, _follow: can.core.Keys(can._follow, item.name), _target: can.onappend.input(can, item, args[index]||opts[item.name], option||can._option), _option: option||can._option, _action: can._action, _output: can._output, _status: can._status, @@ -179,9 +179,9 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { can.core.ItemCB(sub.onaction, function(key, cb) { sub._target[key] = function(event) { can.misc.Event(event, can, function(msg) { cb(event, sub, sub._target) })} }) can.core.ItemCB(item, function(key, cb) { sub._target[key] = function(event) { can.misc.Event(event, can, function(msg) { cb(event, sub, sub._target) })} }) item.action && can.onappend.figure(sub, item, sub._target, function(_sub, value) { sub._target.value = value, can.Update() }) - skip? next(): can.core.CallFunc([sub.onaction, chat._INIT], {can: sub, meta: item, cb: next, target: sub._target}) + if (skip) { return } item.type == html.BUTTON && item.action == ice.AUTO && can.base.isUndefined(can._delay_init) && (auto = sub._target), next() }) - } can.core.Next(can.core.Value(can, [chat.ONIMPORT, mdb.LIST])||meta.inputs, add) + }; var auto; can.core.Next(can.core.Value(can, [chat.ONIMPORT, mdb.LIST])||meta.inputs, add, function() { auto && auto.click() }) }, _action: function(can, list, action, meta) { meta = meta||can.onaction||{}, action = action||can._action, can.onmotion.clear(can, action) function run(event, button) { can.misc.Event(event, can, function(msg) { var _can = can._fields? can.sup: can @@ -232,6 +232,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { action === false || can.onmotion.clear(can, can._action), sub.onappend._action(sub, can.Conf(ice.MSG_ACTION)||msg.Option(ice.MSG_ACTION), action||can._action) action === false || sub.onappend._status(sub, sub.onexport&&sub.onexport.list||msg.Option(ice.MSG_STATUS)), can.user.isMobile || sub.onappend.tools(sub, msg) can.isCmdMode() && can.onappend.style(can, can.misc.Search(can, ctx.STYLE), can._target) + can.page.style(can, can._output, html.HEIGHT, "", html.WIDTH, "") if (can.isCmdMode()) { can.onimport.size(can, can.page.height(), can.page.width(), true) } can.core.List([chat.FLOAT, chat.FULL, chat.CMD], function(mode) { can.page.ClassList.has(can, can._target, mode) && sub.onlayout[mode](sub) }) can.onmotion.story.auto(can, can._output), can.onexport.output(can, msg), can.base.isFunc(cb) && cb(msg) @@ -657,11 +658,13 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||document.body can.onkeymap._build(can), target.onkeydown = function(event) { can.misc.Event(event, can, function(msg) { if (can.user.isWindows && event.ctrlKey) { can.onkeymap.prevent(event) } - if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } + if (can.page.tagis(event.target, html.SELECT, html.INPUT)) { return } + // if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } can.onengine.signal(can, chat.ONKEYDOWN, can.request(event, {"model": can.user.isWebview && event.metaKey? "webview": "normal"})) }) }, target.onkeyup = function(event) { can.misc.Event(event, can, function(msg) { if (can.user.isWindows && event.ctrlKey) { can.onkeymap.prevent(event) } - if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } + if (can.page.tagis(event.target, html.SELECT, html.INPUT)) { return } + // if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } can.onengine.signal(can, chat.ONKEYUP, can.request(event, {"model": "normal"})) }) } }, diff --git a/index.css b/index.css index e899a663..a1eb2760 100644 --- a/index.css +++ b/index.css @@ -41,7 +41,7 @@ table.content thead { position:sticky; top:2px; } table.content th { background-color:steelblue; padding:2px 5px; } table.content td { padding:2px 5px; } table.content.action th:last-child { position:sticky; right:2px; } -table.content.action td:last-child { background-color:steelblue; max-width:150px; position:sticky; right:2px; } +table.content.action td:last-child { background-color:steelblue; max-width:200px; position:sticky; right:2px; } table.content.full { width:100%; } div.code { background-color:#5066b945; font-size:14px; } div.story[data-type=spark] { background-color:#2169a9a6; color:white; padding:5px 10px; border-left:blue solid 5px; } @@ -90,6 +90,7 @@ fieldset.input.date div.output td span.lunar.fest { color:red; } fieldset.input.date div.status { text-align:center; } /* float */ body div.float { background-color:#061c3ceb; padding:5px; overflow:auto; } +// body div.float { background-color:#061c3ceb; padding:5px; overflow:auto; top:100px; } body>div.toast div.title { color:blue; float:left; } body>div.toast div.duration { color:gray; float:right; } body>div.toast div.content { color:blue; text-align:center; } @@ -123,7 +124,7 @@ legend>span.delete { font-size:1rem; margin-left:5px; margin-right:-15px; visibi select, input { font-size:1rem; height:32px; } textarea { tab-size:2; height:93px; } input::placeholder { font-style:italic; } table.content, div.item, div.code, div.story[data-type=spark] { white-space:pre; text-align:left; } table.content, div.item, div.code, div.story[data-type=spark] { font-family:monospace; } -fieldset>div.action>div.tabs { padding:5px; height:32px; } +fieldset>div.action>div.tabs { font-style:italic; line-height:22px; padding:5px; height:32px; } fieldset>div.status>div.item { padding:5px; height:31px; float:left; } fieldset>div.status>div.item>label { font-size:0.6rem; } /* display */ @@ -142,9 +143,10 @@ fieldset.plug div.output table.content { width:100%; } // fieldset.plugin>div.output>fieldset.story { position:sticky; left:0; } div.output { position:relative; } div.tabs { position:relative; } -div.tabs span.icon { margin-left:5px; visibility:hidden; } +div.tabs span.icon { margin-left:10px; visibility:hidden; } div.tabs span.icon:hover { background-color:aliceblue; color:black; } div.tabs>div:hover span.icon { visibility:visible; } +div.action>div.tabs:hover span.icon { visibility:visible; } div.tabs>div.select span.icon { visibility:visible; } div.code { position:sticky; left:0; } div.plug { font-style:italic; } @@ -282,6 +284,10 @@ body.mobile fieldset.Footer input[name=cmd] { height:3rem; } body.mobile fieldset.input.date div.output td { padding:8px 20px; } body.mobile fieldset.word.float>div.output>div.project { top:38px; } /* misc */ +fieldset.cmd>div.item.time { padding:5px 10px; line-height:22px; float:right; } +fieldset.cmd>div.item.avatar { padding:0; float:right; height:32px; } +fieldset.cmd>div.item.avatar>img { height:32px; } +fieldset.cmd>div.item.usernick { padding:5px 10px; line-height:22px; float:right; } fieldset.panel.Action.cmd>div.toggle.project { display:none; } fieldset.panel.Search div.story[data-type=spark] { margin:0; } fieldset.panel.Search a { color:yellow; } @@ -296,10 +302,10 @@ fieldset.plugin.inner.cmd>div.action { display:none; } fieldset.plugin.inner.cmd>form.option { display:none; } fieldset.plugin.inner.cmd fieldset.xterm>form.option>div.item.text>input { width:320px; } fieldset.plan div.output table.content { height:100%; width:100%; } -fieldset.xterm div.toggle { display:none; } -fieldset.xterm div.output.select { border:blue solid 1px; } -fieldset.xterm.output>div.output { overflow:hidden; } fieldset.xterm div.output { border-left:gray solid 1px; border-top:gray solid 1px; } +fieldset.xterm div.output.select { border:blue solid 1px; } +fieldset.xterm div.action>div.tabs.select { color:blue; } +fieldset.xterm.output>div.output { overflow:hidden; } div.layout.flex>div.output { float:left; clear:none; } fieldset>div.layout { clear:both; } fieldset.draw td.content { position:relative; } diff --git a/lib/misc.js b/lib/misc.js index 9f7c49a7..ea5734ae 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -175,7 +175,9 @@ Volcanos("misc", { }, Info: function() { var args = this._args(log.INFO, arguments); console.info.apply(console, args), this._signal(args) }, Warn: function() { var args = this._args(log.WARN, arguments); console.warn.apply(console, args), this._signal(args); debugger }, - Error: function() { var args = this._args(log.ERROR, arguments); args.push(ice.NL, this._stacks().slice(1).join(ice.NL)), console.error.apply(console, args), this._signal(args); debugger }, + Error: function() { + var args = this._args(log.ERROR, arguments); args.push(ice.NL, this._stacks().slice(1).join(ice.NL)), console.error.apply(console, args), this._signal(args); debugger + }, Debug: function() { var args = this._args(log.DEBUG, arguments); args.push(ice.NL, this._stacks().slice(1, 4).join(ice.NL)), console.debug.apply(console, args), this._signal(args) }, Trace: function() { var output = false for (var i in arguments) { var arg = arguments[i]; if (arg.Conf && arg.Conf("log.trace") == ice.TRUE || arg.Option && arg.Option("log.trace") == ice.TRUE) { output = true } } if (!output) { return } @@ -193,10 +195,11 @@ Volcanos("misc", { for (var i = -depth+1; i < list.length; i++) { var pos = split(i); if (pos.path != current.path) { return pos } } } return split(depth)||{} }, - _stacks: function() { var list = ((new Error()).stack||"").split(ice.NL).slice(2) + _stacks: function(n, s) { var list = ((s||(new Error())).stack||"").split(ice.NL).slice(typeof n == undefined? 2: n) for (var i = 0; i < list.length; i++) { var ls = list[i].trim().split(ice.SP) list[i] = ls.pop().trim(); if (list[i][0] == "(") { list[i] = list[i].slice(1, -1) } list[i] = ice.TB+list[i]; if (ls.length > 1) { list[i] += ice.TB+ls.pop() } + list[i] = list[i].replace(/\?[^:]+/, "").replace(location.origin, "") } return list }, _stack: function() { return ((new Error()).stack||"").split(ice.NL).slice(2) }, _time: function() { var now = new Date() diff --git a/lib/page.js b/lib/page.js index 0d9c7d71..b33ea2e7 100644 --- a/lib/page.js +++ b/lib/page.js @@ -225,9 +225,10 @@ Volcanos("page", { while (list.node.childNodes.length > 0) { var item = list.node.childNodes[0]; item.parentNode.removeChild(item), output.appendChild(item) } return delete(cache[name]), list.data }, - insertBefore: function(can, list, before, parent) { parent = parent||before.parentNode - var target = can.base.isArray(list)? can.page.Append(can, parent, list)._target: list - return before && parent.insertBefore(target, before), target + insertBefore: function(can, target, before, parent) { parent = parent||before.parentNode + if (can.base.isArray(target)) { + return can.core.List(target, function(item) { var target = can.page.Append(can, parent, [item])._target; return parent.insertBefore(target, before), target })[0] + } return before && parent.insertBefore(target, before), target }, styleHeight: function(can, target, value) { return can.page.style(can, target, html.HEIGHT, value), target.offsetHeight }, styleWidth: function(can, target, value) { return can.page.style(can, target, html.WIDTH, value), target.offsetWidth }, diff --git a/lib/user.js b/lib/user.js index fded319e..8fcf6794 100644 --- a/lib/user.js +++ b/lib/user.js @@ -65,7 +65,7 @@ Volcanos("user", { return fmt == "%W"? list: can.base.Time(time, (fmt||"%y-%m-%d %H:%M:%S").replace("%w", list[now.getDay()])) }, toastConfirm: function(can, content, title, action) { - if (!action.list || action.list.length == 0) { action = shy({confirm: action}, ["confirm", "cancel"], function() {}) } + if (!action.list || action.list.length == 0) { action = shy({confirm: action}, ["confirm", web.CANCEL], function() {}) } var carte = can.user.toast(can, {content: content, title: title, action: action||[cli.CLOSE], duration: -1}) can.page.style(can, carte._target, html.TOP, 200, html.BOTTOM, ""); return carte }, @@ -153,7 +153,7 @@ Volcanos("user", { })}]}, html.ACTION, ]}]) var action = can.onappend._action(can, button||[html.SUBMIT, html.CANCEL], ui.action, { - _trans: {submit: msg.Option("submit")}, + _trans: {submit: msg.Option(web.SUBMIT)}, focus: function() { can.onmotion.focus(can, can.page.Select(can, ui._target, html.INPUT_ARGS)[0]) }, cancel: function() { can.page.Remove(can, ui._target) }, submit: function(event, can, button) { var args = [], data = {}, err = false @@ -196,7 +196,7 @@ Volcanos("user", { }, toimage: function(can, name, target, silent) { var toast = can.user.toastProcess(can, "生成中...") can.require(["https://cdn.jsdelivr.net/npm/html2canvas@1.0.0-rc.5/dist/html2canvas.min.js"], function() { toast.close() - html2canvas(target||can._target).then(function (canvas) { var url = canvas.toDataURL("image/png") + html2canvas(target||can._target).then(function (canvas) { var url = canvas.toDataURL(web.IMAGE_PNG) silent? (can.user.download(can, url, name, nfs.PNG), can.user.toastSuccess(can)): can.user.toastImage(can, name, url) }) }) @@ -217,8 +217,7 @@ Volcanos("user", { ]} } var ui = can.onappend.tabview(can, { "扫码授权": function(target) { can.misc.WSS(can, {type: aaa.LOGIN, name: "", "sess.theme": can.getHeaderTheme()}, function(cmd, arg) { - var _cmd = " space login "+arg[0] - if (cmd == cli.PWD) { return can.page.Modify(can, target, arg[2]), can.page.Append(can, target, [ + if (cmd == cli.PWD) { var _cmd = " space login "+arg[0]; return can.page.Modify(can, target, arg[2]), can.page.Append(can, target, [ {text: "
请授权: "+_cmd, title: "点击复制,并后台执行此命令,即可登录", style: {cursor: "copy"}, onclick: function() { can.user.copy(event, can, _cmd) }}, ]), can.onmotion.delay(can, function() { layout() }, 10) } if (cmd == ice.MSG_SESSID) { return can.misc.CookieSessid(can, arg[0]), can.page.Remove(can, ui._target), can.base.isFunc(cb) && cb() } @@ -234,7 +233,21 @@ Volcanos("user", { }, can.base.Obj(method, can.user.isMobile? ["密码登录"]: ["扫码授权"]), can.page.Append(can, document.body, [{view: "input login float"}])._target) can.onmotion.delay(can, function() { layout() }) }, - logout: function(can) { can.user.toastConfirm(can, "logout", "", function() { can.runAction({}, aaa.LOGOUT, [], function(msg) { + logout: function(can) { can.user.toastConfirm(can, aaa.LOGOUT, "", function() { can.runAction({}, aaa.LOGOUT, [], function(msg) { can.misc.Search(can, chat.SHARE)? can.misc.Search(can, chat.SHARE, ""): can.user.reload(true) }) }) }, + header: function(can) { var header = can._root.Header + var meta = { + time: {view: [[html.ITEM, mdb.TIME]], _init: function(target) { + can.core.Timer({interval: 100}, function() { can.page.Modify(can, target, can.user.time(can, null, "%H:%M:%S %w")) }) + can.onappend.figure(can, {action: "date", _hold: true}, target, function(sub, value) {}) + }}, + avatar: {view: [[html.ITEM, aaa.AVATAR]], list: [{img: can.user.info.avatar}], onclick: function(event) { + header && header.onaction.avatar(event, header) + }}, + usernick: {view: [[html.ITEM, aaa.USERNICK], "", can.user.info.usernick], onclick: function(event) { + header && header.onaction.usernick(event, header) + }}, + }; return can.core.List(can.base.getValid(can.core.List(arguments).slice(1), [mdb.TIME, aaa.AVATAR, aaa.USERNICK]), function(item) { return meta[item] }) + } }) diff --git a/panel/action.js b/panel/action.js index 889ef1c8..8d79795f 100644 --- a/panel/action.js +++ b/panel/action.js @@ -59,7 +59,9 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { if (arg[0] == mdb.PLUGIN) { can.onexport.plugin(can, msg, arg, fields) } if (arg[0] == ctx.COMMAND) { can.onexport.command(can, msg, arg, fields) } }, - onkeydown: function(can, msg, model) { if (can.isCmdMode() && !msg._event.metaKey) { return } + onkeydown: function(can, msg, model) { if (can.isCmdMode() && !msg._event.metaKey) { + var sub = can.core.Value(can._plugins[0], chat._OUTPUTS_CURRENT); sub && can.core.CallFunc([sub, "onaction.onkeydown"], {event: msg._event, can: sub}); return + } if (can.onkeymap.selectCtrlN(msg._event, can, can._action, html.DIV_ITEM)) { return } can._keylist = can.onkeymap._parse(msg._event, can, model, can._keylist||[], can._output) }, diff --git a/panel/search.js b/panel/search.js index cb1bbc9f..02a659a7 100644 --- a/panel/search.js +++ b/panel/search.js @@ -8,7 +8,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can, can _size: function(can) { can.getActionSize(function(left, top, width, height) { can.page.style(can, can._target, {left: left||0, top: top||0, width: width}), can.page.style(can, can._output, html.MAX_HEIGHT, height -= 2*html.PLUGIN_MARGIN+html.ACTION_HEIGHT+can.onexport.statusHeight(can)) can.core.List([can.ui.content, can.ui.display], function(target) { can.page.style(can, target, html.MAX_WIDTH, can.ConfWidth(width-2*html.PLUGIN_MARGIN)) }) - can.ConfHeight(can.base.Min(height-can.ui.content.offsetHeight-can.ui.display.offsetHeight+can.onexport.statusHeight(can)-1, 320)) + can.ConfHeight(can.base.Min(height-can.ui.content.offsetHeight-can.ui.display.offsetHeight+can.onexport.statusHeight(can)-1, height/2)) }) }, _input: function(can, msg, arg, fields) { if (can.base.contains(arg[1], ";")) { arg = can.core.Split(arg[1], "\t ;", "\t ;") } can.run(can.request({}, {fields: fields.join(ice.FS)}, msg), arg, function(res) { can.db.type = arg[0] diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index f841687d..53e7fb8c 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -37,10 +37,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl can.onimport._tabview(can, args[args.length-3]||can.Option(nfs.PATH), args[args.length-2]||can.Option(nfs.FILE), args[args.length-1]) } }), can.base.isFunc(cb) && cb(msg) }, - _keydown: function(can) { can.onkeymap._build(can), can._root.onengine.listen(can, chat.ONKEYDOWN, function(event) { - if (can.onkeymap.selectCtrlN(event, can, can.ui.tabs, html.DIV_TABS)) { return } - can.db._key_list = can.onkeymap._parse(event, can, mdb.PLUGIN, can.db._key_list, can.ui.content) - }) }, + _keydown: function(can) { can.onkeymap._build(can) }, _tabs: function(can) { if (!can.isCmdMode()) { return can.ui.tabs = can._action } can.user.isMobile || can.core.List([ {name: can.page.unicode.menu, onclick: function() { @@ -60,12 +57,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl }) }}, ], function(item) { can.page.Append(can, can.ui.tabs, [can.base.Copy(item, {view: [[html.ICON, web.WEBSITE], html.DIV, item.name]})]) }) - can.user.isMobile || can.page.Append(can, can.ui.tabs, [{view: mdb.TIME, _init: function(target) { - can.core.Timer({interval: 100}, function() { can.page.Modify(can, target, can.user.time(can, null, "%H:%M:%S %w")) }) - can.onappend.figure(can, {action: "date", _hold: true}, target, function(sub, value) {}) - }}]) - can.page.Append(can, can.ui.tabs, [{view: aaa.AVATAR, list: [{img: can.user.info.avatar}], onclick: function(event) { can._root.Header.onaction.avatar(event, can._root.Header) }}]) - can.page.Append(can, can.ui.tabs, [{view: [aaa.USERNICK, "", can.user.info.usernick], onclick: function(event) { can._root.Header.onaction.usernick(event, can._root.Header) }}]) + can.page.Append(can, can.ui.tabs, can.user.header(can)) }, __tabPath: function(can, skip) { can.onmotion.clear(can, can.ui.path) can.onimport._tabPath(can, ice.PS, nfs.PATH, can.base.Path(can.Option(nfs.PATH), can.Option(nfs.FILE)), function(ls) { @@ -531,6 +523,10 @@ Volcanos(chat.ONACTION, {list: ["调试", "首页", "官网", "源码", "百度" }, close: function() { can.page.Remove(can, ui._target) }, }); var from, to }, + onkeydown: function(event, can) { + if (can.onkeymap.selectCtrlN(event, can, can.ui.tabs, html.DIV_TABS)) { return } + can.db._key_list = can.onkeymap._parse(event, can, mdb.PLUGIN, can.db._key_list, can.ui.content) + }, }) Volcanos(chat.ONEXPORT, {list: [mdb.COUNT, mdb.TYPE, nfs.FILE, nfs.LINE, ice.BACK], size: function(can, size, full) { if (size > 1) { return size } if (size > 0) { return size*full } }, @@ -556,39 +552,43 @@ Volcanos(chat.ONEXPORT, {list: [mdb.COUNT, mdb.TYPE, nfs.FILE, nfs.LINE, ice.BAC } } } var package = "", block = "", current = can.Option(nfs.LINE), percent = " = "+parseInt(can.Option(nfs.LINE)*100/(can.db.max||1))+"%" can.page.Select(can, can.ui.content, "tr.line>td.text", function(item, index) { var text = item.innerText, _indent = indent(text) - function push(item) { list.push(item); if (index < can.Option(nfs.LINE)) { current = list[list.length-1], percent = " = "+parseInt((index+1)*100/(can.db.max||1))+"%" } } - if (can.db.parse == nfs.JS) { var ls = can.core.Split(text, "\t (,", ice.DF) + function push(item) { list.push(item+(item? ice.DF+(index+1): "")); if (index < can.Option(nfs.LINE)) { current = list[list.length-1], percent = " = "+parseInt((index+1)*100/(can.db.max||1))+"%" } } + if (can.db.parse == nfs.CSS) { + if (text.indexOf("/* ") == 0) { + push(can.base.trimPrefix(can.base.trimSuffix(text, " */"), "/* ")) + } + } else if (can.db.parse == nfs.JS) { var ls = can.core.Split(text, "\t (,", ice.DF) if (_indent == 0 && can.base.beginWith(text, "Volcanos")) { var _block = can.base.trimPrefix(ls[1], "chat.").toLowerCase() if (_block != block) { push("") } block = _block - if (text.indexOf(chat._INIT) > -1) { push(block+ice.PT+chat._INIT+ice.DF+(index+1)) } + if (text.indexOf(chat._INIT) > -1) { push(block+ice.PT+chat._INIT) } } else if (_indent == 0 && can.base.beginWith(text, "var ")) { block = ls[1] } else if (_indent == 4 && ls[1] == ice.DF) { - ls[0] && push(block+ice.PT+ls[0]+ice.DF+(index+1)) + ls[0] && push(block+ice.PT+ls[0]) } } else if (can.db.parse == nfs.SH) { if (can.base.endWith(text, "() {")) { var ls = can.core.Split(text, "\t (){") - push(ls[0]+ice.DF+(index+1)) + push(ls[0]) } } else if (can.db.parse == nfs.GO) { var ls = can.core.Split(text, "\t *", "({:})") if (_indent == 0) { switch (ls[0]) { case "package": package = ls[1]; break case "func": if (ls[1] == "(") { ls[1] = ls[2]+ice.PT+ls[5] - if (ls[5].toLowerCase()[0] == ls[5][0]) { push("- "+ls[1]+ice.DF+(index+1)) } else { push("+ "+ls[1]+ice.DF+(index+1)) } break + if (ls[5].toLowerCase()[0] == ls[5][0]) { push("- "+ls[1]) } else { push("+ "+ls[1]) } break } case "type": case "var": - if (ls[1].toLowerCase()[0] == ls[1][0]) { push("- "+ls[1]+ice.DF+(index+1)) } else { push("+ "+package+ice.PT+ls[1]+ice.DF+(index+1)) } break + if (ls[1].toLowerCase()[0] == ls[1][0]) { push("- "+ls[1]) } else { push("+ "+package+ice.PT+ls[1]) } break } } else if (_indent == 4) { if (text.indexOf("MergeCommands(") > -1) { block = "cmds" } else if (text == "})") { block = "" } } else if (_indent == 8) { - if (block == "cmds" && ls[1] == ice.DF) { push("+ "+package+ice.PT+ls[0]+ice.DF+(index+1)), block = package+ice.PT+ls[0] } + if (block == "cmds" && ls[1] == ice.DF) { push("+ "+package+ice.PT+ls[0]), block = package+ice.PT+ls[0] } } else if (_indent == 12) { - if (block && ls[1] == ice.DF) { push("+ "+block+ice.SP+ls[0]+ice.DF+(index+1)) } + if (block && ls[1] == ice.DF) { push("+ "+block+ice.SP+ls[0]) } } } }); return {list: list, current: current, percent: percent} diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index e4d3f03e..0e741561 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -233,7 +233,6 @@ Volcanos(chat.ONKEYMAP, { g: shy("查找搜索", function(event, can) { can.onaction.find(event, can) }), }, normal: { - f: shy("打开文件", function(event, can) { can.onaction.open(event, can) }), s: shy("保存文件", function(event, can) { can.onaction.save(event, can, nfs.SAVE) }), c: shy("编译项目", function(event, can) { can.onaction.compile(event, can, code.COMPILE) }), diff --git a/plugin/local/code/xterm.js b/plugin/local/code/xterm.js index e6d6005b..6e689f4f 100644 --- a/plugin/local/code/xterm.js +++ b/plugin/local/code/xterm.js @@ -1,14 +1,18 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireModules(can, ["xterm/css/xterm.css", "xterm", "xterm-addon-fit", "xterm-addon-web-links"], function() { - var item = msg.TableDetail(); item.hash = item.hash||can.Option(mdb.HASH), can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg), can.onappend._status(can) + var item = msg.TableDetail(); item.hash = item.hash||can.Option(mdb.HASH), can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg), can.onappend._status(can), can.onkeymap._build(can) if (item.type == html.LAYOUT) { can.onimport._layout(can, item) } else { can.onimport._connect(can, item, can._output) } can.onimport.layout(can) - can.sup.onexport.link = function() { return can.misc.MergePodCmd(can, {cmd: web.CODE_XTERM, hash: item.hash, style: html.OUTPUT}) } + can.sup.onexport.link = function() { return can.misc.MergePodCmd(can, {pod: can.Conf(ice.POD), cmd: web.CODE_XTERM, hash: item.hash, style: html.OUTPUT}) } }) }, _layout: function(can, item) { + function connect(item, output, tabs) { can.run(can.request({}, item), [item.hash], function(msg) { + can.core.Item(msg.TableDetail(), function(key, value) { item[key] = value }) + can.onappend._status(can), can.onimport._connect(can, item, output, tabs) + }, true); return output } function show(list, target, root, tabs) { root = root||target, can.core.List(list, function(item) { if (item.type.indexOf(html.LAYOUT) == 0) { show(item.list, can.page.Append(can, target, [item.type])._target, root, tabs)._root = root } else { - can.onimport._connect(can, item, can.page.Append(can, target, [html.OUTPUT])._target, tabs)._output._root = root + connect(item, can.page.Append(can, target, [html.OUTPUT])._target, tabs)._root = root } }); return target } var main, output = can._output; can.core.List(can.base.Obj(item.text), function(item) { @@ -16,77 +20,129 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireModules var target = show(item.list, can.page.insertBefore(can, [item.type], can._status), null, tabs); target._tabs = tabs, tabs._output = target if (item.type.indexOf(html.HIDE) == -1) { main = target } } else { - main = main||can.onimport._connect(can, item, output||can.page.insertBefore(can, [html.OUTPUT], can._status))._output, output = null + var target = connect(item, output||can.page.insertBefore(can, [html.OUTPUT], can._status)); output = null + main = main||target } }), can.onaction.select(can, main) }, _tabs: function(can, item, output) { if (output != output._root && output._root) { return output._tabs = output._root._tabs } - var tabs = can.page.Append(can, can._action, [{view: [html.TABS, "", item.name||item.type||item.hash], onclick: function() { - can.onaction.select(can, tabs._output) - }}])._target; return tabs._output = output, output._tabs = tabs + var tabs = can.onimport.tabs(can, [{name: item.name||item.type||item.hash}], function() { + can.onmotion.delay(can, function() { var output = tabs._output; can.onaction.select(can, output._root||output) }) + }, function() { can.onaction.delete(can, tabs._output) }); return tabs._output = output, output._tabs = tabs }, _theme: function(can, item) { return can.base.Obj(item.theme)||(can.getHeaderTheme() == html.LIGHT? {background: cli.WHITE, 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)}) + 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, title) }), can.onexport.title(can, item.name) + term.onTitleChange(function(title) { can.onexport.title(can, term, title) }), can.onexport.title(can, term, item.name) term.onResize(function(size) { can.onimport._resize(can, term, size) }) term.onData(function(data) { can.onimport._input(can, term, data) }) term.onCursorMove(function() { can.onexport.term(can, term) }) term.loadAddon(new WebLinksAddon.WebLinksAddon()) - term._item = item, term._output = output, output._term = term, output._tabs || (tabs? (output._tabs = tabs): can.onimport._tabs(can, item, output)) - term.open(output), term.focus(), text && term.write(text.replaceAll(ice.NL, "\r\n")) + can.onmotion.clear(can, output), term.open(output), term.focus(), text && can.onmotion.delay(can, function() { term.write(text.replaceAll(ice.NL, "\r\n")) }) can.onengine.listen(can, chat.ONTHEMECHANGE, function() { can = can.core.Value(can.sup, chat._OUTPUTS_CURRENT) term.selectAll(), can.onimport._connect(can, item, output, tabs, can.base.trimSuffix(term.getSelection(), ice.NL)) }), can.page.style(can, output, html.BACKGROUND_COLOR, term._publicOptions.theme.background||cli.BLACK) - output.onclick = function() { can.onmotion.select(can, can._fields, html.DIV_OUTPUT, can._output = output), can.onexport.term(can, term) } - return can.db = can.db||{}, can.db[item.hash] = term + output.onclick = function() { output._tabs._current = output + can.onmotion.select(can, can._fields, html.DIV_OUTPUT, can._output = output), term.focus(), can.onexport.term(can, term) + }; return can.db = can.db||{}, can.db[item.hash] = term }, _resize: function(can, term, size) { can.runAction(can.request({}, size, term._item), web.RESIZE, [], function() { can.onexport.term(can, term) }) }, - _input: function(can, term, data) { can._output = term._output, can.runAction(can.request({}, term._item), web.INPUT, [btoa(data)], function() {}) }, + _input: function(can, term, data) { + if (data == "\u0013") { can._delay = true + can.onmotion.delay(can, function() { can._delay && can.runAction(can.request({}, term._item), web.INPUT, [btoa(data)], function() {}) }) + } else { + if (can._delay) { can._delay = false; var msg = can.request({}, {_handle: ice.TRUE}, term._item) + can._keylist = can.onkeymap._parse({key: data, _msg: msg}, can, mdb.NORMAL, can._keylist||[], term); return + } can._output = term._output, can.runAction(can.request({}, term._item), web.INPUT, [btoa(data)], function() {}) + } + }, grow: function(can, msg) { var arg = msg.detail.slice(1), term = can.db[arg[0]]; arg[1] == "~~~end~~~"? can.onaction.delete(can, term._output): term.write(arg[1]) }, layout: function(can) { function show(target, height, width) { var list = can.page.SelectChild(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT)) var h = height/list.length, w = width; if (can.page.ClassList.has(can, target, html.FLEX)) { h = height, w = width/list.length } if (target == can._fields) { h = height, w = width } can.core.List(list, function(target) { can.page.style(can, target, html.HEIGHT, h, html.WIDTH, w), can.page.ClassList.has(can, target, html.LAYOUT)? show(target, h, w): target._term && target._term._fit.fit() }) } show(can._fields, can.ConfHeight(), can.ConfWidth()) }, }) -Volcanos(chat.ONACTION, {list: ["+", "-", "/", "sess"], - "+": function(event, can) { can.Update(event, [ctx.ACTION, mdb.CREATE], function(msg) { can.Update(event, [msg.Result()], function(msg) { +Volcanos(chat.ONKEYMAP, { + _mode: { + normal: { + u: function(event, can) { can.onaction.split(event, can, html.FLOW) }, + v: function(event, can) { can.onaction.split(event, can, html.FLEX) }, + j: function(event, can) { can.onaction.selectSibling(can, html.FLOW) }, + k: function(event, can) { can.onaction.selectSibling(can, html.FLOW, true) }, + h: function(event, can) { can.onaction.selectSibling(can, html.FLEX, true) }, + l: function(event, can) { can.onaction.selectSibling(can, html.FLEX) }, + c: function(event, can) { can.onaction.tabnew(event, can) }, + e: function(event, can) { can.user.input({target: can._output._tabs}, can, [mdb.NAME], function(list) { can.onexport.title(can, can._output._term, list[0]) }) }, + n: function(event, can) { can._output._tabs.nextSibling && can._output._tabs.nextSibling.click() }, + p: function(event, can) { can._output._tabs.previousSibling && can._output._tabs.previousSibling.click() }, + s: function(event, can) { can.onaction.sess(event, can) }, + t: function(event, can) { can.user.input({target: can._output._tabs}, can, [ctx.INDEX, ctx.ARGS], function(list, data) { can.onimport.tool(can, [data], function(sub) { + sub.select(), sub.onexport.record = function(_, value) { can.onimport._input(can, can._output._term, value+ice.NL) } + }, can._fields) }) }, + f: function(event, can) { + var input = can.user.input({target: can._output._tabs}, can, [{type: mdb.TEXT, name: mdb.NAME, select: function(item) { + input.submit(event, can, "submit") + }, run: function(event, cmds, cb) { var msg = can.request(event) + can.page.Select(can, can._action, [html.DIV_TABS, html.SPAN_NAME], function(target) { msg.Push(mdb.NAME, target.innerText) }) + cb(msg) + }}], function(list) { + + }) + }, + }, + }, _engine: {}, +}) +Volcanos(chat.ONACTION, { + tabnew: function(event, can) { can.Update(event, [ctx.ACTION, mdb.CREATE], function(msg) { can.Update(event, [msg.Result()], function(msg) { can.onaction.select(can, can._output = can.page.insertBefore(can, [html.OUTPUT], can._status)), can.onimport._init(can, msg) }) }) }, - "-": function(event, can) { can.onaction.split(event, can, html.FLOW) }, - "/": function(event, can) { can.onaction.split(event, can, html.FLEX) }, split: function(event, can, button) { can.Update(event, [ctx.ACTION, mdb.CREATE], function(msg) { can.Update(event, [msg.Result()], function(msg) { if (can.page.ClassList.has(can, can._output.parentNode, button)) { var layout = can._output.parentNode } else { var layout = can.page.insertBefore(can, [{view: [[html.LAYOUT, button]]}], can._output); layout.appendChild(can._output) - } - var root = can._output._root||layout, tabs = can._output._tabs; tabs._output = root, root._tabs = tabs + } var root = can._output._root||layout, tabs = can._output._tabs; tabs._output = root, root._tabs = tabs can._output._root = root, can._output = can.page.insertBefore(can, [html.OUTPUT], can._output.nextSibling, layout) - can._output._root = root, can._output._tabs = tabs, can.onimport._init(can, msg) + can._output._root = root, can._output._tabs = tabs, can.onimport._init(can, msg), can.onmotion.delay(can, function() { can._output.click() }) }) }) }, delete: function(can, output) { - if (output == can.sup._output) { - can.onmotion.clear(can, output) - } else { - while (output && output.parentNode.children.length == 1) { output = output.parendNode } + if (output == can.sup._output) { can.onmotion.clear(can, output) } else { + while (output && output.parentNode.children.length == 1) { output = output.parentNode } + var next = output.parentNode; can.onmotion.delay(can, function() { can.page.Select(can, next, html.DIV_OUTPUT, function(target) { target.click() }) }) can.page.Remove(can, output) } can.onimport.layout(can) }, select: function(can, output) { can.page.SelectChild(can, can._fields, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT), function(target) { can.onmotion.hidden(can, target, target == output || target == output._root) - can.onmotion.delay(can, function() { can.page.Select(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT), function(target) { target._term && target._term._fit.fit() }) }) + can.onmotion.delay(can, function() { + output._tabs._current? output._tabs._current.click(): (target.click(), can.page.SelectOne(can, target, html.DIV_OUTPUT, function(target) { target.click() })) + can.page.Select(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT), function(target) { target._term && target._term._fit.fit() }) + }) }) }, - sess: function(can) { can.runAction({}, mdb.CREATE, [mdb.TYPE, html.LAYOUT, mdb.TEXT, can.base.Format(can.onexport.sess(can))], function() {}, true) }, + selectSibling: function(can, layout, prev) { var key = prev? "previousSibling": "nextSibling" + var output = can._output; while ((!output[key] || !can.page.ClassList.has(can, output.parentNode, layout)) && output != can._fields) { output = output.parentNode } + if (can.page.ClassList.has(can, output.parentNode, layout) && output[key]) { + can.page.SelectOne(can, output[key], html.DIV_OUTPUT, function(target) { target.click() })||output[key].click() + } + }, + sess: function(event, can) { can.user.input(event, can, [mdb.NAME], function(list) { + can.runAction({}, mdb.CREATE, [mdb.TYPE, html.LAYOUT, mdb.NAME, list[0], mdb.TEXT, can.base.Format(can.onexport.sess(can))], function(msg) { + can.user.toastSuccess(can, can.user.trans(can, nfs.SAVE)+ice.SP+msg.Result()) + }, true) + }) }, + onkeydown: function(event, can) { + if (can.onkeymap.selectCtrlN(event, can, can._action, html.DIV_TABS)) { return } + can._keylist = can.onkeymap._parse(event, can, mdb.NORMAL, can._keylist||[], can._output._term) + }, }) Volcanos(chat.ONEXPORT, {list: [mdb.TIME, mdb.HASH, mdb.TYPE, mdb.NAME, "rows", "cols", "cursorY", "cursorX"], term: function(can, term) { item = term._item can.core.List(can.onexport.list, function(key) { can.Status(key, can.base.getValid(item[key], term[key], term.buffer.active[key], "")+"") }) - can.core.List([mdb.HASH, mdb.TYPE, mdb.NAME], function(key) { can.Status(key, item[key]||"") }) + can.core.List([mdb.TIME, mdb.HASH, mdb.TYPE, mdb.NAME], function(key) { can.Status(key, item[key]||"") }) }, sess: function(can) { return can.page.Select(can, can._action, html.DIV_TABS, function(target) { function show(target) { + var name = can.page.SelectOne(can, target._tabs, html.SPAN_NAME).innerText if (can.page.ClassList.has(can, target, html.LAYOUT)) { - return {type: target.className, name: target._tabs? target._tabs.innerText: "", list: can.page.SelectChild(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT), function(target) { return show(target) })} - } else { - var item = target._term._item; return {type: item.type, name: target._tabs.innerText, text: item.text, hash: item.hash} - } + return {type: target.className, name: name, list: can.page.SelectChild(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT), function(target) { return show(target) })} + } else { var item = target._term._item; return {type: item.type, name: name, text: item.text, hash: item.hash} } } return show(target._output) }) }, - title: function(can, title) { can.page.Modify(can, can._output._tabs, title), can.Status(mdb.NAME, title), can.sup.onexport.title(can.sup, title) }, + title: function(can, term, title) { can.page.Modify(can, can.page.SelectOne(can, term._output._tabs, html.SPAN_NAME), title), can.Status(mdb.NAME, title), can.sup.onexport.title(can.sup, title) }, }) diff --git a/plugin/state.js b/plugin/state.js index a096b8ba..d0d682c9 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -12,14 +12,15 @@ Volcanos(chat.ONIMPORT, { _clear: function(can, msg) { can.onmotion.clear(can) }, _inner: function(can, msg) { can.onappend.table(can, msg), can.onappend.board(can, msg), can.onmotion.story.auto(can) }, _field: function(can, msg) { - var opts = {}; can.page.SelectArgs(can, can._option, "", function(target) { var value = msg.Option(target.name); target.name && value && (opts[target.name] = value) }) - var height = can.ConfHeight(); can.page.Select(can, can._output, html.TABLE, function(target) { height -= target.offsetHeight }) - msg.Table(function(item) { can.onappend._plugin(can, item, {index: item.index, args: can.base.Obj(item.args||item.arg, []), height: can.base.Min(height, 200)}, function(sub, meta) { + var opts = {pod: msg.Option(ice.POD)}; can.page.SelectArgs(can, can._option, "", function(target) { var value = msg.Option(target.name); target.name && value && (opts[target.name] = value) }) + var height = can.ConfHeight(); can.page.SelectChild(can, can._output, html.TABLE, function(target) { height -= target.offsetHeight }) + msg.Table(function(item) { can.onappend._plugin(can, item, {pod: msg.Option(ice.POD), index: item.index, args: can.base.Obj(item.args||item.arg, []), height: can.base.Min(height, 200)}, function(sub, meta) { sub.Conf(can.base.Obj(item.conf)); if (sub.isSimpleMode()) { (function() { sub.ConfHeight(can.ConfHeight()/2) var msg = can.request(); msg.Echo(sub.Conf(ice.MSG_RESULT)), can.onappend._output(sub, msg, sub.Conf(ctx.DISPLAY)) - })(); return } var opt = can.base.Obj(item[ice.OPT], []); sub.ConfWidth(can.ConfWidth()), can.page.style(can, sub._output, html.MAX_WIDTH, can.ConfWidth()) + })(); return }; var opt = can.base.Obj(item[ice.OPT], []) sub.run = function(event, cmds, cb) { var res = can.request(event, can.Option(), opts); for (var i = 0; i < opt.length; i += 2) { res.Option(opt[i], opt[i+1]) } can.run(event, (msg.Option("_index") == can._index? msg[ice.MSG_PREFIX]||[]: [ice.RUN, msg.Option("_index")]).concat(cmds), cb, true) + sub.onimport.size(sub, height, can.ConfWidth(), true) } }) }) }, @@ -187,11 +188,11 @@ Volcanos(chat.ONEXPORT, { output: function(can, msg) {}, action: function(can, button, line) {}, record: function(can, value, key, line) {}, - actionHeight: function(can) { return can.page.ClassList.has(can, can._target, "output")? 0: html.ACTION_HEIGHT }, + actionHeight: function(can) { return can.page.ClassList.has(can, can._target, html.OUTPUT)? 0: html.ACTION_HEIGHT }, statusHeight: function(can) { return !can.page.isDisplay(can._status) || can._status.innerHTML == "" || (can._target.offsetHeight > 0 && can._status.offsetHeight == 0)? 0: html.ACTION_HEIGHT }, title: function(can, title) { can.isCmdMode() && can.user.title(title) }, link: function(can) { var meta = can.Conf(), args = can.Option(); can.misc.Search(can, log.DEBUG) == ice.TRUE && (args[log.DEBUG] = ice.TRUE) - args.cmd = meta.index||can.core.Keys(meta.ctx, meta.cmd), args.cmd == web.WIKI_WORD && (args.cmd = args.path) + args.pod = meta.pod, args.cmd = meta.index||can.core.Keys(meta.ctx, meta.cmd), args.cmd == web.WIKI_WORD && (args.cmd = args.path) return can.misc.MergePodCmd(can, args, true) }, }) diff --git a/proto.js b/proto.js index af6bdb3f..2014a953 100644 --- a/proto.js +++ b/proto.js @@ -72,14 +72,13 @@ var mdb = { } var web = {CHAT: "chat", SHARE: "share", SPACE: "space", DREAM: "dream", - WEBSITE: "website", DRAW: "draw", PLAY: "play", CLEAR: "clear", REFRESH: "refresh", RESIZE: "resize", FILTER: "filter", + WEBSITE: "website", DRAW: "draw", PLAY: "play", CLEAR: "clear", REFRESH: "refresh", RESIZE: "resize", FILTER: "filter", INPUT: "input", CANCEL: "cancel", SUBMIT: "submit", UPLOAD: "upload", DOWNLOAD: "download", TOIMAGE: "toimage", SHARE_CACHE: "/share/cache/", SHARE_LOCAL: "/share/local/", GET: "GET", PUT: "PUT", POST: "POST", DELETE: "DELETE", Accept: "Accept", ContentType: "Content-Type", ContentJSON: "application/json", ContentFORM: "application/x-www-form-urlencoded", - VIDEO_WEBM: "video/webm", - INPUT: "input", + IMAGE_PNG: "image/png", VIDEO_WEBM: "video/webm", CODE_GIT_STATUS: "web.code.git.status", CODE_XTERM: "web.code.xterm", @@ -237,6 +236,7 @@ var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 32, ACTION_MARGIN: 200, DIV_CONTENT: "div.content", TABLE_CONTENT: "table.content", TABLE_LAYOUT: "table.layout", DIV_TOGGLE: "div.toggle", DIV_LAYOUT_HEAD: "div.layout.head", DIV_LAYOUT_FOOT: "div.layout.foot", DIV_LAYOUT_LEFT: "div.layout.left", DIV_FLOAT: "div.float", DIV_TOAST: "div.toast", DIV_CARTE: "div.carte", + SPAN_NAME: "span.name", DIV_LAYOUT: "div.layout", DIV_EXPAND: "div.expand", } @@ -366,7 +366,9 @@ try { if (typeof(window) == lang.OBJECT) { var meta = Volcanos.meta case nfs.JS: var item = document.createElement(nfs.SCRIPT); item.src = url+v, item.onerror = cb, item.onload = cb, document.body.appendChild(item); break } } window.onerror = function(message, source, lineno, colno, error) { window._version && alert([[source, lineno, colno].join(ice.DF), message].join(ice.NL)) } - meta._init = function(can) { window.onerror = function(message, source, lineno, colno, error) { can.misc.Error(message, source, lineno, colno, error) } + meta._init = function(can) { window.onerror = function(message, source, lineno, colno, error) { + meta.version? alert([message].concat(can.misc._stacks(0, error)).join(ice.NL)): can.misc.Error(message, ice.NL+[source, lineno, colno].join(ice.DF), error) + } var last = can.page.width() < can.page.height(); window.onresize = function(event) { can.misc.Event(event, can, function(msg) { if (can.user.isMobile && last === can.page.width() < can.page.height()) { return } last = can.page.width() < can.page.height() can.onmotion.delayOnce(can, function() { can.onengine.signal(can, chat.ONRESIZE, can.request(event, kit.Dict(html.HEIGHT, window.innerHeight, html.WIDTH, window.innerWidth))) }, 100, can._delay_resize = can._delay_resize||[])