From 55b49df60a840b5a46faaf537bf35c3a4ad1c1a8 Mon Sep 17 00:00:00 2001 From: harveyshao Date: Wed, 26 Jan 2022 17:46:36 +0800 Subject: [PATCH] opt can --- frame.js | 163 ++++++++++++++---------------------- lib/core.js | 2 + lib/misc.js | 6 +- page/index.js | 2 +- panel/action.js | 6 +- plugin/input.js | 2 +- plugin/local/code/inner.css | 2 +- plugin/local/code/inner.js | 4 +- plugin/local/code/vimer.css | 2 +- proto.js | 86 ++++++++++--------- publish/chrome/contexts.js | 6 +- 11 files changed, 123 insertions(+), 158 deletions(-) diff --git a/frame.js b/frame.js index 78a01a36..7812ffd6 100644 --- a/frame.js +++ b/frame.js @@ -3,9 +3,10 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, 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) } - if (can.user.isExtension) { Volcanos.meta.args = JSON.parse(localStorage.getItem(ctx.ARGS))||{} } + if (can.user.isExtension) { Volcanos.meta.args = can.base.Obj(localStorage.getItem(ctx.ARGS), {}) } + can.core.Next(list, function(item, next) { item.type = chat.PANEL - can.onappend._init(can, item, item.list, function(panel) { panel.Conf(item) + can.onappend._init(can, can.base.Copy(item, can.core.Value(can._root, can.core.Keys(chat.RIVER, item.name))), item.list, function(panel) { panel.run = function(event, cmds, cb) { var msg = panel.request(event); cmds = cmds||[] return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, panel, cmds, cb) }, can[item.name] = panel, panel._root = can, panel._trans = panel.onaction && panel.onaction._trans||{} @@ -13,15 +14,15 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, can.core.ItemCB(panel.onaction, function(key, cb) { can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {can: panel, msg: msg}) }) }), can.core.CallFunc([panel.onaction, "_init"], {can: panel, cb: next, target: panel._target}) - panel.Conf(can.core.Value(can._root, can.core.Keys(chat.RIVER, item.name))) - panel.Conf("style") && can.page.Modify(can, panel._target, {style: panel.Conf("style")}) + + can.page.Modify(can, panel._target, {style: panel.Conf(ctx.STYLE)}) }, target) }, function() { can.misc.Log(can.user.title(), ice.RUN, can) can.require([can.volcano], null, function(can, name, sub) { can[name] = sub }) - can.onlayout.topic(can), can.onmotion._init(can, target), can.onkeymap._init(can) - can.ondaemon._init(can), can.onengine.signal(can, chat.ONMAIN, can.request()) - can.base.isFunc(cb) && cb() - }), can.onmotion.float.auto(can, document.body) + can.ondaemon._init(can), can.onmotion._init(can, target), can.onkeymap._init(can) + can.onlayout.topic(can), can.onengine.signal(can, chat.ONMAIN, can.request()) + can.onmotion.float.auto(can, target), can.base.isFunc(cb) && cb() + }) }, _search: function(event, can, msg, panel, cmds, cb) { var sub, mod = can, fun = can, key = ""; can.core.List(cmds[1].split(ice.PT), function(value) { @@ -31,27 +32,23 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, } return can.core.CallFunc(fun, { - "event": event, "can": sub, "msg": msg, - "button": key, "cmd": key, "arg": cmds.slice(2), "cmds": cmds.slice(2), - "list": cmds.slice(2), "cb": cb, "target": sub._target, + "event": event, "can": sub, "msg": msg, "cmds": cmds.slice(2), "cb": cb, "target": sub._target, + "button": key, "cmd": key, "arg": cmds.slice(2), "list": cmds.slice(2), }, mod) }, _engine: function(event, can, msg, panel, cmds, cb) { return false }, _plugin: function(event, can, msg, panel, cmds, cb) { - if (can.onengine.plugin.meta[cmds[0]]) { - can.core.CallFunc(can.onengine.plugin.meta[cmds[0]], {msg: msg, cmds: cmds.slice(1), cb: cb}) - return true - } if (cmds[0] == ctx.ACTION && cmds[1] == ice.RUN && can.onengine.plugin.meta[cmds[2]]) { - can.core.CallFunc(can.onengine.plugin.meta[cmds[2]], {msg: msg, cmds: cmds.slice(3), cb: cb}) - return true + return can.core.CallFunc(can.onengine.plugin.meta[cmds[2]], {msg: msg, cmds: cmds.slice(3), cb: cb}), true + } + if (can.onengine.plugin.meta[cmds[0]]) { + return can.core.CallFunc(can.onengine.plugin.meta[cmds[0]], {msg: msg, cmds: cmds.slice(1), cb: cb}), true } return false }, _remote: function(event, can, msg, panel, cmds, cb) { if (panel.onengine._engine(event, can, msg, panel, cmds, cb)) { return } if (panel.onengine._plugin(event, can, msg, panel, cmds, cb)) { return } - can.onengine.signal(can, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds})) var key = can.core.Keys(panel._name, cmds.join(ice.FS)) if (can.user.isLocalFile) { var msg = can.request(event); msg.Clear(ice.MSG_APPEND) @@ -60,22 +57,12 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, } var names = msg.Option("_names")||panel._names||((can.Conf("iceberg")||"/chat/")+panel._name) + can.onengine.signal(can, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds})) can.misc.Run(event, can, {names: names, daemon: can.core.Keys(can.ondaemon._list[0], msg._daemon)}, cmds, function(msg) { - Volcanos.meta.pack[key] = msg, delete(msg._handle), delete(msg._toast) - // if (msg.result && msg.result[0] == ice.ErrWarn) { can.user.toast(can, msg.Result(), "", 10000); return } - can.base.isFunc(cb) && cb(msg) + Volcanos.meta.pack[key] = msg, delete(msg._handle), delete(msg._toast), can.base.isFunc(cb) && cb(msg) }) }, - listen: shy("监听事件", {}, [], function(can, name, cb) { - arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb) - }), - signal: shy("触发事件", function(can, name, msg) { msg = msg||can.request() - name == chat.ONREMOTE? can.misc.Log("signal", name, msg.Option("_msg")): can.misc.Log("signal", name, msg) - can.core.List(can.onengine.listen.meta[name], function(cb) { - can.core.CallFunc(cb, {msg: msg, event: msg._event}) - }) - }), plugin: shy("添加插件", {}, [], function(can, name, command) { name = can.base.trimPrefix(name, "can.") var type = html.TEXT; command.list = can.core.List(command.list, function(item) { switch (typeof item) { @@ -89,20 +76,22 @@ Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, default: return {type: type, name: item} } } - }) - arguments.callee.meta[can.core.Keys("can", name)] = command + }), arguments.callee.meta[can.core.Keys("can", name)] = command + }), + listen: shy("监听事件", {}, [], function(can, name, cb) { arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb) }), + signal: shy("触发事件", function(can, name, msg) { msg = msg||can.request() + name == chat.ONREMOTE? can.misc.Log("signal", name, msg.Option("_msg")): can.misc.Log("signal", name, msg) + can.core.List(can.onengine.listen.meta[name], function(cb) { can.core.CallFunc(cb, {event: msg._event, msg: msg}) }) }), }) Volcanos("ondaemon", {help: "推荐引擎", list: [], _init: function(can, name) { if (can.user.isLocalFile) { return } can.misc.WSS(can, {type: html.CHROME, name: can.misc.Search(can, "daemon")||name||""}, function(event, msg, cmd, arg) { if (!msg) { return } can.base.isFunc(can.ondaemon[cmd])? can.core.CallFunc(can.ondaemon[cmd], { "can": can, "msg": msg, "cmd": cmd, "arg": arg, "cb": function() { msg.Reply() }, - }): can.onengine._search({}, can, msg, can, ["_search", cmd].concat(arg), function() { - msg.Reply() - }) + }): can.onengine._search({}, can, msg, can, ["_search", cmd].concat(arg), function() { msg.Reply() }) }) can.onengine.listen(can, chat.ONSEARCH, function(msg, word) { var meta = can.onengine.plugin.meta - if (word[0] != "*" && word[0] != ctx.COMMAND) { return } + if (word[0] != mdb.FOREACH && word[0] != ctx.COMMAND) { return } var list = word[1] == ""? meta: meta[word[1]]? kit.Dict(word[1], meta[word[1]]): {} can.core.Item(list, function(name, command) { name = can.base.trimPrefix(name, "can.") can.core.List(msg.Option(ice.MSG_FIELDS).split(ice.FS), function(item) { @@ -115,24 +104,18 @@ Volcanos("ondaemon", {help: "推荐引擎", list: [], _init: function(can, name) }) }) }, _list: [""], - pwd: function(can, msg, arg) { - can.ondaemon._list[0] = arg[0] - }, + pwd: function(can, msg, arg) { can.ondaemon._list[0] = arg[0] }, grow: function(can, msg, arg) { var sub = can.ondaemon._list[msg.Option(ice.MSG_TARGET)] sub.onimport._grow(sub, can.page.Color(arg.join(""))) }, - toast: function(can, msg, arg) { - can.onmotion.float.add(can, chat.FLOAT, can.core.CallFunc(can.user.toast, {can: can, msg: msg, cmds: arg})) - }, - confirm: function(can, msg, arg) { - if (can.user.confirm(arg[0])) { msg.Echo(ice.TRUE) } - }, + toast: function(can, msg, arg) { can.core.CallFunc(can.user.toast, {can: can, msg: msg, cmds: arg}) }, + confirm: function(can, msg, arg) { if (can.user.confirm(arg[0])) { msg.Echo(ice.TRUE) } }, }) Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, list, cb, target, field) { meta.name = (meta.name||"").split(ice.SP)[0].split(ice.PT).pop() field = field||can.onappend.field(can, meta.type, meta, target).first - var legend = can.page.Select(can, field, ice.PT+html.LEGEND)[0]||can.page.Select(can, field, html.LEGEND)[0] + var legend = can.page.Select(can, field, html.LEGEND)[0] var option = can.page.Select(can, field, html.FORM_OPTION)[0] var action = can.page.Select(can, field, html.DIV_ACTION)[0] var output = can.page.Select(can, field, html.DIV_OUTPUT)[0] @@ -143,84 +126,70 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, _inputs: {}, _outputs: [], _history: [], Status: function(key, value) { - if (sub.base.isObject(key)) { return sub.core.Item(key, sub.Status), key } - sub.page.Select(sub, status, [[[html.DIV, key], html.SPAN]], function(item) { + if (can.base.isObject(key)) { return can.core.Item(key, sub.Status), key } + can.page.Select(can, status, [[[html.DIV, key], html.SPAN]], function(item) { return value == undefined? (value = item.innerHTML): (item.innerHTML = value) }); return value }, - Action: function(key, value) { return sub.page.SelectArgs(sub, action, key, value)[0] }, - Option: function(key, value) { return sub.page.SelectArgs(sub, option, key, value)[0] }, + 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.onappend._output0(sub, sub.Conf(), event||{}, cmds||sub.Input(), cb, silent); return true }, Input: function(cmds, silent) { - cmds = cmds && cmds.length > 0? cmds: sub.page.SelectArgs(sub, option, ""), cmds = can.base.trim(cmds) - silent || cmds[0] == ctx.ACTION || sub.base.Eq(sub._history[sub._history.length-1], cmds) || sub._history.push(cmds) + cmds = cmds && cmds.length > 0? cmds: can.page.SelectArgs(can, option, ""), cmds = can.base.trim(cmds) + silent || cmds[0] == ctx.ACTION || can.base.Eq(sub._history[sub._history.length-1], cmds) || sub._history.push(cmds) return cmds }, - Clone: function() { meta.args = sub.page.SelectArgs(sub, option, "") + Clone: function() { meta.args = can.page.SelectArgs(can, option, "") can.onappend._init(can, meta, list, function(sub) { can.base.isFunc(cb) && cb(sub, true) can.core.Timer(10, function() { for (var k in sub._inputs) { can.onmotion.focus(can, sub._inputs[k]._target); break } }) }, target) }, - }, list, function(sub) { sub.Conf(meta), meta.feature = sub.base.Obj(meta.feature, {}) - sub.page.ClassList.add(sub, field, meta.index? meta.index.split(ice.PT).pop(): meta.name) - sub.page.ClassList.add(sub, field, meta.style||meta.feature.style||"") + }, list, function(sub) { sub.Conf(meta), meta.feature = can.base.Obj(meta.feature, {}) + can.page.ClassList.add(can, field, meta.index? meta.index.split(ice.PT).pop(): meta.name) + can.page.ClassList.add(can, field, meta.style||meta.feature.style||"") - sub.page.Modify(sub, sub._legend, {onmouseenter: function(event) { - sub.user.carte(event, sub, sub.onaction, sub.onaction.list.concat([["所有 ->"].concat(can.core.Item(meta.feature._trans))], [cli.CLOSE])) - }}) + meta.inputs && sub.onappend._option(sub, meta, sub._option, meta.msg) + if (meta.msg) { var msg = sub.request(); msg.Copy(can.base.Obj(meta.msg)), sub.onappend._output(sub, msg, msg.Option(ice.MSG_DISPLAY)) } - if (meta.msg) { var msg = sub.request(); msg.Copy(sub.base.Obj(meta.msg)) - meta.inputs && sub.onappend._option(sub, meta, sub._option, true) - sub.onappend._output(sub, msg, msg.Option(ice.MSG_DISPLAY)) - } else { - meta.inputs && sub.onappend._option(sub, meta, sub._option) - } - - can.base.isFunc(cb) && cb(sub) + can.page.Modify(can, sub._legend, {onmouseenter: function(event) { + can.user.carte(event, sub, sub.onaction, sub.onaction.list.concat([["所有 ->"].concat(can.core.Item(meta.feature._trans))], [cli.CLOSE])) + }}), can.base.isFunc(cb) && cb(sub) }); return sub }, _option: function(can, meta, option, skip) { meta = meta||{}; var index = -1, args = can.base.Obj(meta.args||meta.arg||meta.opt, []), opts = can.base.Obj(meta.opts, {}) - function add(item, next) { item.type != html.BUTTON && index++ + function add(item, next) { item = can.base.isString(item)? {type: html.TEXT, name: item}: item, item.type != html.BUTTON && index++ return Volcanos(item.name, {_follow: can.core.Keys(can._follow, item.name), _target: can.onappend.input(can, item, args[index]||opts[item.name], option||can._option), _option: can._option, _action: can._action, _output: can._output, _status: can._status, Option: can.Option, Action: can.Action, Status: can.Status, CloneField: can.Clone, CloneInput: function() { can.onmotion.focus(can, add(item)._target) }, - }, [item.display||chat.PLUGIN_INPUT_JS], function(input) { input.Conf(item) + }, [item.display, chat.PLUGIN_INPUT_JS], function(input) { input.Conf(item) input.run = function(event, cmds, cb, silent) { var msg = can.request(event) if (msg.RunAction(event, can.core.Value(can, "_outputs.-1"), cmds)) { return } if (msg.RunAction(event, input, cmds)) { return } return can.Update(event, can.Input(cmds, silent), cb, silent) }, can._inputs[item.name] = input, input.sup = can - can.core.ItemCB(input.onaction, function(key, cb) { - input._target[key] = function(event) { cb(event, input) } - }), skip? next(): can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target]); - can.core.ItemCB(item, function(key, cb) { - input._target[key] = function(event) { cb(event, input) } - }); + can.core.ItemCB(input.onaction, function(key, cb) { input._target[key] = function(event) { cb(event, input) } }) + can.core.ItemCB(item, function(key, cb) { input._target[key] = function(event) { cb(event, input) } }) + skip? next(): can.core.CallFunc([input.onaction, "_init"], [input, item, next, input._target]); (item.action||can.core.Value(meta, "feature.inputs")) && can.onappend.figure(input, item, input._target) }) }; can.core.Next(can.base.Obj(meta.inputs, can.core.Value(can, "onimport.list")).concat(meta.type == chat.FLOAT? [{type: html.BUTTON, name: cli.CLOSE}]: []), add) }, _action: function(can, list, action, meta) { meta = meta||can.onaction, action = action||can._action, can.onmotion.clear(can, action) - can.core.List(can.base.Obj(list, can.core.Value(can, "onaction.list")), function(item) { if (item == undefined) { return } can.onappend.input(can, item == ""? /*空白*/ {type: html.SPACE}: + return can.core.List(can.base.Obj(list, can.core.Value(can, "onaction.list")), function(item) { if (item == undefined) { return } can.onappend.input(can, item == ""? /*空白*/ {type: html.SPACE}: can.base.isString(item)? /*按键*/ {type: html.BUTTON, value: can.user.trans(can, item), onclick: function(event) { - var cb = meta[item]||meta["_engine"] - cb? can.core.CallFunc(cb, {event: event, can: can, button: item}): can.run(event, [ctx.ACTION, item].concat(can.sup.Input())) + var cb = meta[item]||meta["_engine"]; cb? can.core.CallFunc(cb, {event: event, can: can, button: item}): can.run(event, [ctx.ACTION, item].concat(can.sup.Input())) }}: item.length > 0? /*列表*/ {type: html.SELECT, name: item[0], values: item.slice(1), onchange: function(event) { var which = item[event.target.selectedIndex+1] can.core.CallFunc(meta[which], [event, can, which]) can.core.CallFunc(meta[item[0]], [event, can, item[0], which]) - }}: /*其它*/ item - , "", action)}) - return meta + }}: /*其它*/ item, "", action)}), meta }, - _output0: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event) - if (msg.RunAction(event, can, cmds)) { return } - + _output0: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event); if (msg.RunAction(event, can, cmds)) { return } if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { can.request(event, {action: cmds[1]}) return can.user.input(event, can, meta.feature[cmds[1]], function(ev, button, data, list, args) { var msg = can.request(event, {_handle: ice.TRUE}, can.Option()) can.Update(event, cmds.slice(0, 2).concat(args), function(msg) { can.Update({}, can.Input(), cb) }, true) @@ -233,32 +202,28 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, } if (msg.Option("_toast")) { var toast = can.user.toast(can, msg.Option("_toast"), "", -1) } - return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")||{}; can._msg = msg, sub._msg = msg - toast && toast.close() + return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")||{}; can._msg = msg, sub._msg = msg, toast && toast.close() + if (can.base.isFunc(cb)) { can.core.CallFunc(cb, {can: can, msg: msg}); return } var process = msg._can == can || msg._can == sub - if (can.base.isFunc(cb)) { can.core.CallFunc(cb, {can: can, msg: msg}); return } if (process && can.core.CallFunc([sub, "onimport._process"], {can: sub, msg: msg})) { return } if (process && can.core.CallFunc([can, "onimport._process"], {can: can, msg: msg})) { return } - if (silent) { return } - - can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY)||meta.display||meta.feature.display) + !silent && can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY)||meta.display||meta.feature.display) }) }, _output: function(can, msg, display, output) { display = display||chat.PLUGIN_TABLE_JS, output = output||can._output Volcanos(display, {_follow: can.core.Keys(can._follow, display), _display: display, _target: output, _fields: can._target, - _option: can._option, _action: can._action, _output: can._output, _status: can._status, _legend: can._legend, + _option: can._option, _action: can._action, _output: can._output, _status: can._status, _legend: can._legend, _inputs: {}, Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status, - _inputs: {}, }, [display, chat.PLUGIN_TABLE_JS], function(table) { table.Conf(can.Conf()) table.run = function(event, cmds, cb, silent) { var msg = can.request(event) if (msg.RunAction(event, table, cmds)) { return } return can.Update(event, can.Input(cmds, silent), cb, silent) }, can._outputs.push(table), table.sup = can, table._msg = msg - if (msg.result && msg.result[0] == "can.code.inner.plugin" && table.onimport && table.onimport.list.length > 0) { - can.onmotion.clear(can, can._option) - can.onappend._option(can, {inputs: table.onimport.list, args: msg.result.slice(1)}) + if (can.Conf(ctx.INDEX) == "can.code.inner.plugin" && table.onimport && table.onimport.list.length > 0) { + can.onmotion.clear(can, can._option), can.onappend._option(can, {inputs: table.onimport.list}) } + table.onimport && can.core.CallFunc(table.onimport._init, {can: table, msg: msg, list: msg.result||msg.append||[], cb: function(msg) { table.onappend._action(table, msg.Option(ice.MSG_ACTION)||can.Conf(ice.MSG_ACTION)) table.onappend._status(table, msg.Option(ice.MSG_STATUS)) @@ -266,7 +231,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }) }, _status: function(can, list, status) { status = status||can._status, can.onmotion.clear(can, status) - can.core.List(can.base.Obj(list, can.core.Value(can, "onexport.list")), function(item) { item = can.base.isObject(item)? item: {name: item} + can.core.List(can.base.Obj(list, can.core.Value(can, [chat.ONEXPORT, mdb.LIST])), function(item) { item = can.base.isObject(item)? item: {name: item} can.page.Append(can, status, [{view: can.base.join([html.ITEM, item.name]), title: item.name, list: [ {text: [item.name, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [(item.value||"")+"", html.SPAN, item.name]}, ], }]) @@ -275,7 +240,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, tabs: function(can, list, cb, cbs, action) { action = action||can._action return can.page.Append(can, action, can.core.List(list, function(meta) { - return {text: [meta.name, html.DIV, chat.TABS], title: meta.text, onclick: function(event) { + return {text: [meta.name, html.DIV, html.TABS], title: meta.text, onclick: function(event) { can.base.isFunc(cb) && cb(event, meta) }, _init: function(item) { const OVER = "over" function close(item) { var next = item.nextSibling || item.previousSibling @@ -287,11 +252,11 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, can.user.carte(event, can, kit.Dict( "close tab", function(event) { close(item) }, "close other", function(event) { - can.page.Select(can, action, chat.DIV_TABS, function(_item) { + can.page.Select(can, action, html.DIV_TABS, function(_item) { _item == item || close(_item) }) }, - "close all", function(event) { can.page.Select(can, action, chat.DIV_TABS, close) }, + "close all", function(event) { can.page.Select(can, action, html.DIV_TABS, close) }, ), ["close tab", "close other", "close all"]) }, ondragstart: function(event) { var target = event.target; target.click() diff --git a/lib/core.js b/lib/core.js index 57949b32..9830a9ac 100644 --- a/lib/core.js +++ b/lib/core.js @@ -17,6 +17,8 @@ Volcanos("core", {help: "数据结构", if (data == undefined) { return } if (key == undefined) { return data } + if (typeof key == lang.OBJECT && key.length > 0) { key = key.join(ice.PT) } + if (typeof key == lang.OBJECT) { for (var k in key) { arguments.callee.call(this, data, k, key[k]) }; return data } diff --git a/lib/misc.js b/lib/misc.js index 846848ed..8b2e67a6 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -1,9 +1,9 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg = {} var proto = {_event: event, _can: can, - RunAction: function(event, sub, cmds) { var msg = can.request(event) + RunAction: function(event, sub, cmds, meta) { var msg = can.request(event); meta = meta || sub&&sub.onaction || {} if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } - if (cmds && cmds[0] == ctx.ACTION && sub && can.base.isFunc(sub.onaction[cmds[1]])) { - return msg.Option(ice.MSG_HANDLE, ice.TRUE), can.core.CallFunc(sub.onaction[cmds[1]], {event: event, can: sub, msg: msg, button: cmds[1], cmd: cmds[1]}), true + if (cmds && cmds[0] == ctx.ACTION && can.base.isFunc(meta[cmds[1]])) { + return msg.Option(ice.MSG_HANDLE, ice.TRUE), can.core.CallFunc(meta[cmds[1]], {event: event, can: sub, msg: msg, button: cmds[1], cmd: cmds[1]}), true } return false }, diff --git a/page/index.js b/page/index.js index 7a9168aa..e4c196fe 100644 --- a/page/index.js +++ b/page/index.js @@ -1,6 +1,6 @@ Volcanos({name: "chat", panels: [ {name: "Header", help: "标题栏", pos: chat.HEAD, state: ["time", "usernick", "avatar"]}, - {name: "River", help: "群聊组", pos: chat.LEFT, action: ["create", "refresh"]}, + {name: "River", help: "群聊组", pos: html.LEFT, action: ["create", "refresh"]}, {name: "Action", help: "工作台", pos: chat.MAIN}, {name: "Footer", help: "状态条", pos: chat.FOOT, state: ["ncmd"]}, {name: "Search", help: "搜索框", pos: chat.AUTO}, diff --git a/panel/action.js b/panel/action.js index 7dad3637..3f8ae47c 100644 --- a/panel/action.js +++ b/panel/action.js @@ -23,9 +23,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) meta.id && (sub._option.dataset = sub._option.dataset||{}, sub._option.dataset.id = meta.id) can.page.Modify(can, sub._output, {style: kit.Dict(html.MAX_WIDTH, meta.width)}) - can.page.Append(can, can._action, [{view: [chat.TABS, html.DIV, meta.name], onclick: function(event) { + can.page.Append(can, can._action, [{view: [html.TABS, html.DIV, meta.name], onclick: function(event) { can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, sub._target) - can.onmotion.select(can, can._action, chat.DIV_TABS, event.target) + can.onmotion.select(can, can._action, html.DIV_TABS, event.target) }, onmouseenter: sub._legend.onmouseenter}]) }, _menu: function(can, msg) { if (can.user.mod.isPod||can.user.isMobile) { return } @@ -154,7 +154,7 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, cb, t if (button == "tabs") { can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, 0) - can.onmotion.select(can, can._action, chat.DIV_TABS, 0) + can.onmotion.select(can, can._action, html.DIV_TABS, 0) } else if (button == "free") { can.page.Select(can, can._target, [[html.DIV_OUTPUT, html.FIELDSET_PLUGIN]], function(item, index) { can.page.Modify(can, item, {style: {left: 40*index, top: 40*index}}) diff --git a/plugin/input.js b/plugin/input.js index 7023e2ed..47bb6b54 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -1,4 +1,4 @@ -Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, list, cb, target) { +Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, cb, target) { can.base.isFunc(cb) && cb(); switch (meta.type) { case html.SELECT: meta.value && (target.value = meta.value); break case html.BUTTON: meta.action == ice.AUTO && target.click(); break diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 06d725d6..5114daa2 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -1,6 +1,6 @@ fieldset.inner>div.action { float:none; display:block; - height:26px; overflow:auto; + overflow:auto; } fieldset.inner>div.action div.tabs { border:solid 2px red; padding:2px; diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index eb17267d..9dd2ef32 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -146,7 +146,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target can.onmotion.clear(can, target) if (msg.Option("_process") == "_field") { msg.Table(function(meta) { meta.display = msg.Option("_display") - // delete(Volcanos.meta.cache[meta.display]) + delete(Volcanos.meta.cache[meta.display]) can.onimport.plugin(can, meta, target, function(sub) { can.onmotion.focus(can, can.page.Select(can, sub._option, html.OPTION_ARGS)[0]) width && sub.ConfWidth(width) @@ -215,7 +215,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], var p = cache_data[can.file]; p && (can.current = p.current, can.max = p.max) can.page.Modify(can, can.ui.profile, {style: {display: p? p.profile_display: html.NONE}}) can.page.Modify(can, can.ui.display, {style: {display: p? p.display_display: html.NONE}}) - can.onmotion.select(can, can._action, chat.DIV_TABS, msg._tab) + can.onmotion.select(can, can._action, html.DIV_TABS, msg._tab) can.onmotion.delay(can, function() { can.onimport.layout(can) msg.Option(ctx.INDEX) && can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]) }) diff --git a/plugin/local/code/vimer.css b/plugin/local/code/vimer.css index 36630f71..cd8ded63 100644 --- a/plugin/local/code/vimer.css +++ b/plugin/local/code/vimer.css @@ -1,6 +1,6 @@ fieldset.vimer>div.output input.current { background-color:#00000000; color:#00000000; - font-size:1.2em; font-family:monospace; + font-size:1em; font-family:monospace; position:absolute; left:0; margin:0; margin-top:-2px; padding:0; padding-left:9px; diff --git a/proto.js b/proto.js index e06c063f..f495a1fa 100644 --- a/proto.js +++ b/proto.js @@ -124,32 +124,29 @@ var wiki = { H3: "h3.story", DIV_PAGE: "div.page", } -var chat = {ONIMPORT: "onimport", ONACTION: "onaction", ONKEYMAP: "onkeymap", ONEXPORT: "onexport", - LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", OUTPUT: "output", INPUT: "input", UPLOAD: "upload", - STORY: "story", FLOAT: "float", CONTEXTS: "contexts", CARTE: "carte", TOAST: "toast", +var chat = { + LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", OUTPUT: "output", STORY: "story", FLOAT: "float", + TOAST: "toast", CARTE: "carte", INPUT: "input", UPLOAD: "upload", CONTEXTS: "contexts", LEGNED: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status", LAYOUT: "layout", PROJECT: "project", CONTENT: "content", DISPLAY: "display", PROFILE: "profile", + ONIMPORT: "onimport", ONACTION: "onaction", ONKEYMAP: "onkeymap", ONEXPORT: "onexport", TITLE: "title", TOPIC: "topic", BLACK: "black", WHITE: "white", PRINT: "print", - SHARE: "share", RIVER: "river", STORM: "storm", FIELD: "field", TOAST: "toast", + SHARE: "share", RIVER: "river", STORM: "storm", FIELD: "field", PUBLIC: "public", PROTECTED: "protected", PRIVATE: "private", USER: "user", TOOL: "tool", NODE: "node", AGENT: "agent", CHECK: "check", GRANT: "grant", STATE: "state", MENUS: "menus", TRANS: "trans", + SSO: "sso", ONMAIN: "onmain", ONLOGIN: "onlogin", ONSEARCH: "onsearch", ONSIZE: "onsize", ONTOAST: "ontoast", ONREMOTE: "onremote", ONKEYDOWN: "onkeydown", HEAD: "head", LEFT: "left", MAIN: "main", AUTO: "auto", HIDE: "hide", FOOT: "foot", - SCROLL: "scroll", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom", HEADER: "header", FOOTER: "footer", - TABS: "tabs", DIV_TABS: "div.tabs", - - SSO: "sso", - PLUGIN_STATE_JS: "/plugin/state.js", PLUGIN_INPUT_JS: "/plugin/input.js", PLUGIN_TABLE_JS: "/plugin/table.js", @@ -180,13 +177,13 @@ var chat = {ONIMPORT: "onimport", ONACTION: "onaction", ONKEYMAP: "onkeymap", ON "/plugin/input/province.js", ], ACTION_LAYOUT_FMT: ` - fieldset.Action.grid>div.output fieldset.plugin { - width:_width; height:_height; - } - fieldset.Action.grid>div.output fieldset.plugin>div.output { - width:_width; height:_height; - } - `, +fieldset.Action.grid>div.output fieldset.plugin { + width:_width; height:_height; +} +fieldset.Action.grid>div.output fieldset.plugin>div.output { + width:_width; height:_height; +} +`, } var team = { TASK: "task", PLAN: "plan", @@ -210,30 +207,29 @@ var html = { OPTION_ARGS: "select.args,input.args,textarea.args", INPUT_ARGS: "input.args,textarea.args", - DIV_ITEM: "div.item", DIV_FLOAT: "div.float", - INPUT_BUTTON: "input[type=button]", + UPLOAD: "upload", USERNAME: "username", PASSWORD: "password", INPUT: "input", TEXT: "text", TEXTAREA: "textarea", SELECT: "select", BUTTON: "button", FORM: "form", FILE: "file", SPACE: "space", CLICK: "click", SUBMIT: "submit", CANCEL: "cancel", DIV: "div", IMG: "img", CODE: "code", SPAN: "span", VIDEO: "video", TABLE: "table", TR: "tr", TH: "th", TD: "td", BR: "br", UL: "ul", LI: "li", A: "a", LABEL: "label", INNER: "inner", TITLE: "title", + H1: "h1", H2: "h2", H3: "h3", CLASS: "class", FLOAT: "float", CLEAR: "clear", BOTH: "both", BACKGROUND: "background", SELECT: "select", HIDDEN: "hidden", - DISPLAY: "display", BLOCK: "block", NONE: "none", + DISPLAY: "display", BLOCK: "block", NONE: "none", FIXED: "fixed", STROKE_WIDTH: "stroke-width", STROKE: "stroke", FILL: "fill", FONT_SIZE: "font-size", MONOSPACE: "monospace", SCROLL: "scroll", HEIGHT: "height", WIDTH: "width", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom", MAX_HEIGHT: "max-height", MAX_WIDTH: "max-width", MARGIN_X: "margin-x", MARGIN_Y: "margin-y", - PLUGIN_MARGIN: 10, ACTION_HEIGHT: 27, ACTION_MARGIN: 200, - - FIXED: "fixed", + PLUGIN_MARGIN: 10, ACTION_HEIGHT: 29, ACTION_MARGIN: 200, WSS: "wss", SVG: "svg", CANVAS: "canvas", IFRAME: "iframe", CHROME: "chrome", LIST: "list", ITEM: "item", MENU: "menu", NODE: "node", + DIV_ITEM: "div.item", DIV_FLOAT: "div.float", + TABS: "tabs", DIV_TABS: "div.tabs", HIDE: "hide", SHOW: "show", - H1: "h1", H2: "h2", H3: "h3", } var lang = { UNDEFINED: "undefined", @@ -243,14 +239,12 @@ var lang = { } function shy(help, meta, list, cb) { var index = 0, args = arguments; function next(type) { - if (index < args.length && (!type || type == typeof args[index])) { - return args[index++] - } + if (index < args.length && (!type || type == typeof args[index])) { return args[index++] } } cb = args[args.length-1]||function() {} cb.help = next(lang.STRING)||"" - cb.meta = next(lang.OBJECT)|| {} + cb.meta = next(lang.OBJECT)||{} cb.list = next(lang.OBJECT)||[] return cb }; var _can_name = "", _can_path = "" @@ -258,7 +252,7 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args: var meta = arguments.callee.meta, list = arguments.callee.list if (typeof name == lang.OBJECT) { var Config = name; Config.plugin = Config.plugin||chat.plugin_list Config.panels = Config.panels||chat.panel_list, Config.main = Config.main||{name: "Header"} - meta.libs = chat.libs, meta.iceberg = Config.iceberg||meta.iceberg + meta.libs = Config.libs||chat.libs, meta.iceberg = Config.iceberg||meta.iceberg // 预加载 libs = []; for (var i = 0; i < Config.panels.length; i++) { var panel = Config.panels[i] @@ -272,7 +266,6 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args: for (var k in Config) { can[k] = Config[k] } } - can = can||{} var proto = {__proto__: meta, _path: _can_path, _name: name, _load: function(name, each) { // 加载缓存 var cache = meta.cache[name]||[]; for (list.reverse(); list.length > 0; list) { var sub = list.pop(); sub != can && cache.push(sub) @@ -291,16 +284,18 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args: return // 加载完成 } + // 无效地址 if (!libs[0]) { return can.require(libs.slice(1), cb, each) } - libs[0] = libs[0].toLowerCase() + // 补全地址 if (libs[0] == "") { libs[0] = can._name.replace(".js", ".css") } else if (libs[0][0] != ice.PS && libs[0].indexOf(ice.HTTP) != 0) { libs[0] = can._name.slice(0, can._name.lastIndexOf(ice.PS)+1)+libs[0] } - // 请求模块 + // 加载模块 + libs[0] = libs[0].toLowerCase() var name = libs[0].split("?")[0] function next() { can._load(name, each), can.require(libs.slice(1), cb, each) } meta.cache[name]? next(): (_can_path = libs[0], meta._load(name, next)) @@ -316,30 +311,32 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args: }); return msg }, - get: function(name, key, cb) { - return can.search({}, [can.core.Keys(name, "onexport", key)], cb) + 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(ice.PT) + } + return can.run && can.run(event, ["_search"].concat(cmds), cb, true) }, + get: function(name, key, cb) { return can.search({}, [can.core.Keys(name, chat.ONEXPORT, key)], cb) }, set: function(name, key, value) { var msg = can.request({}); msg.Option(key, value) - return can.search(msg._event, [can.core.Keys(name, "onimport", key)]) + return can.search(msg._event, [[name, chat.ONIMPORT, key]]) }, setHeaderMenu: function(list, cb) { can._menu && can.page.Remove(can, can._menu) var msg = can.request({}, {trans: can.onaction._trans}) - return can._menu = can.search(msg._event, ["Header.onimport.menu", can._name].concat(list), cb) + return can._menu = can.search(msg._event, [["Header", chat.ONIMPORT, "menu"], can._name].concat(list), cb) }, setHeader: function(key, value) { return can.set("Header", key, value) }, getHeader: function(key, cb) { return can.get("Header", key, cb) }, getAction: function(key, cb) { return can.get("Action", key, cb) }, getActionSize: function(cb) { return can.get("Action", "size", cb) }, - search: function(event, cmds, cb) { return can.run && can.run(event, ["_search"].concat(cmds), cb, true) }, 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-- - return + res = can.core.Value(can._conf, arguments[i]), i-- + continue } res = can.core.Value(can._conf, arguments[i], arguments[i+1]) } @@ -347,7 +344,7 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args: }, _conf: {}, } - if (navigator.userAgent.indexOf("MSIE") > -1) { + can = can||{}; if (navigator.userAgent.indexOf("MSIE") > -1) { for (var k in proto) { can[k] = proto[k] } } else { can.__proto__ = proto @@ -358,6 +355,7 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args: } else { // 加入队列 list.push(can) } + if (can._follow) { libs = libs.concat(meta.libs, meta.volcano) } if (libs && libs.length > 0) { for (var i = 0; i < libs.length; i++) { @@ -377,18 +375,18 @@ Volcanos.meta._load = function(url, cb) { case nfs.CSS: var item = document.createElement(mdb.LINK) item.rel = "stylesheet", item.type = "text/css" - item.onload = cb, item.href = url + item.href = url, item.onload = cb return (document.head||document.body).appendChild(item), item case nfs.JS: var item = document.createElement(ssh.SCRIPT) - item.onload = cb, item.onerror = cb, item.src = url + item.src = url, item.onload = cb, item.onerror = cb return document.body.appendChild(item), item } } function can(tool) { Volcanos({name: "chat", panels: [ - {name: "Header", help: "标题栏", pos: "hide", state: ["time", "usernick", "avatar"]}, + {name: "Header", help: "标题栏", pos: chat.HIDE, state: ["time", "usernick", "avatar"]}, {name: "Action", help: "工作台", pos: chat.MAIN, tool: tool}, - {name: "Search", help: "搜索框", pos: "auto"}, + {name: "Search", help: "搜索框", pos: chat.AUTO}, ]}) } diff --git a/publish/chrome/contexts.js b/publish/chrome/contexts.js index 42764926..7f92e13d 100644 --- a/publish/chrome/contexts.js +++ b/publish/chrome/contexts.js @@ -56,7 +56,7 @@ setTimeout(function() { Volcanos({Option: function() { return [] }, }, field: function(can, msg, arg) { can.onappend.plugin(can, {type: chat.CONTEXTS, index: arg[0], args: can.base.Obj(arg[1])}, function(sub, meta) { - var pos = {left: msg.Option(chat.LEFT), top: msg.Option(chat.TOP), right: msg.Option(chat.RIGHT), bottom: msg.Option(chat.BOTTOM)} + var pos = {left: msg.Option(html.LEFT), top: msg.Option(html.TOP), right: msg.Option(html.RIGHT), bottom: msg.Option(html.BOTTOM)} can.page.Modify(can, sub._target, {style: pos}) can.onmotion.move(can, sub._target, pos, function(target) { can.page.Modify(can, sub._output, {style: { @@ -82,8 +82,8 @@ setTimeout(function() { Volcanos({Option: function() { return [] }, sub.onaction["保存参数"] = function(event) { can.request(event, {zone: location.host, id: msg.Option(mdb.ID)}) - can.run(event, [chat.FIELD, mdb.MODIFY, chat.TOP, sub._target.offsetTop]) - can.run(event, [chat.FIELD, mdb.MODIFY, chat.LEFT, sub._target.offsetLeft]) + can.run(event, [chat.FIELD, mdb.MODIFY, html.TOP, sub._target.offsetTop]) + can.run(event, [chat.FIELD, mdb.MODIFY, html.LEFT, sub._target.offsetLeft]) can.run(event, [chat.FIELD, mdb.MODIFY, ctx.ARGS, JSON.stringify(sub.Input([], true))]) can.user.toastSuccess(can) }