diff --git a/lib/core.js b/lib/core.js index f88af181..9215ccbf 100644 --- a/lib/core.js +++ b/lib/core.js @@ -125,24 +125,16 @@ Volcanos("core", {help: "数据结构", return list }), Next: shy("迭代器", function(list, cb, cbs) { - function next(i) { - i < list.length? cb(list[i], function() { - next(i+1) - }, i, list): typeof cbs == lang.FUNCTION && cbs(list) - } - switch (typeof list) { - case undefined: list = []; break - case lang.OBJECT: - if (list.length == undefined) { - var ls = []; for (var k in list) { ls.push(k) } - list = ls - } - break - default: list = [list] + case lang.OBJECT: if (list == null) { list = []; break } + if (list.length == undefined) { var ls = []; for (var k in list) { ls.push(k) } list = ls } break + default: if (list == undefined) { list = []; break } + list = [list] } - list && list.length > 0 && typeof cb == lang.FUNCTION? next(0): typeof cbs == lang.FUNCTION && cbs(list) + function next(i) { i < list.length? typeof cb == lang.FUNCTION && cb(list[i], function() { next(i+1) }, i, list): + typeof cbs == lang.FUNCTION && cbs(list) } + return next(0), list }), Items: shy("迭代器", function(obj, cb) { var list = [] for (var k in obj) { diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index fb470390..c4ce8cb8 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -92,7 +92,7 @@ fieldset.inner>div.output div.profile>div.action>div.item { float:left; } fieldset.inner>div.output div.profile>div.output { - clear:both; + clear:both; overflow:auto; } fieldset.inner>div.output div.display>div.output { clear:both; diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index d59accb7..fbc3bdd0 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -10,50 +10,8 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE)) can.onimport.project(can, can.Option(nfs.PATH), function() { - can.onimport._toolkit(can, can.ui.toolkit), can.core.Timer(100, function() { - can.onimport.sess(can) - can.core.Next(can.core.Split(msg.OptionOrSearch("tool")), function(item, next) { - can.onimport.toolkit(can, {index: item}, next) - }, function() { - can.core.Next(["inner/search.js", "inner/favor.js", "inner/sess.js"].reverse(), function(item, next) { - can.require([item], function() {}, function(can, name, sub) { sub._init(can, next) }) - }, function() { - can.core.List(can.core.Split(msg.OptionOrSearch("tabs")), function(item) { - can.onimport.tabview(can, can.Option(nfs.PATH), item) - }) - }) - }) - }) - }) - var run = can.run; can.run = function(event, cmds, cb, silent) { var msg = can.request(event) - if (can.misc.runAction(can, msg, cmds, cb, kit.Dict( - ctx.INPUTS, function(cmds) { - if (cmds[0] == nfs.FILE) { - switch (msg.Option(mdb.TYPE)) { - case ctx.INDEX: - run(event, [ctx.ACTION, ctx.INPUTS, ctx.INDEX].concat(cmds.slice(1)), cb, silent) - break - default: - can.core.List(can._file, function(item) { - if (!cmds[1] || item.path.indexOf(cmds[1])) { - msg.Push(nfs.FILE, item.path) - } - }) - can.base.isFunc(cb) && cb(msg) - } - return - } - run(event, [ctx.ACTION, ctx.INPUTS].concat(cmds), cb, silent) - }, - ))) { return } - run(event, cmds, cb, silent) - } - can.user.mod.isCmd && can.onengine.listen(can, chat.ONKEYDOWN, function(event) { - var cb = can.onaction[kit.Dict( - "r", "执行", "v", "展示", "s", "保存", - "t", "添加", "f", "打开", "p", "插件", lang.ESCAPE, "清屏", - )[event.key]] - can.base.isFunc(cb) && cb(event, can) + can.onimport._toolkit(can, can.ui.toolkit), can.onimport._session(can, msg) + can.onimport._keydown(can) }) }, _project: function(can, target) { @@ -67,11 +25,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target cli.CLOSE, function(event) { can.onmotion.hidden(can, target), can.onimport.layout(can) }, mdb.PLUGIN, function(event) { can.user.input(event, can, [ctx.INDEX], function(event, button, data, list, args) { - can.onappend.plugin(can, data, function(sub) { - sub.run = function(event, cmds, cb) { - can.run(event, [ctx.ACTION, ice.RUN, data.index].concat(cmds), cb, true) - } - }, ui.output) + can.onimport.plugin(can, data, ui.output) }) }, )) @@ -85,11 +39,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target cli.CLOSE, function(event) { can.onmotion.hidden(can, target), can.onimport.layout(can) }, mdb.PLUGIN, function(event) { can.user.input(event, can, [ctx.INDEX], function(event, button, data, list, args) { - can.onappend.plugin(can, data, function(sub) { - sub.run = function(event, cmds, cb) { - can.run(event, [ctx.ACTION, ice.RUN, data.index].concat(cmds), cb, true) - } - }, ui.output) + can.onimport.plugin(can, data, ui.output) }) }, )) @@ -98,15 +48,19 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target _toolkit: function(can, target) { can.ui.toolkit = can.onappend.field(can, "toolkit", {}, can._output) can.ui.docker = can.page.Append(can, can._fields, [{view: "docker"}]).first - var repos = can.base.trimSuffix(can.base.trimPrefix(can.Option(nfs.PATH), "usr/"), ice.PS) - - can.run({}, [ctx.ACTION, ctx.COMMAND].concat([ - "web.code.git.spide", "web.code.git.trend", "web.code.git.total", - ].reverse()), function(msg) { - can.core.Next(msg.Table(), function(item, next) { - item.args = can.base.getValid(item.args, [repos]), can.onimport.toolkit(can, item, next) - }) - }, true) + }, + _session: function(can, msg) { can.onimport.sess(can, "", function() { can.onimport.sess(can, { + tool: can.core.Split(msg.OptionOrSearch("tool")).reverse(), + plug: can.core.Split(msg.OptionOrSearch("plug")).reverse(), + tabs: can.core.Split(msg.OptionOrSearch("tabs")), + }) }) }, + _keydown: function(can) { + can.user.mod.isCmd && can.onengine.listen(can, chat.ONKEYDOWN, function(event) { + var cb = can.onaction[kit.Dict( + "r", "执行", "v", "展示", "s", "保存", + "t", "添加", "f", "打开", "p", "插件", lang.ESCAPE, "清屏", + )[event.key]]; can.base.isFunc(cb) && cb(event, can) + }) }, project: function(can, path, cb) { can.Option({path: path}) @@ -125,15 +79,13 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target return can._msg.Option(can.Option()), can.onsyntax._init(can, can._msg, cb) } - if (line == ctx.INDEX) { var msg = can.request({}, {index: file, line: line}) - can.tabview[key] = msg + if (line == ctx.INDEX) { var msg = can.request({}, {index: file, line: line}); can.tabview[key] = msg msg._tab = can.onappend.tabs(can, [{name: file.split(ice.PS).pop(), text: file}], function(event, meta) { can.onimport.tabview(can, path, file, "", cb), cb = null }, function(item) { delete(can.tabview[key]) }) return } - can.Option({path: path, file: file, line: line||1}) can.run({}, [path, file], function(msg) { can.tabview[key] = msg msg._tab = can.onappend.tabs(can, [{name: file.split(ice.PS).pop(), text: file}], function(event, meta) { @@ -158,11 +110,8 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target can.onmotion.hidden(can, can.ui.display, true), can.onimport.layout(can) }, toolkit: function(can, meta, cb) { - can.onappend.plugin(can, meta, function(sub) { - sub.run = function(event, cmds, cb, silent) { - can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true) - } - + meta.opts = meta.opts||{repos: can.base.trimSuffix(can.base.trimPrefix(can.Option(nfs.PATH), "usr/"), ice.PS) } + can.onimport.plugin(can, meta, can.ui.toolkit.output, function(sub) { sub.Conf(html.HEIGHT, can.Conf(html.HEIGHT)-4*html.ACTION_HEIGHT, html.WIDTH, can.Conf(html.WIDTH)) sub.page.style(sub, sub._output, html.MAX_HEIGHT, sub.Conf(html.HEIGHT)) sub.page.style(sub, sub._output, html.MAX_WIDTH, sub.Conf(html.WIDTH)) @@ -178,7 +127,15 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target can.page.Select(can, sub._option, html.OPTION_ARGS)[0].focus() } can.base.isFunc(cb) && cb(sub) - }, can.ui.toolkit.output) + }) + }, + plugin: function(can, meta, target, cb) { + can.onappend.plugin(can, meta, function(sub) { + sub.run = function(event, cmds, cb) { + can.run(event, [ctx.ACTION, ice.RUN, meta.index].concat(cmds), cb, true) + } + can.base.isFunc(cb) && cb(sub) + }, target) }, layout: function(can) { var height = can.Conf(html.HEIGHT), width = can.Conf(html.WIDTH) can.page.style(can, can.ui.content, can.user.mod.isCmd? html.HEIGHT: html.MAX_HEIGHT, height) @@ -191,12 +148,17 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target can.page.style(can, can.ui.content, html.WIDTH, width-can.ui.project.offsetWidth-can.ui.profile.offsetWidth-25) can.page.style(can, can.ui.profile_output, html.HEIGHT, can.ui.content.offsetHeight-html.ACTION_HEIGHT) }, - sess: function(can, sess) { sess = sess||can.base.Obj(localStorage.getItem("web.code.inner.sess"), {}) - can.core.Next(sess.tabs, function(item, next) { var ls = item.split(":") - can.onimport.tabview(can, ls[0], ls[1], ls[2], next) - }) + sess: function(can, sess, cb) { sess = sess||can.base.Obj(localStorage.getItem("web.code.inner.sess"), {}) can.core.Next(sess.tool, function(item, next) { can.onimport.toolkit(can, {index: item}, function(sub) { can.toolkit[item] = sub, next() }) + }, function() { + can.core.Next(sess.plug, function(item, next) { + can.require([item], function() {}, function(can, name, sub) { sub._init(can, can.base.ParseURL(sub._path), next) }) + }, function() { + can.core.Next(sess.tabs, function(item, next) { var ls = item.split(":") + can.onimport.tabview(can, ls[0], ls[1], ls[2], next) + }, cb) + }) }) }, }, [""]) @@ -216,16 +178,14 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], }, can.ui.content, can.ui.profile_output, can.ui.display_output)) { return can.onaction.selectLine(can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb() } + if (msg.Option(ctx.INDEX)) { - can.onappend.plugin(can, {index: msg.Option(ctx.INDEX)}, function(sub) { - sub.run = function(event, cmds, cb) { - can.run(event, [ctx.ACTION, ice.RUN, msg.Option(ctx.INDEX)].concat(cmds), cb, true) - } + can.onimport.plugin(can, {index: msg.Option(ctx.INDEX)}, can.ui.content, function(sub) { can.core.Timer(100, function() { var input = can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]; input && input.focus() }) can.base.isFunc(cb) && cb() - }, can.ui.content) + }) return } @@ -267,7 +227,6 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], }, }) Volcanos("onaction", {help: "控件交互", list: ["打开", "插件", "添加", "保存"], - "保存": function(event, can) { can.onexport.sess(can), can.user.toastSuccess(can) }, "打开": function(event, can) { can.user.input(event, can, [nfs.FILE], function(event, button, data, list, args) { can.onimport.tabview(can, can.Option(nfs.PATH), data.file) @@ -286,12 +245,19 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "插件", "添加", }) }) }, + "保存": function(event, can) { can.onexport.sess(can), can.user.toastSuccess(can) }, "项目": function(event, can) { can.onmotion.toggle(can, can.ui.project), can.onimport.layout(can) }, + "工具": function(event, can) { can.onmotion.toggle(can, can.ui.toolkit.fieldset) }, "展示": function(event, can) { can.onimport.profile(can) can.run(event, [ctx.ACTION, mdb.ENGINE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.profile(can, msg) }, true) }, + "执行": function(event, can) { can.onimport.display(can) + can.run(event, [ctx.ACTION, mdb.ENGINE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { + can.onimport.display(can, msg) + }, true) + }, "清屏": function(event, can) { if (can.page.Select(can, document.body, ".input.float", function(item) { return can.page.Remove(can, item) @@ -300,16 +266,11 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "插件", "添加", if (can.page.Select(can, can.ui.toolkit.status, "div.select", function(item) { return item.click(), item }).length > 0) { return } + can.onmotion.hidden(can, can.ui.profile) can.onmotion.hidden(can, can.ui.display) can.onimport.layout(can) }, - "执行": function(event, can) { can.onimport.display(can) - can.run(event, [ctx.ACTION, mdb.ENGINE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { - can.onimport.display(can, msg) - }, true) - }, - "工具": function(event, can) { can.onmotion.toggle(can, can.ui.toolkit.fieldset) }, back: function(event, can) { can.history.pop(); var last = can.history.pop() last && can.onimport.tabview(can, last.path, last.file, last.line) can.Status("跳转数", can.history.length) @@ -389,21 +350,19 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "插件", "添加", }) Volcanos("onexport", {help: "导出数据", list: ["文件数", "解析器", "文件名", "当前行", "跳转数", "标签数"], sess: function(can) { - localStorage.setItem("web.code.inner.sess", JSON.stringify( - { - "tabs": can.onexport.tabs(can), - "tool": can.onexport.tool(can), - } - )) + localStorage.setItem("web.code.inner.sess", JSON.stringify({ + "tool": can.onexport.tool(can), + "tabs": can.onexport.tabs(can), + })) + }, + tool: function(can) { + return can.core.Item(can.toolkit) }, tabs: function(can) { return can.core.Item(can.tabview, function(key, msg) { return key+":"+msg.Option(nfs.LINE) }) }, - tool: function(can) { - return can.core.Item(can.toolkit) - }, position: function(can, index, total) { total = total||can.max return (parseInt(index))+ice.PS+parseInt(total)+" = "+parseInt((index)*100/total)+"%" }, diff --git a/plugin/local/code/inner/favor.js b/plugin/local/code/inner/favor.js index 28238ce8..66854359 100644 --- a/plugin/local/code/inner/favor.js +++ b/plugin/local/code/inner/favor.js @@ -1,4 +1,4 @@ -Volcanos("onimport", {help: "导入数据", _init: function(can, cb) { +Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { can.onimport.toolkit(can, {index: "web.code.favor"}, function(sub) { sub.run = function(event, cmds, cb) { var msg = can.request(event) if (can.misc.runAction(can, msg, cmds, cb, kit.Dict( diff --git a/plugin/local/code/inner/search.js b/plugin/local/code/inner/search.js index 4d56ec93..7bfb07b1 100644 --- a/plugin/local/code/inner/search.js +++ b/plugin/local/code/inner/search.js @@ -1,4 +1,4 @@ -Volcanos("onimport", {help: "导入数据", _init: function(can, cb) { var history = [] +Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { var history = [] function show(msg, word) { if (!msg) { return } history.push(msg); var sub = msg._can; sub.Option("word", word||msg._word) sub.onmotion.clear(sub), sub.onappend.table(sub, msg, function(value, key, index, line) { return {text: ["", html.TD], list: [{text: [can.page.replace(can, value, ice.PWD, ""), html.DIV]}], onclick: function(event) { diff --git a/plugin/local/code/inner/sess.js b/plugin/local/code/inner/sess.js index ac754d1f..fe9de37d 100644 --- a/plugin/local/code/inner/sess.js +++ b/plugin/local/code/inner/sess.js @@ -1,4 +1,4 @@ -Volcanos("onimport", {help: "导入数据", _init: function(can, cb) { +Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { can.onimport.toolkit(can, {index: "web.code.sess"}, function(sub) { sub.run = function(event, cmds, cb) { var msg = can.request(event) if (can.misc.runAction(can, msg, cmds, cb, kit.Dict( diff --git a/proto.js b/proto.js index 550a6098..d2bd8a9b 100644 --- a/proto.js +++ b/proto.js @@ -316,23 +316,20 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args: }); return msg }, - 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) + get: function(name, key, cb) { + return can.search({}, [can.core.Keys(name, "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)]) }, - get: function(name, key, cb) { - return can.search({}, [can.core.Keys(name, "onexport", key)], cb) + 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) }, 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) }, - openSearch: function(cmds, cb) { - return can.search({}, [can.core.Keys("Search", "onimport", "select")].concat(cmds||[]), cb) - }, search: function(event, cmds, cb) { return can.run && can.run(event, ["_search"].concat(cmds), cb, true) }, Conf: function(key, value) { var res = can._conf