From 7ffca63865ed2d7339ccd5c016d18c910018d091 Mon Sep 17 00:00:00 2001 From: shaoying Date: Wed, 20 Jan 2021 18:35:23 +0800 Subject: [PATCH] opt frame.js --- LICENSE | 2 +- README.md | 2 +- frame.js | 96 ++++++++++------------ lib/core.js | 2 +- lib/misc.js | 3 + manifest.json | 19 ++--- pane/Action.css | 5 +- pane/Action.js | 163 ++++++++++++++++++------------------- pane/Header.js | 7 ++ plugin/local/code/inner.js | 8 +- plugin/local/code/vimer.js | 3 + proto.js | 11 +-- 12 files changed, 155 insertions(+), 166 deletions(-) diff --git a/LICENSE b/LICENSE index ef84d856..e2ef4bdb 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 小营长 +Copyright (c) 2019 码神 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 24533113..680a64f8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ # volcanos -volcanos是一个前端框架,通过模块化、集群化、自动化、快速的创建、共享应用程序和数据。 +volcanos是一个前端框架,通过模块化、集群化、自动化,快速的创建、共享应用程序和数据。 diff --git a/frame.js b/frame.js index fdd537c0..55abef7d 100644 --- a/frame.js +++ b/frame.js @@ -5,7 +5,7 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, pane.onaction && pane.onappend._action(pane, item.action||pane.onaction.list) pane.Status = pane.Status || function(key, value) { pane.run({}, ["search", "Footer.onimport."+key, value]) } - pane.run = function(event, cmds, cb, silent) { var msg = pane.request(event); cmds = cmds || [] + pane.run = function(event, cmds, cb) { var msg = pane.request(event); cmds = cmds || [] return (can.onengine[cmds[0]]||can.onengine[meta.main.engine]||can.onengine.remote)(event, can, msg, pane, cmds, cb) }, can[item.name] = pane, next() }, target) @@ -15,13 +15,6 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, pane.onaction._init(pane, msg, [], cb, pane._target) }) }, - _daemon: function(can, name, cb) { - can.misc.WSS(can, {type: "chrome", name: name}, cb||function(event, msg, cmd, arg) { - msg && can.run(event, ["search"].concat(msg["detail"]||[]), function(msg) { - msg.Reply() - }) - }) - }, search: function(event, can, msg, pane, cmds, cb) { var sub, mod = can, fun = can, key = ""; can.core.List(cmds[1].split("."), function(value) { @@ -39,10 +32,11 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, can.misc.Run(event, can, {names: pane._name}, cmds, cb) pane.run(event, ["search", "Footer.onimport.ncmd"]) }, engine: function(event, can, msg, pane, cmds, cb) { return false }, + listen: shy("事件回调", {}, [], function(can, name, cb) { arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb) }), - signal: shy("事件触发", function(can, name, msg) { + signal: shy("事件触发", function(can, name, msg) { msg = msg || can.request() can.core.List(can.onengine.listen.meta[name], function(cb) { can.core.CallFunc(cb, {msg: msg}) }) @@ -215,26 +209,26 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, var last = sub._history[sub._history.length-1]; !sub.core.Eq(last, cmds) && cmds[0] != "action" && !slient && sub._history.push(cmds) return cmds }, - }, list.concat(Volcanos.meta.volcano).concat(Volcanos.meta.libs), function(sub) { sub.Conf(meta) + }, list.concat(Volcanos.meta.volcano, Volcanos.meta.libs), function(sub) { sub.Conf(meta) meta.feature = sub.base.Obj(meta.feature, {}) sub.page.ClassList.add(sub, field, meta.style||meta.feature.style||"") - typeof cb == "function" && cb(sub) meta.inputs && sub.onappend._option(sub, meta, sub._option) + typeof cb == "function" && cb(sub) }) }, _option: function(can, meta, option) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []) function add(item, next) { item._input != "button" && item.type != "button" && index++ - var input = Volcanos(item.name, {_follow: can._follow+"."+item.name, + Volcanos(item.name, {_follow: can._follow+"."+item.name, _option: can._option, _action: can._action, _output: can._output, _status: can._status, _target: can.onappend.input(can, item, args[index], option), + Option: can.Option, Action: can.Action, Status: can.Status, CloneInput: function() { add(item)._target.focus() }, CloneField: function() { can.Clone() }, - Option: can.Option, Action: can.Action, Status: can.Status, - }, [item.display||"/plugin/input.js"].concat(Volcanos.meta.volcano).concat(Volcanos.meta.libs), function(input) { + }, [item.display||"/plugin/input.js"].concat(Volcanos.meta.volcano, Volcanos.meta.libs), function(input) { input.Conf(item), input.sup = can, input.run = function(event, cmds, cb, silent) { var sub = can.core.Value(can, "_outputs.-1") - if (cmds && cmds[0] == "action" && sub && sub.onaction[cmds[1]]) { + if (sub && cmds && cmds[0] == "action" && sub.onaction[cmds[1]]) { return sub.onaction[cmds[1]](event, sub) } @@ -243,37 +237,33 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, } return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent) - } + }, can._inputs[item.name] = input - can.onappend.figure(input, item, item.value, input._target) can.core.Item(input.onaction, function(key, value) { - key.indexOf("on") == 0 && (input._target[key] = input._target[key] || function(event) { + key.indexOf("on") == 0 && !input._target[key] && (input._target[key] = function(event) { value(event, input) }) - }) + }), can.onappend.figure(input, item, item.value, input._target) - input.onaction && input.onaction._init && input.onaction._init(input, item, [], next, input._target) - }); return can._inputs[item.name] = input + can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target]) + }) }; can.core.Next(can.base.Obj(meta.inputs, []), add) }, _action: function(can, list, action, meta) { action = action || can._action, meta = meta || can.onaction - can.core.List(list, function(item) { can.onappend.input(can, - item == ""? /*空白*/ {type: "space"}: - typeof item == "string"? /*按键*/ {type: "button", value: item, onclick: function(event) { - var cb = meta[item] || meta["_engine"] || can.onkeymap && can.onkeymap._remote - typeof cb == "function" && cb(event, can, item) + can.core.List(list, function(item) { can.onappend.input(can, item == ""? /*空白*/ {type: "space"}: + typeof item == "string"? /*按键*/ {type: "button", value: item, onclick: function(event) { + can.core.CallFunc(meta[item]||meta["_engine"], [event, can, item]) - }}: item.length > 0? /*列表*/ {type: "select", name: item[0], values: item.slice(1), onchange: function(event) { - var which = item[event.target.selectedIndex+1] - var cb = meta[which]; typeof cb == "function" && cb(event, can, which) - var cb = meta[item[0]]; typeof cb == "function" && cb(event, can, item[0], which) + }}: item.length > 0? /*列表*/ {type: "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.input? /*文本*/ {type: "input", name: item.input[0], onkeydown: function(event) { - item.input[1](event, can) + }}: item.input? /*文本*/ {type: "input", name: item.input[0], onkeydown: function(event) { + can.core.CallFunc(item.input[1], [event, can]) - }}: typeof item == "object" && /*其它*/ item - , "", action) - }) + }}: typeof item == "object" && /*其它*/ item + , "", action)}) }, _output: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event); can.page.Select(can, can._output, "div.control .args", function(item) { @@ -285,14 +275,13 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, } var feature = can.Conf("feature") - var input = cmds && feature && feature[cmds[1]]; if (cmds && cmds[0] == "action" && input) { + var input = cmds && cmds[0] == "action" && feature && feature[cmds[1]]; if (input) { can.user.input(event, can, input, function(ev, button, data, list) { cmds = cmds.slice(0, 2), can.core.Item(data, function(key, value) { key && value && cmds.push(key, value) }) - can.run(event, cmds, function(msg) { - var sub = can.core.Value(can, "_outputs.-1") + can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1") if (can.core.CallFunc([sub, "onimport._process"], [sub, msg, cmds, cb])) { return } if (can.core.CallFunc([can, "onimport._process"], [can, msg, cmds, cb])) { return } typeof cb == "function" && cb(msg) @@ -302,8 +291,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, return } - return can.run(event, cmds||[], function(msg) { - var sub = can.core.Value(can, "_outputs.-1") + return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1") if (can.core.CallFunc([sub, "onimport._process"], [sub, msg, cmds, cb])) { return } if (can.core.CallFunc([can, "onimport._process"], [can, msg, cmds, cb])) { return } typeof cb == "function" && cb(msg) @@ -311,26 +299,27 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, var display = msg.Option("_display") || meta.display || meta.feature.display || "/plugin/table.js" - var output = Volcanos(display, {_follow: can._follow+"."+display, + Volcanos(display, {_follow: can._follow+"."+display, _option: can._option, _action: can._action, _output: can._output, _status: can._status, _target: can._output, _fields: can._target, Option: can.Option, Action: can.Action, Status: can.Status, - }, [display].concat(Volcanos.meta.volcano).concat(Volcanos.meta.libs), function(table) { + }, [display].concat(Volcanos.meta.volcano, Volcanos.meta.libs), function(table) { table.Conf(can.Conf()), table.sup = can, table.run = function(event, cmds, cb, silent) { if (cmds && cmds[0] == "action" && table.onaction[cmds[1]]) { return table.onaction[cmds[1]](event, table) } return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent) - }, table._msg = msg + }, can._outputs.push(table), table._msg = msg + can.page.Modify(can, can._action, ""), can.page.Modify(can, can._status, "") table.onimport && table.onimport._init && table.onimport._init(table, msg, msg.result||[], function(msg) { table.onaction && table.onappend._action(table, msg._action||meta._action||table.onaction.list) table.ondetail && table.onappend._detail(table, msg._detail||meta._detail||table.ondetail.list) table.onexport && table.onappend._status(table, msg._export||meta._export||table.onexport.list) }, can._output) - }); can._outputs.push(output) - }, silent) + }) + }) }, _detail: function(can, list, target) { target = target || can._output list.length > 0 && (target.oncontextmenu = function(event) { @@ -355,18 +344,18 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }]); return ui.first }, tree: function(can, list, field, split, cb, target, node) { - node = node || {}; can.core.List(list, function(item) { + node = node || {"": target}; can.core.List(list, function(item) { item[field] && can.core.List(item[field].split(split), function(value, index, array) { var last = array.slice(0, index).join(split), name = array.slice(0, index+1).join(split) - node[name] || (node[name] = can.page.Append(can, node[last]||target, [{view: ["item", "div", value+(index==array.length-1?"":split)], onclick: function(event) { + node[name] || (node[name] = can.page.Append(can, node[last], [{view: ["item", "div", value+(index==array.length-1?"":split)], onclick: function(event) { index < array.length - 1? can.onmotion.toggle(can, node[name]): typeof cb == "function" && cb(event, item) }}, {view: "list", style: {display: "none"}}]).last) }) }); return node }, field: function(can, type, item, target) { type = type || "input", item = item || {} - return can.page.Append(can, target, [{view: [(type||"")+" "+(item.name||"")+" "+(item.pos||""), "fieldset"], list: [ + return can.page.Append(can, target||can._output, [{view: [(type||"")+" "+(item.name||"")+" "+(item.pos||""), "fieldset"], list: [ item.pos? undefined: {text: [(item.nick||item.name||"").split(" ")[0]+"("+(item.help||"").split(" ")[0]+")", "legend"]}, {view: ["option", "form"]}, {view: ["action"]}, {view: ["output"]}, {view: ["status"]}, ]}]) @@ -448,14 +437,15 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, meta.type = meta.type||"story" can.onappend._init(can, meta, ["/plugin/state.js"], function(sub) { + meta.type == "story" && sub.page.Remove(sub, sub._legend) typeof cb == "function" && cb(sub, meta) - sub.page.Remove(sub, sub._legend) }, target||can._output) }, plugin: function(can, meta, cb, target) { meta = meta || {} - can.run({}, ["action", "command", meta.index], function(msg) { msg.Table(function(value) { - can.onappend._plugin(can, value, meta, cb, target) - }) }, true) + meta.inputs && meta.inputs.length > 0? can.onappend._plugin(can, {meta: meta.meta, list: meta.list}, meta, cb, target): + can.run({}, ["action", "command", meta.index||item.ctx+"."+item.cmd], function(msg) { msg.Table(function(value) { + can.onappend._plugin(can, value, meta, cb, target) + }) }, true) }, plugins: function(can, meta, cb, target) { can.onappend.plugin(can, meta, function(sub) { @@ -557,8 +547,6 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can, targe target._keys = can.onkeypop._parse(event, can, "normal", target._keys||[], item) }) } - target.onkeyup = function(event) { - } }, _parse: function(event, can, mode, list, target) { list.push(event.key) can.Status && can.Status("keys", list.join("")) diff --git a/lib/core.js b/lib/core.js index fb5ad4fe..3f37dc1e 100644 --- a/lib/core.js +++ b/lib/core.js @@ -87,7 +87,7 @@ Volcanos("core", {help: "核心模块", var can = args["can"]||args[0], msg = args["msg"]||args[1] func = typeof func == "function"? func: typeof func == "string"? this.Value(mod||can, func): - typeof func == "object" && func.slice? this.Value(func, this.Keys(func.slice(1))): null + typeof func == "object" && func.slice? this.Value(func[0], this.Keys(func.slice(1))): null if (typeof func != "function") { return } var cb = args["cb"] diff --git a/lib/misc.js b/lib/misc.js index ae410468..cdfae48d 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -65,6 +65,9 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg for (var i = 0; i < arguments.length; i++) { msg.result.push(arguments[i]) } return msg._hand = true, msg }, + Length: function() { + return msg.append && msg.append[0] && msg[msg.append[0]] && msg[msg.append[0]].length || 0 + }, } return msg }, diff --git a/manifest.json b/manifest.json index 89c9ddb8..7d541d34 100644 --- a/manifest.json +++ b/manifest.json @@ -1,21 +1,12 @@ { "manifest_version": 2, - "name": "volcanos", - "version": "0.0.1", + "name": "volcanos", "version": "0.0.1", "background": {"page": "/publish/chrome/chrome.html"}, "browser_action": {"default_popup": "/publish/chrome/popup.html"}, - "content_scripts": [ - { - "matches": [""], - "js": ["/proto.js", - "/lib/base.js", - "/lib/core.js", - "/lib/misc.js", - "/lib/page.js", - "/lib/user.js", - "/publish/chrome/contexts.js" - ] - } + "content_scripts": [{"matches": [""], + "js": ["/proto.js", "/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js", + "/publish/chrome/contexts.js" + ]} ], "permissions": [ "tabs", diff --git a/pane/Action.css b/pane/Action.css index 3c8cf118..133bf24a 100644 --- a/pane/Action.css +++ b/pane/Action.css @@ -26,9 +26,10 @@ fieldset.Action>div.action div.item.select { background-color:#2e515f; } +fieldset.Action div.output { +} fieldset.Action div.output.tabs { - margin:28px 10px; - padding-bottom:28px; + margin-top:28px; } fieldset.Action div.output.flow fieldset.plugin { float:left; diff --git a/pane/Action.js b/pane/Action.js index 1b221c0d..7fe9668a 100644 --- a/pane/Action.js +++ b/pane/Action.js @@ -1,49 +1,38 @@ -(function() { const RIVER = "river", STORM = "storm", ACTION = "action" -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - var river = can.Conf(RIVER), storm = can.Conf(STORM) - can.onmotion.clear(can), can.core.Next(msg.Table(), function(value, next) { - value.feature = can.base.Obj(value.feature||value.meta||"{}", {}) - value.inputs = can.base.Obj(value.inputs||value.list||"[]", []) +Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) { + var river = can.Conf("river"), storm = can.Conf("storm") + can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) { + item.width = parseInt(can.Conf("width")), item.height = parseInt(can.Conf("height")) + item.feature = can.base.Obj(item.feature||item.meta) + item.inputs = can.base.Obj(item.inputs||item.list) + item.type = "plugin" - value.inputs.length == 0? can.run({}, ["action", "command", value.index || value.ctx+"."+value.cmd], function(msg) { - value.feature = can.base.Obj(msg.meta&&msg.meta[0]||"{}", {}) - value.inputs = can.base.Obj(msg.list&&msg.list[0]||"[]", []) - - can.onimport._plugin(can, target, river, storm, value), next() - }): (can.onimport._plugin(can, target, river, storm, value), next()) + can.onappend.plugin(can, item, function(sub, meta) { + can.onimport._plugin(can, river, storm, sub, meta), next() + }) }) }, - _plugin: function(can, target, river, storm, value) { value.name = value.name.split(" ")[0] - value.width = parseInt(can.Conf("width")), value.height = parseInt(can.Conf("height")) - value.action = value.id || value.index || value.key+"."+value.name - value.type = "plugin" - - // 添加插件 - can.onappend._init(can, value, ["/plugin/state.js"], function(plugin) { - plugin._option.dataset.id = value.action, value.target = plugin._target - plugin.run = function(event, cmds, cb, silent) { var msg = plugin.request(event); cmds = cmds || [] - return can.run(event, can.onengine[cmds[0]]? cmds: [river, storm, value.action].concat(cmds), function(msg) { - typeof cb == "function" && cb(msg) - }, silent) - } - - can.page.Modify(can, plugin._target, {style: {"max-width": value.width}}) - can.onengine.listen(can, "action.resize", function(width, height) { - can.page.Modify(can, plugin._target, {style: {"max-width": value.width = width}}) + _plugin: function(can, river, storm, sub, item) { + sub.run = function(event, cmds, cb) { var msg = sub.request(event); cmds = cmds || [] + return can.run(event, [river, storm, item.id||item.index||item.key+"."+item.name].concat(cmds), function(msg) { + typeof cb == "function" && cb(msg) }) + }, can._plugins = (can._plugins||[]).concat([sub]) - can._plugins = (can._plugins||[]).concat([plugin]) - can.page.Append(can, can._action, [{view: ["item", "div", value.name], onclick: function(event) { - can.onmotion.select(can, can._output, "fieldset.plugin", value.target) - can.onmotion.select(can, can._action, "div.item", event.target) - }}]) - }, target) + can.page.Modify(can, sub._target, {style: {"max-width": item.width}}) + can.onengine.listen(can, "action.resize", function(width, height) { + can.page.Modify(can, sub._target, {style: {"max-width": item.width = width}}) + }) + + can.page.Append(can, can._action, [{view: ["item", "div", item.name], onclick: function(event) { + can.onmotion.select(can, can._output, "fieldset.plugin", sub._target) + can.onmotion.select(can, can._action, "div.item", event.target) + }}]) }, - _share: function(can, msg, share, cb) { - can.user.title(msg.Option("title")) + _share: function(can, msg, share) { can.user.topic(can, can.user.Search(can, "topic")||msg.Option("topic")||"white") - can.Conf(RIVER, "_share"), can.Conf(STORM, share) - can.onimport._init(can, msg, [], cb, can._output) + can.user.title(can.user.Search(can, "title")||msg.Option("title")) + can.Conf("river", "_share"), can.Conf("storm", share) + can.onimport._init(can, msg) }, }) Volcanos("onengine", {help: "解析引擎", list: [], @@ -69,65 +58,55 @@ Volcanos("onengine", {help: "解析引擎", list: [], }) Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { var share = can.user.Search(can, "share"); if (share) { - can.run({}, ["_share", share], function(msg) { msg.append && msg[msg.append[0]]? can.onimport._share(can, msg, share, cb): + can.run({}, ["_share", share], function(msg) { msg.Length()>0? can.onimport._share(can, msg, share): can.onengine.engine({}, can, msg, can, [msg.Option("sess.river"), msg.Option("sess.storm")], function(msg) { - can.onimport._share(can, msg, share, cb) + can.onimport._share(can, msg, share) }) }) } can.onengine.listen(can, "storm.select", function(msg, river, storm) { - can.page.Cache(can.Conf(RIVER)+"."+can.Conf(STORM), can._action, can._output.scrollTop+1) - can.page.Cache(can.Conf(RIVER)+"."+can.Conf(STORM), can._output, can._output.scrollTop+1) - can.Conf(RIVER, river), can.Conf(STORM, storm) // 转场 - var position = can.page.Cache(river+"."+storm, can._action) - var position = can.page.Cache(river+"."+storm, can._output) - if (position) { can._output.scrollTo(0, position-1); return } - - can.run({}, [river, storm], function(msg) { - if (msg.append && msg[msg.append[0]] && msg[msg.append[0]].length > 0) { - can.onimport._init(can, msg, list, cb, can._output) - } else { - var msg = can.request({}, {river: river, storm: storm}) - can.run(msg._event, ["search", "River.ondetail.添加工具"]) - } - }) + can.onaction._select(can, msg, river, storm) }) - can.run({}, ["search", "Header.onimport.menu", "action", - ["布局", "默认布局", "流动布局", "网格布局", "标签布局", "自由布局"], - ], function(event, key) { - can.core.CallFunc(can.onaction[key], {event: event, can: can, key: key}) + can.onengine.listen(can, "search", function(msg, word) { + if (word[0] == "*" || word[0] == "plugin") { + can.onexport.plugin(can, msg) + } }) - can._target.ontouchstart = function(event) { can.onengine.signal(can, "action.touch", {}) } + can._target.ontouchstart = function(event) { + can.onengine.signal(can, "action.touch", can.request(event)) + } + can.Conf({width: can._output.offsetWidth-33, height: window.innerHeight}) can.onengine.listen(can, "resize", function(width, height) { can.Conf({width: width, height: height}) can.onengine.signal(can, "action.resize", can.request({}, {width: width, height: height})) }) - can.onengine.listen(can, "search", function(msg, word) { - if (word[0] != "*" && word[0] != "plugin") { return } + can.run({}, ["search", "Header.onimport.menu", "action", + ["布局", "默认布局", "流动布局", "网格布局", "标签布局", "自由布局"], + ], function(event, key) { + can.core.CallFunc([can.onaction, key], {event: event, can: can, key: key}) + }) + }, + _select: function(can, msg, river, storm) { + function key(name) { return can.Conf("river")+"."+can.Conf("storm")+"."+name} + can.page.Cache(key("action"), can._action, can._output.scrollTop+1) + can.page.Cache(key("output"), can._output, can._output.scrollTop+1) - var fields = (msg.Option("fields")||"pod,ctx,cmd,type,name,text").split(",") - can.page.Select(can, can._output, "fieldset.plugin>legend", function(item) { - if (item.innerHTML.indexOf(word[1]) == -1) { return } + can.Conf("river", river), can.Conf("storm", storm) // 转场 + var position = can.page.Cache(key("output"), can._output) + var position = can.page.Cache(key("action"), can._action) + if (position) { can._output.scrollTo(0, position-1); return } - can.core.List(fields, function(key) { - switch (key) { - case "ctx": msg.Push(key, "web.chat"); break - case "cmd": msg.Push(key, "action"); break - case "type": msg.Push(key, "plugin"); break - case "name": msg.Push(key, item.innerHTML); break - case "text": - msg.Push(key, shy("跳转", function() { - var input = can.page.Select(can, item.parentNode, "input.args")[0] - input && input.focus() - })); break - default: msg.Push(key, "") - } - }) - }) + can.run({}, [river, storm], function(msg) { + if (msg.Length() > 0) { + can.onimport._init(can, msg) + } else { + var msg = can.request({}, {river: river, storm: storm}) + can.run(msg._event, ["search", "River.ondetail.添加工具"]) + } }) }, @@ -161,5 +140,25 @@ Volcanos("onexport", {help: "导出数据", list: [], item.dataset.args = JSON.stringify(list), cb(item, next) }) }, + plugin: function(can, msg) { + var fields = (msg.Option("fields")||"pod,ctx,cmd,type,name,text").split(",") + can.page.Select(can, can._output, "fieldset.plugin>legend", function(item) { + if (item.innerHTML.indexOf(word[1]) == -1) { return } + + can.core.List(fields, function(key) { + switch (key) { + case "ctx": msg.Push(key, "web.chat"); break + case "cmd": msg.Push(key, "action"); break + case "type": msg.Push(key, "plugin"); break + case "name": msg.Push(key, item.innerHTML); break + case "text": + msg.Push(key, shy("跳转", function() { + var input = can.page.Select(can, item.parentNode, "input.args")[0] + input && input.focus() + })); break + default: msg.Push(key, "") + } + }) + }) + }, }) -})() diff --git a/pane/Header.js b/pane/Header.js index 86382e6c..d937532e 100644 --- a/pane/Header.js +++ b/pane/Header.js @@ -36,6 +36,13 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, }]) }) }, + _daemon: function(can, name, cb) { + can.misc.WSS(can, {type: "chrome", name: name}, cb||function(event, msg, cmd, arg) { + msg && can.run(event, ["search"].concat(msg["detail"]||[]), function(msg) { + msg.Reply() + }) + }) + }, _state: function(can, msg, target) { can.core.List(can.Conf(STATE)||["time", USERNAME], function(item) { can.page.Append(can, target, [{view: ["state "+item, "div", can.Conf(item)], diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 0a3c7363..dfab1e76 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -149,7 +149,7 @@ Volcanos("onaction", {help: "控件交互", list: [], // can.onimport.project(can, can.Option("path")) }) }, - search: function(event, can) { + searchShow: function(event, can) { can.page.Toggle(can, can.ui.search, function() { // can.onaction.searchLine(event, can, "") }) @@ -259,6 +259,9 @@ Volcanos("onaction", {help: "控件交互", list: [], can.onkeymap && can.onkeymap.selectLine(can, line, item) }) + + var pos = can.current.offset()-can.current.line.offsetTop + can.current.scroll(0, -pos) }, searchLine: function(event, can, value) { value = value.trim() can.page.Modify(can, can.ui.search, {style: {display: ""}}) @@ -273,8 +276,7 @@ Volcanos("onaction", {help: "控件交互", list: [], value = value.replace("<", "<").replace(">", ">"), value = value.replace("./", "") return {text: ["", "td"], list: [{text: [value, "div"]}], onclick: function(event) { line.line && can.onimport.tabview(can, can.Option("path"), line.file.replace("./", ""), parseInt(line.line), function() { - var pos = can.current.offset()-can.current.line.offsetTop - can.current.scroll(0, -pos) + can.onaction.selectLine(can, parseInt(line.line)) }) }} }, can.ui.tags) diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index e79fafc0..9c19e083 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -47,6 +47,9 @@ Volcanos("onimport", {help: "导入数据", list: [], _merge: function(can, sub) }, }, ["/plugin/local/code/vimer.css"]) Volcanos("onaction", {help: "控件交互", list: [], + _engine: function(event, can, key, arg, cb) { + can.onkeymap._remote(event, can, key) + }, save: function(event, can) { var msg = can.request(event); msg.Option("content", can.onexport.content(can)) can.run(event, ["action", "save", can.parse, can.Option("file"), can.Option("path")], function(msg) { diff --git a/proto.js b/proto.js index 39b799d6..d167f03d 100644 --- a/proto.js +++ b/proto.js @@ -52,21 +52,16 @@ var Volcanos = shy("火山架", {libs: [], cache: {}}, [], function(name, can, l return // 加载完成 } - var source = !libs[0].endsWith("/") && (libs[0].indexOf(".") == -1? libs[0]+".js": libs[0]) || libs[0] - // 请求模块 - function next() { can._load(source, each), can.require(libs.slice(1), cb, each) } - meta.cache[source]? next(): meta._load(source, next) + function next() { can._load(libs[0], each), can.require(libs.slice(1), cb, each) } + meta.cache[libs[0]]? next(): meta._load(libs[0], next) }, request: function(event, option) { event = event || {} event._msg = event._msg || can.misc.Message(event, can) can.core.Item(option, event._msg.Option) return event._msg }, - - Conf: function(key, value) { - return can.core.Value(can._conf, key, value) - }, _conf: {}, + Conf: function(key, value) { return can.core.Value(can._conf, key, value) }, _conf: {}, } if (_can_name) {