diff --git a/frame.js b/frame.js index a1f21362..07a89222 100644 --- a/frame.js +++ b/frame.js @@ -78,10 +78,10 @@ Volcanos(chat.ONENGINE, {help: "搜索引擎", _init: function(can, meta, list, return false }, _plugin: function(event, can, msg, panel, cmds, cb) { - if (cmds[0] == ctx.ACTION && cmds[1] == ice.RUN && can.onengine.plugin.meta[cmds[2]]) { - return can.core.CallFunc(can.onengine.plugin.meta[cmds[2]], {can: panel, msg: msg, cmds: cmds.slice(3), cb: cb}), true + if (cmds[0] == ctx.ACTION && cmds[1] == ice.RUN && can.onengine.plugin(can, cmds[2])) { + return can.core.CallFunc(can.onengine.plugin(can, cmds[2]), {can: panel, msg: msg, cmds: cmds.slice(3), cb: cb}), true } - var p = can.onengine.plugin.meta[cmds[0]], n = 1; if (p) { + var p = can.onengine.plugin(can, cmds[0]), n = 1; if (p) { if (p.meta && p.meta[cmds[1]] && cmds[0] == ctx.ACTION) { n = 3 } else if (p.meta && p.meta[cmds[0]]) { n = 2 } return can.core.CallFunc(p, {can: p.can||panel, msg: msg, arg: cmds.slice(n), cmds: cmds.slice(n), cb: cb}), true } @@ -89,9 +89,12 @@ Volcanos(chat.ONENGINE, {help: "搜索引擎", _init: function(can, meta, list, }, plugin: shy("添加插件", function(can, name, command) { - if (can.base.isObject(name)) { - return can.core.Item(name, function(key, value) { - name.hasOwnProperty(key) && can.base.isFunc(value) && can.onengine.plugin(can, key, value) }) + if (name == undefined) { return } + if (command == undefined) { + if (typeof name != "string") { return } + if (name.indexOf("can.") == -1) { return } + name = can.base.trimPrefix(name, "can.") + return arguments.callee.meta[name] } name = can.base.trimPrefix(name, "can.") var type = html.TEXT; command.list = can.core.List(command.list, function(item) { @@ -99,7 +102,7 @@ Volcanos(chat.ONENGINE, {help: "搜索引擎", _init: function(can, meta, list, case lang.STRING: return can.core.SplitInput(item) case lang.OBJECT: return type = item.type||type, item } - }), command.can = can, arguments.callee.meta[can.core.Keys(ice.CAN, name)] = command + }), command.can = can, arguments.callee.meta[name] = command }), listen: shy("监听事件", function(can, name, cb) { arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb) @@ -456,7 +459,7 @@ Volcanos(chat.ONAPPEND, {help: "渲染引擎", _init: function(can, meta, list, }, target||can._output, field) }, plugin: function(can, meta, cb, target, field) { meta = meta||{}, meta.index = meta.index||can.core.Keys(meta.ctx, meta.cmd) - var p = can.onengine.plugin.meta[meta.index], res = {}; function cbs(sub, meta, skip) { res.__proto__ = sub, cb(sub, meta, skip) } + var p = can.onengine.plugin(can, meta.index), res = {}; function cbs(sub, meta, skip) { res.__proto__ = sub, cb(sub, meta, skip) } (meta.meta || meta.inputs && meta.inputs.length > 0)? /* 局部命令 */ can.onappend._plugin(can, {meta: meta.meta, list: meta.list}, meta, cbs, target, field): p? /* 前端命令 */ can.onappend._plugin(can, {name: meta.index, help: p.help, meta: p.meta, list: p.list}, meta, function(sub, meta, skip) { sub.run = function(event, cmds, cb) { var _cb = p, n = 0 diff --git a/lib/misc.js b/lib/misc.js index 9ea876e0..68d79c24 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -255,8 +255,8 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg if (list[cmds[0]]) { return list[cmds[0]](cmds.slice(1)), true } }, concat: function(can, to, from) { to = to||[], from = from||[] - if (from[0] == ctx.ACTION && from[1] == ice.RUN && can.onengine.plugin.meta[from[2]]) { return from } - if (can.onengine.plugin.meta[from[0]]) { return from } + if (from[0] == ctx.ACTION && from[1] == ice.RUN && can.onengine.plugin(can, from[2])) { return from } + if (can.onengine.plugin(can, from[0])) { return from } if (from[0] == "_search") { return from } return to.concat(from) }, diff --git a/panel/action.js b/panel/action.js index 7a5aef4e..5247ba75 100644 --- a/panel/action.js +++ b/panel/action.js @@ -38,6 +38,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg) { _cmd: function(can, item, next) { can.onengine.signal(can, chat.ONACTION_CMD) can.onappend.plugin(can, can.base.Copy(item, {mode: "cmd", opts: can.misc.Search(can)}), function(sub, meta, skip) { sub.run = function(event, cmds, cb) { can.runActionCommand(event, sub._index, cmds, cb) } + can._plugins = can.misc.concat(can, can._plugins, [sub]) can.user.title(meta.name), skip || next() }) }, diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index d87e039b..74bfaeb0 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -32,8 +32,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", var ls = can.file.split(ice.PS); if (ls.length > 4) { ls = [ls.slice(0, 2).join(ice.PS)+"/.../"+ls.slice(-2).join(ice.PS)] } can.Status(kit.Dict("文件名", ls.join(ice.PS), "解析器", can.parse)), can.onimport.layout(can) - skip || can.onaction.selectLine(can, can.Option(nfs.LINE)) - can.base.isFunc(cb) && cb(), cb = null + skip || can.onaction.selectLine(can, can.Option(nfs.LINE)), can.base.isFunc(cb) && cb(), cb = null }) } function load(msg) { can.tabview[key] = msg @@ -65,7 +64,7 @@ Volcanos(chat.ONFIGURE, {help: "索引导航", can.onimport.zone(can, can.core.List(path, function(path) { return {name: path, _init: function(target) { show(target, path) }} }), target) }, plugin: function(can, target, zone) { var total = 0 - can.onimport.tree(can, can.core.Item(can.onengine.plugin.meta, function(key) { return total++, {index: can.base.trimPrefix(key, "can.")} }), ctx.INDEX, ice.PT, function(event, item) { + can.onimport.tree(can, can.core.Item(can.onengine.plugin.meta, function(key) { return total++, {index: key} }), ctx.INDEX, ice.PT, function(event, item) { can.onimport.tabview(can, can.Option(nfs.PATH), can.core.Keys("can", item.index), ctx.INDEX) }, target), zone._total(total) }, @@ -105,7 +104,6 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", _init: function(can, msg, cb) { return can.onimport.plug(can, {index: msg.Option(ctx.INDEX), args: can.Option(nfs.PATH) == ctx.COMMAND && can.Option(nfs.LINE) != ctx.INDEX? [can.Option(nfs.LINE)]: []}, can.ui._content, function(sub) { sub.onimport.size(sub, sub.ConfHeight(can.ui.content.offsetHeight-2*html.ACTION_HEIGHT), sub.ConfWidth(can.ui.content.offsetWidth), true) msg._plugin = sub, can.base.isFunc(cb) && cb(msg._content = can.ui._content), can.onmotion.delay(can, function() { sub.Focus() }) - sub.onaction.close = function() { can.onaction.back(can), msg._tab._close() } sub.onimport._open = function(sub, msg, _arg) { var url = can.base.ParseURL(_arg), ls = url.origin.split("/chat/pod/") if (_arg.indexOf(location.origin) == 0 && ls.length > 1) { @@ -247,6 +245,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", if (target.offsetWidth < can.ui._profile_output.offsetWidth) { can.profile_size[can.onexport.keys(can)] = target.offsetWidth, can.onimport.layout(can) } }) }) } + can.onmotion.toggle(can, can.ui.profile_output, true) can.onmotion.toggle(can, can.ui.profile, true), can.onimport.layout(can) }, display: function(can, msg) { @@ -302,8 +301,8 @@ Volcanos(chat.ONACTION, {help: "控件交互", _trans: {link: "链接", width: " }) Volcanos(chat.ONIMPORT, {help: "导入数据", - _keydown: function(can) { can.onkeymap._build(can) - can.isCmdMode() && can._root.onengine.listen(can, chat.ONKEYDOWN, function(event) { + _keydown: function(can) { if (!can.isCmdMode()) { return } + can.onkeymap._build(can), can._root.onengine.listen(can, chat.ONKEYDOWN, function(event) { can._key_list = can.onkeymap._parse(event, can, mdb.PLUGIN, can._key_list, can.ui.content) }) }, @@ -316,8 +315,6 @@ Volcanos(chat.ONKEYMAP, {help: "导入数据", r: shy("执行命令", function(event, can) { can.onaction[cli.EXEC](event, can) }), f: shy("打开文件", function(event, can) { can.onaction["打开"](event, can) }), - g: shy("搜索", function(event, can) { can.onaction["搜索"](event, can) }), - x: shy("关闭标签", function(event, can) { can._tab._close() }), h: shy("打开左边标签", function(event, can) { var next = can._tab.previousSibling; next && next.click() }), l: shy("打开右边标签", function(event, can) { var next = can._tab.nextSibling; next && next.click() }), @@ -343,10 +340,8 @@ Volcanos(chat.ONKEYMAP, {help: "导入数据", }) Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) { - can.page.ClassList.add(can, can._fields, code.INNER) - can.onmotion.clear(can), can.onlayout.profile(can) - can.onimport._profile(can, can.ui.profile) - can.onimport._display(can, can.ui.display) + can.onmotion.clear(can), can.page.ClassList.add(can, can._fields, code.INNER), can.onlayout.profile(can) + can.onimport._profile(can, can.ui.profile), can.onimport._display(can, can.ui.display) if (msg.Result() == "" && can.Option(nfs.LINE) == "1") { return } if (msg.Option(nfs.FILE)) { @@ -401,6 +396,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }, layout: function(can) { if (can.isSimpleMode()) { return can.page.style(can, can.ui.content, html.WIDTH, can.ConfWidth()) } + if (can.isCmdMode()) { can.ConfHeight(window.innerHeight), can.ConfWidth(window.innerWidth) } var width = can.ConfWidth()+(can.user.isMobile && can.isCmdMode() && can.user.isLandscape()? 16: 0)-(can.user.isWindows && !can.isCmdMode()? 20: 0) var project_width = can.ui.project.style.display == html.NONE? 0: (can.ui.project.offsetWidth||240) @@ -412,47 +408,30 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar var height = can.user.isMobile && can.isFloatMode()? window.innerHeight-2*html.ACTION_HEIGHT: can.base.Min(can.ConfHeight(), 320)-1 var display_height = can.ui.display.style.display == html.NONE? 0: (can.display_size[can.onexport.keys(can)]||height/2) - if (can.isCmdMode()) { // height += html.ACTION_HEIGHT - var content_height = height-display_height - can.ui._tabs.offsetHeight - can.ui._path.offsetHeight - 4 - can.page.style(can, can._output, html.MAX_HEIGHT, "") - } else { - var content_height = height-display_height - } - + var content_height = height-display_height; if (can.isCmdMode()) { content_height -= can.ui._tabs.offsetHeight + can.ui._path.offsetHeight + 4 } var profile_height = height-html.ACTION_HEIGHT-display_height can.page.styleHeight(can, can.ui.profile_output, profile_height) can.page.styleHeight(can, can.ui.display_output, display_height) can.page.styleHeight(can, can.ui.content, content_height-(can.ui.content != can.ui._content? 4: 0)) can.page.styleHeight(can, can.ui.project, height) - can.page.Select(can, can.ui.profile, html.IFRAME, function(iframe) { - can.page.Modify(can, iframe, {height: profile_height-html.ACTION_HEIGHT-4, width: profile_width}) - }) - var sub = can.ui.content._plugin; if (sub) { - sub.ConfHeight(content_height-2*html.ACTION_HEIGHT), sub.ConfWidth(content_width) - sub && sub.onaction.refresh({}, sub) - } + var sub = can.ui.content._plugin; sub && sub.onimport.size(content_height-2*html.ACTION_HEIGHT, content_width, true) + can.page.Select(can, can.ui.profile, html.IFRAME, function(iframe) { can.page.Modify(can, iframe, {height: profile_height-html.ACTION_HEIGHT-4, width: profile_width}) }) }, toolkit: function(can, meta, cb) { meta.msg = true can.onimport.plug(can, meta, can.ui.toolkit.output, function(sub) { - sub.ConfHeight(can.ConfHeight()/2), sub.ConfWidth(can.ConfWidth()-can.ui.project.offsetWidth) - sub.page.style(sub, sub._output, html.MAX_HEIGHT, sub.ConfHeight()) - sub.page.style(sub, sub._output, html.MAX_WIDTH, sub.ConfWidth()) - + sub.onimport.size(sub, can.ConfHeight()/2, can.ConfWidth() - can.ui.profile.offsetWidth, true) can._status.appendChild(sub._legend), sub._legend.onclick = function(event) { if (can.page.Select(can, can._status, ice.PT+html.SELECT)[0] == event.target) { can.page.ClassList.del(can, event.target, html.SELECT) can.page.ClassList.del(can, sub._target, html.SELECT) return } - can.onmotion.select(can, can.ui.toolkit.output, html.FIELDSET, sub._target), sub.Focus() can.onmotion.select(can, can._status, html.LEGEND, event.target) if (meta.msg == true) { meta.msg = false, sub.Update() } - }, sub.select = function() { return sub._legend.click(), sub } - sub.onaction.close = function() { sub.select() } - sub._legend.onmouseenter = null - can.base.isFunc(cb) && cb(sub) + }, sub._legend.onmouseenter = null, can.base.isFunc(cb) && cb(sub) + sub.onaction.close = sub.select = function() { return sub._legend.click(), sub } }) }, exts: function(can, url, cb) { diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index b15033c5..9e56ac66 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -1,10 +1,9 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) { can.require(["inner.js"], function(can) { can.onimport.inner_init(can, msg, function() { can.undo = [], can.redo = [] - // can.core.Item(can.onkeymap._mode.plugin, function(key, value) { can.onkeymap._mode.normal[key] = can.onkeymap._mode.normal[key]||value }) + can.page.ClassList.add(can, can._fields, code.VIMER) can.onimport._input(can), can.onkeymap._build(can), can.onkeymap._plugin({}, can) can.onengine.listen(can, "tabview.line.select", function(msg) { can.onaction._selectLine(can) }) - can.page.ClassList.add(can, can._fields, code.VIMER), can.base.isFunc(cb) && cb(msg) - can.onengine.plugin(can, can.onplugin) + can.onengine.plugin(can, can.onplugin), can.base.isFunc(cb) && cb(msg) }, target) }, function(can, name, sub) { name == chat.ONIMPORT && (can.onimport.inner_init = sub._init) if (name == chat.ONACTION) { can._trans = can.base.Copy(can._trans||{}, sub._trans) } if (name == chat.ONKEYMAP) { can.core.Item(sub._mode, function(mode, value) { @@ -18,32 +17,24 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar {view: ["current", html.INPUT], spellcheck: false, onkeydown: function(event) { if (event.metaKey) { return } if (event.ctrlKey && can.onaction._complete(event, can)) { return } can._keylist = can.onkeymap._parse(event, can, can.mode+(event.ctrlKey? "_ctrl": ""), can._keylist, can.ui.current) - can.mode == "insert" && can.onmotion.delay(can, function() { can.current.text(can.ui.current.value) }, 10) + can.mode == "insert" && can.onmotion.delay(can, function() { can.current.text(can.ui.current.value) }) can.mode == "normal" && can.Status("按键", can._keylist.join("")) can.mode == "normal" && can.onkeymap.prevent(event) }, onkeyup: function(event) { can.onaction._complete(event, can) - }, onclick: function(event) { can.onkeymap._insert(event, can) - - }}, {view: [code.COMPLETE]}, + }}, code.COMPLETE, ]); can.ui.current = ui.current, can.ui.complete = ui.complete }, }, [""]) Volcanos(chat.ONFIGURE, {help: "索引导航", create: function(can, target, zone, path) { - if (can.isCmdMode()) { - can.onappend._action(can, can.base.Obj(can._msg.Option(ice.MSG_ACTION)), target) - } else { - can.onmotion.hidden(can, target.parentNode) - } + can.isCmdMode()? can.onappend._action(can, can.base.Obj(can._msg.Option(ice.MSG_ACTION)), target): can.onmotion.hidden(can, target.parentNode) }, source: function(can, target, zone, path) { var total = 0 function show(target, path) { can.run(can.request({}, {dir_root: path, dir_deep: true}), [ice.PWD], function(msg) { var list = msg.Table() - can.core.List(list, function(item) { if (can.Option(nfs.FILE).indexOf(item.path) == 0) { item.expand = true } - item._menu = shy({trash: function(event) { can.onaction._run(event, can, nfs.TRASH, [can.base.Path(path, item.path)]) }}) - }) + can.core.List(list, function(item) { item._menu = shy({trash: function(event) { can.onaction._run(event, can, nfs.TRASH, [can.base.Path(path, item.path)]) }}) }) can.onimport.tree(can, list, nfs.PATH, ice.PS, function(event, item) { can.onimport.tabview(can, path, item.path) }, target) - can.Status("文件数", total += msg.Length()), zone._total(total) + can.Status("文件数", zone._total(total += msg.Length())) }, true) } if (path.length == 1) { return show(target, path[0]) } can.page.Remove(can, target.previousSibling) @@ -51,20 +42,16 @@ Volcanos(chat.ONFIGURE, {help: "索引导航", }, website: function(can, target, zone) { can.run(can.request({}, {dir_root: "src/website/", dir_deep: true}), [ice.PWD], function(msg) { var list = msg.Table() - can.core.List(list, function(item) { if (can.Option(nfs.FILE).indexOf(item.path) == 0) { item.expand = true } }) can.onimport.tree(can, list, nfs.PATH, ice.PS, function(event, item) { can.onimport.tabview(can, "src/website/", item.path) }, target) zone._total(msg.Length()) }, true) }, dream: function(can, target, zone) { var call = arguments.callee can.runAction({}, ice.RUN, [web.DREAM], function(msg) { msg.Table(function(item) { var color = item.status == cli.START? "": "gray" - can.page.style(can, can.onimport.item(can, item, function(event) { - can.onimport.tabview(can, can.Option(nfs.PATH), item.name, web.DREAM) - }, function(event) { + can.page.style(can, can.onimport.item(can, item, function(event) { can.onimport.tabview(can, can.Option(nfs.PATH), item.name, web.DREAM) }, function(event) { return shy({}, kit.Dict(cli.START, [cli.OPEN, cli.STOP], cli.STOP, [cli.START, nfs.TRASH])[item.status], function(event, button) { can.runAction(can.request({}, item), ice.RUN, [web.DREAM, ctx.ACTION, button], function(msg) { - if (can.sup.onimport._process(can.sup, msg)) { return } - can.onmotion.clear(can, target), call(can, target, zone) + if (can.sup.onimport._process(can.sup, msg)) { return } can.onmotion.clear(can, target), call(can, target, zone) }) }) }, target), {color: color}) @@ -77,21 +64,17 @@ Volcanos(chat.ONFIGURE, {help: "索引导航", }, xterm: function(can, target, zone) { can.runAction({}, ice.RUN, [code.XTERM], function(msg) { msg.Table(function(item) { - can.onimport.item(can, item, function(event) { - can.onimport.tabview(can, ctx.COMMAND, code.XTERM, item.hash) - }, function(event) {}, target) + can.onimport.item(can, item, function(event) { can.onimport.tabview(can, ctx.COMMAND, code.XTERM, item.hash) }, function(event) {}, target) }), zone._total(msg.Length()) }) }, plugin: function(can, target, zone) { var total = 0 - can.onimport.tree(can, can.core.Item(can.onengine.plugin.meta, function(key) { return total++, {index: can.base.trimPrefix(key, "can.")} }), ctx.INDEX, ice.PT, function(event, item) { + can.onimport.tree(can, can.core.Item(can.onengine.plugin.meta, function(key) { return total++, {index: key} }), ctx.INDEX, ice.PT, function(event, item) { can.onimport.tabview(can, can.Option(nfs.PATH), can.core.Keys("can", item.index), ctx.INDEX) }, target), zone._total(total) }, module: function(can, target, zone) { can.runAction(can.request({}, {fields: ctx.INDEX}), ctx.COMMAND, [mdb.SEARCH, ctx.COMMAND], function(msg) { - can.onimport.tree(can, msg.Table(), ctx.INDEX, ice.PT, function(event, item) { - can.onimport.tabview(can, can.Option(nfs.PATH), item.index, ctx.INDEX) - }, target), zone._total(msg.Length()) + can.onimport.tree(can, msg.Table(), ctx.INDEX, ice.PT, function(event, item) { can.onimport.tabview(can, can.Option(nfs.PATH), item.index, ctx.INDEX) }, target), zone._total(msg.Length()) }) }, }) @@ -116,15 +99,16 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互", t: shy("添加命令", function(event, can) { can.onaction["添加"](event, can) }), p: shy("添加插件", function(event, can) { can.onaction["插件"](event, can) }), e: shy("添加扩展", function(event, can) { can.onaction["扩展"](event, can) }), - + g: shy("搜索", function(event, can) { can.onaction["搜索"](event, can) }), + i: shy("插入模式", function(event, can) { can.onkeymap._insert(event, can) }), n: shy("命令模式", function(event, can) { can.onkeymap._normal(event, can) }), ":": shy("底行模式", function(event, can) { can.onimport.toolkit(can, {index: "cli.system"}, function(sub) { can.toolkit["cli.system"] = sub.select() }) }), s: shy("保存文件", function(event, can) { can.onaction.save(event, can, nfs.SAVE) }), - d: shy("创建空间", function(event, can) { can.onaction.dream(event, can, web.DREAM) }), - m: shy("添加模块", function(event, can) { can.onaction.autogen(event, can, code.AUTOGEN) }), c: shy("编译项目", function(event, can) { can.onaction.compile(event, can, code.COMPILE) }), + m: shy("添加模块", function(event, can) { can.onaction.autogen(event, can, code.AUTOGEN) }), + d: shy("创建空间", function(event, can) { can.onaction.dream(event, can, web.DREAM) }), }, normal_ctrl: { f: shy("向下翻页", function(event, can, target, count) { @@ -435,7 +419,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", }) }, }) -Volcanos(chat.ONEXPORT, {help: "导出数据", list: ["文件数", "模式", "解析器", "文件名", "当前行", "跳转数"]}) +Volcanos(chat.ONEXPORT, {help: "导出数据", list: ["文件数", "模式", "按键", "解析器", "文件名", "当前行", "跳转数"]}) Volcanos(chat.ONPLUGIN, {help: "注册插件", "code.vimer.keymap": shy("按键", {}, ["mode", "key", ice.LIST, ice.BACK], function(can, msg, cmds) { can.core.Item(can.onkeymap._mode, function(mode, value) {