From a8485b8ecd1d92f1510bbe03d50238e4e1108c1b Mon Sep 17 00:00:00 2001 From: shaoying Date: Wed, 3 Jun 2020 22:24:05 +0800 Subject: [PATCH] opt engine --- frame.js | 45 ++++++++++++++++++++++++++++++--------- index.css | 4 ++++ lib/core.js | 23 ++++++++++++++++++++ lib/misc.js | 2 +- pane/Action.js | 3 ++- pane/Header.js | 6 +++--- plugin/inner.css | 4 ++++ plugin/inner.js | 20 +++++++++++------ plugin/local/wiki/word.js | 5 ++--- proto.js | 10 ++++----- 10 files changed, 92 insertions(+), 30 deletions(-) diff --git a/frame.js b/frame.js index 20f001aa..4f8da58a 100644 --- a/frame.js +++ b/frame.js @@ -1,8 +1,11 @@ -Volcanos("onaction", { _init: function(can, meta, list, cb, target) { +// volcanos: 前端 火山架 我看不行 +// FMS: a fieldset manager system + +Volcanos("onengine", { _init: function(can, meta, list, cb, target) { can.core.Next(meta.panes, function(item, next) { can.onappend._init(can, item, meta.libs.concat(item.list), function(pane) { pane.Conf(item), pane.run = function(event, cmds, cb) { - (can.onaction[cmds[0]]||can.onaction[meta.main.engine])(event, can, pane.request(event), pane, cmds, cb); + (can.onengine[cmds[0]]||can.onengine[meta.main.engine])(event, can, pane.request(event), pane, cmds, cb); }, can[item.name] = pane, next(); }, can._target); }, function() { can.onlayout._init(can, meta, list, function() { @@ -27,10 +30,13 @@ Volcanos("onaction", { _init: function(can, meta, list, cb, target) { // 应用入口 can.user.title(can.user.Search(can, "title")) var pane = can[meta.main.name], msg = can.request({}); - pane.onaction._init(pane, msg, msg.option||[], cb, target); + pane.onaction && pane.onaction._init(pane, msg, msg.option||[], cb, target); }) }, target) }); }, + _merge: function(can, sub) { can.core.Item(sub, function(key, value) { + if (sub.hasOwnProperty(key)) { can.onengine[key] = value } + }); return true }, search: function(event, can, msg, pane, cmds, cb) { var chain = cmds[1] var sub, mod = can, key, fun = can; can.core.List(chain.split("."), function(value, index, array) { fun && (sub = mod, mod = fun, key = value, fun = mod[value]) @@ -85,13 +91,14 @@ Volcanos("onaction", { _init: function(can, meta, list, cb, target) { return false; }, remote: function(event, can, msg, pane, cmds, cb) { - if (can.onaction.engine(event, can, msg, pane, cmds, cb)) { return } + if (can.onengine.engine(event, can, msg, pane, cmds, cb)) { return } if (location.protocol == "file:") { typeof cb == "function" && cb(msg); return } can.misc.Run(event, can, {names: pane._name}, cmds, cb) }, }) Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { field = field || can.onappend.field(can, target, meta.type||"plugin", meta); + var legend = can.page.Select(can, field, "legend")[0]; var option = can.page.Select(can, field, "form.option")[0]; var action = can.page.Select(can, field, "div.action")[0]; var output = can.page.Select(can, field, "div.output")[0]; @@ -99,10 +106,22 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { var feature = can.base.Obj(meta.feature) can.page.ClassList.add(can, field, feature.style||"") + legend && (legend.onclick = function(event) { var msg = can.request(event) + can.core.List(["share", "pod"], function(key) { var value = can.user.Search(can, key) + value != undefined && msg.Option(key, can.user.Search(key)) + }) + can.core.List(["River", "Storm", "Action"], function(item) { + can.run(event, ["search", item+".onexport.key"]) + }) + var args = {}; can.core.List(msg.option, function(key) { args[key] = msg.Option(key) }) + location.href = can.user.Share(can, args, true) + }) + // 添加插件 var sub = Volcanos(meta.name, { _help: meta.name, _target: field, _option: option, _action: action, _output: output, _follow: can._follow+"."+meta.name, _history: [], + _inputs: {}, _outputs: [], Option: function(key, value) { if (key == undefined) { value = {} sub.page.Select(sub, option, "select.args,input.args", function(item) { @@ -138,7 +157,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { // 添加控件 var args = can.base.Obj(meta.args, []) can.core.Next(can.base.Obj(meta.inputs, []), function(item, next, index) { - sub[item.name] = Volcanos(item.name, { _help: item.name, + sub._inputs[item.name] = Volcanos(item.name, { _help: item.name, _target: can.onappend.input(sub, option, item.type, item, args[index]), _option: option, _action: action, _output: output, _follow: can._follow+"."+meta.name+"."+item.name, @@ -168,8 +187,11 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { if (!cmds[i]) { cmds.pop() } else { break } } - var msg = sub.request(event); msg.Option("_action", item.name); - cmds[0] != "action" && sub._history.push(cmds); + var msg = sub.request(event); msg.Option("_action", item.name) + + var last = sub._history[sub._history.length-1] + !can.core.Eq(last, cmds) && cmds[0] != "action" && sub._history.push(cmds) + run(event, cmds, cb, silent) } @@ -187,26 +209,28 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { }) }) + var count = 0 function run(event, cmds, cb, silent) { sub.run(event, cmds, function(msg) { + sub.Status("ncmd", sub._history.length+"/"+count++) if (silent) { typeof cb == "function" && cb(msg); return } // 添加组件 var display = (msg.Option("_display")||feature.display||"table.js") display.indexOf("/") == 0 || (display = "/plugin/"+display) - sub[display] = Volcanos(display, { _help: display, _target: output, + var table = Volcanos(display, { _help: display, _target: output, _option: option, _action: action, _output: output, _follow: can._follow+"."+meta.name+"."+display, Option: sub.Option, Action: sub.Action, Status: sub.Status, }, Volcanos.meta.libs.concat(["/frame.js", display]), function(table) { table.Conf(sub.Conf()) table.onimport && table.onimport._init && table.onimport._init(table, msg, msg.result||[], function() {}, output) - table.run = function(event, cmds, cb, silent) { cmds = cmds || [] run(event, cmds, cb, silent) } // 工具栏 action.innerHTML = "", table.onaction && can.core.List(table.onaction.list, function(item) { + item === ""? can.page.Append(can, action, [{view: "item space"}]): typeof item == "string"? can.onappend.input(can, action, "input", {type: "button", value: item, onclick: function(event) { table.onaction[item](event, table, msg) }}): item.length > 0? can.onappend.input(can, action, "input", {type: "select", values: item.slice(1), name: item[0], onchange: function(event) { @@ -225,8 +249,9 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { status.innerHTML = "", table.onexport && can.core.List(table.onexport.list, function(item) { can.page.Append(can, status, [{view: "item "+item, title: item, list: [{text: [item+": ", "label"]}, {text: ["", "span"]}]}]) }) + sub.Status("ncmd", sub._history.length+"/"+count) }) - var table = sub[display]; + sub._outputs.push(table) }, silent) } }); cb(sub); diff --git a/index.css b/index.css index be96c6a0..0c09c584 100644 --- a/index.css +++ b/index.css @@ -10,6 +10,10 @@ fieldset { legend { margin-left:10px; } +legend:hover { + cursor:pointer; + background:red; +} div.hidden { display:none; } diff --git a/lib/core.js b/lib/core.js index e671382e..773c6ac0 100644 --- a/lib/core.js +++ b/lib/core.js @@ -120,4 +120,27 @@ Volcanos("core", {help: "核心模块", if (begin < list.length) { res.push(list.slice(begin)) } return res }), + + Eq: function(obj, other) { var self = arguments.callee + // undefined null + // string number boolen + // object function + if (typeof obj != typeof other) { + return false + } + if (typeof obj == "object") { + for (var i = 0; i < obj.length; i++) { + if (!self(obj[i], other[i])) { + return false + } + } + for (var k in obj) { + if (!self(obj[k], other[k])) { + return false + } + } + return true + } + return obj === other + } }) diff --git a/lib/misc.js b/lib/misc.js index 8b990f27..9c68d9da 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -52,7 +52,7 @@ Volcanos("misc", {help: "工具模块", } msg._xhr = xhr }), - Run: shy("请求后端", {order: 0}, function(event, can, dataset, cmd, cb) { + Run: shy("请求后端", {order: 0}, function(event, can, dataset, cmd, cb) { event = event || {} var msg = (can.request||can.Event)(event); // 解析参数 diff --git a/pane/Action.js b/pane/Action.js index 50c91c8e..05a52ec4 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -37,9 +37,10 @@ Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, value.width = can._target.offsetWidth value.height = can._target.offsetHeight can.onappend._init(can, value, Volcanos.meta.libs.concat(["/plugin/state.js"]), function(sub) { - sub.run = function(event, cmds, cb, silent) { var msg = can.request(event, event._msg||{_msg: sup}); + sub.run = function(event, cmds, cb, silent) { var msg = can.request(event) can.Conf("active", sub.Option()) can.Conf("action", value.name) + // console.log(event, sub, msg) // 插件回调 can.run(event, [river, storm, index].concat(cmds), function(msg) { can.run(msg._event, ["search", "Footer.onaction.ncmd"]); diff --git a/pane/Header.js b/pane/Header.js index edc9737e..d1d3c36d 100644 --- a/pane/Header.js +++ b/pane/Header.js @@ -31,11 +31,11 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, }) }, title: function(event, can, key) { var msg = can.request(event) - can.core.List(["River", "Storm", "Action"], function(item) { - can.run(event, ["search", item+".onexport.key"]) + can.core.List(["share", "pod"], function(key) { var value = can.user.Search(can, key) + value != undefined && msg.Option(key, can.user.Search(key)) }) var args = {}; can.core.List(msg.option, function(key) { args[key] = msg.Option(key) }) - location.href = can.user.Share(can, args) + location.href = can.user.Share(can, args, true) }, username: function(event, can, key) { if (can.user.confirm("logout?")) { diff --git a/plugin/inner.css b/plugin/inner.css index f7bfe4e1..334b159d 100644 --- a/plugin/inner.css +++ b/plugin/inner.css @@ -1,3 +1,6 @@ +fieldset.editor>div.action { + clear:none; +} fieldset.editor>div.action>div.file { border:solid 2px red; padding:2px; @@ -11,6 +14,7 @@ fieldset.editor>div.action>div.file:hover { fieldset.editor>div.action>div.file.select { background-color:green; } + fieldset.editor>div.output { min-height:300px; } diff --git a/plugin/inner.js b/plugin/inner.js index 8a883a90..189c340d 100644 --- a/plugin/inner.js +++ b/plugin/inner.js @@ -32,6 +32,9 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, }) }, onblur: function(event) { can.onaction.modifyLine(can, can.current, can.editor.value) + }, onclick: function(event) { + }, ondblclick: function(event) { + can.onkeymap._mode(can, "insert") }}, ]) @@ -110,7 +113,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], // plugin function init() { - can.onkeymap._remote(event, can, "运行") + can.onkeymap._remote(null, can, "运行") typeof p.display == "object" && ( p.display.height && can.page.Modify(can, can.ui.display, {style: { "max-height": p.display.height, @@ -164,6 +167,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], "do": "keyword", "done": "keyword", + "local": "keyword", "echo": "keyword", "kill": "keyword", "let": "keyword", @@ -171,18 +175,22 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], "xargs": "function", "date": "function", + "find": "function", + "grep": "function", + "sed": "function", "awk": "function", "pwd": "function", "ps": "function", "ls": "function", "rm": "function", + "go": "function", "export": "keyword", "source": "keyword", "require": "keyword", }, prefix: {"#": "comment"}, - suffix: {"&": "comment"}, + suffix: {"{": "comment"}, line: function(can, line) { return line }, }, vim: { @@ -553,7 +561,7 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" }, }, }) -Volcanos("onaction", {help: "控件交互", list: ["项目", "上传", "保存", "历史", "提交", "运行", "记录", "复盘"], +Volcanos("onaction", {help: "控件交互", list: ["项目", "上传", "保存", "", "历史", "提交", "运行", "日志", "记录", "复盘"], modifyLine: function(can, target, value) { var p = can.onsyntax.parse(can, value) typeof p == "object"? can.page.Appends(can, target, [p]): target.innerHTML = p }, @@ -605,6 +613,7 @@ Volcanos("onaction", {help: "控件交互", list: ["项目", "上传", "保存", "提交": function(event, can, msg) { can.onkeymap._remote(event, can, "提交") }, "历史": function(event, can, msg) { can.onkeymap._remote(event, can, "历史") }, "运行": function(event, can, msg) { can.onkeymap._remote(event, can, "运行") }, + "日志": function(event, can, msg) { can.onkeymap._remote(event, can, "日志") }, "记录": function(event, can, msg) { var sub = can.request(event) can.core.Item(can.Option(), sub.Option) @@ -652,10 +661,7 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can) { can.page.Modify(can, can.ui.editor, style) }, }) -Volcanos("ondaemon", {help: "数据刷新", list: [], _init: function(can) { -}, -}) -Volcanos("onexport", {help: "导出数据", list: ["输入法", "输入值", "文件名", "解析器", "当前行"], +Volcanos("onexport", {help: "导出数据", list: ["输入法", "输入值", "文件名", "解析器", "当前行", "ncmd"], content: function(can) { return can.page.Select(can, can._output, "div.content>pre.item", function(item) { return can.current == item? can.editor.value: item.innerText diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index c3b9beeb..5068c328 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -1,5 +1,4 @@ -Volcanos("onimport", {help: "导入数据", list: [], - _init: function(can, msg, list, cb, target) { can._output.innerHTML = ""; +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { can._output.innerHTML = ""; can.onappend.table(can, target, "table", msg) // if (msg.Option("_display") == "table") { @@ -20,7 +19,7 @@ Volcanos("onimport", {help: "导入数据", list: [], var meta = JSON.parse(data.meta||"{}") can.onappend._init(can, meta, Volcanos.meta.libs.concat(["plugin/state.js"]), function(sub) { sub.run = function(event, cmds, cb, silent) { - // can.run(event, ["field", "action", "story", data.type, data.name, data.text].concat(cmds), cb, silent) + can.run(event, ["action", "story", data.type, data.name, data.text].concat(cmds), cb, true) } }, can._output, item) }) diff --git a/proto.js b/proto.js index 28fd23fe..f217d90c 100644 --- a/proto.js +++ b/proto.js @@ -1,6 +1,3 @@ -// volcanos: 前端 火山架 我看不行 -// FMS: a fieldset manager system - function shy(help, meta, list, cb) { var index = -1, value = "", type = "string", args = arguments; function next(check) { if (++index >= args.length) {return false} @@ -29,7 +26,7 @@ var Volcanos = shy("火山架", {cache: {}, index: 1, order: 1, debug: { _head: document.head, _body: document.body, _width: window.innerWidth, _height: window.innerHeight, }, libs = Preload.concat(Config.volcano), cb = function(can) { - can.onaction._init(can, can.Conf(Config), [], function(msg) { + can.onengine._init(can, can.Conf(Config), [], function(msg) { }, can._target) } } @@ -43,7 +40,9 @@ var Volcanos = shy("火山架", {cache: {}, index: 1, order: 1, debug: { } for (var i = 0; i < cache.length; i++) { - typeof cb == "function" && cb(can, name, cache[i]) || (can[cache[i]._name] = cache[i]); + if (can[cache[i]._name] && can[cache[i]._name]._merge && can[cache[i]._name]._merge(can, cache[i])) { continue } + if (typeof cb == "function" && cb(can, name, cache[i])) { continue} + can[cache[i]._name] = cache[i] // 加载索引 } meta.cache[name] = cache; @@ -209,3 +208,4 @@ var Volcanos = shy("火山架", {cache: {}, index: 1, order: 1, debug: { return can.require(libs, cb), can }) +