diff --git a/frame.js b/frame.js index 04ef2ea1..e798609f 100644 --- a/frame.js +++ b/frame.js @@ -1,16 +1,15 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { can.require([can.volcano], null, function(can, key, sub) { can[key] = sub }) if (!can.user.isMailMaster) { if (can.misc.Search(can, ice.MSG_SESSID)) { can.misc.CookieSessid(can, can.misc.Search(can, ice.MSG_SESSID)); return can.misc.Search(can, ice.MSG_SESSID, "") } } - can.user.title(can.misc.SearchOrConf(can, chat.TITLE)||can.misc.Search(can, ice.POD)||location.host) can.run = function(event, cmds, cb) { var msg = can.request(event); cmds = cmds||[]; return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, can, cmds, cb) } + can.user.title(can.misc.SearchOrConf(can, chat.TITLE)||can.misc.Search(can, ice.POD)||location.host) can.core.Next(list, function(item, next) { item.type = chat.PANEL - can.onappend._init(can, can.base.Copy(item, can.core.Value(can, [chat.RIVER, item.name])), item.list, function(sub) { can[item.name] = sub + can.onappend._init(can, item, item.list, function(sub) { can[item.name] = sub sub.run = function(event, cmds, cb) { var msg = sub.request(event); cmds = cmds||[]; return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, sub, cmds, cb) } can.core.Item(sub.onplugin, function(key, cmd) { sub.onplugin.hasOwnProperty(key) && can.base.isFunc(cmd) && can.onengine.plugin(sub, can.core.Keys(ice.CAN, key), cmd) }) can.core.ItemCB(sub.onaction, function(key, cb) { can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {can: sub, msg: msg}) }) }) can.core.CallFunc([sub.onaction, chat._INIT], {can: sub, cb: next, target: sub._target}), delete(sub._history), delete(sub._conf.feature) }, target) - }, function() { - can.onlayout._init(can, target), can.onmotion._init(can, target), can.onkeymap._init(can, target) + }, function() { can.onlayout._init(can, target), can.onmotion._init(can, target), can.onkeymap._init(can, target) can.onengine.signal(can, chat.ONMAIN, can.request()), can.base.isFunc(cb) && cb(can) }), can._path = location.href }, @@ -23,27 +22,20 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { can.requ if (panel.onengine._plugin(event, can, msg, panel, cmds, cb)) { return } if (panel.onengine._engine(event, can, msg, panel, cmds, cb)) { return } if (panel.onengine._static(event, can, msg, panel, cmds, cb)) { return } - var toast, _toast = msg.Option(chat._TOAST); if (_toast) { can.onmotion.delay(can, function() { - if (msg._can && msg._can._toast) { return } - toast = toast||can.user.toastProcess(msg._can, _toast) }, 500) - } - msg.option = can.core.List(msg.option, function(item) { return [chat._TOAST, ice.MSG_HANDLE].indexOf(item) > -1 && delete(msg[item])? undefined: item }) - msg.OptionDefault(ice.MSG_THEME, can.getHeader(chat.THEME), ice.SESS_HEIGHT, panel.Conf(html.HEIGHT)||panel._target.offsetHeight||"", ice.SESS_WIDTH, panel.Conf(html.WIDTH)||panel.offsetWidth||"") + var toast, _toast = msg.Option(chat._TOAST); if (_toast) { can.onmotion.delay(can, function() { if (msg._can && msg._can._toast) { return } toast = toast||can.user.toastProcess(msg._can, _toast) }, 500) } + msg.OptionDefault(ice.MSG_THEME, can.getHeader(chat.THEME), ice.MSG_LANGUAGE, can.user.info.language, ice.SESS_HEIGHT, panel.Conf(html.HEIGHT)||panel._target.offsetHeight||"", ice.SESS_WIDTH, panel.Conf(html.WIDTH)||panel.offsetWidth||"") if (can.base.isUndefined(msg[ice.MSG_DAEMON])) { var sub = msg._can; can.base.isUndefined(sub._daemon) && can.ondaemon._list[0] && (sub._daemon = can.ondaemon._list.push(sub)-1) if (sub._daemon) { msg.Option(ice.MSG_DAEMON, can.core.Keys(can.ondaemon._list[0], sub._daemon)) } - } can.onengine.signal(panel, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds})) + } if (!can.misc.CookieSessid(can) && can.user.info.sessid) { msg.Option(ice.MSG_SESSID, can.user.info.sessid) } + can.onengine.signal(panel, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds})) var names = msg.Option(chat._NAMES)||panel._names||((can.Conf("iceberg")||Volcanos.meta.iceberg)+panel._name) - if (!can.misc.CookieSessid(can) && can.user.info.sessid) { msg.Option(ice.MSG_SESSID, can.user.info.sessid) } - msg.Option(ice.MSG_LANGUAGE, can.user.info.language||"") - if (msg.Option("log.trace") == ice.TRUE) { debugger } can.misc.Run(event, can, {names: names, daemon: msg[ice.MSG_DAEMON]}, cmds, function(msg) { toast && toast.close(), toast = true - if (msg.Option("log.trace") == ice.TRUE) { debugger } can.base.isFunc(cb) && cb(msg), Volcanos.meta.pack[can.core.Keys(panel._name, cmds.join(mdb.FS))] = msg }) }, _static: function(event, can, msg, panel, cmds, cb) { if (!can.user.isLocalFile) { return false } var res = Volcanos.meta.pack[can.core.Keys(panel._name, cmds.join(mdb.FS))], msg = can.request(event); msg.Clear(ice.MSG_APPEND) - return res? msg.Copy(res): can.user.toast(can, "miss data"), can.base.isFunc(cb) && cb(msg), true + return res? msg.Copy(res): can.user.toastFailure(can, "miss data"), can.base.isFunc(cb) && cb(msg), true }, _engine: function(event, can, msg, panel, cmds, cb) { return false }, _plugin: function(event, can, msg, panel, cmds, cb) { @@ -52,11 +44,7 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { can.requ } var p = can.onengine.plugin(can, cmds[0]), n = 1; if (!p) { return false } var func = p, _can = p.can||panel, _sup = _can - if (p.meta && p.meta[cmds[2]] && cmds[1] == ctx.ACTION) { - n = 3, func = p.meta[cmds[2]], _can = msg._can - } else if (p.meta && p.meta[cmds[1]]) { - n = 2, func = p.meta[cmds[2]], _can = msg._can - } + if (p.meta && p.meta[cmds[2]] && cmds[1] == ctx.ACTION) { n = 3, func = p.meta[cmds[2]], _can = msg._can } else if (p.meta && p.meta[cmds[1]]) { n = 2, func = p.meta[cmds[2]], _can = msg._can } if (cmds[n] == ctx.ACTION && cmds[n+1] == mdb.INPUTS) { return true } return can.core.CallFunc(func, {sup: _sup, can: _can, sub: msg._can, msg: msg, arg: cmds.slice(n), cmds: cmds.slice(n), cb: cb}), true }, @@ -67,31 +55,29 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { can.requ return can.base.isString(item) && (item = can.core.SplitInput(item, can.base.isFunc(command.meta[item])? html.BUTTON: type)), item.type != html.SELECT && (type = item.type), button = button || item.type == html.BUTTON, item }); if (!button) { command.list.push(can.core.SplitInput(ice.LIST, html.BUTTON)) } command.can = can, command.meta.name = name, arguments.callee.meta[_name] = command }), - listen: shy(function(can, name, cb, target) { - if (target) { - target[name] = function(event) { can.misc.Event(event, can, cb) } - } else { - arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb) - } - }), + listen: shy(function(can, name, cb, target) { arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb) }), signal: function(can, name, msg) { msg = msg||can.request(); var _msg = name == chat.ONREMOTE? msg.Option("_msg"): msg _msg.Option(ice.LOG_DISABLE) == ice.TRUE || can.misc.Log(name, can._name, (msg._cmds||[]).join(lex.SP), name == chat.ONMAIN? can: _msg) return can.core.List(can.onengine.listen.meta[name], function(cb) { can.core.CallFunc(cb, {event: msg._event, msg: msg}) }).length, msg }, }) Volcanos(chat.ONDAEMON, {_init: function(can, name) { if (can.user.isLocalFile) { return } - can.misc.WSS(can, {type: html.CHROME, name: can.misc.Search(can, cli.DAEMON)||name||"", text: can.user.title(), theme: can.getHeaderTheme(), module: "shylinux.com/x/volcanos", version: can.base.trimPrefix(window._version, "?_v=")}, function(event, msg, cmd, arg, cb) { + can.misc.WSS(can, {type: html.CHROME, name: can.misc.Search(can, cli.DAEMON)||name||"", text: can.user.title(), module: "shylinux.com/x/volcanos", version: can.base.trimPrefix(window._version, "?_v=")}, function(event, msg, cmd, arg, cb) { var sub = can.ondaemon._list[msg.Option(ice.MSG_TARGET)]||can; can.base.isFunc(sub.ondaemon[cmd])? can.core.CallFunc(sub.ondaemon[cmd], {can: can, msg: msg, sub: sub, cmd: cmd, arg: arg, cb: cb}): can.onengine._search({}, can, msg, can, [chat._SEARCH, cmd].concat(arg), cb) }) - }, _list: [""], - pwd: function(can, arg) { can._wss_name = can.ondaemon._list[0] = arg[0] }, + }, _list: [""], pwd: function(can, arg) { can._wss_name = can.ondaemon._list[0] = arg[0] }, + close: function(can, msg, sub) { can.user.close() }, exit: function(can, msg, sub) { can.user.close() }, toast: function(can, sub, arg) { can.core.CallFunc(can.user.toast, [sub].concat(arg)) }, + grow: function(can, msg, sub, arg) { + if (sub._fields && sub.sup && sub.sup.onimport._grow) { return sub.sup.onimport._grow(sub.sup, msg, arg.join("")) } + if (!sub._fields && sub && sub.onimport._grow) { return sub.onimport._grow(sub, msg, arg.join("")) } + }, refresh: function(can, sub) { can.base.isFunc(sub.Update) && sub.Update() }, action: function(can, msg, sub, arg) { if (arg[0] == "ctrl") { var list = []; can.misc.Log("what ", document.activeElement) - can.page.Select(can, can._root._target, "input", function(target, index) { list[index] = target + can.page.Select(can, can._root._target, html.INPUT, function(target, index) { list[index] = target if (document.activeElement == document.body) { return target.focus() } switch (arg[1]) { case "next": if (list[index-1] == document.activeElement) { target.focus() } break @@ -102,16 +88,11 @@ Volcanos(chat.ONDAEMON, {_init: function(can, name) { if (can.user.isLocalFile) return } if (arg[0].indexOf(nfs.PT) == -1 && can.page.SelectInput(can, sub._option, arg[0], function(target) { target.type == html.BUTTON? target.click(): (target.value = arg[1]||"", target.focus()); return target })) { return } - var _sub = can.core.Value(sub, chat._OUTPUTS_CURRENT); if (_sub && _sub.onaction && _sub.onaction[arg[0]]) { return _sub.onaction[arg[0]]({}, _sub, arg[0]) } + var _sub = sub.sub; if (_sub && _sub.onaction && _sub.onaction[arg[0]]) { return _sub.onaction[arg[0]]({}, _sub, arg[0]) } if (sub && sub.onaction && sub.onaction[arg[0]]) { return sub.onaction[arg[0]]({}, sub, arg[0], _sub) } can.core.CallFunc(can.core.Value(can, arg[0]), kit.Dict({can: can}, arg.slice(1))) }, input: function(can, msg, sub, arg) { can.page.Select(can, sub._target, "input:focus", function(target) { target.value += arg[0] }) }, - grow: function(can, msg, sub, arg) { - if (sub._fields && sub.sup && sub.sup.onimport._grow) { return sub.sup.onimport._grow(sub.sup, msg, arg.join("")) } - if (!sub._fields && sub && sub.onimport._grow) { return sub.onimport._grow(sub, msg, arg.join("")) } - }, - close: function(can, msg, sub) { can.user.close() }, exit: function(can, msg, sub) { can.user.close() }, }) Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { meta.index && (meta.name = meta.index), meta.name = can.core.Split(meta.name||"", "\t .\n").pop()||can.Conf(mdb.NAME) @@ -124,14 +105,12 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { can.base.isIn(meta.index, web.WIKI_PORTAL) && can.onappend.style(can, html.OUTPUT, field) var sub = Volcanos(meta.name, {_root: can._root||can, _follow: can.core.Keys(can._follow, meta.name), _target: field, _legend: legend, _option: option, _action: action, _output: output, _status: status, _history: [], - Status: function(key, value) { if (can.base.isObject(key)) { return can.core.Item(key, sub.Status), key } - try { + Status: function(key, value) { if (can.base.isObject(key)) { return can.core.Item(key, sub.Status), key } try { can.page.Select(can, status, [[[html.SPAN, key]]], function(target) { if (can.base.beginWith(value, nfs.PS, ice.HTTP)) { value = can.page.Format(html.A, value) } return can.base.isUndefined(value)? (value = target.innerHTML): (target.innerHTML = value.trim? value.trim(): value+"") }); return value - } catch(e) {} - }, + } catch {} }, Action: function(key, value) { return can.page.SelectArgs(can, action, key, value)[0] }, Option: function(key, value) { return can.page.SelectArgs(can, option, key, value)[0] }, Update: function(event, cmds, cb, silent) { sub.request(event)._caller(), sub.onappend._output0(sub, sub.Conf(), event||{}, cmds||sub.Input([], !silent), cb, silent); return true }, @@ -139,11 +118,10 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { Input: function(cmds, save) { cmds = cmds && cmds.length > 0? cmds: can.page.SelectArgs(sub), cmds = can.base.trim(cmds) return !save || cmds[0] == ctx.ACTION || can.base.Eq(sub._history[sub._history.length-1], cmds) || sub._history.push(cmds), cmds }, - Clone: function() { meta.args = can.page.SelectArgs(can) - can.onappend._init(can, meta, list, function(sub) { can.base.isFunc(cb) && cb(sub, true), can.onmotion.delay(can, sub.Focus) }, target) - }, + Clone: function() { meta.args = can.page.SelectArgs(can), can.onappend._init(can, meta, list, function(sub) { can.base.isFunc(cb) && cb(sub, true), can.onmotion.delay(can, sub.Focus) }, target) }, }, list, function(sub) { meta.feature = can.base.Obj(meta.feature, {}), sub.Conf(meta), field._can = sub can.onappend.style(sub, meta.index? meta.index.split(nfs.PT): meta.name), can.onappend.style(sub, sub.Conf(ctx.STYLE)), can.onappend.style(sub, sub.Mode()) + sub.isCmdMode() && can.onappend.style(sub, can.misc.Search(can, ctx.STYLE)), sub.isCmdMode() && sub.Conf(can.misc.Search(can)) sub._trans = can.base.Copy(sub._trans||{}, can.core.Value(sub, [chat.ONACTION, chat._TRANS])) can.core.Item(meta.feature, function(key, cb) { cb.help && sub.user.trans(sub, kit.Dict(key, cb.help)) }) meta.msg && can.onmotion.delay(can, function() { var msg = sub.request(); msg.Copy(can.base.Obj(meta.msg)) @@ -151,38 +129,27 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }), meta.inputs && sub.onappend._option(sub, meta, sub._option, meta.msg) sub._legend && (sub._legend.onclick = function(event) { can.user.carte(event, sub, sub.onaction, sub.onaction.list.concat([[ctx.ACTION].concat(can.core.Item(meta.feature._trans))]), function(event, button) { can.misc.Event(event, sub, function(msg) { - msg.RunAction(event, can.core.Value(sub, chat._OUTPUTS_CURRENT), [ctx.ACTION, button]) || msg.RunAction(event, sub, [ctx.ACTION, button]) || sub.runAction(event, button, [], function(msg) { - can.onappend._output(sub, msg) - }) + msg.RunAction(event, sub.sub, [ctx.ACTION, button]) || msg.RunAction(event, sub, [ctx.ACTION, button]) || sub.runAction(event, button, [], function(msg) { can.onappend._output(sub, msg) }) }) }) - }) - sub.isCmdMode() && can.onappend.style(sub, can.misc.Search(can, ctx.STYLE)), sub.isCmdMode() && sub.Conf(can.misc.Search(can)) - can.base.isFunc(cb) && cb(sub) - if (can.user.isMobile && !can.user.isLandscape()) { return } if (can.page.ClassList.has(can, sub._target, html.OUTPUT)) { return } + }), can.base.isFunc(cb) && cb(sub) + if (sub.isOutputStyle()) { return } if (can.user.isMobile && !can.user.isLandscape()) { return } sub.isCmdMode() && !can.base.isIn(meta.index, web.CODE_VIMER, web.CODE_INNER, web.CHAT_MACOS_DESKTOP) && 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, {}) can.core.List([""].concat(meta.inputs), function(item) { if (item != "" && item.type != html.BUTTON) { return } var icon = { + "": {name: mdb.DELETE, cb: function(event) { can.onaction.close(event, can) }}, run: {name: web.PLAY, cb: function(event) { can.Update(event) }}, 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) }}, - prev: {name: mdb.PREV, cb: function(event) { - var sub = can.core.Value(can, chat._OUTPUTS_CURRENT) - sub.onaction && sub.onaction.prev? sub.onaction.prev(event, sub): can.onaction.prev(event, can) - }}, - next: {name: mdb.NEXT, cb: function(event) { - var sub = can.core.Value(can, chat._OUTPUTS_CURRENT) - sub.onaction && sub.onaction.next? sub.onaction.next(event, sub): can.onaction.next(event, can) - }}, + prev: {name: mdb.PREV, cb: function(event) { var sub = can.sub; sub.onaction && sub.onaction.prev? sub.onaction.prev(event, sub): can.onaction.prev(event, can) }}, + next: {name: mdb.NEXT, cb: function(event) { var sub = can.sub; sub.onaction && sub.onaction.next? sub.onaction.next(event, sub): can.onaction.next(event, can) }}, play: {name: web.PLAY}, - "": {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) { - var msg = can.request(event), cmds = [ctx.ACTION, item.name] - msg.RunAction(event, can.core.Value(can, chat._OUTPUTS_CURRENT), cmds) || msg.RunAction(event, can, cmds) || can.Update(event, cmds) + var msg = can.request(event), cmds = [ctx.ACTION, item.name]; msg.RunAction(event, can.sub, cmds) || msg.RunAction(event, can, cmds) || can.Update(event, cmds) }}]) }) can.core.List(args.slice(can.core.List(meta.inputs, function(item) { if (can.base.isIn(item.type, html.TEXTAREA, html.TEXT, html.SELECT)) { return item } }).length), function(item, index) { meta.inputs.push({type: mdb.TEXT, name: "args"+index, value: item}) }) @@ -191,12 +158,12 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { _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, CloneField: can.Clone, CloneInput: function() { can.onmotion.focus(can, add(item)._target) }, Input: can.Input, Option: can.Option, Action: can.Action, Status: can.Status, }, [item.display, chat.PLUGIN_INPUT_JS], function(sub) { sub.Conf(item) + if (item.type == html.TEXT) { can.page.Append(can, sub._target.parentNode, [{text: [sub._target.value, html.SPAN, mdb.VALUE]}]) } if (item.type == html.BUTTON && can.base.isIn(item.name, mdb.CREATE, mdb.INSERT)) { can.onappend.style(can, "icons", sub._target.parentNode) can.page.Append(can, sub._target.parentNode, [{icon: item.name, onclick: function(event) { can.Update(event, [ctx.ACTION, item.name]) }}]) } - if (item.type == html.TEXT) { can.page.Append(can, sub._target.parentNode, [{text: [sub._target.value, html.SPAN, mdb.VALUE]}]) } sub.run = function(event, cmds, cb, silent) { var msg = can.request(event, kit.Dict(chat._TOAST, ice.PROCESS))._caller() - msg.RunAction(event, sub, cmds) || msg.RunAction(event, can.core.Value(can, chat._OUTPUTS_CURRENT), cmds) || can.Update(event, can.Input(cmds, !silent), cb, silent) + msg.RunAction(event, sub, cmds) || msg.RunAction(event, can.sub, cmds) || can.Update(event, can.Input(cmds, !silent), cb, silent) }, can._inputs = can._inputs||{}, can._inputs[item.name] = sub, sub.sup = can 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) })} }) @@ -218,8 +185,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { var button = event.target.value; meta[item[0]]? can.core.CallFunc(meta[item[0]], [event, can, item[0], button]): meta[button] && can.core.CallFunc(meta[button], [event, can, button]) }) }}: /* 4.其它 */(item.type == html.BUTTON && (item.value = item.value||can.user.trans(can, item.name, meta._trans), item.onclick = item.onclick||function(event) { run(event, item.name) - }, item._init = item._init||function(target) { - item.action && can.onappend.figure(sub, item, target, function(_sub, value) { can.Update() }) + }, item._init = item._init||function(target) { item.action && can.onappend.figure(sub, item, target, function(_sub, value) { can.Update() }) if (can.base.isIn(item.name, mdb.CREATE, mdb.INSERT)) { can.onappend.style(can, "icons", target.parentNode) can.page.Append(can, target.parentNode, [{icon: item.name, onclick: function(event) { can.Update(event, [ctx.ACTION, item.name]) }}]) } @@ -227,7 +193,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }), meta }, _output0: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event); meta.feature = meta.feature||{} - if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION) { var sub = can.core.Value(can, chat._OUTPUTS_CURRENT); if (msg.RunAction(event, sub, cmds)) { return } } + if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION) { if (msg.RunAction(event, can.sub, cmds)) { return } } if (msg.RunAction(event, can, cmds)) { return } if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { var msg = can.request(event, {action: cmds[1]}) var action = meta.feature[cmds[1]]; if (can.base.isFunc(action)) { cb = cb||function() { can.Update() } @@ -236,10 +202,9 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }): can.core.CallFunc(action, {sup: meta.can, can: can, msg: can.request(event), arg: cmds.slice(2), cb: cb}) } return can.user.input(event, can, meta.feature[cmds[1]], function(args) { can.Update(can.request(event, {_handle: ice.TRUE}, msg, can.Option()), cmds.slice(0, 2).concat(args), cb) }) } - return can.onengine._plugin(event, can, msg, can, cmds, cb) || can.run(event, cmds, function(msg) { - if (can.base.isFunc(cb)) { return cb(msg) } if (silent) { return } + return can.onengine._plugin(event, can, msg, can, cmds, cb) || can.run(event, cmds, function(msg) { if (can.base.isFunc(cb)) { return cb(msg) } if (silent) { return } var _can = can._fields? can.sup: can; if (_can == (msg._can._fields? msg._can.sup: msg._can)) { if (can.core.CallFunc([_can, chat.ONIMPORT, ice.MSG_PROCESS], {can: _can, msg: msg})) { return } } - if (cmds && cmds[0] == ctx.ACTION) { if (can.base.isIn(cmds[1], mdb.CREATE, mdb.INSERT, mdb.PRUNES, mdb.IMPORT, mdb.EXPORT, "exports", "imports", nfs.TRASH) || msg.Length() == 0 && !msg.Result()) { return can.user.toastSuccess(can, cmds[1]), can.Update() } } + if (cmds && cmds[0] == ctx.ACTION) { if (can.base.isIn(cmds[1], mdb.CREATE, mdb.INSERT, mdb.PRUNES, mdb.EXPORT, mdb.IMPORT, "exports", "imports", nfs.TRASH) || msg.Length() == 0 && !msg.Result()) { return can.user.toastSuccess(can, cmds[1]), can.Update() } } can.onappend._output(can, msg, meta.display||msg.Option(ice.MSG_DISPLAY)||meta.feature.display) }) }, @@ -249,7 +214,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { _legend: can._legend, _option: can._option, _action: can._action, _output: output, _status: can._status, Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status, db: {}, ui: {}, }, [display, chat.PLUGIN_TABLE_JS], function(sub) { sub.Conf(can.Conf()) - var last = can.core.Value(can, chat._OUTPUTS_CURRENT); last && can.core.CallFunc([last, "onaction.hidden"], {can: last}) + var last = can.sub; last && can.core.CallFunc([last, "onaction.hidden"], {can: last}) sub.run = function(event, cmds, cb, silent) { sub.request(event)._caller().RunAction(event, sub, cmds) || can.Update(event, can.Input(cmds, !silent), cb, silent) }, can._outputs = can._outputs||[], can._outputs.push(sub), sub.sup = can, can.sub = sub @@ -262,11 +227,9 @@ 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.onmotion.story.auto(can, can._output), can.onappend.style(sub, sub.Conf(ctx.STYLE)) - if (can.onimport.size) { - if (can.isFullMode() || can.isCmdMode()) { can.onimport.size(can, can.page.height(), can.page.width(), true) } + if (can.onimport.size) { if (can.isFullMode() || can.isCmdMode()) { can.onimport.size(can, can.page.height(), can.page.width(), true) } can.onexport.output(sub, msg) - } - can.base.isFunc(cb) && cb(msg) + } can.base.isFunc(cb) && cb(msg) }, target: output}) }) }, @@ -278,10 +241,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { ], onclick: function(event) { can.user.copy(event, can, item.value) }}]) }) }, - style: function(can, style, target) { target = target||can._fields||can._target - if (can.base.endWith(style, ".css")) { return can.require([style]) } - can.base.isObject(style) && !can.base.isArray(style)? can.page.style(can, target, style): can.page.ClassList.add(can, target, style) - }, + field: function(can, type, item, target) { type = type||html.STORY, item = item||{} var name = can.core.Split(item.nick||item.name||"").pop()||""; name = can.core.Keys(item.space, name) var title = !item.help || item.help == name || can.user.language(can) == "en"? name: name+"("+can.core.Split(item.help)[0]+")" @@ -291,83 +251,82 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { var icon = [], _item = can.base.Copy({className: "", type: "", name: ""}, item), input = can.page.input(can, _item, value) if (item.type == html.BUTTON && !input.value) { input.value = can.user.trans(can, item.name) } if (item.type == html.TEXT) { input.onfocus = input.onfocus||function(event) { can.onmotion.selectRange(event.target) } - input.onkeydown = item.onkeydown||function(event) { - if (event.key == lang.ENTER) { can.Update() } + input.onkeydown = item.onkeydown||function(event) { if (event.key == code.ENTER) { return can.Update(), can.onkeymap.prevent(event) } can.onkeymap.input(event, can), can.onkeymap.selectOutput(event, can) } input.onkeyup = item.onkeyup||function(event) { if (item.name == html.FILTER) { can.user.toast(can, "filter out "+can.page.Select(can, can._output, html.TR, function(tr, index) { if (!can.page.ClassList.set(can, tr, html.HIDE, index > 0 && tr.innerText.indexOf(event.target.value) == -1)) { return tr } - }).length+" lines") } } - icon.push({icon: mdb.DELETE, onclick: function(event) { _input.value = "", input.onkeyup({target: event.target.previousSibling}) }}) + }).length+" lines") } }, icon.push({icon: mdb.DELETE, onclick: function(event) { _input.value = "", input.onkeyup({target: event.target.previousSibling}) }}) } if (item.range) { input._init = function(target) { can.onappend.figure(can, item, target, function(sub, value, old) { target.value = value, can.core.CallFunc([can.onaction, item.name], [event, can, item.name]) }) } } var _input = can.page.Append(can, target, [{view: [[html.ITEM].concat(style, [item.type, item.name])], list: [item.icon && {icon: item.icon}, input].concat(icon), _init: function(target, _input) { if (item.type == html.SELECT) { _input.select.value = value||_item.value||_item.values[0], can.onappend.select(can, _input.select, _item) } item.style && can.onappend.style(can, item.style, target) }}])[item.name]; return _input }, - scroll: function(can, target, offset, length) { if (target.scrollHeight/target.offsetHeight == 1) { return } - if (offset) { var ui = can.page.Append(can, target, [{view: "scrollbar", style: {height: length*target.offsetHeight*2}}]) - target.addEventListener("scroll", function(event) { can.page.style(can, ui.scrollbar, html.TOP, target.scrollTop+offset*target.offsetHeight, html.RIGHT, -target.scrollLeft) }) - return ui.scrollbar - } - var ui = can.page.Append(can, target, [{view: "scrollbar", style: {height: target.offsetHeight*target.offsetHeight/target.scrollHeight}, - onmousedown: function(event) { var begin = {top: target.scrollTop, y: event.y} - window._scroll = function(event) { target.scrollTop = begin.top+(event.y-begin.y)/target.offsetHeight*target.scrollHeight, can.onkeymap.prevent(event) } - }, - }]) - target.addEventListener("scroll", function(event) { can.onmotion.delayOnce(can, function() { can.page.style(can, ui.scrollbar, "visibility", "visible") - can.page.style(can, ui.scrollbar, html.TOP, target.scrollTop+target.scrollTop/target.scrollHeight*target.offsetHeight, html.RIGHT, -target.scrollLeft) - can.onmotion.delayOnce(can, function() { can.page.style(can, ui.scrollbar, "visibility", "hidden") }, 3000, target._delay_scroll = target._delay_scroll||[]) - }, 0, target._delay_scroll = target._delay_scroll||[]) }) - return ui.scrollbar - }, - select: function(can, select, item) { var carte + select: function(can, select, item) { return can.page.Append(can, select.parentNode, [{type: html.INPUT, data: {className: html.SELECT, type: html.BUTTON, name: item.name, value: can.user.trans(can, item.value||item.values[0]), title: item.name}, onclick: function(event) { var target = event.target - if (carte) { return carte.close(), carte = null } carte = can.user.carte(event, can, {}, item.values, function(event, button) { - carte.close(), carte = null; if (target.value == button) { return } + var carte = can.user.carte(event, can, {}, item.values, function(event, button) { carte.close(); if (target.value == button) { return } target.value = button, select.value = button, select.onchange && select.onchange({target: select}) }); can.onappend.style(can, [html.SELECT, item.name], carte._target), can.page.style(can, carte._target, html.MIN_WIDTH, event.target.offsetWidth) }, _init: function(target) { can.page.style(can, target, html.WIDTH, (select.offsetWidth||80)+10), can.onappend.style(can, html.HIDE, select) }}, {icon: mdb.SELECT}]) }, table: function(can, msg, cb, target, keys) { if (!msg || msg.Length() == 0) { return } var meta = can.base.Obj(msg.Option(mdb.META)) for (var i = 0; i < msg.append.length-1; i++) { if (msg.append[i] == ctx.ACTION) { msg.append[i] = msg.append[msg.append.length-1], msg.append[msg.append.length-1] = ctx.ACTION } } - var table = can.page.AppendTable(can, msg, target||can._output, msg.append, cb||function(value, key, index, line, array) { - function run(event, cmd, arg) { can.misc.Event(event, can, function(msg) { can.run(can.request(event, line, can.Option()), [ctx.ACTION, cmd].concat(arg)) }) } - if (msg.append.length == 2 && msg.append[0] == mdb.KEY && msg.append[1] == mdb.VALUE) { if (key == mdb.VALUE) { key = line.key } line = {}, can.core.List(array, function(item) { line[item.key] = item.value }) } + var table = can.page.AppendTable(can, msg, target||can._output, msg.append, cb||function(value, key, index, data, list) { + if (msg.append.length == 2 && msg.append[0] == mdb.KEY && msg.append[1] == mdb.VALUE) { if (key == mdb.VALUE) { key = data.key } data = {}, can.core.List(list, function(item) { data[item.key] = item.value }) } + function run(event, cmd, arg) { can.misc.Event(event, can, function(msg) { can.run(can.request(event, data, can.Option()), [ctx.ACTION, cmd].concat(arg)) }) } return {text: [value, html.TD], onclick: function(event) { var target = event.target if (can.page.tagis(target, html.INPUT) && target.type == html.BUTTON) { can.request(event, {action: target.name}) meta && meta[target.name]? can.user.input(event, can, meta[target.name], function(args) { run(event, target.name, args) }): run(event, target.name) - } else { can.sup.onimport.change(event, can.sup, key, event.target.innerText) || can.sup.onexport.record(can.sup, value, key, line, event) } - }, ondblclick: function(event) { if ([mdb.KEY, mdb.HASH, mdb.ID].indexOf(key) > -1) { return } + } else { can.sup.onimport.change(event, can.sup, key, event.target.innerText) || can.sup.onexport.record(can.sup, value, key, data, event) } + }, ondblclick: function(event) { if (can.base.isIn(key, mdb.KEY, mdb.HASH, mdb.ID)) { return } var item = can.core.List(can.Conf([ctx.FEATURE, mdb.INSERT]), function(item) { if (item.name == key) { return item } })[0]||{name: key, value: value} - item.run = function(event, cmds, cb) { can.run(can.request(event, line, can.Option()), cmds, cb, true) } + item.run = function(event, cmds, cb) { can.run(can.request(event, data, can.Option()), cmds, cb, true) } item._enter = function(event, value) { if (event.ctrlKey) { run(event, mdb.MODIFY, [key, value]) } } can.onmotion.modifys(can, event.target, function(event, value, old) { run(event, mdb.MODIFY, [key, value]) }, item) }} }); table && can.onappend.style(can, chat.CONTENT, table), msg.append && msg.append[msg.append.length-1] == ctx.ACTION && can.onappend.style(can, ctx.ACTION, table) ;(can.isCmdMode() || table.offsetWidth > can.ConfWidth() / 2) && can.onappend.style(can, "full", table) - can.page.Select(can, table, "input", function(target) { - target.name == target.value && (target.value = can.user.trans(can, target.value)) - }) + can.page.Select(can, table, html.INPUT_BUTTON, function(target) { target.name == target.value && (target.value = can.user.trans(can, target.value)) }) return keys && can.page.RangeTable(can, table, can.core.List(keys, function(key) { return can.page.Select(can, table, html.TH, function(th, index) { if (th.innerHTML == key) { return index } })[0] })), table }, board: function(can, text, target) { text && text.Result && (text = text.Result()); if (!text) { return } var code = can.page.Append(can, target||can._output, [{text: [can.page.Color(text), html.DIV, html.CODE]}]).code if (text.indexOf(" 0) { can.page.Select(can, code, html.SVG, function(target) { - can.page.style(can, target, {height: can.ConfHeight(), width: can.ConfWidth()}) + can.page.style(can, target, html.MIN_HEIGHT, can.ConfHeight(), html.MIN_WIDTH, can.ConfWidth()) }) } else { can.page.Select(can, code, html.INPUT_BUTTON, function(target) { - target.onclick = function(event) { can.misc.Event(event, can, function(msg) { - can.run(can.request(event, can.Option()), [ctx.ACTION, target.name]) - }) } + target.onclick = function(event) { can.misc.Event(event, can, function(msg) { can.run(can.request(event, can.Option()), [ctx.ACTION, target.name]) }) } }) } return code.scrollBy && code.scrollBy(0, 10000), code }, tools: function(can, msg, cb, target) { can.onimport.tool(can, can.base.Obj(msg.Option(ice.MSG_TOOLKIT), []), cb, target) }, + + style: function(can, style, target) { target = target||can._fields||can._target + if (can.base.endWith(style, ".css")) { return can.require([style]) } + can.base.isObject(style) && !can.base.isArray(style)? can.page.style(can, target, style): can.page.ClassList.add(can, target, style) + }, + scroll: function(can, target, offset, length) { if (target.scrollHeight/target.offsetHeight == 1) { return } + if (offset) { var ui = can.page.Append(can, target, [{view: "scrollbar", style: {height: length*target.offsetHeight*2}}]) + target.addEventListener("scroll", function(event) { can.page.style(can, ui.scrollbar, html.TOP, target.scrollTop+offset*target.offsetHeight, html.RIGHT, -target.scrollLeft) }) + return ui.scrollbar + } + var begin, _target = can.page.Append(can, target, [{view: "scrollbar", + onmousedown: function(event) { begin = {top: target.scrollTop, y: event.y}, window._mousemove = event.target }, + onmousemove: function(event) { if (!begin) { return } target.scrollTop = begin.top+(event.y-begin.y)/target.offsetHeight*target.scrollHeight, can.onkeymap.prevent(event) }, + onmouseup: function(event) { begin = null, delete(window._mousemove) }, + }])._target + target.addEventListener("scroll", function(event) { var height = can.base.Min(target.offsetHeight*target.offsetHeight/target.scrollHeight, target.offsetHeight/4) + can.page.style(can, _target, html.HEIGHT, height, html.RIGHT, -target.scrollLeft, "visibility", "visible", + html.TOP, target.scrollTop+target.scrollTop/(target.scrollHeight-target.offsetHeight)*(target.offsetHeight-height), + ), can.onmotion.delayOnce(can, function() { can.page.style(can, _target, "visibility", "hidden") }, 3000, target._delay_scroll = target._delay_scroll||[]) + }) + return _target + }, toggle: function(can, target) { var toggle = can.page.Append(can, target, [ {view: [[html.PROJECT, html.TOGGLE]], onclick: function() { can.onmotion.toggle(can, can.ui.project), can.onimport.layout(can) }}, @@ -378,8 +337,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { can.page.Modify(can, toggle.project, can.page.isDisplay(can.ui.project)? left: right) can.page.Modify(can, toggle.display, can.page.isDisplay(can.ui.display)? down: up) can.page.Modify(can, toggle.profile, can.page.isDisplay(can.ui.profile)? right: left) - } - return toggle + }; return toggle }, layout: function(can, list, type, target) { const FLOW = html.FLOW, FLEX = html.FLEX var count = 0, ui = {size: {}}; type = type||FLEX, target = target||can._output @@ -405,7 +363,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { if (can.base.isObject(meta) && meta.layout) { meta.layout(h, width) } can.page.style(can, target, html.WIDTH, width), height -= h } else { - if (item == "project") { + if (item == html.PROJECT) { var w = 230, h = height } else { var w = calc(item, target.offsetWidth||target.style.width||_width/list.length, _width), h = height @@ -448,20 +406,16 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { } else { can.runActionCommand(sub.request(event, {pod: meta.space}), sub._index, cmds, cb) } - } - sub._index = value.index||meta.index, can.base.isFunc(cb) && cb(sub, meta, skip) + }, sub._index = value.index||meta.index, can.base.isFunc(cb) && cb(sub, meta, skip) }, target||can._output, field) }, _float: function(can, index, args, cb) { can.onappend.plugin(can, {index: index, args: args, mode: chat.FLOAT}, function(sub) { - can.getActionSize(function(left, top, width, height) { - sub.onimport.size(sub, sub.ConfHeight(height*3/4), sub.ConfWidth(width/2), true) - can.onmotion.move(can, sub._target, {left: width/2, top: height/4}), can.base.isFunc(cb) && cb(sub) - }), sub.onaction.close = function() { can.page.Remove(can, sub._target) } + sub.onmotion.float(sub), sub.onaction.close = function() { can.page.Remove(can, sub._target) }, cb && cb(sub) }, can._root._target) }, figure: function(can, meta, target, cb) { if (meta.type == html.SELECT || meta.type == html.BUTTON) { return } var input = meta.action||mdb.KEY, path = chat.PLUGIN_INPUT+input+nfs._JS; can.require([path], function(can) { function _cb(sub, value, old) { if (value == old) { return } target.value = value, can.base.isFunc(cb) && cb(sub, value, old) } - target.onkeydown = function() { if (event.key == lang.ESCAPE && target._can) { return target._can.close(), target.blur() } else if (event.key == lang.ENTER) { can.base.isFunc(cb) && cb(event, target.value) } } + target.onkeydown = function() { if (event.key == code.ESCAPE && target._can) { return target._can.close(), target.blur() } else if (event.key == code.ENTER) { can.base.isFunc(cb) && cb(event, target.value) } } can.core.ItemCB(can.onfigure[input], function(key, on) { var last = target[key]||function() { }; target[key] = function(event) { can.misc.Event(event, can, function(msg) { function show(sub, cb) { can.base.isFunc(cb) && cb(sub, _cb), can.onlayout.figure(event, can, sub._target, false), can.onmotion.toggle(can, sub._target, true) } can.core.CallFunc(on, {event: event, can: can, meta: meta, cb: _cb, target: target, sub: target._can, last: last, cbs: function(cb) { @@ -492,12 +446,11 @@ Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||can._ro can.user.isMobile && can.user.isLandscape() || can.page.style(can, document.body, kit.Dict(html.OVERFLOW, html.HIDDEN)) }, expand: function(can, target, width) { var n = parseInt(target.offsetWidth/(width+20)); width = target.offsetWidth/n - 20 - can.page.SelectChild(can, target, "*", function(target) { can.page.styleWidth(can, target, width) }) + can.page.SelectChild(can, target, "", function(target) { can.page.styleWidth(can, target, width) }) }, background: function(can, url, target) { can.page.style(can, target||can._root._target, "background-image", url == "" || url == "void"? "": 'url("'+url+'")') }, figure: function(event, can, target, right, max) { if (!event || !event.target) { return {} } target = target||can._fields||can._target - var rect = event.target == document.body? {left: can.page.width()/2, top: can.page.height()/2, right: can.page.width()/2, bottom: can.page.height()/2}: - (event.currentTarget||event.target).getBoundingClientRect() + var rect = event.target == document.body? {left: can.page.width()/2, top: can.page.height()/2, right: can.page.width()/2, bottom: can.page.height()/2}: (event.currentTarget||event.target).getBoundingClientRect() var layout = right? {left: rect.right, top: rect.top}: {left: rect.left, top: rect.bottom} can.getActionSize(function(left, top, width, height) { left = left||0, top = top||0, height = can.base.Max(height, can.page.height()-top) if (max && layout.top-top > height*max) { @@ -534,9 +487,9 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { if (event.metaKey) { if (item.innerText.indexOf(web.HTTP) == 0) { return can.user.open(item.innerText) } if (item.innerText.indexOf("vim ") == 0) { - can.onappend._float(can, web.CODE_VIMER, can.misc.SplitPath(can, item.innerText.split(" ")[1]), function() {}) + can.onappend._float(can, web.CODE_VIMER, can.misc.SplitPath(can, item.innerText.split(" ")[1])) } else { - meta.name == "shell" && can.onappend._float(can, web.CODE_XTERM, ["sh"], function() {}) + meta.name == "shell" && can.onappend._float(can, web.CODE_XTERM, ["sh"]) } } }) }) @@ -576,8 +529,8 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { modify: function(can, target, cb, item) { var back = target.innerHTML, _target = target if (back.length > 120 || back.indexOf(lex.NL) > -1) { return can.onmotion.modifys(can, target, cb) } var ui = can.page.Appends(can, target, [{type: html.INPUT, value: target.innerText, style: {width: can.base.Max(target.offsetWidth-20, 400)}, onkeydown: function(event) { switch (event.key) { - case lang.ENTER: target.innerHTML = event.target.value, event.target.value == back || cb(event, event.target.value, back); break - case lang.ESCAPE: target.innerHTML = back; break + case code.ENTER: target.innerHTML = event.target.value, event.target.value == back || cb(event, event.target.value, back); break + case code.ESCAPE: target.innerHTML = back; break default: can.onkeymap.input(event, can) } }, _init: function(target) { item && can.onappend.figure(can, item, target, function(event, value) { can.base.isFunc(cb) && cb(event, value), _target.innerText = value @@ -587,8 +540,8 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { var ui = can.page.Appends(can, target, [{type: html.TEXTAREA, value: target.innerText, style: { height: can.base.Min(target.offsetHeight-20, 60), width: can.base.Max(target.offsetWidth-20, 400), }, onkeydown: function(event) { switch (event.key) { - case lang.ENTER: if (event.ctrlKey) { target.innerHTML = event.target.value, event.target.value == back || cb(event, event.target.value, back) } break - case lang.ESCAPE: target.innerHTML = back; break + case code.ENTER: if (event.ctrlKey) { target.innerHTML = event.target.value, event.target.value == back || cb(event, event.target.value, back) } break + case code.ESCAPE: target.innerHTML = back; break default: can.onkeymap.input(event, can) } }, _init: function(target) { item && can.onappend.figure(can, item, target), can.onmotion.focus(can, target), can.onmotion.delay(can, function() { target.click() }) }}]) }, @@ -614,16 +567,24 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { var key = can.base.Time(null, "%H:%M:%S.%s"); list[key] = {}, list[key] = can.onmotion.delay(can, function() { list[key] && cb() }, interval)||{} }, delay: function(can, cb, interval, key) { - if (!key) { - if (interval === 0) { - return cb() - } + if (!key) { if (interval === 0) { return cb() } return can.core.Timer(interval||30, cb) } can._delay_list = can._delay_list||shy({}, []) var last = can._delay_list.meta[key]||0, self = can._delay_list.meta[key] = can._delay_list.list.push(cb) return can.core.Timer(interval||30, function() { cb(self, last, can._delay_list.meta[key]) }) }, + float: function(can) { var height = can.page.height()/2, width = can.page.width()*3/4 + if (can.user.isMobile) { + if (can.user.isLandscape()) { + height = can.page.height()*3/4, width = can.page.width()*3/4 + } else { + width = can.page.width() + } + } + can.onimport.size(can, height, width, true) + can.onmotion.move(can, can._target, {left: can.page.width()-width, top: can.page.height()/4}) + }, clear: function(can, target) { return can.page.Modify(can, target||can._output, ""), target }, cache: function(can, next) { var list = can.base.getValid(can.base.Obj(can.core.List(arguments).slice(2)), [can._output]) can.core.List(list, function(target) { target && target._cache_key && can.page.Cache(target._cache_key, target, target.scrollTop+1) }) @@ -695,7 +656,7 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||documen } }), can.onkeymap._engine[item] = engine }) }, _parse: function(event, can, mode, list, target) { list = list||[] - if (event.metaKey && !can.user.isWebview) { return } if ([lang.META, lang.ALT, lang.CONTROL, lang.SHIFT].indexOf(event.key) > -1) { return list } + if (event.metaKey && !can.user.isWebview) { return } if ([code.META, code.ALT, code.CONTROL, code.SHIFT].indexOf(event.key) > -1) { return list } list.push(event.key); for (var pre = 0; pre < list.length; pre++) { if ("0" <= list[pre] && list[pre] <= "9") { continue } break } var count = parseInt(list.slice(0, pre).join(""))||1, map = can.onkeymap._mode[mode] function repeat(cb, count) { list = []; for (var i = 1; i <= count; i++) { if (can.core.CallFunc(cb, {event: event, can: can, target: target, count: count})) { break } } } @@ -708,8 +669,8 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||documen }, _mode: { insert: { - Escape: function(event, can, target) { if (event.key == lang.ESCAPE) { target.blur() } }, - Enter: function(event, can, target) { if (event.key != lang.ENTER) { return } + Escape: function(event, can, target) { if (event.key == code.ESCAPE) { target.blur() } }, + Enter: function(event, can, target) { if (event.key != code.ENTER) { return } var his = target._history||[]; his.push(target.value), target._history = his, target._current = his.length can.page.tagis(event.target, html.INPUT) && can.onmotion.focus(can, target) }, @@ -765,10 +726,10 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||documen }), can.onkeymap.selectCtrlN(event, can, target, html.DIV_ITEM+":not(.hide)", function(target) { target.click(), can.onmotion.focus(can, event.target) }) - if (event.key == lang.ENTER) { can.page.Select(can, target, html.DIV_ITEM+":not(.hide)")[0].click(), can.onmotion.focus(can, event.target) } - if (event.key == lang.ESCAPE) { event.target.blur() } + if (event.key == code.ENTER) { can.page.Select(can, target, html.DIV_ITEM+":not(.hide)")[0].click(), can.onmotion.focus(can, event.target) } + if (event.key == code.ESCAPE) { event.target.blur() } }, - selectInputs: function(event, can, cb, target) { if (can.page.ismodkey(event)) { return } if (event.key == lang.ESCAPE) { return target.blur() } + selectInputs: function(event, can, cb, target) { if (can.page.ismodkey(event)) { return } if (event.key == code.ESCAPE) { return target.blur() } if (event.ctrlKey || can.base.isIn(event.key, "Tab", "ArrowUp", "ArrowDown")) { if (can.base.isUndefined(target._index)) { target._index = -1, target._value = target.value } function select(order) { if (order == -1) { target.value = target._value } var index = 0; return can.page.Select(can, can._output, [html.TBODY, html.TR], function(tr) { if (can.page.ClassList.has(can, tr, html.HIDDEN)) { return } @@ -777,7 +738,7 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||documen } return tr }).length } - var total = select(target._index), key = event.key; if (event.key == lang.TAB) { key = event.shiftKey? "p": "n" } switch (key) { + var total = select(target._index), key = event.key; if (event.key == code.TAB) { key = event.shiftKey? "p": "n" } switch (key) { case "ArrowDown": case "n": select(target._index = (target._index+2) % (total+1) - 1); break case "ArrowUp": diff --git a/index.css b/index.css index e6413391..630b8fe1 100644 --- a/index.css +++ b/index.css @@ -27,7 +27,6 @@ input[name=offend] { width:80px; } input[name=id] { width:60px; } input[name=url] { width:320px; } input[name=cmd] { background-color:var(--code-bg-color); color:var(--code-fg-color); width:100%; } -div.item.text.cmd { color:var(--code-fg-color); } table.content.full { width:100%; } table.content thead { position:sticky; top:2px; } table.content th { padding:5px; box-shadow: var(--box-shadow); } @@ -35,28 +34,22 @@ table.content td { padding:5px; } table.content.action th:last-child { position:sticky; right:2px; box-shadow: var(--box-shadow); } table.content.action td:last-child { position:sticky; right:2px; box-shadow: var(--box-shadow); } table.content col.time { width:180px; } -// table.content col.option { cursor:pointer; } table.content col.action { width:180px; } -body:not(.windows) table.content { font-family:monospace; } -body:not(.windows) div.code { font-family:monospace; } -body:not(.windows) div.tabs { font-family:monospace; } -body:not(.windows) div.path { font-family:monospace; } -body:not(.windows) div.carte { font-family:monospace; } fieldset.panel.Action.tabs table.content { width:100%; } h1 { text-align:center; margin:20px 0; } h2 { margin:20px 0; } h3 { margin:20px 0; } hr, td.hr { border-bottom:var(--plugin-border-color) dashed 1px; margin:5px; } ol, ul { margin-left:40px; } -p { margin:20px 0; } a { color:var(--body-fg-color); } +p { margin:20px 0; } kbd { padding:0 5px; } img { margin-bottom:-8px; } /* fieldset */ fieldset>legend { margin-right:10px; box-shadow:var(--box-shadow); } +fieldset>form.option>div.item:not(.icon) { margin-right:10px; } fieldset>form.option>div.item:not(.icon) { box-shadow:var(--box-shadow); } fieldset>form.option>div.item.button { border-radius:5px; } -fieldset>form.option>div.cmd { width:100%; } -fieldset>form.option>div.textarea { width:100%; } -fieldset>form.option>div.item:not(.icon) { margin-right:10px; } +fieldset>form.option>div.item.text.cmd { color:var(--code-fg-color); width:100%; } +fieldset>form.option>div.item.textarea { width:100%; } fieldset>form.option>div.item.select>input { min-width:80px; } fieldset>form.option>div.item.select { border-radius:5px; } fieldset>div.action>div.item.select { border-radius:5px; } @@ -65,7 +58,6 @@ fieldset>div.action>div.item { margin-right:10px; box-shadow:var(--box-shadow); fieldset>div.output { width:100%; } fieldset>div.output table.content input { margin-right:10px; box-shadow:var(--box-shadow); } fieldset>div.status { width:100%; } -fieldset.cmd>div.status { height:31px; } fieldset.input>legend { display:none; } fieldset.input.key div.action { display:none; } fieldset.input.key div.output table.content { width:100%; } @@ -132,7 +124,11 @@ body.en fieldset.input.date>div.action>div.item.select.month select { width:100p body.zh fieldset.input.date>div.action>div.item.select select { width:58px; } body.zh fieldset.input.date>div.action>div.item.select.year select { width:81px; } body.zh fieldset.input.date>div.action>div.item.select.month select { width:81px; } -// body.zh input[type=button]:not(.select) { letter-spacing:5px; } +body:not(.windows) table.content { font-family:monospace; } +body:not(.windows) div.code { font-family:monospace; } +body:not(.windows) div.tabs { font-family:monospace; } +body:not(.windows) div.path { font-family:monospace; } +body:not(.windows) div.carte { font-family:monospace; } /* icon */ legend>i:first-child { margin-right:10px; } div.item>i:first-child { margin-right:10px; } form.option div.icon, form.option span.icon { font-size:20px; line-height:32px; padding:0 5px; margin:0; height:32px; } @@ -170,7 +166,6 @@ fieldset:not(.float)>form.option>div.text>span.value { display:none; } fieldset.float>form.option>div.text>input { display:none; } fieldset.float>form.option>div.text>span { display:none; } fieldset.float>form.option>div.text>span.value { white-space:pre; padding:7px; height:32px; max-width:200px; display:block; overflow:auto; } -// fieldset.float>form.option>div.text>span.value { padding:7px; height:32px; display:block; overflow:auto; } fieldset.float div.text:hover>span.icon.delete { visibility:hidden; } body.mobile:not(.landscape) fieldset.float>form.option>div.text>span.value { display:none; } body.windows form.option>div.icon { font-size:21px; } @@ -203,16 +198,15 @@ div.project div.zone>div.item { text-align:center; padding:3px; } div.project div.zone>div.item>div.icon { margin-left:3px; float:right; } div.project div.zone>div.list>div.zone>div.item { text-align:left; padding-left:20px; } div.project div.zone>div.list>div.zone>div.item:hover { margin-left:10px; transition:all 0.3s; } -fieldset>div.output div.project { border-right:var(--box-border); width:230px; } -/* fieldset>div.output div.profile { border-left:var(--box-border); max-width:320px; } */ -fieldset>div.output div.profile:not(.toggle) { border-left:var(--box-border); min-width:230px; } -fieldset>div.output div.display:not(.toggle) { border-top:var(--box-border); min-height:230px; } div.content { position:relative; } div.content>div.toggle { position:absolute; } div.content>div.toggle:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); cursor:pointer; } div.content>div.toggle.project { top:20%; left:0; height:80px; width:unset; padding-top:25px; transform:scale(1, 3); border:none; } div.content>div.toggle.profile { top:20%; right:0; height:80px; padding-top:25px; transform:scale(1, 3); border:none; } div.content>div.toggle.display { left:20%; bottom:0; width:80px; text-align:center; transform:scale(3, 1); border:none; } +div.project:not(.toggle) { border-right:var(--box-border); width:230px; } +div.profile:not(.toggle) { border-left:var(--box-border); min-width:230px; } +div.display:not(.toggle) { border-top:var(--box-border); } /* table card */ div.output.card>div.item.stop { color:var(--disable-fg-color); } div.output.card>div.item { padding:10px; border:var(--box-border); margin:10px; width:320px; float:left; box-shadow:var(--box-shadow); } @@ -267,7 +261,6 @@ input:not([type=button]):focus { border:var(--input-border); outline:none; } textarea { background-color:var(--input-bg-color); color:var(--input-fg-color); } table.content tr:hover { background-color:var(--tr-hover-bg-color); } table.content tr.select { background-color:var(--tr-hover-bg-color); } -// table.content tr:hover { background-color:var(--tr-hover-bg-color); color:var(--hover-fg-color); } table.content th { background-color:var(--th-bg-color); color:var(--th-fg-color); } table.content td:hover { background-color:var(--td-hover-bg-color); } table.content td.select { background-color:var(--td-hover-bg-color); } @@ -276,7 +269,6 @@ h1:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); h2:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } h3:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } kbd:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } -/* kbd:hover { background-color:white; color:black; } */ samp:hover { background-color:white; color:black; } div.item:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } div.item.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } @@ -349,8 +341,8 @@ fieldset.cmd>div.item.usernick { line-height:22px; padding:5px 10px; float:right fieldset.plug>div.output table.content { width:100%; } fieldset.location>div.action input[type=text] { width:40px; } fieldset.config form.option input[name=key] { width:240px; } -fieldset.inner.float>div.status { display:none; } fieldset.qrcode>div.output div.code { padding:0; } +fieldset.inner.float>div.status { display:none; } fieldset.xterm>div.action>div.tabs:only-child { display:none; } fieldset.xterm>div.layout { clear:both; } fieldset.xterm div.layout div.output { border-left:var(--box-border); border-top:var(--box-border); } @@ -358,7 +350,6 @@ fieldset.xterm div.layout div.output.select { border:var(--box-border)} fieldset.plan div.output div.content>table.content { height:100%; width:100%; } fieldset.draw div.output svg { margin-bottom:-5px; } fieldset.draw>form.option>div.item.pid>input { width:60px; } -// fieldset.draw div.output svg { margin-bottom:-4px; height:100%; width:100%; } fieldset.draw.trend div.output svg { background-color:#1b5b738c; } fieldset.draw.trend div.output { overflow:hidden; } fieldset.draw.spide div.output { overflow:hidden; } @@ -371,12 +362,13 @@ img, iframe { margin-bottom:-3px; } iframe { height:420px; width:100%; } /* scrollbar */ div.scrollbar { background-color:#0000ff66; width:10px; position:absolute; right:0; top:0; transition:width .3s 1s; visibility:hidden; } -div.scrollbar:hover { width:50px; transition:width .1s;} -fieldset.panel.Action>div.output::-webkit-scrollbar { width:0 !important; height:0 !important; } +div.scrollbar:hover { width:30px; transition:width .1s;} fieldset.panel.River>div.output::-webkit-scrollbar { width:0 !important; height:0 !important; } -div.story[data-type=spark]::-webkit-scrollbar { width:0 !important; height:0 !important; } +fieldset.panel.Action>div.output::-webkit-scrollbar { width:0 !important; height:0 !important; } +form.option>div.text>span.value::-webkit-scrollbar { width:0 !important; height:0 !important; } +div.status::-webkit-scrollbar { width:0 !important; height:0 !important; } div.project::-webkit-scrollbar { width:0 !important; height:0 !important; } div.content::-webkit-scrollbar { width:0 !important; height:0 !important; } -div.carte::-webkit-scrollbar { width:0 !important; height:0 !important; } -div.status::-webkit-scrollbar { width:0 !important; height:0 !important; } div.toggle::-webkit-scrollbar { width:0 !important; height:0 !important; } +div.story[data-type=spark]::-webkit-scrollbar { width:0 !important; height:0 !important; } +div.carte::-webkit-scrollbar { width:0 !important; height:0 !important; } diff --git a/lib/core.js b/lib/core.js index b7afef4b..4a8f1576 100644 --- a/lib/core.js +++ b/lib/core.js @@ -4,14 +4,14 @@ Volcanos("core", { }, Keys: function() { var list = [] for (var i = 0; i < arguments.length; i++) { var v = arguments[i]; switch (typeof v) { - case lang.OBJECT: for (var j = 0; j < v.length; j++) { list.push(v[j]) } break - case lang.NUMBER: list.push(v+""); break - case lang.FUNCTION: v = v() + case code.OBJECT: for (var j = 0; j < v.length; j++) { list.push(v[j]) } break + case code.NUMBER: list.push(v+""); break + case code.FUNCTION: v = v() default: v && list.push(v+"") } } return list.join(nfs.PT) }, Value: function(data, key, value) { if (data == undefined) { return } if (key == undefined) { return data } - if (typeof key == lang.OBJECT) { if (key.length != undefined) { key = key.join(nfs.PT) } else { for (var k in key) { arguments.callee.call(this, data, k, key[k]) } return data } } + if (typeof key == code.OBJECT) { if (key.length != undefined) { key = key.join(nfs.PT) } else { for (var k in key) { arguments.callee.call(this, data, k, key[k]) } return data } } if (value != undefined) { var _node = data, keys = key.split(nfs.PT) for (var i = 0; i < keys.length; i++) { var _next = _node[keys[i]]||{}; _node[keys[i]] = _next if (i < keys.length - 1) { _node = _next } else { _node[keys[i]] = value } @@ -22,29 +22,29 @@ Volcanos("core", { } return node == undefined? data[key]: node }, Split: function(str) { if (!str || !str.length) { return [] } - var opt = {detail: false}, arg = []; for (var i = 1; i < arguments.length; i++) { var v = arguments[i]; typeof v == lang.OBJECT? opt = v: arg.push(v) } + var opt = {detail: false}, arg = []; for (var i = 1; i < arguments.length; i++) { var v = arguments[i]; typeof v == code.OBJECT? opt = v: arg.push(v) } function _list(str) { var res = {}; for (var i = 0; i < str.length; i++) { res[str[i]] = true }; return res } var space = _list(arg[0]||"\t ,;\n") // 空白符 var block = _list(arg[1]||"{[()]}") // 分隔符 var quote = _list(arg[2]||"'\"`") // 引用符 var trans = _list(arg[3]||"\\") // 转义符 - var res = [], begin = 0; function push(obj) { obj && res.push(typeof obj == lang.STRING || opt.detail? obj: obj.text), begin = -1 } + var res = [], begin = 0; function push(obj) { obj && res.push(typeof obj == code.STRING || opt.detail? obj: obj.text), begin = -1 } for (var s = "", i = 0; i < str.length; i++) { if (space[str[i]]) { if (s) { continue } - begin > -1 && push(str.slice(begin, i)), opt.detail && push({type: lang.SPACE, text: str.slice(i, i+1)}) + begin > -1 && push(str.slice(begin, i)), opt.detail && push({type: code.SPACE, text: str.slice(i, i+1)}) } else if (block[str[i]]) { if (s) { continue } begin > -1 && push(str.slice(begin, i)), push(str.slice(i, i+1)) } else if (quote[str[i]]) { if (s == "") { begin > -1 && push(str.slice(begin, i)), s = str[i], begin = i+1 } else if (s == str[i]) { - push({type: lang.STRING, text: str.slice(begin, i), left: s, right: str[i]}), s = "", begin = -1 + push({type: code.STRING, text: str.slice(begin, i), left: s, right: str[i]}), s = "", begin = -1 } } else if (trans[str[i]]) { begin == -1 && (begin = i), i++ } else { begin == -1 && (begin = i) } - } return begin > -1 && (s? push({type: lang.STRING, text: str.slice(begin), left: s, right: ""}): push(str.slice(begin))), res + } return begin > -1 && (s? push({type: code.STRING, text: str.slice(begin), left: s, right: ""}): push(str.slice(begin))), res }, - SplitInput: function(item, type) { if (typeof item == lang.OBJECT) { return item } type = type||html.TEXT; switch (item) { + SplitInput: function(item, type) { if (typeof item == code.OBJECT) { return item } type = type||html.TEXT; switch (item) { case ice.RUN: return {type: html.BUTTON, name: item} case ice.LIST: return {type: html.BUTTON, name: item, action: ice.AUTO} case ice.BACK: return {type: html.BUTTON, name: item} @@ -63,63 +63,63 @@ Volcanos("core", { } }, CallFunc: function(func, args, mod) { args = args||{}; var can = args["can"]||args[0], msg = args["msg"]||args[1], cb = args["cb"] if (Array.isArray(args)) { this.List(args, function(arg) { if (!arg) { return } if (arg.request && arg.run) { can = arg } else if (arg.Append && arg.Result) { msg = arg } else if (typeof arg == code.FUNCTION) { cb = arg } }) } - func = typeof func == lang.FUNCTION? func: typeof func == lang.OBJECT && func.length > 0? this.Value(func[0], this.Keys(func.slice(1))): typeof func == lang.STRING? this.Value(mod||can, func): null - if (typeof func != lang.FUNCTION) { if (typeof cb == lang.FUNCTION) { cb() } return } + func = typeof func == code.FUNCTION? func: typeof func == code.OBJECT && func.length > 0? this.Value(func[0], this.Keys(func.slice(1))): typeof func == code.STRING? this.Value(mod||can, func): null + if (typeof func != code.FUNCTION) { if (typeof cb == code.FUNCTION) { cb() } return } var list = [], echo = false; args.length > 0? list = args: this.List(func.toString().split(")")[0].split("(")[1].split(mdb.FS), function(item, index) { item = item.trim(); if (item == "") { return } list.push(args[item] || msg&&msg.Option&&msg.Option(item) || can&&can.Conf&&can.Conf(item) || null); if (item == "cb") { echo = true } }); var res = func.apply(mod||can, list); if (msg && msg.Defer) { msg.Defer() } - if (!echo && typeof cb == lang.FUNCTION) { res && msg&&msg.Echo&&msg.Echo(res), arguments.callee.apply(this, [cb, {msg: msg, res: res}]) } return res + if (!echo && typeof cb == code.FUNCTION) { res && msg&&msg.Echo&&msg.Echo(res), arguments.callee.apply(this, [cb, {msg: msg, res: res}]) } return res }, List: function(list, cb, interval, cbs) { - if (typeof list == lang.STRING) { list = [list] } else if (typeof list == lang.NUMBER) { // [end cb interval]|[begin end interval] - var begin = 0, end = list, step = typeof interval == lang.NUMBER? interval: 1; if (typeof cb == lang.NUMBER) { begin = list, end = cb, cb = null } + if (typeof list == code.STRING) { list = [list] } else if (typeof list == code.NUMBER) { // [end cb interval]|[begin end interval] + var begin = 0, end = list, step = typeof interval == code.NUMBER? interval: 1; if (typeof cb == code.NUMBER) { begin = list, end = cb, cb = null } list = []; for (var i = begin; i < end; i += step) { list.push(i) } } list = list||[] if (interval > 0) { - function loop(i) { i >= list.length? typeof cbs == lang.FUNCTION && cbs(list): cb(list[i], i, list), setTimeout(function() { loop(i+1) }, interval) } - typeof cb == lang.FUNCTION && list.length > 0 && setTimeout(function() { loop(0) }, interval/4) + function loop(i) { i >= list.length? typeof cbs == code.FUNCTION && cbs(list): cb(list[i], i, list), setTimeout(function() { loop(i+1) }, interval) } + typeof cb == code.FUNCTION && list.length > 0 && setTimeout(function() { loop(0) }, interval/4) } else { var res = [] - for (var i = 0; i < list.length; i++) { var _res = typeof cb == lang.FUNCTION? cb(list[i], i, list): list[i]; _res != undefined && res.push(_res) } + for (var i = 0; i < list.length; i++) { var _res = typeof cb == code.FUNCTION? cb(list[i], i, list): list[i]; _res != undefined && res.push(_res) } list = res } return list }, Next: function(list, cb, cbs) { switch (typeof list) { - case lang.OBJECT: if (list == null) { list = []; break } if (list.length == undefined) { var ls = []; for (var k in list) { ls.push(k) } list = ls } break + case code.OBJECT: if (list == null) { list = []; break } if (list.length == undefined) { var ls = []; for (var k in list) { ls.push(k) } list = ls } break default: if (list == undefined) { list = []; break } list = [list] } - function next(i) { i < list.length? typeof cb == lang.FUNCTION && cb(list[i], function() { next(i+1) }, i, list): typeof cbs == lang.FUNCTION && cbs(list) } + function next(i) { i < list.length? typeof cb == code.FUNCTION && cb(list[i], function() { next(i+1) }, i, list): typeof cbs == code.FUNCTION && cbs(list) } return next(0), list }, Item: function(obj, cb) { var list = [] - for (var k in obj) { var res = typeof cb == lang.FUNCTION? cb(k, obj[k], list): k; res != undefined && list.push(res) } + for (var k in obj) { var res = typeof cb == code.FUNCTION? cb(k, obj[k], list): k; res != undefined && list.push(res) } return list }, ItemKeys: function(obj, cb) { var list = [], keys = []; for (var k in obj) { keys.push(k) } keys.sort() - for (var i in keys) { var k = keys[i]; var res = typeof cb == lang.FUNCTION? cb(k, obj[k]): k; res != undefined && list.push(res) } + for (var i in keys) { var k = keys[i]; var res = typeof cb == code.FUNCTION? cb(k, obj[k]): k; res != undefined && list.push(res) } return list }, ItemOrder: function(obj, key, cb) { var list = [], order = [], keys = {}, vals = {}, i = 0 for (var k in obj) { o = obj[k][key]||i++, order.push(o), keys[o] = k, vals[o] = obj[k] } order.sort() - for (var i in order) { var k = order[i], res = typeof cb == lang.FUNCTION? cb(keys[k], vals[k]): k; res != undefined && list.push(res) } + for (var i in order) { var k = order[i], res = typeof cb == code.FUNCTION? cb(keys[k], vals[k]): k; res != undefined && list.push(res) } return list }, ItemForm: function(obj, cb) { var list = [] - for (var k in obj) { list = list.concat(this.List(obj[k], function(v, i) { return typeof cb == lang.FUNCTION && cb(v, i, k, obj) })) } + for (var k in obj) { list = list.concat(this.List(obj[k], function(v, i) { return typeof cb == code.FUNCTION && cb(v, i, k, obj) })) } return list }, ItemCB: function(meta, cb, can, item) { var list = [] - for (var k in meta) { if (k.indexOf("on") == 0 && typeof meta[k] == lang.FUNCTION) { (function(k) { list.push(k) - if (typeof cb == lang.FUNCTION) { cb(k, meta[k]) } else { cb[k] = function(event) { can.misc.Event(event, can, function(msg) { + for (var k in meta) { if (k.indexOf("on") == 0 && typeof meta[k] == code.FUNCTION) { (function(k) { list.push(k) + if (typeof cb == code.FUNCTION) { cb(k, meta[k]) } else { cb[k] = function(event) { can.misc.Event(event, can, function(msg) { meta[k](event, can, item) }) } } })(k) } } return list }, Timer: shy("定时器, value, [1,2,3,4], {delay, interval, length}", function(interval, cb, cbs) { var timer = {stop: false} function loop(i) { timer.stop || i >= interval.length && interval.length >= 0 || cb(timer, interval.interval||interval[i], i, interval)? - typeof cbs == lang.FUNCTION && cbs(timer, interval): setTimeout(function() { loop(i+1) }, interval.interval||interval[i+1]) - } interval = typeof interval == lang.OBJECT? interval: [interval]; if (interval.interval == 0) { return cb(), timer } + typeof cbs == code.FUNCTION && cbs(timer, interval): setTimeout(function() { loop(i+1) }, interval.interval||interval[i+1]) + } interval = typeof interval == code.OBJECT? interval: [interval]; if (interval.interval == 0) { return cb(), timer } var delay = interval.delay||interval.interval/2||interval[0] - return typeof cb == lang.FUNCTION && (timer._timer = setTimeout(function() { loop(0) }, delay)), timer + return typeof cb == code.FUNCTION && (timer._timer = setTimeout(function() { loop(0) }, delay)), timer }), }) diff --git a/lib/misc.js b/lib/misc.js index c510231a..7146aed0 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -71,7 +71,7 @@ Volcanos("misc", { }); return msg }, Event: function(event, can, cb) { for (var i = 3; i < arguments.length; i++) { can.request(event, arguments[i]) } cb(can.request(event)) }, Run: function(event, can, dataset, cmds, cb) { var msg = can.request(event), _can = msg._can; _can._fields && _can.sup && (_can = _can.sup) - var form = {cmds: cmds}; can.core.List(msg.option, function(key) { !can.base.isIn(key, "log.caller") && msg[key] && (form[key] = msg[key]) }) + var form = {cmds: cmds}; can.core.List(msg.option, function(key) { !can.base.isIn(key, "log.caller", "_handle", "_toast") && msg[key] && (form[key] = msg[key]) }) can.misc.POST(can, msg, can.base.MergeURL(dataset.names.toLowerCase(), ice.MSG_INDEX, _can._index), form, cb) }, POST: function(can, msg, url, form, cb, cbs) { var xhr = new XMLHttpRequest(), begin = new Date(); msg._xhr = xhr diff --git a/lib/page.js b/lib/page.js index 258415f8..cf3b2f50 100644 --- a/lib/page.js +++ b/lib/page.js @@ -105,25 +105,25 @@ Volcanos("page", { } return value } function show(value, deep) { deep = deep == undefined? 2: 0; switch (typeof value) { - case lang.OBJECT: if (!value) { return {} } + case code.OBJECT: if (!value) { return {} } if (value._path) { return {value: "@\""+value._path+"\""} } if (value.tagName) { return {type: nfs.TARGET, value: "$ "+value.tagName.toLowerCase()+(value.className? nfs.PT+value.className.replaceAll(lex.SP, nfs.PT):"")} } if (deep < 0) { return {value: value.length == undefined? "{"+can.page.unicode.inner+"}": "["+can.page.unicode.inner+"]"} } if (value.length != undefined) { return {value: (value.length > 3? value.length+lex.SP: "")+"["+can.core.List(value, function(value, index) { if (index < 6) { return short(show(value, deep-1).value, index+1) } }).join(mdb.FS)+"]"} } return {value: "{"+can.core.Item(value, function(key, val, list) { if (value.hasOwnProperty(key) && val && list.length < 7) { return short(key+nfs.DF+show(val, deep-1).value, list.length) } }).join(mdb.FS)+"}"} - case lang.STRING: return {open: "s", close: "s", value: "\""+(deep == 2? value.replaceAll("\n", "\\n"): short(value))+"\""} - case lang.NUMBER: return {open: "n", close: "n", value: value} - case lang.BOOLEAN: return {open: "b", close: "b", value: value} - case lang.FUNCTION: return {open: "f", close: "f", value: deep == 2? (""+value).split(lex.NL)[0]: "function(..) {..}"} + case code.STRING: return {open: "s", close: "s", value: "\""+(deep == 2? value.replaceAll("\n", "\\n"): short(value))+"\""} + case code.NUMBER: return {open: "n", close: "n", value: value} + case code.BOOLEAN: return {open: "b", close: "b", value: value} + case code.FUNCTION: return {open: "f", close: "f", value: deep == 2? (""+value).split(lex.NL)[0]: "function(..) {..}"} default: return {value: value} } } var loaded = false, _show = show(value); _show.open = _show.open||open, _show.close = _show.close||close var ui = can.page.Append(can, target, [!key && value.tagName? can.page.AppendView(can, value): {view: [[html.ITEM, _show.type||typeof(value)], key == ""? html.SPAN: html.DIV], list: [ {view: [mdb.ICON, html.SPAN, _show.close+lex.SP]}, {view: [mdb.NAME, html.SPAN, key || key === 0? key+lex.SP: ""]}, {view: [mdb.VALUE, html.SPAN, _show.value]}, - ], onclick: function() { cb && cb(prefix, value); if (typeof value != lang.OBJECT) { return } + ], onclick: function() { cb && cb(prefix, value); if (typeof value != code.OBJECT) { return } ui.icon.innerText = (can.onmotion.toggle(can, ui.list)? _show.open: _show.close)+lex.SP if (loaded) { return } loaded = true, ui.icon.innerText = _show.open+lex.SP if (value.tagName) { can.page.Append(can, ui.list, [can.page.AppendView(can, value)]), can.onappend.style(can, mdb.VIEW, ui.list) - can.core.List(can.core.Item(target, function(key, value) { if (["textContent", "innerHTML", "outerHTML"].indexOf(key) > -1 || typeof value == lang.FUNCTION || key.toUpperCase() == key) { return } return key }).sort(), function(key) { + can.core.List(can.core.Item(target, function(key, value) { if (["textContent", "innerHTML", "outerHTML"].indexOf(key) > -1 || typeof value == code.FUNCTION || key.toUpperCase() == key) { return } return key }).sort(), function(key) { target[key] && can.page.AppendData(can, ui.list, can.core.Keys(prefix, key), key, target[key], cb) }) } else if (value.length != undefined) { @@ -210,7 +210,7 @@ Volcanos("page", { var list = ["<"+type]; for (var i = 2; i < arg.length; i += 2) { list.push(lex.SP+arg[i]+mdb.EQ+arg[i+1]) } return list.concat(">", arg[1], "").join("") } }, - Color: function(text) { if (typeof text != lang.STRING) { return "" } text = text.replace(/\\n/g, "
") + Color: function(text) { if (typeof text != code.STRING) { return "" } text = text.replace(/\\n/g, "
") if (text.indexOf(ice.HTTP) == 0 && text.length > 10) { var ls = text.split(lex.SP); text = ""+ls[0]+""+ls.slice(1).join(lex.SP) } if (text.indexOf("export ctx_dev=") == 0 && text.length > 10) { return "
"+""+text+""+"
" @@ -228,9 +228,9 @@ Volcanos("page", { text = text.replace(/\033\[m/g, "") return text }, - Keys: function() { var list = []; /* FS SP GT PT */ for (var i = 0; i < arguments.length; i++) { var v = arguments[i]; if (typeof v == lang.OBJECT) { - for (var j = 0; j < v.length; j++) { if (typeof v[j] == lang.OBJECT) { - for (var k = 0; k < v[j].length; k++) { if (typeof v[j][k] == lang.OBJECT) { v[j][k] = v[j][k].join(nfs.PT) } } + Keys: function() { var list = []; /* FS SP GT PT */ for (var i = 0; i < arguments.length; i++) { var v = arguments[i]; if (typeof v == code.OBJECT) { + for (var j = 0; j < v.length; j++) { if (typeof v[j] == code.OBJECT) { + for (var k = 0; k < v[j].length; k++) { if (typeof v[j][k] == code.OBJECT) { v[j][k] = v[j][k].join(nfs.PT) } } v[j] = v[j].join(ice.GT) } } list.push(v.join(lex.SP)) } else { list.push(v+"") } } return list.join(mdb.FS) }, @@ -251,7 +251,7 @@ Volcanos("page", { styleWidth: function(can, target, value) { return can.page.style(can, target, html.WIDTH, value), target.offsetWidth }, styleClass: function(can, target, value) { return can.page.Modify(can, target, {className: value}), target.className }, style: function(can, target, style) { var value = {}; for (var i = 2; i < arguments.length; i += 2) { - if (typeof arguments[i] == lang.OBJECT) { can.page.Modify(can, target, {style: arguments[i--]}) } else { value[arguments[i]] = arguments[i+1] } + if (typeof arguments[i] == code.OBJECT) { can.page.Modify(can, target, {style: arguments[i--]}) } else { value[arguments[i]] = arguments[i+1] } } return can.page.Modify(can, target, {style: value}), value }, tagis: function(target) { if (!target || !target.tagName) { return } var type = target.tagName.toLowerCase(); for (var i = 1; i < arguments.length; i++) { if (type == arguments[i]) { return true } } @@ -262,7 +262,7 @@ Volcanos("page", { draggable: function(can, item, ok) { item.setAttribute("draggable", ok) }, height: function() { return window.innerHeight }, width: function() { return window.innerWidth }, - ismodkey: function(event) { return [lang.META, lang.ALT, lang.CONTROL, lang.SHIFT].indexOf(event.key) > -1 }, + ismodkey: function(event) { return [code.META, code.ALT, code.CONTROL, code.SHIFT].indexOf(event.key) > -1 }, unicode: { menu: "☰", prev: "❮", next: "❯", play: "▸", push: "⇈", pull: "⇊", refresh: "↻", goback: "↺", @@ -332,7 +332,7 @@ Volcanos("page", { var canvas = can.page.Create(can, html.CANVAS, {width: size, height: size}), ctx = canvas.getContext("2d") ctx.fillStyle = colors[Math.floor(Math.random()*(colors.length))], ctx.fillRect(margin, margin, size-2*margin, size-2*margin) ctx.fillStyle = cli.WHITE, ctx.font = (fonts||can.base.Min(size/text.length-30, 16))+"px Arial", ctx.textAlign = "center", ctx.textBaseline = "middle", ctx.fillText(text, size/2, size/2) - return canvas.toDataURL(nfs.IMAGE_PNG, 1) + return canvas.toDataURL(web.IMAGE_PNG, 1) }, position: function(event, target) { var p = target.getBoundingClientRect(); return {x: event.clientX - p.x, y: event.clientY - p.y} }, theme: function(cb) { diff --git a/lib/user.js b/lib/user.js index 5acc470f..673b0142 100644 --- a/lib/user.js +++ b/lib/user.js @@ -37,7 +37,7 @@ Volcanos("user", { }, alert: function(text) { alert(JSON.stringify(text)) }, confirm: function(text) { return confirm(JSON.stringify(text)) }, - prompt: function(tip, def, cb, silent) { (text = silent? def: prompt(tip, def||"")) != undefined && typeof cb == lang.FUNCTION && cb(text); return text }, + prompt: function(tip, def, cb, silent) { (text = silent? def: prompt(tip, def||"")) != undefined && typeof cb == code.FUNCTION && cb(text); return text }, reload: function(force) { (force || confirm("重新加载页面?")) && location.reload() }, jumps: function(url) { location.href = url }, opens: function(url) { @@ -141,7 +141,7 @@ Volcanos("user", { }) } var ui = can.page.Append(can, document.body, [{view: [[chat.CARTE, meta._style||can.base.replaceAll(can._index||"", nfs.PT, lex.SP)||"", chat.FLOAT]], list: can.core.List(list, function(item, index) { if (item == web.FILTER) { - return {input: [html.FILTER, function(event) { if (event.key == lang.ESCAPE) { return carte.close() } can.onkeymap.selectItems(event, can, carte._target) }], + return {input: [html.FILTER, function(event) { if (event.key == code.ESCAPE) { return carte.close() } can.onkeymap.selectItems(event, can, carte._target) }], _init: function(target) { can.onmotion.delay(can, function() { target.placeholder = "search in "+(can.core.List(list, function(item) { if (item) { return item } }).length-1)+" items", target.focus() }) } } } @@ -176,7 +176,7 @@ Volcanos("user", { can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) { item.name && item.value && _msg.Option(item.name, item.value) }) can.run(event, cmds, cb, true) }, _enter: function(event) { return action.submit(event, can, html.SUBMIT), true }}, item), target) - }, item.onkeydown = function(event) { if (event.key == lang.ESCAPE) { event.target.blur() } } + }, item.onkeydown = function(event) { if (event.key == code.ESCAPE) { event.target.blur() } } return {type: html.TR, list: [ {type: html.TD, list: [{text: [can.user.trans(can, item.name||"", item._trans), html.LABEL]}]}, {type: html.TD, list: [{text: item.need == "must"? "*": "", style: {color: cli.RED}}]}, {type: html.TD, list: [can.page.input(can, item), item.type == html.TEXT && {icon: "delete", onclick: function(event) { event.target.previousSibling.value = "" }}]}, diff --git a/panel/action.js b/panel/action.js index 2fdfad06..1166c9fc 100644 --- a/panel/action.js +++ b/panel/action.js @@ -5,7 +5,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { var river = can.Conf(chat.R sub.onaction._close = function() { can.onengine.signal(can, chat.ONACTION_REMOVE, can.request({river: river, storm: storm}, item)), can.page.Remove(can, sub._target) } sub.run = function(event, cmds, cb) { return can.run(event, (river == web.SHARE? [ctx.ACTION]: []).concat([river, storm, meta.id||meta.index], cmds), cb) } }) - }, function() { can.isCmdMode() || can.onmotion.delay(can, function() { can.onaction.layout(can) + }, function() { can.isCmdMode() || can.onmotion.delay(can, function() { can.onaction.layout(can), can.onappend.scroll(can, can._output) can.onexport.layout(can) && list[0] == river && list[1] == storm && can.core.List(can._plugins, function(sub) { sub.Conf(ctx.INDEX) == list[2] && can.onmotion.delay(can, function() { sub._tabs.click() }) }) }, 300) }) }, @@ -71,7 +71,7 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { }, 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 + var sub = can._plugins[0].sub; 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/footer.js b/panel/footer.js index 11530ad3..c660bd15 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -15,7 +15,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.Conf(NKEY, 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, icon: "bi bi-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 == lang.ESCAPE) { return close() } if (event.key != lang.ENTER) { return } + 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 cli.CLEAR: case cli.CLOSE: break diff --git a/panel/header.js b/panel/header.js index 61d008af..24f8a81b 100644 --- a/panel/header.js +++ b/panel/header.js @@ -20,7 +20,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { }, _search: function(can, msg, target) { can._search = can.onappend.input(can, {type: html.TEXT, icon: "bi bi-search", name: mdb.SEARCH, value: can.misc.Search(can, "_search"), onkeydown: function(event) { can.onkeymap.input(event, can) - event.key == lang.ENTER && can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event, {type: mdb.FOREACH, word: event.target.value||""})) + event.key == code.ENTER && can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event, {type: mdb.FOREACH, word: event.target.value||""})) }}, "", target, [chat.TITLE]) can.onimport.menu(can, mdb.SEARCH, function() { can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event, {type: mdb.FOREACH, word: can._search.value||""})) }) }, diff --git a/panel/search.js b/panel/search.js index 6db6c122..43c8b84b 100644 --- a/panel/search.js +++ b/panel/search.js @@ -24,8 +24,8 @@ Volcanos(chat.ONACTION, {_init: function(can) { can.onmotion.hidden(can) }, list onsize: function(can, msg, height, width) { can.onimport._size(can), can.core.List(can._plugins, function(sub) { sub.onimport.size(sub, can.ConfHeight(), can.ConfWidth(), true) }) }, onlogin: function(can, msg) { can.ui = can.page.Append(can, can._output, [chat.CONTENT, {view: [[chat.DISPLAY, chat.CONTENT], html.TABLE]}, chat.PROFILE]) can.onappend._action(can, (can.Conf(html.ACTION)||can.onaction.list).concat({type: html.TEXT, name: html.FILTER, _init: function(target) { can.ui.filter = target }, onkeydown: function(event) { - if (event.key == lang.ESCAPE) { return event.target.blur() } - if (event.key == lang.ENTER) { can.onkeymap.prevent(event); if (event.shiftKey) { return can.page.SelectOne(can, can.ui.content, [html.TBODY, html.TR, html.TD], function(target) { target.click() }) } + if (event.key == code.ESCAPE) { return event.target.blur() } + if (event.key == code.ENTER) { can.onkeymap.prevent(event); if (event.shiftKey) { return can.page.SelectOne(can, can.ui.content, [html.TBODY, html.TR, html.TD], function(target) { target.click() }) } 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||[]) @@ -56,7 +56,7 @@ Volcanos(chat.ONACTION, {_init: function(can) { can.onmotion.hidden(can) }, list if (data.type == nfs.SHY) { meta = {index: web.WIKI_WORD, args: data.text} } if (data.type == ice.CMD) { meta = {index: data.name, args: can.core.Split(data.text)} } if (data.ctx == ice.NFS && data.cmd == nfs.PACK) { var ls = can.misc.SplitPath(can, data.text) - can.runAction(event, cli.RUN, [web.CODE_VIMER, ctx.ACTION, mdb.RENDER, data.type, ls[1], ls[0]], function(msg) { msg.Table(function(meta) { + can.runAction(event, ctx.RUN, [web.CODE_VIMER, ctx.ACTION, mdb.RENDER, data.type, ls[1], ls[0]], function(msg) { msg.Table(function(meta) { can.onappend.plugin(can, meta, function(sub) { can._plugins = (can._plugins||[]).concat(sub), sub.onimport.size(sub, can.ConfHeight(), can.ConfWidth()-1, true) }, can.ui.profile) }), can.onappend.board(can, msg.Result(), can.ui.profile) }) return diff --git a/plugin/input.js b/plugin/input.js index 595770f8..ff711046 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -4,7 +4,7 @@ Volcanos(chat.ONACTION, { onclick: function(event, can) { can.Conf(mdb.TYPE) == html.BUTTON && can.run(event, [ctx.ACTION, can.Conf(mdb.NAME)].concat(can.sup.Input())), can.onkeymap.prevent(event) }, onchange: function(event, can) { can.Conf(mdb.TYPE) == html.SELECT && can.run(event) }, onkeydown: function(event, can) { can.onkeymap.input(event, can, event.target); if (can.Conf(mdb.TYPE) == html.TEXTAREA && !event.ctrlKey) { return } - if (event.key == lang.ENTER) { return can.onkeymap.prevent(event), can.run(event), can.onmotion.focus(can, event.target) } + if (event.key == code.ENTER) { return can.onkeymap.prevent(event), can.run(event), can.onmotion.focus(can, event.target) } if (!event.ctrlKey) { return } switch (event.key) { case "m": can.CloneField(); break case "b": can.CloneInput(); break diff --git a/plugin/input/key.js b/plugin/input/key.js index 4a61a437..38e428fb 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -22,7 +22,7 @@ Volcanos(chat.ONFIGURE, {key: { }) }, onblur: function(event, can, sub, cb) { sub && can.onmotion.delay(can, sub.close, 300) }, onkeydown: function(event, can, meta, cb, target, sub, last) { - if (event.key == lang.ENTER) { return meta._enter && (!can.page.tagis(event.target, html.TEXTAREA) || event.ctrlKey) && meta._enter(event, target.value)? sub.close(): last(event) } + if (event.key == code.ENTER) { return meta._enter && (!can.page.tagis(event.target, html.TEXTAREA) || event.ctrlKey) && meta._enter(event, target.value)? sub.close(): last(event) } if (!sub) { return } sub.hidden() || can.onkeymap.selectCtrlN(event, can, sub._output, "tr:not(.hidden)>td:first-child", function(td) { return meta.select && (sub.close(), meta.select(target.value = td.innerText)), cb(sub, td.innerText, target.value), td }) || can.onmotion.delayOnce(can, function() { can.onkeymap.selectInputs(event, sub, function() { sub._load(event, sub, cb, target, meta.name) }, target) }, target.value.length < 3? 500: 150) }, diff --git a/plugin/input/keyboard.js b/plugin/input/keyboard.js index b4335d93..fbed7bf9 100644 --- a/plugin/input/keyboard.js +++ b/plugin/input/keyboard.js @@ -12,15 +12,15 @@ Volcanos(chat.ONFIGURE, {keyboard: { switch (item.name) { case cli.CLEAR: target.value = "", target.focus(); break case cli.CLOSE: can.close(); break - case lang.ESC: can.close(); break - case lang.CTRL: can._ctrl = !can._ctrl, hold(); break - case lang.SHIFT: can._shift = !can._shift, hold(); break - case lang.BACKSPACE: target.value = target.value.slice(0, -1), add(""); break - case lang.ENTER: break + case code.ESC: can.close(); break + case code.CTRL: can._ctrl = !can._ctrl, hold(); break + case code.SHIFT: can._shift = !can._shift, hold(); break + case code.BACKSPACE: target.value = target.value.slice(0, -1), add(""); break + case code.ENTER: break default: can._shift = can._shift||event.shiftKey - if (item.name == lang.TAB) { + if (item.name == code.TAB) { add(lex.TB) - } else if (item.name == lang.SPACE) { + } else if (item.name == code.SPACE) { add(lex.SP) } else if (item.name.indexOf(lex.NL) > -1) { var ls = can.core.Split(item.name, lex.NL, lex.NL, lex.NL) add(can._shift? ls[0]: ls[1]) @@ -41,12 +41,12 @@ Volcanos(chat.ONFIGURE, {keyboard: { }) }); return 150 }, _normal: function(can, msg) { - can.core.List([[lang.ESC, "close", "clear"], - ["~\n`", "!\n1", "@\n2", "#\n3", "$\n4", "%\n5", "^\n6", "&\n7", "*\n8", "(\n9", ")\n0", "_\n-", "+\n=", lang.BACKSPACE], - [lang.TAB, "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "{\n[", "}\n]", "|\n\\"], - [lang.CTRL, "a", "s", "d", "f", "g", "h", "j", "k", "l", ":\n;", "\"\n'", lang.ENTER], - [lang.SHIFT, "z", "x", "c", "v", "b", "n", "m", "<\n,", ">\n.", "?\n/", lang.SHIFT], - [lang.CTRL, lang.CMD, lang.ALT, lang.SPACE, lang.ALT, lang.CMD, lang.CTRL], + can.core.List([[code.ESC, "close", "clear"], + ["~\n`", "!\n1", "@\n2", "#\n3", "$\n4", "%\n5", "^\n6", "&\n7", "*\n8", "(\n9", ")\n0", "_\n-", "+\n=", code.BACKSPACE], + [code.TAB, "q", "w", "e", "r", "t", "y", "u", "i", "o", "p", "{\n[", "}\n]", "|\n\\"], + [code.CTRL, "a", "s", "d", "f", "g", "h", "j", "k", "l", ":\n;", "\"\n'", code.ENTER], + [code.SHIFT, "z", "x", "c", "v", "b", "n", "m", "<\n,", ">\n.", "?\n/", code.SHIFT], + [code.CTRL, code.CMD, code.ALT, code.SPACE, code.ALT, code.CMD, code.CTRL], ], function(list) { can.core.List(list, function(item, index) { msg.Push(can.base.isObject(item)? item: {type: [mdb.KEY, index == 0? html.HEAD: index == list.length-1? "tail": ""].join(lex.SP), name: item}) }) }); return 750 diff --git a/plugin/local/chat/keyboard.js b/plugin/local/chat/keyboard.js index afa1911b..f1456cae 100644 --- a/plugin/local/chat/keyboard.js +++ b/plugin/local/chat/keyboard.js @@ -13,7 +13,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can) _input: function(can, item, data, target) { item = can.base.isObject(item)? item: {type: html.BUTTON, name: item} if (can.base.isArray(item)) { return can.page.Append(can, target, [{view: "space"}]), can.core.List(item, function(item) { can.onimport._input(can, item, data, target) }) } item._init = item._init||function(target) { switch (target.type) { - case html.TEXT: target.onkeydown = function(event) { can.misc.Event(event, can, function(msg) { if (event.key == lang.ENTER) { + case html.TEXT: target.onkeydown = function(event) { can.misc.Event(event, can, function(msg) { if (event.key == code.ENTER) { can.runAction(can.request(event, data), web.SPACE, [ctx.ACTION, item.name, target.value], function() {}) } })}; break case html.BUTTON: target.onclick = function(event) { can.misc.Event(event, can, function(msg) { diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 1258be98..475cb1a8 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -12,7 +12,8 @@ fieldset.inner>div.output div.content td.text span.constant { color:var(--code-c fieldset.inner>div.output div.content td.text span.string { color:var(--code-string); box-shadow:var(--box-shadow); } fieldset.inner>div.output div.content td.text span.object { color:var(--code-object); } fieldset.inner>div.output>div.project { width:230px; flex:0 0 230px; box-shadow:var(--box-shadow); } -fieldset.inner>div.output>div.project * { font-size:14px; font-family:monospace; outline:none; } +// fieldset.inner>div.output>div.project * { font-size:14px; font-family:monospace; outline:none; } +body:not(.windows) fieldset.inner>div.output>div.project * { font-size:14px; font-family:monospace; outline:none; } fieldset.inner>div.output>div.project div.action { width:100%; } fieldset.inner>div.output>div.project input[type=text] { box-shadow:none; } fieldset.inner>div.output>div.project div.zone>div.item span.icon { font-size:20px; line-height:16px; padding:0 5px; float:right; display:none; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index da3d8fcc..ad52fef1 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -21,19 +21,17 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp case chat.CMD: can.onappend.style(can, html.OUTPUT) can.onexport.session(can, PROJECT_HIDE) == html.HIDE && can.onmotion.hidden(can, can.ui.project) if (can.onexport.session(can, TABVIEW_HIDE) == html.HIDE) { can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.tabs) } - can.onengine.listen(can, chat.ONUNLOAD, function() { - can.onexport.recover(can) - }) + can.onengine.listen(can, chat.ONUNLOAD, function() { can.onexport.recover(can) }) case chat.FULL: // no break default: can.user.isMobile && can.onmotion.hidden(can, can.ui.project), can.onimport.project(can, paths), can.onimport._tabs(can) } var args = can.misc.SearchHash(can), tabs = can.onexport.session(can, RECOVER_TABS), tool = can.onexport.session(can, RECOVER_TOOL) can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE), function() { if (!can.isCmdMode()) { return } if (tabs) { can.core.Next(tabs, function(item, next) { can.onimport.tabview(can, item[0], item[1], item[2], next) }, function() { - args.length > 0 && can.onimport._tabview(can, args[args.length-3], args[args.length-2]||can.Option(nfs.FILE), args[args.length-1]) + args.length > 0 && can.onimport.tabview(can, args[args.length-3], args[args.length-2]||can.Option(nfs.FILE), args[args.length-1]) }) } else { - args.length > 0 && can.onimport._tabview(can, args[args.length-3], args[args.length-2]||can.Option(nfs.FILE), args[args.length-1]) + args.length > 0 && can.onimport.tabview(can, args[args.length-3], args[args.length-2]||can.Option(nfs.FILE), args[args.length-1]) } tool && can.core.Next(tool, function(item, next) { can.onimport.toolkit(can, item, next) }) }), can.onkeymap._build(can) @@ -65,9 +63,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp }); var index = args[0] can.core.List(args.slice(1), function(val) { can.page.Append(can, target, [{text: [val, "", html.ITEM], onclick: function(event) { can.runAction(can.request(event, {index: index}), mdb.INPUTS, [ctx.ARGS], function(msg) { - can.user.carte(event, can, {}, msg[msg.append[0]], function(event, button) { - can.onimport.tabview(can, "", [index, button].join(mdb.FS), ctx.INDEX) - }) + can.user.carte(event, can, {}, msg[msg.append[0]], function(event, button) { can.onimport.tabview(can, "", [index, button].join(mdb.FS), ctx.INDEX) }) }) }}]) }) }, @@ -116,10 +112,6 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp "\u271A": shy({"font-size": "20px", translate: "0 2px"}, function(event) { can.onaction.open(event, can) }), }, function(text, cb) { return cb && {text: [text, html.SPAN, html.VIEW], style: cb.meta, onclick: cb} })) }, - _tabview: function(can, path, file, line, cb) { var key = can.onexport.keys(can, path, file) - if (!can.user.isWebview) { return can.onimport.tabview(can, path, file, line, cb) } - if (!can.db.tabview[key]) { return can.onimport.tabview(can, path, file, line, cb), can.db.tabview[key] = true } - }, tabview: function(can, path, file, line, cb) { path = path||can.Option(nfs.PATH); var key = can.onexport.keys(can, path, file) function isIndex() { return line == ctx.INDEX } function isSpace() { return line == web.SPACE } function show(skip) { can._msg && can._msg.Option && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.db.tabview[key] @@ -504,8 +496,8 @@ Volcanos(chat.ONACTION, { can.onappend.figure(can, {action: "key", mode: chat.SIMPLE, _enter: function(event) { if (event.ctrlKey) { meta.grep() } else { meta[button](), can.onmotion.delay(can, function() { target.focus() }) } return true }, run: function(event, cmds, cb) { var msg = can.request(event); can.core.List(can.core.Split(can.current.text(), "\t {([,:;=<>])}", {detail: true}), function(value) { - if (can.base.isObject(value)) { if (value.type == lang.SPACE) { return } - value.type == lang.STRING && msg.Push(mdb.VALUE, value.left+value.text+value.right), msg.Push(mdb.VALUE, value.text) + if (can.base.isObject(value)) { if (value.type == code.SPACE) { return } + value.type == code.STRING && msg.Push(mdb.VALUE, value.left+value.text+value.right), msg.Push(mdb.VALUE, value.text) } else { value.indexOf(nfs.PT) > -1 && msg.Push(mdb.VALUE, value.split(nfs.PT).pop()), msg.Push(mdb.VALUE, value) } diff --git a/plugin/local/code/xterm.js b/plugin/local/code/xterm.js index 7023957c..17fc6995 100644 --- a/plugin/local/code/xterm.js +++ b/plugin/local/code/xterm.js @@ -48,7 +48,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireModules term.onCursorMove(function() { can.onexport.term(can, term) }) term.loadAddon(new WebLinksAddon.WebLinksAddon()) can.onmotion.clear(can, output), term.open(output), term.focus() - can.onengine.listen(can, chat.ONTHEMECHANGE, function() { can = can.core.Value(can.sup, chat._OUTPUTS_CURRENT) + can.onengine.listen(can, chat.ONTHEMECHANGE, function() { term.selectAll(), can.onimport._connect(can, item, output, tabs, can.base.trimSuffix(term.getSelection(), lex.NL)) }), can.onimport._recover(can, item, term, text) can.page.style(can, output, html.BACKGROUND_COLOR, term._publicOptions.theme.background||cli.BLACK) diff --git a/plugin/local/wiki/word.css b/plugin/local/wiki/word.css index 669e9992..c389b5a6 100644 --- a/plugin/local/wiki/word.css +++ b/plugin/local/wiki/word.css @@ -17,7 +17,7 @@ fieldset.word>div.output svg.story[data-index] text { cursor:pointer; } fieldset.word>div.output input.story[type=button] { font-family:system-ui; font-weight:bold; padding:20px 40px; margin:10px; height:64px; box-shadow:var(--box-shadow); } fieldset.word>div.output fieldset.web.code.inner.output div.output td.line { border-right:var(--box-border); } fieldset.word>div.output fieldset.story { margin:20px 0; } -fieldset.word>div.output fieldset.story>form.option>div.icon.delete { display:none; } +fieldset.word>div.output fieldset.story:not(.float)>form.option>div.icon.delete { display:none; } fieldset.word>div.navmenu { background-color:inherit; overflow:auto; min-width:120px; clear:both; float:left; } fieldset.word>div.navmenu div.list { margin-left:20px; } diff --git a/plugin/state.js b/plugin/state.js index cc7e0b46..c1834891 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -13,83 +13,51 @@ Volcanos(chat.ONIMPORT, { _inner: function(can, msg) { can.onappend.table(can, msg), can.onappend.board(can, msg), can.onmotion.story.auto(can) }, _field: function(can, msg, cb) { var height = can.ConfHeight(), width = can.ConfWidth(); can.page.SelectChild(can, can._output, can.page.Keys(html.TABLE, html.DIV_CODE), function(target) { height -= target.offsetHeight }) height = can.base.Min(msg.Option(html.HEIGHT)||height, can.isCmdMode()? can.ConfHeight()/2: 320), width = msg.Option(html.WIDTH)||can.ConfWidth() - msg.Table(function(item) { can.onappend._plugin(can, item, {index: item.index, args: can.base.Obj(item.args||item.arg, []), height: height, width: width}, function(sub, meta) { - sub.Conf(can.base.Obj(item.conf)); if (sub.isSimpleMode()) { sub.ConfHeight(can.ConfHeight()/2) - var res = can.request(); res.Echo(sub.Conf(ice.MSG_RESULT)), can.onappend._output(sub, res, sub.Conf(ctx.DISPLAY)); return - } - if (can.page.ClassList.has(can, sub._target, html.FLOAT)) { - height = window.innerHeight/2, width = window.innerWidth/2 - can.onmotion.move(can, sub._target, {left: window.innerWidth-width, top: window.innerHeight-height}) - } - sub.run = function(event, cmds, cb) { sub.onimport.size(sub, height, width, true) - sub.onexport.output = function() { sub.onimport.size(sub, height, width, true) - // can.page.SelectChild(can, can._output, html.TABLE, function(target) { can.page.style(can, target, html.MAX_HEIGHT, height, html.DISPLAY, html.BLOCK) }) - }, can.run(event, (!msg.Option("_index") || msg.Option("_index") == can._index || can._index.indexOf("can.") == 0? msg[ice.MSG_PREFIX]||[]: [ice.RUN, msg.Option("_index")]).concat(cmds), cb, true) - } - sub._target.onclick = function() { - can.page.SelectChild(can, can._output, html.FIELDSET, function(target) { can.page.style(can, target, "z-index", "9") }) - can.page.style(can, sub._target, "z-index", "10") - } - can.base.isFunc(cb) && cb(sub) + msg.Table(function(item) { can.onappend._plugin(can, item, {index: item.index, args: can.base.Obj(item.args||item.arg, []), height: height, width: width}, function(sub) { + sub.run = function(event, cmds, cb) { var index = msg.Option(ice.MSG_INDEX) + can.run(event, (!index || index == can._index || index.indexOf("can.") == 0? msg[ice.MSG_PREFIX]||[]: [ice.RUN, index]).concat(cmds), cb, true) + }, can.page.ClassList.has(can, sub._target, html.FLOAT)? can.onmotion.float(sub): sub.onimport.size(sub, height, width, true), cb && cb(sub) }) }) }, - _float: function(can, msg) { var arg = msg._arg; msg.Table(function(item) { can.onappend._plugin(can, item, {index: item.index, args: arg? arg.slice(1): [], mode: chat.FLOAT}, function(sub, meta) { - sub.run = function(event, cmds, cb) { can.runAction(can.request(event, {path: msg.Option(nfs.PATH), text: msg.Option(mdb.TEXT)}), [ice.RUN, arg[0]], cmds, cb) } - can.getActionSize(function(left, top, width, height) { left = left||0, top = !can.Mode()? 120: 0, can.onmotion.move(can, sub._target, {left: left, top: top}) - sub.onimport.size(sub, can.base.Max(height, can.page.height())-top-(can.user.isMobile&&!can.user.isLandscape()? 2*html.ACTION_HEIGHT: 0), width, true) - }) - }, document.body) }) }, + _float: function(can, msg) { can.onimport._field(can, msg, function(sub) { can.onmotion.float(sub) }) }, _hold: function(can, msg, arg) { can.user.toast(can, arg||ice.SUCCESS) }, - _back: function(can) { can._history.pop(); for (var index = 0, his = can._history.pop(); his; his = can._history.pop()) { if (his[0] == ctx.ACTION) { continue } - can.page.SelectArgs(can, can._option, "", function(item) { item.value = his[index++]||"" - can.page.Select(can, item.parentNode, "span.value", function(target) { target.innerText = target.value||"" }) - }) - can.page.SelectArgs(can, can._action, "", function(item) { item.value = his[index++]||"" }) - can.Update(); break - } !his && can.Update() }, + _back: function(can) { can._history.pop(); for (var i = 0, his = can._history.pop(); his; his = can._history.pop()) { if (his[0] == ctx.ACTION) { continue } + can.page.SelectArgs(can, can._option, "", function(target) { target.value = his[i++]||"", can.page.Select(can, target.parentNode, "span.value", function(target) { target.innerText = target.value||"" }) }) + can.page.SelectArgs(can, can._action, "", function(target) { target.value = his[i++]||"" }); break + } can.Update() }, _rich: function(can, msg) { if (can.page.Select(can, can._output, [html.TABLE_CONTENT, html.TBODY], function(table) { var head = can.page.Select(can, can._output, [html.TABLE_CONTENT, html.TH], function(th) { return th.innerText }) return can.page.Append(can, table, msg.Table(function(value) { return {row: can.core.List(head, function(key) { return value[key] })} })) }).length == 0) { can.onappend.table(can, msg) } }, - _grow: function(can, msg, arg) { var sub = can.core.Value(can, chat._OUTPUTS_CURRENT) + _grow: function(can, msg, arg) { var sub = can.sub if (sub && sub.onimport && sub.onimport.grow) { return sub.onimport.grow(sub, msg, arg) } arg = can.page.Color(arg); if (can.page.Select(can, can._output, html.DIV_CODE, function(div) { return can.page.style(can, div, html.MAX_HEIGHT, 400), can.page.Append(can, div, [{text: arg}]), div.scrollBy(0, 10000), true }).length == 0) { can.onappend.board(can, arg) } }, - _open: function(can, msg, arg) { return can.Update(), can.user.open(arg) }, - _close: function(can, msg) { return can.user.close() || history.back() }, - size: function(can, height, width, auto, mode) { height -= can.onexport.actionHeight(can)+can.onexport.statusHeight(can) - auto? (can.page.style(can, can._output, html.HEIGHT, "", html.WIDTH, "", html.MAX_HEIGHT, height? can.ConfHeight(height): "", html.MAX_WIDTH, can.ConfWidth(width)), - can.page.style(can, can._target, html.HEIGHT, "", html.WIDTH, "")): - (can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(height), html.WIDTH, can.ConfWidth(width), html.MAX_HEIGHT, "", html.MAX_WIDTH, ""), - can.page.style(can, can._target, html.WIDTH, can.ConfWidth(width))) - var sub = can.core.Value(can, chat._OUTPUTS_CURRENT); if (!sub) { return can.Mode(mode), auto } sub.ConfHeight(can.ConfHeight()), sub.ConfWidth(can.ConfWidth()) - if (mode) { sub.Mode(can.Mode(mode)), sub.onlayout[mode](sub, height, width) } else { sub.onlayout._init(sub, height, width) } return auto - }, + _open: function(can, msg, arg) { can.user.open(arg), can.Update() }, + _close: function(can, msg) { can.user.close() || history.back() }, change: function(event, can, name, value, cb) { return can.page.SelectArgs(can, can._option, "", function(input) { if (input.name != name || value == input.value) { return } can.page.Select(can, input.parentNode, "span.value", function(target) { target.innerText = value }) return input.value = value, can.Update(event, can.Input([], true), cb), input })[0] }, + size: function(can, height, width, auto, mode) { can.Mode(mode), can.ConfHeight(height), can.ConfWidth(width), height -= can.onexport.actionHeight(can)+can.onexport.statusHeight(can) + auto? (can.page.style(can, can._output, html.HEIGHT, "", html.WIDTH, "", html.MAX_HEIGHT, height, html.MAX_WIDTH, width), can.page.style(can, can._target, html.HEIGHT, "", html.WIDTH, "")): + (can.page.style(can, can._output, html.HEIGHT, height, html.WIDTH, width, html.MAX_HEIGHT, "", html.MAX_WIDTH, ""), can.page.style(can, can._target, html.WIDTH, width)) + var sub = can.sub; if (!sub) { return auto } sub.Mode(mode), sub.ConfHeight(height), sub.ConfWidth(width) + mode? sub.onlayout[mode](sub, height, width): sub.onlayout._init(sub, height, width); return auto + }, }) Volcanos(chat.ONACTION, {list: [ - "刷新界面", "刷新数据", "切换浮动", "切换全屏", "远程控制", "共享工具", "打开链接", "生成链接", "生成脚本", "生成图片", - ["视图", "操作", "专注", "项目", "预览", "演示", "状态"], - ["其它", "扩展参数", "保存参数", "清空参数", "复制数据", "下载数据", "清空数据", "删除工具"], - ["调试", "查看文档", "查看脚本", "查看源码", "查看配置", "查看日志", "打包页面"], + "刷新数据", "刷新界面", + "切换浮动", "切换全屏", + "远程控制", "共享工具", + "打开链接", "生成链接", + "生成脚本", "生成图片", + ["视图", "参数", "操作", "状态", "专注", "项目", "预览", "演示"], + ["数据", "保存参数", "清空参数", "复制数据", "下载数据", "清空数据", "删除工具"], + ["调试", "打包页面", "查看文档", "查看脚本", "查看源码", "查看配置", "查看日志"], ], - "参数": function(event, can) { can.onmotion.toggle(can, can._option) }, - "操作": function(event, can) { can.onmotion.toggle(can, can._action) }, - "专注": function(event, can) { can.onaction._view(event, can, function(sub) { if (!sub.ui) { return } - sub.ui.project && can.onmotion.hidden(can, sub.ui.project) - sub.ui.profile && can.onmotion.hidden(can, sub.ui.profile) - sub.ui.display && can.onmotion.hidden(can, sub.ui.display) - }) }, - "项目": function(event, can) { can.onaction._view(event, can, function(sub) { sub.ui && sub.ui.project && can.onmotion.toggle(can, sub.ui.project) }) }, - "预览": function(event, can) { can.onaction._view(event, can, function(sub) { sub.ui && sub.ui.project && can.onmotion.toggle(can, sub.ui.profile) }) }, - "演示": function(event, can) { can.onaction._view(event, can, function(sub) { sub.ui && sub.ui.project && can.onmotion.toggle(can, sub.ui.display) }) }, - "状态": function(event, can) { can.onaction._view(event, can, function(sub) { can.onmotion.toggle(can, can._status) }) }, - _view: function(event, can, cb) { var sub = can.core.Value(can, chat._OUTPUTS_CURRENT); cb(sub), sub.onimport.layout(sub) }, _engine: function(event, can, button) { can.Update(event, [ctx.ACTION, button].concat(can.Input())) }, _switch: function(can, sub, mode, save, load) { if (can.page.ClassList.neg(can, can._target, mode)) { @@ -98,71 +66,74 @@ Volcanos(chat.ONACTION, {list: [ html.ACTION, can.page.isDisplay(can._action), html.STATUS, can.page.isDisplay(can._status), html.OUTPUT, can.base.Copy({}, can._output.style, html.HEIGHT, html.WIDTH, html.MAX_HEIGHT, html.MAX_WIDTH), ctx.STYLE, can.base.Copy({}, can._target.style, html.LEFT, html.TOP, html.RIGHT, html.BOTTOM), save(), - )), can.onimport.size(can, can.ConfHeight()+can.onexport.actionHeight(can)+can.onexport.statusHeight(can), can.ConfWidth(), false, mode) + )), can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), false, mode) } else { var back = (can._mode_list = can._mode_list||[]).pop(); if (!back) { return } can.onmotion.toggle(can, can._action, back.action), can.onmotion.toggle(can, can._status, back.status) - can.onimport.size(can, back.height+can.onexport.actionHeight(can)+can.onexport.statusHeight(can), back.width, false, mode) - can.page.style(can, can._target, html.LEFT, back.style.left, html.TOP, back.style.top) - can.base.isFunc(load) && load(back) + can.onimport.size(can, back.height, back.width, false, mode), can.page.style(can, can._target, back.style), load && load(back) } }, - "刷新界面": function(event, can) { var sub = can._outputs[0]; sub.onlayout._init(sub), can.user.toastSuccess(can) }, "刷新数据": function(event, can) { can.Update(event, can.Input()), can.user.toastSuccess(can) }, + "刷新界面": function(event, can) { var sub = can.sub; sub.onlayout._init(sub, sub.ConfHeight(), sub.ConfWidth()), can.user.toastSuccess(can) }, "切换浮动": function(event, can, button, sub) { can.onaction._switch(can, sub, chat.FLOAT, function() { can.onmotion.hidden(can, can._action), can.onmotion.hidden(can, can._status) - can.getActionSize(function(left, top) { - can.onmotion.move(can, can._target, {left: (left||0)+(can.user.isMobile? 0: html.PLUGIN_MARGIN), top: can.page.height()/2-html.PLUGIN_MARGIN-html.ACTION_HEIGHT}) - can.onmotion.resize(can, can._target, function(height, width) { can.onimport.size(can, height, width) }, top) - }) - can.ConfHeight(can.page.height()/2-can.onexport.actionHeight(can)-can.onexport.statusHeight(can)), can.ConfWidth(can.page.width()/(can.user.isMobile? 1: 2)) + can.onmotion.float(can), can.onmotion.resize(can, can._target, function(height, width) { can.onimport.size(can, height, width) }) }) }, "切换全屏": function(event, can, button, sub) { can.onaction._switch(can, sub, chat.FULL, function() { can.page.style(can, can._target, html.LEFT, "", html.TOP, can.onexport.marginTop(), html.BOTTOM, "") - can.ConfHeight(can.page.height()-can.onexport.marginTop()-can.onexport.actionHeight(can)-can.onexport.statusHeight(can)-can.onexport.marginBottom(can)), can.ConfWidth(can.page.width()) + can.ConfHeight(can.page.height()-can.onexport.marginTop()-can.onexport.marginBottom(can)), can.ConfWidth(can.page.width()) }) }, "远程控制": function(event, can) { can.onaction.keyboard(event, can) }, - "共享工具": function(event, can) { var meta = can.Conf(); can.onmotion.share(event, can, [ - {name: chat.TITLE, value: meta.name}, {name: chat.THEME, values: [can.getHeader(chat.THEME), html.DARK, html.LIGHT, cli.WHITE, cli.BLACK]}, - ], [mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input())]) }, + "共享工具": function(event, can) { var meta = can.Conf(); can.onmotion.share(event, can, [{name: chat.TITLE, value: meta.name}], [mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input())]) }, "打开链接": function(event, can) { can.user.opens(can.onexport.link(can)) }, "生成链接": function(event, can) { can.onmotion.share(event, can, [], [mdb.LINK, can.user.copy(event, can, can.onexport.link(can))]) }, - "生成脚本": function(event, can) { var conf = can.Conf(), args = can.Input().join(lex.SP), list = [ - "export ctx_dev="+location.origin+"; ctx_temp=$(mktemp); curl -o $ctx_temp -fsSL $ctx_dev;"+" source $ctx_temp cmd "+(conf.index||"")+lex.SP+args, + "生成脚本": function(event, can) { var args = can.Input().join(lex.SP), list = [ + "export ctx_dev="+location.origin+"; ctx_temp=$(mktemp); curl -o $ctx_temp -fsSL $ctx_dev;"+" source $ctx_temp cmd "+(can.Conf(ctx.INDEX))+lex.SP+args, "ish_sys_dev_run_command "+args, "ish_sys_dev_run_action", "ish_sys_dev_run_source", ]; can.user.copy(event, can, list[0]) }, - "生成图片": function(event, can) { can.user.toimage(can, can._name) }, + "生成图片": function(event, can) { can.user.toimage(can, can.name) }, + + _view: function(can, cb) { var sub = can.sub; cb(sub), sub.onimport.layout(sub) }, + "参数": function(event, can) { can.onaction._view(can, function(sub) { can.onmotion.toggle(can, can._option) }) }, + "操作": function(event, can) { can.onaction._view(can, function(sub) { can.onmotion.toggle(can, can._action) }) }, + "状态": function(event, can) { can.onaction._view(can, function(sub) { can.onmotion.toggle(can, can._status) }) }, + "专注": function(event, can) { can.onaction._view(can, function(sub) { if (!sub.ui) { return } + sub.ui.project && can.onmotion.hidden(can, sub.ui.project) + sub.ui.profile && can.onmotion.hidden(can, sub.ui.profile) + sub.ui.display && can.onmotion.hidden(can, sub.ui.display) + }) }, + "项目": function(event, can) { can.onaction._view(can, function(sub) { sub.ui && sub.ui.project && can.onmotion.toggle(can, sub.ui.project) }) }, + "预览": function(event, can) { can.onaction._view(can, function(sub) { sub.ui && sub.ui.project && can.onmotion.toggle(can, sub.ui.profile) }) }, + "演示": function(event, can) { can.onaction._view(can, function(sub) { sub.ui && sub.ui.project && can.onmotion.toggle(can, sub.ui.display) }) }, - "扩展参数": function(event, can) { can.onmotion.toggle(can, can._action) }, "保存参数": function(event, can) { can.search(event, ["River.ondetail.保存参数"]) }, - "清空参数": function(event, can) { can.page.SelectArgs(can, can._option, "", function(item) { return item.value = "" }) }, - "复制数据": function(event, can) { var sub = can._outputs[0]; can.user.copy(event, can, sub.onexport.table(sub)||sub.onexport.board(sub)) }, - "下载数据": function(event, can) { var sub = can._outputs[0]; can.user.input(event, can, [{name: "filename", value: can.Conf(mdb.NAME)}], function(list) { + "清空参数": function(event, can) { can.page.SelectArgs(can, can._option, "", function(target) { return target.value = "" }) }, + "复制数据": function(event, can) { var sub = can.sub; can.user.copy(event, can, sub.onexport.table(sub)||sub.onexport.board(sub)) }, + "下载数据": function(event, can) { var sub = can.sub; can.user.input(event, can, [{name: "filename", value: can.Conf(mdb.NAME)}], function(list) { can.user.downloads(can, sub.onexport.table(sub), list[0], nfs.CSV), can.user.downloads(can, sub.onexport.board(sub), list[0], nfs.TXT) }) }, "清空数据": function(event, can) { can.onmotion.clear(can, can._output) }, "删除工具": function(event, can) { can.onaction._close(event, can) }, + "打包页面": function(event, can) { can.onengine.signal(can, "onwebpack", can.request(event)) }, "查看文档": function(event, can) { can.onengine.signal(can, "ondebugs", can.request(event, {action: ice.HELP, index: can.Conf(ctx.INDEX)})) }, "查看脚本": function(event, can) { can.onengine.signal(can, "ondebugs", can.request(event, {action: nfs.SCRIPT, index: can.Conf(ctx.INDEX)})) }, "查看源码": function(event, can) { can.onengine.signal(can, "ondebugs", can.request(event, {action: nfs.SOURCE, index: can.Conf(ctx.INDEX)})) }, "查看配置": function(event, can) { can.onengine.signal(can, "ondebugs", can.request(event, {action: ctx.CONFIG, index: can.Conf(ctx.INDEX)})) }, - "查看日志": function(event, can) { var sub = can._outputs[0]; sub.onimport.tool(sub, ["can.debug"], function(sub) { sub.select() }) }, - "打包页面": function(event, can) { can.onengine.signal(can, "onwebpack", can.request(event)) }, + "查看日志": function(event, can) { var sub = can.sub; sub.onimport.tool(sub, ["can.debug"], function(sub) { sub.select() }) }, - refresh: function(event, can) { var sub = can.core.Value(can, chat._OUTPUTS_CURRENT); if (sub) { sub.ConfHeight(can.ConfHeight()), sub.ConfWidth(can.ConfWidth()), sub.onimport.layout(sub) } }, + refresh: function(event, can) { can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), true, can.Mode()) }, close: function(event, can) { if (can.isCmdMode()) { can.user.close() } else if (can.isFullMode()) { - can.onaction["切换全屏"](event, can, "切换全屏", can.core.Value(can, chat._OUTPUTS_CURRENT)) + can.onaction["切换全屏"](event, can, "切换全屏", can.sub) } else if (can.isFloatMode()) { - can.onaction["切换浮动"](event, can, "切换浮动", can.core.Value(can, chat._OUTPUTS_CURRENT)) + can.onaction["切换浮动"](event, can, "切换浮动", can.sub) } else { can.onaction._close(event, can) } - }, - _close: function(event, can) { can.page.Remove(can, can._target) }, + }, _close: function(event, can) { can.page.Remove(can, can._target) }, clear: function(event, can) { can.onmotion.clear(can, can._output) }, actions: function(event, can) { can.onmotion.toggle(can, can._action) }, - full: function(event, can) { can.onaction["切换全屏"](event, can, "切换全屏", can.core.Value(can, chat._OUTPUTS_CURRENT)) }, + full: function(event, can) { can.onaction["切换全屏"](event, can, "切换全屏", can.sub) }, prev: function(event, can) { can.runAction(event, mdb.PREV, [can.Status(mdb.TOTAL)||0, can.Option(mdb.LIMIT)||can.Action(mdb.LIMIT)||can._msg.Option("cache.limit")||"", can.Option(mdb.OFFEND)||can.Action(mdb.OFFEND)||""], function(msg) { can.onimport._process(can, msg) }) }, next: function(event, can) { can.runAction(event, mdb.NEXT, [can.Status(mdb.TOTAL)||0, can.Option(mdb.LIMIT)||can.Action(mdb.LIMIT)||can._msg.Option("cache.limit")||"", can.Option(mdb.OFFEND)||can.Action(mdb.OFFEND)||""], function(msg) { can.onimport._process(can, msg) }) }, upload: function(event, can) { can.user.upload(event, can) }, @@ -209,14 +180,13 @@ Volcanos(chat.ONACTION, {list: [ }) }, }) Volcanos(chat.ONEXPORT, { - args: function(can) { return can.page.SelectArgs(can, can._option, "", function(target) { return target.value }) }, - output: function(can, msg) {}, action: function(can, button, line) {}, record: function(can, value, key, data) {}, + output: function(can, msg) {}, action: function(can, button, data) {}, record: function(can, value, key, data) {}, + title: function(can, title) { can.isCmdMode() && can.user.title(title) }, marginTop: function() { return 0 }, marginBottom: function() { return 0 }, actionHeight: function(can) { return can.page.ClassList.has(can, can._target, html.OUTPUT)? 0: html.ACTION_HEIGHT }, statusHeight: function(can) { return can.page.ClassList.has(can, can._target, html.OUTPUT) || !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) + link: function(can) { var meta = can.Conf(), args = can.Option() args.pod = meta._space||meta.space||meta.pod, args.cmd = meta.index||can.core.Keys(meta.ctx, meta.cmd) return can.misc.MergePodCmd(can, args, true) - }, + }, args: function(can) { return can.Option() } }) diff --git a/plugin/story/spide.js b/plugin/story/spide.js index c5d5bd2b..9436ec59 100644 --- a/plugin/story/spide.js +++ b/plugin/story/spide.js @@ -52,14 +52,14 @@ Volcanos(chat.ONACTION, {list: [[ice.VIEW, "横向", "纵向"], [html.SIZE, 24, }) }, }) -Volcanos(chat.ONEXPORT, {list: [mdb.TIME, mdb.COUNT]}) Volcanos(chat.ONDETAIL, { onclick: function(event, can, tree) { if (tree.list.length > 0 || tree.name.endsWith(can.Conf(lex.SPLIT))) { return tree.hide = !tree.hide, can.onaction[can.Action(ice.VIEW)||"横向"](event, can) } for (var node = tree; node; node = node.last) { can.request(event, node.meta) } can.run(can.request(event, can.Option()), can.base.Obj(can.Conf(lex.PREFIX), []).concat(can.Conf(ctx.ACTION)||[], [tree.file||"", tree.name]), function(msg) { - if (msg.Length() == 0) { return can.onappend._float(can, web.CODE_INNER, [can._msg.Option(nfs.DIR_ROOT), tree.file, tree.line], code.INNER) } + if (msg.Length() == 0) { return can.onappend._float(can, web.CODE_INNER, [can._msg.Option(nfs.DIR_ROOT), tree.file, tree.line]) } if (msg.Append(mdb.INDEX)) { return msg.Table(function(value) { can.onappend._float(can, value.index, value.args) }) } }, true) }, }) +Volcanos(chat.ONEXPORT, {list: [mdb.TIME, mdb.COUNT]}) diff --git a/plugin/story/trend.js b/plugin/story/trend.js index 48e8d848..f3aed615 100644 --- a/plugin/story/trend.js +++ b/plugin/story/trend.js @@ -86,9 +86,7 @@ Volcanos(chat.ONACTION, {list: [[ice.VIEW, "趋势图", "柱状图", "折线图" Volcanos(chat.ONDETAIL, { onmouseenter: function(event, can, item) { can.Status(item) }, onclick: function(event, can, item) { can.run(can.request(event, item, can.Option()), [mdb.DETAIL], function(msg) { - can.getActionSize(function(left, top, width, height) { msg.Option(html.HEIGHT, height*3/4), msg.Option(html.WIDTH, width*3/4) - can.sup.onimport._field(can.sup, msg, function(sub) { can.onmotion.move(can, sub._target, {left: left||0, top: (top||0)+height/4}) }) - }) + msg.Append(ctx.STYLE, html.FLOAT), can.sup.onimport._field(can, msg) }) }, }) Volcanos(chat.ONEXPORT, {list: ["from", "commit", "total", "max", "date", "text", "add", "del"], diff --git a/plugin/table.js b/plugin/table.js index 90456fd0..217738a2 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -6,88 +6,29 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( can.onappend.table(can, msg, null, target), can.onappend.board(can, msg, target), can.onmotion.story.auto(can, target) } }, + card: function(can, msg, target) { can.page.Appends(can, target||can._output, msg.Table(function(value) { + return {view: [[html.ITEM, value.status]], list: [{view: [wiki.TITLE, html.DIV, value.name]}, {view: [wiki.CONTENT, html.DIV, value.text]}, + {view: html.ACTION, inner: value.action, onclick: function(event) { can.run(can.request(event, value), [ctx.ACTION, event.target.name]) }}, + ]} + })), can.onlayout.expand(can, can._output, 320) }, _vimer_zone: function(can, msg, target) { msg.Table(function(value) { var action = [] can.page.Select(can, can.page.Create(can, html.DIV, value.action), html.INPUT, function(target) { action.push(target.name), target.name != target.value && can.user.trans(can, kit.Dict(target.name, target.value)) }) can.onimport.item(can, {name: can.page.Color(value[can.Conf(mdb.FIELD)||mdb.VIEW]||value[mdb.NAME]||value[mdb.TEXT]||value[mdb.TYPE]), title: value[mdb.TEXT]}, function(event) { can.sup.onexport.record(can, value.name, mdb.NAME, value, event) - }, function() { return shy(action, function(event, button, meta, carte) { can.misc.Event(event, can, function(msg) { - can.sup.onexport.action(can, button, value) || can.run(event, [ctx.ACTION, button], function(msg) { can.sup.onimport._process(can.sup, msg) || can.Update() }), carte.close() + }, function() { return shy(action, function(event, button, meta, carte) { can.misc.Event(event, can, function(msg) { carte.close() + can.sup.onexport.action(can, button, value) || can.run(event, [ctx.ACTION, button], function(msg) { can.sup.onimport._process(can.sup, msg) || can.Update() }) }, value) }) }) }) }, - _system_app: function(can, msg, target) { can.page.Appends(can, target, msg.Table(function(item) { var name = item.name||item.text - return {view: html.ITEM, style: {"text-align": "center", margin: 10, width: 100, "float": "left"}, list: [ - {type: html.IMG, src: "/share/local/usr/icons/"+item.text, style: {display: html.BLOCK, width: 100}}, - {text: name.split(nfs.PT)[0].replace(lex.SP, lex.NL), style: {display: html.BLOCK, height: 40}}, - ], onclick: function(event) { can.runAction(can.request(event, item, can.Option()), "xterm", []) }} - })) }, - card: function(can, msg, target) { can.page.Appends(can, target||can._output, msg.Table(function(item) { - return {view: [[html.ITEM, item.status]], list: [{view: [wiki.TITLE, html.DIV, item.name]}, {view: [wiki.CONTENT, html.DIV, item.text]}, - {view: html.ACTION, inner: item.action, onclick: function(event) { can.run(can.request(event, item), [ctx.ACTION, event.target.name]) }}, - ]} - })), can.onlayout.expand(can, can._output, 320) }, - icon: function(can, msg, target, cb) { return msg.Table(function(value) { value.icon = can.misc.PathJoin(value.icon||can.page.drawText(can, value.name, 80)) - return can.page.Append(can, target, [{view: html.ITEM, list: [{view: html.ICON, list: [{img: value.icon+(value.space? "?pod="+value.space: "")}]}, {view: [mdb.NAME, "", value.name]}], _init: function(target) { - cb && cb(target, value) - }, onclick: function(event) { can.sup.onexport.record(can.sup, value.name, mdb.NAME, value) }}])._target - }) }, - _icon: function(can, name, button, target) { can.page.Append(can, target, [{text: [can.page.unicode[name]||name, html.SPAN, html.ICON], onclick: function(event) { - can.base.isFunc(button)? button(event, button): can.onaction[button](event, can, button), can.onkeymap.prevent(event) - }}]) }, - tabs: function(can, list, cb, cbs, action) { action = action||can._action; return can.page.Append(can, action, can.core.List(list, function(tabs) { - function close(target) { var next = target.nextSibling||target.previousSibling; if (!next) { return } - next.click(), can.onmotion.delay(can, function() { can.base.isFunc(cbs) && cbs(tabs), can.page.Remove(can, target) }) - } - return {view: html.TABS, title: tabs.text, list: [{text: [tabs.name, html.SPAN, mdb.NAME]}, {icon: mdb.DELETE, onclick: function(event) { - close(tabs._target), can.onkeymap.prevent(event) - }}], onclick: function(event) { - can.onmotion.select(can, action, html.DIV_TABS, tabs._target), can.base.isFunc(cb) && cb(event, tabs) - }, _init: function(target) { tabs._target = target; var menu = tabs._menu||shy() - target._close = function() { close(target) } - can.page.Modify(can, target, {draggable: true, _close: function() { close(target) }, - ondragstart: function(event) { action._drop = function(before) { before.parentNode == action && action.insertBefore(target, before) } }, - ondragover: function(event) { event.preventDefault(), action._drop(event.target) }, - oncontextmenu: function(event) { can.user.carte(event, can, kit.Dict( - "Close", function(event) { close(target) }, - "Close Other", function(event) { can.page.SelectChild(can, action, html.DIV_TABS, function(target) { target == tabs._target || close(target) }) }, - "Rename Tabs", function(event) { can.user.input(event, can, [mdb.NAME], function(list) { - can.page.Select(can, target, "span.name", function(target) { can.page.Modify(can, target, list[0]||tabs.name) }) - }) }, menu.meta, - ), ["Close", "Close Other", "Rename Tabs", ""].concat(can.base.getValid(menu.list, can.core.Item(menu.meta))), function(event, button, meta) { (meta[button]||menu)(event, button, meta) }) }, - }), target.click() - }} - }))._target }, - tool: function(can, list, cb, target, status) { target = target||can._output, status = status||can._status - can.core.List(list.reverse(), function(meta) { can.base.isString(meta) && (meta = {index: meta}), meta.mode = html.FLOAT - can.onimport.plug(can, meta, function(sub) { can.onmotion.hidden(can, sub._target), sub._legend._target = sub._target - status.appendChild(sub._legend), sub._legend.oncontextmenu = sub._legend.onclick, sub._legend.onclick = function(event) { can.misc.Event(event, can, function(msg) { - if (can.page.SelectOne(can, status, nfs.PT+html.SELECT, function(target) { can.onmotion.hidden(can, target._target), can.page.ClassList.del(can, target, html.SELECT); return target }) == sub._legend) { return } - sub.onimport.size(sub, can.ConfHeight()/2-html.ACTION_HEIGHT, (can.ConfWidth()-(can.ui && can.ui.project? can.ui.project.offsetWidth: 0))/2) - sub.onaction._close = function() { can.page.Remove(can, sub._target), can.page.Remove(can, sub._legend) } - can.onmotion.select(can, status, html.LEGEND, sub._legend), can.onmotion.toggle(can, sub._target, true), sub.Focus() - if (sub._delay_init || meta.msg) { sub._delay_init = false, meta.msg = false, sub.Update() } - }) }, sub._delay_init = true, sub.onaction.close = function() { sub.select() }, sub.select = function() { return sub._legend.click(), sub } - sub.hidden = function() { can.onmotion.hidden(can, sub._target), can.page.ClassList.del(can, sub._legend, html.SELECT) } - can.base.isFunc(cb) && cb(sub) - }, target) - }) - }, - plug: function(can, meta, cb, target, field) { if (!meta || !meta.index) { return } - meta.type = meta.type||html.PLUG, meta.name = meta.index, can.onappend.plugin(can, meta, function(sub) { sub.sup = can - sub.run = function(event, cmds, cb) { if (can.page.Select(can, sub._option, "input[name=path]").length > 0 && sub.Option(nfs.PATH) == "") { sub.request(event, {path: nfs.PWD}) } - can.runActionCommand(can.request(event, can.Option()), meta.index, cmds, cb) - }, sub.onaction.close = function() { can.onmotion.hidden(can, target) }, can.base.isFunc(cb) && cb(sub) - }, target, field) - }, _zone: function(can, zone, index, cb, field) { zone._delay_init = function() { can.onimport.plug(can, {index: index, style: html.OUTPUT, mode: mdb.ZONE, field: field}, function(sub) { - sub.run = function(event, cmds, cb) { can.request(event, {mode: mdb.ZONE}), can.runActionCommand(event, index, cmds, cb) } - var action = can.core.List(sub.Conf(ctx.INPUTS), function(item) { if (item.type == html.BUTTON && [ice.LIST, ice.BACK].indexOf(item.name) == -1) { return item.name } }) + sub.run = function(event, cmds, cb) { can.runActionCommand(can.request(event, {mode: mdb.ZONE}), index, cmds, cb) } zone._icon(kit.Dict( can.page.unicode.refresh, function(event) { sub.Update(event) }, "+", function(event) { sub.Update(event, [ctx.ACTION, mdb.CREATE]) }, "=", function() { can.onimport.tabview(can, "", sub._index, ctx.INDEX) }, )) + var action = can.core.List(sub.Conf(ctx.INPUTS), function(item) { if (item.type == html.BUTTON && [ice.LIST, ice.BACK].indexOf(item.name) == -1) { return item.name } }) sub.onexport.output = function(_sub, msg) { zone._total(msg.Length()), cb(sub, msg) zone._menu = shy({_trans: sub._trans}, action.concat(can.base.Obj(msg.Option(ice.MSG_ACTION), [])), function(event, button, meta, carte) { sub.Update(event, [ctx.ACTION, button]), carte.close() @@ -126,8 +67,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( }}, {view: html.LIST, _init: function(target) { can.ui.zone = can.ui.zone||{}, can.ui.zone[zone.name] = zone, zone._target = target zone._total = function(total) { return can.page.Modify(can, zone._search, {placeholder: "search in "+total+" items"}), total } - zone._icon = function(list) { - can.page.Select(can, zone._legend, html.SPAN_ICON, function(target) { can.page.Remove(can, target) }) + zone._icon = function(list) { can.page.Select(can, zone._legend, html.SPAN_ICON, function(target) { can.page.Remove(can, target) }) can.core.Item(list, function(name, button) { can.onimport._icon(can, name, button, zone._legend) }) } zone.refresh = function() { can.onmotion.clear(can, target), zone._init(target, zone) } @@ -137,8 +77,16 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( ]} })) }, - tree: function(can, list, field, split, cb, target, node) { - node = node||{"": target}; can.core.List(list, function(item) { item[field] && can.core.List(item[field].split(split), function(value, index, array) { if (!value) { return } + _icon: function(can, name, button, target) { can.page.Append(can, target, [{text: [can.page.unicode[name]||name, html.SPAN, html.ICON], onclick: function(event) { + can.base.isFunc(button)? button(event, button): can.onaction[button](event, can, button), can.onkeymap.prevent(event) + }}]) }, + icon: function(can, msg, target, cb) { return msg.Table(function(value) { value.icon = can.misc.PathJoin(value.icon||can.page.drawText(can, value.name, 80)) + return can.page.Append(can, target, [{view: html.ITEM, list: [{view: html.ICON, list: [{img: value.icon+(value.space? "?pod="+value.space: "")}]}, {view: [mdb.NAME, "", value.name]}], _init: function(target) { + cb && cb(target, value) + }, onclick: function(event) { can.sup.onexport.record(can.sup, value.name, mdb.NAME, value) }}])._target + }) }, + tree: function(can, list, field, split, cb, target, node) { node = node||{"": target} + can.core.List(list, function(item) { item[field] && can.core.List(item[field].split(split), function(value, index, array) { if (!value) { return } var last = array.slice(0, index).join(split), name = array.slice(0, index+1).join(split); if (node[name]) { return } var ui = can.page.Append(can, node[last], [{view: html.ITEM, list: [ {view: [[html.EXPAND, item.expand? cli.OPEN: ""], html.DIV, (index==array.length-1? "": can.page.unicode.close)]}, @@ -169,11 +117,55 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( list: function(can, root, cb, target, cbs) { target = target||can._output can.core.List(root.list, function(item) { var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, item.meta.name], onclick: function(event) { can.base.isFunc(cb) && cb(event, item) || can.onmotion.toggle(can, ui.list), can.onmotion.select(can, target, html.DIV_ITEM, event.target) - }, _init: function(target) { - if (item.meta.name == "_") { target.innerHTML = "", can.onappend.style(can, html.SPACE, target) } + }, _init: function(target) { if (item.meta.name == "_") { target.innerHTML = "", can.onappend.style(can, html.SPACE, target) } cbs && cbs(target, item) }}, {view: html.LIST}]); can.onimport.list(can, item, cb, ui.list, cbs) }) }, + tabs: function(can, list, cb, cbs, action) { action = action||can._action; return can.page.Append(can, action, can.core.List(list, function(tabs) { + function close(target) { var next = target.nextSibling||target.previousSibling; if (!next) { return } + next.click(), can.onmotion.delay(can, function() { can.base.isFunc(cbs) && cbs(tabs), can.page.Remove(can, target) }) + } + return {view: html.TABS, title: tabs.text, list: [{text: [tabs.name, html.SPAN, mdb.NAME]}, {icon: mdb.DELETE, onclick: function(event) { + close(tabs._target), can.onkeymap.prevent(event) + }}], onclick: function(event) { + can.onmotion.select(can, action, html.DIV_TABS, tabs._target), can.base.isFunc(cb) && cb(event, tabs) + }, _init: function(target) { var menu = tabs._menu||shy(); tabs._target = target, target._close = function() { close(target) } + can.page.Modify(can, target, {draggable: true, _close: function() { close(target) }, + ondragstart: function(event) { action._drop = function(before) { before.parentNode == action && action.insertBefore(target, before) } }, + ondragover: function(event) { event.preventDefault(), action._drop(event.target) }, + oncontextmenu: function(event) { can.user.carte(event, can, kit.Dict( + "Close", function(event) { close(target) }, + "Close Other", function(event) { can.page.SelectChild(can, action, html.DIV_TABS, function(target) { target == tabs._target || close(target) }) }, + "Rename Tabs", function(event) { can.user.input(event, can, [mdb.NAME], function(list) { + can.page.Select(can, target, "span.name", function(target) { can.page.Modify(can, target, list[0]||tabs.name) }) + }) }, menu.meta, + ), ["Close", "Close Other", "Rename Tabs", ""].concat(can.base.getValid(menu.list, can.core.Item(menu.meta))), function(event, button, meta) { (meta[button]||menu)(event, button, meta) }) }, + }), target.click() + }} + }))._target }, + tool: function(can, list, cb, target, status) { target = target||can._output, status = status||can._status + can.core.List(list.reverse(), function(meta) { can.base.isString(meta) && (meta = {index: meta}), meta.mode = html.FLOAT + can.onimport.plug(can, meta, function(sub) { can.onmotion.hidden(can, sub._target), sub._legend._target = sub._target + status.appendChild(sub._legend), sub._legend.oncontextmenu = sub._legend.onclick, sub._legend.onclick = function(event) { can.misc.Event(event, can, function(msg) { + if (can.page.SelectOne(can, status, nfs.PT+html.SELECT, function(target) { can.onmotion.hidden(can, target._target), can.page.ClassList.del(can, target, html.SELECT); return target }) == sub._legend) { return } + sub.onimport.size(sub, can.ConfHeight()/2, (can.ConfWidth()-(can.ui && can.ui.project? can.ui.project.offsetWidth: 0))/2) + can.onmotion.select(can, status, html.LEGEND, sub._legend), can.onmotion.toggle(can, sub._target, true), sub.Focus() + if (sub._delay_init || meta.msg) { sub._delay_init = false, meta.msg = false, sub.Update() } + }) }, sub._delay_init = true, sub.onaction.close = function() { sub.select() }, sub.select = function() { return sub._legend.click(), sub } + sub.hidden = function() { can.onmotion.hidden(can, sub._target), can.page.ClassList.del(can, sub._legend, html.SELECT) } + sub.onaction._close = function() { can.page.Remove(can, sub._target), can.page.Remove(can, sub._legend) } + can.base.isFunc(cb) && cb(sub) + }, target) + }) + }, + plug: function(can, meta, cb, target, field) { if (!meta || !meta.index) { return } + meta.type = meta.type||html.PLUG, meta.name = meta.index, can.onappend.plugin(can, meta, function(sub) { sub.sup = can + sub.run = function(event, cmds, cb) { + if (can.page.Select(can, sub._option, "input[name=path]").length > 0 && sub.Option(nfs.PATH) == "") { sub.request(event, {path: nfs.PWD}) } + can.runActionCommand(can.request(event, can.Option()), meta.index, cmds, cb) + }, sub.onaction.close = function() { can.onmotion.hidden(can, target) }, can.base.isFunc(cb) && cb(sub) + }, target, field) + }, }) Volcanos(chat.ONLAYOUT, { _init: function(can, height, width) { can.core.CallFunc([can.onimport, html.LAYOUT], {can: can, height: height, width: width}) }, @@ -187,7 +179,7 @@ Volcanos(chat.ONLAYOUT, { }, }) Volcanos(chat.ONEXPORT, { - title: function(can, title) { can.isCmdMode() && can.user.title(title) }, + title: function(can, title) { can.sup.onexport.title(can, title) }, table: function(can) { var msg = can._msg; if (msg.Length() == 0) { return } var res = [msg.append && msg.append.join(mdb.FS)]; msg.Table(function(line, index, array) { res.push(can.core.Item(line, function(key, value) { return value }).join(ice.FS)) }); return res.join(lex.NL) }, diff --git a/proto.js b/proto.js index e8cdac3a..e807dd58 100644 --- a/proto.js +++ b/proto.js @@ -13,16 +13,17 @@ var ice = { TB: "\t", SP: " ", DF: ":", EQ: "=", AT: "@", PS: "/", PT: ".", FS: ",", QS: "?", NL: "\n", LT: "<", GT: ">", OK: "ok", TRUE: "true", FALSE: "false", SUCCESS: "success", FAILURE: "failure", PROCESS: "process", - AUTO: "auto", HOME: "home", MAIN: "main", - HTTP: "http", HTML: "html", LIST: "list", BACK: "back", - SHOW: "show", HIDE: "hide", HELP: "help", COPY: "copy", - VIEW: "view", MODE: "mode", SHIP: "ship", EXEC: "exec", + HTTP: "http", HTML: "html", + HOME: "home", MAIN: "main", + LIST: "list", BACK: "back", + SHOW: "show", HIDE: "hide", + VIEW: "view", MODE: "mode", + COPY: "copy", HELP: "help", + AUTO: "auto", EXEC: "exec", + SHIP: "ship", DEV: "dev", POD: "pod", CTX: "ctx", CMD: "cmd", ARG: "arg", OPT: "opt", CAN: "can", MSG: "msg", RUN: "run", RES: "res", ERR: "err", - CAN_PLUGIN: "can._plugin", - CAN_DEBUG: "can.debug", - LOG_DEBUG: "log.debug", MSG_DETAIL: "detail", MSG_OPTION: "option", MSG_APPEND: "append", MSG_RESULT: "result", MSG_SESSID: "sessid", MSG_FIELDS: "fields", @@ -40,25 +41,20 @@ var ice = { MSG_PREFIX: "_prefix", MSG_USERNICK: "user.nick", MSG_USERNAME: "user.name", MSG_USERROLE: "user.role", MSG_LANGUAGE: "user.lang", - MSG_TITLE: "sess.title", MSG_THEME: "sess.theme", MSG_RIVER: "sess.river", MSG_STORM: "sess.storm", MSG_WIDTH: "sess.width", MSG_HEIGHT: "sess.height", - MSG_MODE: "sess.mode", MSG_DAEMON: "sess.daemon", + MSG_TITLE: "sess.title", MSG_THEME: "sess.theme", MSG_RIVER: "sess.river", MSG_STORM: "sess.storm", + MSG_HEIGHT: "sess.height", MSG_WIDTH: "sess.width", MSG_MODE: "sess.mode", MSG_DAEMON: "sess.daemon", LOG_DISABLE: "log.disable", ErrWarn: "warn: ", ErrNotLogin: "not login: ", ErrNotRight: "not right: ", ErrNotFound: "not found: ", ErrNotValid: "not valid: ", - USR: "usr", - USR_ICEBERGS: "usr/icebergs/", - USR_VOLCANOS: "usr/volcanos/", - LIB_MISC: "lib/misc.js", - LIB_PAGE: "lib/page.js", - REQUIRE: "require", - - NFS: "nfs", + CAN_PLUGIN: "can._plugin", CAN_DEBUG: "can.debug", LOG_DEBUG: "log.debug", + NFS: "nfs", USR: "usr", USR_VOLCANOS: "usr/volcanos/", } var ctx = { CONTEXT: "context", COMMAND: "command", CONFIG: "config", INPUTS: "inputs", FEATURE: "feature", INDEX: "index", ARGS: "args", STYLE: "style", DISPLAY: "display", ACTION: "action", EXTRA_INDEX: "extra.index", EXTRA_ARGS: "extra.args", + RUN: "run", } var mdb = { DICT: "dict", META: "meta", HASH: "hash", LIST: "list", @@ -78,33 +74,36 @@ var mdb = { QS: ice.QS, AT: ice.AT, EQ: ice.EQ, FS: ice.FS, } -var web = {CHAT: "chat", LINK: "link", +var web = {CHAT: "chat", DREAM: "dream", SPACE: "space", ROUTE: "route", SPIDE: "spide", COUNT: "count", SHARE: "share", 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/", WORKER: "worker", SERVER: "server", GATEWAY: "gateway", - AT: "@", QS: "?", HTTP: "http", + AT: "@", QS: "?", LINK: "link", HTTP: "http", GET: "GET", PUT: "PUT", POST: "POST", DELETE: "DELETE", Accept: "Accept", ContentType: "Content-Type", ContentJSON: "application/json", ContentFORM: "application/x-www-form-urlencoded", IMAGE_PNG: "image/png", VIDEO_WEBM: "video/webm", - UPDATE: "update", TOGGLE: "toggle", HIDDEN: "hidden", - CODE_GIT_REPOS: "web.code.git.repos", CODE_GIT_STATUS: "web.code.git.status", - CODE_XTERM: "web.code.xterm", CODE_VIMER: "web.code.vimer", CODE_INNER: "web.code.inner", - WIKI_WORD: "web.wiki.word", WIKI_DRAW: "web.wiki.draw", WIKI_FEEL: "web.wiki.feel", - CHAT_MACOS_DESKTOP: "web.chat.macos.desktop", CHAT_MACOS_SESSION: "web.chat.macos.session", - CHAT_IFRAME: "web.chat.iframe", CHAT_FAVOR: "web.chat.favor", - TEAM_PLAN: "web.team.plan", - CHAT_FLOWS: "web.chat.flows", - WIKI_PORTAL: "web.wiki.portal", - CHAT_PORTAL: "web.chat.portal", + CODE_GIT_STATUS: "web.code.git.status", + CODE_GIT_REPOS: "web.code.git.repos", CODE_COMPILE: "web.code.compile", + CODE_VIMER: "web.code.vimer", + CODE_INNER: "web.code.inner", + CODE_XTERM: "web.code.xterm", + WIKI_WORD: "web.wiki.word", + WIKI_DRAW: "web.wiki.draw", + WIKI_PORTAL: "web.wiki.portal", + CHAT_MACOS_DESKTOP: "web.chat.macos.desktop", + CHAT_MACOS_SESSION: "web.chat.macos.session", + CHAT_FAVOR: "web.chat.favor", + CHAT_FLOWS: "web.chat.flows", + TEAM_PLAN: "web.team.plan", } var aaa = { - LOGIN: "login", LOGOUT: "logout", INVITE: "invite", TOKEN: "token", USER: "user", + LOGIN: "login", LOGOUT: "logout", INVITE: "invite", TOKEN: "token", USERNICK: "usernick", USERNAME: "username", PASSWORD: "password", USERROLE: "userrole", BACKGROUND: "background", AVATAR: "avatar", LANGUAGE: "language", ENGLISH: "english", CHINESE: "chinese", VOID: "void", TECH: "tech", ROOT: "root", @@ -114,6 +113,7 @@ var lex = { TB: ice.TB, SP: ice.SP, NL: ice.NL, } var yac = { + STASK: "stack", } var ssh = { SHELL: "shell", @@ -125,33 +125,25 @@ var tcp = { HOST: "host", PORT: "port", } var nfs = { - DIR: "dir", CAT: "cat", DEFS: "defs", TRASH: "trash", DIR_ROOT: "dir_root", + DIR: "dir", CAT: "cat", DEFS: "defs", PACK: "pack", TRASH: "trash", DIR_ROOT: "dir_root", COPY: "copy", EDIT: "edit", SAVE: "save", LOAD: "load", FIND: "find", GREP: "grep", TAGS: "tags", CONTENT: "content", RECENT: "recent", SCRIPT: "script", MODULE: "module", SOURCE: "source", TARGET: "target", REPOS: "repos", MASTER: "master", PATH: "path", FILE: "file", LINE: "line", SIZE: "size", - OPENS: "opens", REPLACE: "replace", FROM: "from", TO: "to", + REPLACE: "replace", FROM: "from", TO: "to", SVG: "svg", HTML: "html", CSS: "css", JS: "js", SH: "sh", GO: "go", CSV: "csv", JSON: "json", SHY: "shy", TXT: "txt", PNG: "png", WEBM: "webm", _CSS: ".css", _JS: ".js", + PWD: "./", SRC: "src/", USR: "usr/", USR_LOCAL_WORK: "usr/local/work/", SRC_DOCUMENT: "src/document/", DF: ice.DF, PS: ice.PS, PT: ice.PT, - PWD: "./", SRC: "src/", USR: "usr/", - USR_LOCAL_WORK: "usr/local/work/", - SRC_DOCUMENT: "src/document/", - PACK: "pack", - - IMAGE_PNG: "image/png", - IMAGE_JPEG: "image/jpeg", } var cli = { - PWD: "pwd", SYSTEM: "system", DAEMON: "daemon", ORDER: "order", BUILD: "build", + OPENS: "opens", SYSTEM: "system", DAEMON: "daemon", ORDER: "order", BUILD: "build", BEGIN: "begin", START: "start", OPEN: "open", CLOSE: "close", STOP: "stop", END: "end", RESTART: "restart", COLOR: "color", BLACK: "black", WHITE: "white", BLUE: "blue", RED: "red", GRAY: "gray", CYAN: "cyan", GREEN: "green", PURPLE: "purple", YELLOW: "yellow", MAGENTA: "magenta", SILVER: "silver", ALICEBLUE: "aliceblue", TRANSPARENT: "transparent", - MAKE: "make", MAIN: "main", EXEC: "exec", DONE: "done", COST: "cost", FROM: "from", CLEAR: "clear", - RUN: "run", - PLAY: "play", - OPENS: "opens", + MAKE: "make", EXEC: "exec", DONE: "done", COST: "cost", FROM: "from", CLEAR: "clear", LINUX: "linux", DARWIN: "darwin", WINDOWS: "windows", + PWD: "pwd", } var log = { INFO: "info", WARN: "warn", ERROR: "error", DEBUG: "debug", TRACE: "trace", @@ -160,11 +152,14 @@ var log = { var code = { FAVOR: "favor", XTERM: "xterm", INNER: "inner", VIMER: "vimer", WEBPACK: "webpack", BINPACK: "binpack", AUTOGEN: "autogen", COMPILE: "compile", PUBLISH: "publish", - COMMENT: "comment", KEYWORD: "keyword", - PACKAGE: "package", DATATYPE: "datatype", FUNCTION: "function", CONSTANT: "constant", - STRING: "string", NUMBER: "number", BOOLEAN: "boolean", OBJECT: "object", ARRAY: "array", TEMPLATE: "template", COMPLETE: "complete", NAVIGATE: "navigate", CURRENT: "current", PULL: "pull", PUSH: "push", + COMMENT: "comment", KEYWORD: "keyword", + PACKAGE: "package", DATATYPE: "datatype", FUNCTION: "function", CONSTANT: "constant", + STRING: "string", NUMBER: "number", BOOLEAN: "boolean", OBJECT: "object", ARRAY: "array", UNDEFINED: "undefined", + + META: "Meta", ALT: "Alt", CONTROL: "Control", SHIFT: "Shift", TAB: "Tab", ESCAPE: "Escape", ENTER: "Enter", + CMD: "Cmd", CTRL: "Ctrl", SPACE: "Space", BACKSPACE: "Backspace", ESC: "Esc", PS: "/", } var wiki = { TITLE: "title", BRIEF: "brief", REFER: "refer", SPARK: "spark", SHELL: "shell", @@ -208,21 +203,18 @@ var chat = { ], PLUGIN_INPUT: "/plugin/input/", PLUGIN_STORY: "/plugin/story/", PLUGIN_LOCAL: "/plugin/local/", PLUGIN_STATE_JS: "/plugin/state.js", PLUGIN_INPUT_JS: "/plugin/input.js", PLUGIN_TABLE_JS: "/plugin/table.js", ONENGINE: "onengine", ONDAEMON: "ondaemon", ONAPPEND: "onappend", ONLAYOUT: "onlayout", ONMOTION: "onmotion", ONKEYMAP: "onkeymap", - ONIMPORT: "onimport", ONSYNTAX: "onsyntax", ONFIGURE: "onfigure", ONACTION: "onaction", ONDETAIL: "ondetail", ONEXPORT: "onexport", ONPLUGIN: "onplugin", - + ONIMPORT: "onimport", ONACTION: "onaction", ONDETAIL: "ondetail", ONEXPORT: "onexport", + ONSYNTAX: "onsyntax", ONFIGURE: "onfigure", ONPLUGIN: "onplugin", + ONSIZE: "onsize", ONMAIN: "onmain", ONLOGIN: "onlogin", ONREMOTE: "onremote", ONSEARCH: "onsearch", ONRESIZE: "onresize", ONKEYUP: "onkeyup", ONKEYDOWN: "onkeydown", ONMOUSEENTER: "onmouseenter", ORIENTATIONCHANGE: "orientationchange", - ONSTORM_SELECT: "onstorm_select", ONACTION_NOSTORM: "onaction_nostorm", ONACTION_NOTOOL: "onaction_notool", ONACTION_TOUCH: "onaction_touch", ONACTION_CMD: "onaction_cmd", - ONACTION_REMOVE: "onaction_remove", + ONSTORM_SELECT: "onstorm_select", ONACTION_NOSTORM: "onaction_nostorm", ONACTION_NOTOOL: "onaction_notool", ONACTION_TOUCH: "onaction_touch", ONACTION_CMD: "onaction_cmd", ONACTION_REMOVE: "onaction_remove", ONOPENSEARCH: "onopensearch", ONSEARCH_FOCUS: "onsearch_focus", ONCOMMAND_FOCUS: "oncommand_focus", - ONTHEMECHANGE: "onthemechange", - ONUNLOAD: "onunload", - ONLAYOUT: "onlayout", - ONWEBPACK: "onwebpack", + ONTHEMECHANGE: "onthemechange", ONLAYOUT: "onlayout", ONUNLOAD: "onunload", ONWEBPACK: "onwebpack", ONTOAST: "ontoast", ONDEBUG: "ondebug", ONSHARE: "onshare", ONPRINT: "onprint", _INIT: "_init", _DELAY_INIT: "_delay_init", - _TRANS: "_trans", _STYLE: "_style", _ENGINE: "_engine", _SEARCH: "_search", _OUTPUTS_CURRENT: "_outputs.-1", _NAMES: "_names", _TOAST: "_toast", + _TRANS: "_trans", _STYLE: "_style", _ENGINE: "_engine", _SEARCH: "_search", _NAMES: "_names", _TOAST: "_toast", } var team = { TASK: "task", PLAN: "plan", @@ -243,22 +235,16 @@ var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 32, ACTION_MARGIN: 200, FIELDSET_PANEL: "fieldset.panel", FIELDSET_PLUGIN: "fieldset.plugin", FIELDSET_STORY: "fieldset.story", FIELDSET_PLUG: "fieldset.plug", FIELDSET_FLOAT: "fieldset.float", FIELDSET_INPUT: "fieldset.input", - H1: "h1", H2: "h2", H3: "h3", - CODE: "code", - UL: "ul", OL: "ol", LI: "li", - TABLE: "table", THEAD: "thead", TBODY: "tbody", TR: "tr", TH: "th", TD: "td", - HEADER: "header", NAV: "nav", MAIN: "main", ASIDE: "aside", FOOTER: "footer", - A: "a", SPAN: "span", DIV: "div", BR: "br", HR: "hr", - IMG: "img", VIDEO: "video", AUDIO: "audio", CANVAS: "canvas", IFRAME: "iframe", - SVG: "svg", - FORM: "form", LABEL: "label", + H1: "h1", H2: "h2", H3: "h3", UL: "ul", OL: "ol", LI: "li", BR: "br", HR: "hr", + A: "a", SPAN: "span", CODE: "code", DIV: "div", + SVG: "svg", IMG: "img", VIDEO: "video", AUDIO: "audio", CANVAS: "canvas", IFRAME: "iframe", + WSS: "wss", WEBVIEW: "webview", CHROME: "chrome", MOBILE: "mobile", LANDSCAPE: "landscape", + BODY: "body", FORM: "form", LABEL: "label", TITLE: "title", INNER: "inner", SPACE: "space", CLICK: "click", SELECT: "select", INPUT: "input", TEXT: "text", FILE: "file", TEXTAREA: "textarea", BUTTON: "button", CANCEL: "cancel", SUBMIT: "submit", UPLOAD: "upload", USERNAME: "username", PASSWORD: "password", + TABLE: "table", THEAD: "thead", TBODY: "tbody", TR: "tr", TH: "th", TD: "td", + HEADER: "header", NAV: "nav", MAIN: "main", ASIDE: "aside", FOOTER: "footer", - BODY: "body", - TITLE: "title", INNER: "inner", SPACE: "space", CLICK: "click", - WSS: "wss", WEBVIEW: "webview", CHROME: "chrome", MOBILE: "mobile", LANDSCAPE: "landscape", - BACKGROUND_COLOR: "background-color", COLOR: "color", PADDING: "padding", BORDER: "border", MARGIN: "margin", MARGIN_TOP: "margin-top", MARGIN_X: "margin-x", MARGIN_Y: "margin-y", HEIGHT: "height", WIDTH: "width", MIN_HEIGHT: "min-height", MAX_HEIGHT: "max-height", MIN_WIDTH: "min-width", MAX_WIDTH: "max-width", @@ -282,11 +268,6 @@ var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 32, ACTION_MARGIN: 200, DIV_FLOAT: "div.float", DIV_TOAST: "div.toast", DIV_CARTE: "div.carte", DESKTOP: "desktop", DIV_DESKTOP: "div.desktop", DIV_EXPAND: "div.expand", } -var lang = { - SPACE: "space", UNDEFINED: "undefined", STRING: "string", NUMBER: "number", BOOLEAN: "boolean", FUNCTION: "function", OBJECT: "object", ARRAY: "array", - META: "Meta", ALT: "Alt", CONTROL: "Control", SHIFT: "Shift", TAB: "Tab", ESCAPE: "Escape", ENTER: "Enter", - CMD: "Cmd", CTRL: "Ctrl", SPACE: "Space", BACKSPACE: "Backspace", ESC: "Esc", PS: "/", -} var svg = { GROUP: "group", PID: "pid", GRID: "grid", FIGURE: "figure", DATA: "data", SHIP: "ship", TRANS: "trans", @@ -300,13 +281,13 @@ var svg = { } function shy(help, meta, list, cb) { var arg = arguments, i = 0; function next(type) { - if (type == lang.OBJECT) { if (typeof arg[i] == lang.OBJECT && arg[i].length == undefined) { return arg[i++] } - } else if (type == lang.ARRAY) { if (typeof arg[i] == lang.OBJECT && arg[i].length != undefined) { return arg[i++] } + if (type == code.OBJECT) { if (typeof arg[i] == code.OBJECT && arg[i].length == undefined) { return arg[i++] } + } else if (type == code.ARRAY) { if (typeof arg[i] == code.OBJECT && arg[i].length != undefined) { return arg[i++] } } else if (i < arg.length && (!type || type == typeof arg[i])) { return arg[i++] } - } return cb = typeof arg[arg.length-1] == lang.FUNCTION? arg[arg.length-1]: function() {}, cb.help = next(lang.STRING)||"", cb.meta = next(lang.OBJECT)||{}, cb.list = next(lang.ARRAY)||[], cb + } return cb = typeof arg[arg.length-1] == code.FUNCTION? arg[arg.length-1]: function() {}, cb.help = next(code.STRING)||"", cb.meta = next(code.OBJECT)||{}, cb.list = next(code.ARRAY)||[], cb }; var _can_name = "", _can_path = "" var Volcanos = shy({iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {}, args: {}}, function(name, can, libs, cb) { - var meta = arguments.callee.meta, list = arguments.callee.list; if (typeof name == lang.OBJECT) { + var meta = arguments.callee.meta, list = arguments.callee.list; if (typeof name == code.OBJECT) { if (name.length > 0) { return Volcanos({panels: [{name: chat.HEADER, style: html.HIDE, state: [mdb.TIME, aaa.USERNICK]}, {name: chat.ACTION, style: html.MAIN, tool: name}, {name: chat.FOOTER, style: html.HIDE}]}) } var Config = name; name = Config.name||ice.CAN, _can_name = "" meta.iceberg = Config.iceberg||meta.iceberg, meta.libs = (Config.libs||chat.libs).concat(Config.list), panels = Config.panels||chat.panel_list, delete(Config.panels) @@ -316,19 +297,18 @@ var Volcanos = shy({iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {} } can = kit.proto(can||{}, kit.proto({_name: name, _path: _can_name, _load: function(name, cbs) { var cache = meta.cache[name]||[] for (list.reverse(); list.length > 0; list) { var sub = list.pop(); sub != can && cache.push(sub), sub._path = sub._path||name } meta.cache[name] = cache - cache.forEach(function(sub) { var name = sub._name; if (typeof cbs == lang.FUNCTION && cbs(can, name, sub)) { return } + cache.forEach(function(sub) { var name = sub._name; if (typeof cbs == code.FUNCTION && cbs(can, name, sub)) { return } can[name] = can[name]||{}; for (var k in sub) { can[name].hasOwnProperty(k) || sub.hasOwnProperty(k) && (can[name][k] = sub[k]) } }) }, require: function(libs, cb, cbs) { if (!libs || libs.length == 0) { - if (navigator.userAgent == "nodejs") { return typeof cb == lang.FUNCTION && cb(can) } - return typeof cb == lang.FUNCTION && setTimeout(function() { cb(can) }, 10) + if (navigator.userAgent == "nodejs") { return typeof cb == code.FUNCTION && cb(can) } + return typeof cb == code.FUNCTION && setTimeout(function() { cb(can) }, 10) } if (libs[0] == undefined) { return can.require(libs.slice(1), cb, cbs) } if (libs[0] == "") { libs[0] = can._path.replace(nfs._JS, nfs._CSS) } - if (libs[0].indexOf(nfs.SRC) == 0) { libs[0] = "/require/"+libs[0] } - if (libs[0].indexOf(nfs.USR) == 0) { libs[0] = "/require/"+libs[0] } + if (libs[0].indexOf(nfs.SRC) == 0 || libs[0].indexOf(nfs.USR) == 0) { libs[0] = "/require/"+libs[0] } if (libs[0][0] != ice.PS && libs[0].indexOf(ice.HTTP) != 0) { libs[0] = can._path.slice(0, can._path.lastIndexOf(ice.PS)+1)+libs[0] } var name = (libs[0].indexOf(ice.HTTP) == 0? libs[0]: libs[0].split(ice.QS)[0]).toLowerCase() function next() { can._load(name, cbs), can.require(libs.slice(1), cb, cbs) } @@ -341,7 +321,7 @@ var Volcanos = shy({iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {} can.base.isFunc(item.Option)? can.core.List(item.Option(), function(key) { key.indexOf("_") == 0 || key.indexOf("user.") == 0 || set(key, item.Option(key)) }): can.core.Item(can.base.isFunc(item)? item(): item, set) - }); set(ice.MSG_HEIGHT, can.ConfHeight()+""), set(ice.MSG_WIDTH, can.ConfWidth()+""), set(ice.MSG_MODE, can.Mode()) + }); set(ice.MSG_HEIGHT, can.ConfHeight()||32), set(ice.MSG_WIDTH, can.ConfWidth()||320), set(ice.MSG_MODE, can.Mode()) return msg }, runActionInputs: function(event, cmds, cb) { var msg = can.request(event), meta = can.Conf() @@ -354,14 +334,11 @@ var Volcanos = shy({iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {} can.runAction(event, ice.RUN, [index].concat(args), cb, true) }, runAction: function(event, action, args, cb, silent) { - var msg = can.request(event); if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && can.onaction && can.onaction[action]) { - // return can.core.CallFunc(can.onaction[action], {event: event, can: can, msg: msg, button: action}) - } can.request(event, {_handle: ice.TRUE}, can.Option())._caller() can.run(event, [ctx.ACTION].concat(action, args), cb, silent) }, search: function(event, cmds, cb) { - if (cmds && typeof cmds == lang.OBJECT && cmds.length > 0 && typeof cmds[0] == lang.OBJECT && cmds[0].length > 0 ) { cmds[0] = cmds[0].join(nfs.PT) } + if (cmds && typeof cmds == code.OBJECT && cmds.length > 0 && typeof cmds[0] == code.OBJECT && cmds[0].length > 0 ) { cmds[0] = cmds[0].join(nfs.PT) } return (can._root||can).run(event, [chat._SEARCH].concat(cmds), cb, true) }, get: function(name, key, cb) { var value; can.search({}, [can.core.Keys(name, chat.ONEXPORT, key)], cb||function(msg) { value = msg.Result() }); return value }, @@ -375,32 +352,32 @@ var Volcanos = shy({iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {} setAction: function(key, value) { return can.set(chat.ACTION, key, value) }, getAction: function(key, cb) { return can.get(chat.ACTION, key, cb) }, getActionSize: function(cb) { return can.get(chat.ACTION, nfs.SIZE, cb) }, - isStoryType: function(value) { return can.page.ClassList.has(can, can._fields, chat.STORY) }, - isSimpleMode: function(value) { return can.Mode() == chat.SIMPLE }, - isFloatMode: function(value) { return can.Mode() == chat.FLOAT }, - isFullMode: function(value) { return can.Mode() == chat.FULL }, - isCmdMode: function(value) { return can.Mode() == chat.CMD }, - isAutoMode: function(value) { return can.Mode() == "" }, + + isPanelType: function() { return can.page.ClassList.has(can, can._fields||can._target, chat.PANEL) }, + isPluginType: function() { return can.page.ClassList.has(can, can._fields||can._target, chat.PLUGIN) }, + isStoryType: function() { return can.page.ClassList.has(can, can._fields||can._target, chat.STORY) }, + isOutputStyle: function() { return can.page.ClassList.has(can, can._fields||can._target, chat.OUTPUT) }, + isSimpleMode: function() { return can.Mode() == chat.SIMPLE }, + isFloatMode: function() { return can.Mode() == chat.FLOAT }, + isFullMode: function() { return can.Mode() == chat.FULL }, + isCmdMode: function() { return can.Mode() == chat.CMD }, + isAutoMode: function() { return can.Mode() == "" }, Mode: function(value) { return can.Conf(ice.MODE, value) }, ConfDefault: function(value) { can.core.Item(value, function(k, v) { can.Conf(k) || can.Conf(k, v) }) }, ConfHeight: function(value) { return can.Conf(html.HEIGHT, value) }, ConfWidth: function(value) { return can.Conf(html.WIDTH, value) }, Conf: function(key, value) { var res = can._conf for (var i = 0; i < arguments.length; i += 2) { - if (typeof key == lang.OBJECT) { res = can.core.Value(can._conf, arguments[i]), i--; continue } + if (typeof key == code.OBJECT) { res = can.core.Value(can._conf, arguments[i]), i--; continue } res = can.core.Value(can._conf, arguments[i], arguments[i+1]) } return can.base.isUndefined(res) && key.indexOf(ctx.FEATURE+nfs.PT) == -1? can.Conf(can.core.Keys(ctx.FEATURE, key)): res }, _conf: {}, }, meta)); if (_can_name) { meta.cache[_can_name] = meta.cache[_can_name]||[], meta.cache[_can_name].push(can) } else { list.push(can) } - setTimeout(function() { - can.require(can._follow? libs.concat(meta.libs, meta.volcano): libs, cb) - }, 1) + setTimeout(function() { can.require(can._follow? libs.concat(meta.libs, meta.volcano): libs, cb) }, 1) return can }) -try { if (typeof(window) == lang.OBJECT) { var meta = Volcanos.meta - meta.target = document.body, meta._height = window.innerHeight, meta._width = window.innerWidth - var debug = location.search.indexOf("debug=true") > -1 - try { +try { if (typeof(window) == code.OBJECT) { var meta = Volcanos.meta + try { var debug = location.search.indexOf("debug=true") > -1 meta.version = window._version||"", window.parent.outerWidth-window.parent.innerWidth > 100 && (meta.version = "", debug = false) } catch (e) { meta.version = window._version, window.outerWidth-window.innerWidth > 100 && (meta.version = "", debug = false) @@ -411,25 +388,26 @@ try { if (typeof(window) == lang.OBJECT) { var meta = Volcanos.meta default: var item = document.createElement(nfs.SCRIPT); item.src = url+meta.version, item.onerror = cb, item.onload = cb, document.body.appendChild(item) } } - meta._init = function(can) { - window.onmousemove = function(event) { window._mousemove && (window._mousemove.onmousemove(event)) } - window.onmouseup = function(event) { window._mousemove && (window._mousemove.onmouseup(event)) } - window.ondblclick = function(event) { can.onkeymap.prevent(event) } - window.onkeydown = function(event) { if (event.key == lang.ESCAPE && !can.page.tagis(event.target, html.INPUT)) { can.onkeymap.prevent(event) } } - window.onerror = function(message, source, lineno, colno, error) { debug? alert([message].concat(can.misc._stacks(0, error)).join(lex.NL)): can.misc.Error(message, lex.NL+[source, lineno, colno].join(ice.DF), error) } - window.onbeforeunload = function() { can.onengine.signal(can, chat.ONUNLOAD) } - var last = can.page.width() < can.page.height(); window.onresize = function(event) { can.misc.Event(event, can, function(msg) { + meta.target = document.body, meta._height = window.innerHeight, meta._width = window.innerWidth + meta._init = function(can) { 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||[]) }) } + window.onbeforeunload = function() { can.onengine.signal(can, chat.ONUNLOAD) } + window.onerror = function(message, source, lineno, colno, error) { debug? alert([message].concat(can.misc._stacks(0, error)).join(lex.NL)): can.misc.Error(message, lex.NL+[source, lineno, colno].join(ice.DF), error) } + window.onmousemove = function(event) { window._mousemove && (window._mousemove.onmousemove(event)) } + window.onmouseup = function(event) { window._mousemove && (window._mousemove.onmouseup(event)) } + // window.ondblclick = function(event) { can.onkeymap.prevent(event) } + // window.onkeydown = function(event) { if (event.key == code.ESCAPE && !can.page.tagis(event.target, html.INPUT)) { can.onkeymap.prevent(event) } } } } else { // nodejs - global.location = {}, global.document = {}, global.window = {}, global.navigator = { userAgent: "nodejs" } + global.document = {}, global.location = {}, global.window = {}, global.navigator = {userAgent: "nodejs"} global.kit = kit, global.ice = ice global.ctx = ctx, global.mdb = mdb, global.web = web, global.aaa = aaa global.lex = lex, global.yac = yac, global.ssh = ssh, global.gdb = gdb global.tcp = tcp, global.nfs = nfs, global.cli = cli, global.log = log global.code = code, global.wiki = wiki, global.chat = chat, global.team = team, global.mall = mall - global.html = html, global.lang = lang, global.svg = svg + global.html = html, global.svg = svg global.shy = shy, global.Volcanos = Volcanos } } catch (e) { console.log(e) } diff --git a/publish/client/mp/utils/kit.js b/publish/client/mp/utils/kit.js index 3f31d4e7..f3db505a 100644 --- a/publish/client/mp/utils/kit.js +++ b/publish/client/mp/utils/kit.js @@ -10,9 +10,9 @@ function shy(help, meta, list, cb) { } cb = args[args.length-1]||function() {} - cb.help = next(lang.STRING)||"" - cb.meta = next(lang.OBJECT)|| {} - cb.list = next(lang.OBJECT)||[] + cb.help = next(code.STRING)||"" + cb.meta = next(code.OBJECT)|| {} + cb.list = next(code.OBJECT)||[] return cb } module.exports = { diff --git a/publish/client/nodejs/proto.js b/publish/client/nodejs/proto.js index 2a73211e..f2e13c13 100644 --- a/publish/client/nodejs/proto.js +++ b/publish/client/nodejs/proto.js @@ -1,4 +1,4 @@ -try { if (typeof(global) == lang.OBJECT) { // nodejs +try { if (typeof(global) == code.OBJECT) { // nodejs Volcanos.meta._load = function(url, cb) { if (!url) { return cb() } switch (url.split("?")[0].split(nfs.PT).pop().toLowerCase()) { case nfs.JS: