diff --git a/frame.js b/frame.js index 41e7a334..17f20117 100644 --- a/frame.js +++ b/frame.js @@ -103,7 +103,7 @@ Volcanos("onengine", { _init: function(can, meta, list, cb, target) { can.misc.Run(event, can, {names: pane._name}, cmds, cb) }, }) -Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { +Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { meta.name = meta.name.split(" ")[0] 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]; @@ -111,16 +111,14 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { var output = can.page.Select(can, field, "div.output")[0]; var status = can.page.Select(can, field, "div.status")[0]; - var feature = can.base.Obj(meta.feature) - can.page.ClassList.add(can, field, feature.style||"") - can.onappend._legend(can, legend) - // 添加插件 - var sub = Volcanos(meta.name, { _help: meta.name, _target: field, + var sub = Volcanos(meta.name, { _help: meta.name, _follow: can._follow+"."+meta.name, + _target: field, _inputs: {}, _outputs: [], _history: [], _option: option, _action: action, _output: output, - _follow: can._follow+"."+meta.name, _history: [], - _inputs: {}, _outputs: [], Option: function(key, value) { + if (typeof key == "object") { + return sub.core.Item(key, function(key, value) { sub.Option(key, value) }), key + } if (key == undefined) { value = {} sub.page.Select(sub, option, "select.args,input.args", function(item) { value[item.name] = item.value @@ -146,21 +144,30 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { }, }, [Volcanos.meta.volcano].concat(list), function(sub) { meta.feature = can.base.Obj(meta.feature, {}) - meta.detail = meta.feature["detail"] || {} - sub.onimport._init(sub, sub.Conf(meta), list, function() {}, field); + can.page.ClassList.add(can, field, meta.feature.style||"") + + can.onappend._legend(can, legend) if (can.user.Search(can, "share") && can.user.Search(can, "river") && can.user.Search(can, "storm")) { can.page.Select(can, field, "legend", function(item) { can.page.Remove(can, item) }) } + meta.detail = meta.feature["detail"] || {} + sub.onimport._init(sub, sub.Conf(meta), list, function() {}, field); + // 添加控件 - var args = can.base.Obj(meta.args, []) - can.core.Next(can.base.Obj(meta.inputs, []), function(item, next, index) { - sub._inputs[item.name] = Volcanos(item.name, { _help: item.name, + function add(item, next, index) { + return sub._inputs[item.name] = Volcanos(item.name, { _help: item.name, _follow: can._follow+"."+meta.name+"."+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, + CloneInput: function() { add(item, function() {}, index)._target.focus() }, + CloneField: function() { can.onappend._init(can, meta, list, function(sub) { + cb(sub), sub.Timer(10, function() { + for (var k in sub._inputs) { sub._inputs[k]._target.focus(); break } + }) + }, target) }, }, Volcanos.meta.libs.concat([item.display||"/plugin/input.js"]), function(input) { input.onimport._init(input, input.Conf(item), item.list||[], function() {}, input._target); + if (location.protocol == "chrome-extension:") { var p = sub.user.Cookie(can, item.name) item.type != "button" && p != undefined && (input._target.value = p) @@ -170,11 +177,16 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { p != undefined && (input._target.value = p) } - input.run = function(event, cmds, cb, silent) { + input.run = function(event, cmds, cb, silent) { var msg = sub.request(event); msg.Option("_action", item.name) // 控件回调 switch (item.name) { + case "查看": + case "打开": + msg.Option("_action", "") + break case "返回": // 历史命令 + msg.Option("_action", "") sub._history.pop(); var his = sub._history.pop(); if (his) { can.page.Select(can, option, "input.args", function(item, index) { item.value = his[index] || "" @@ -189,15 +201,10 @@ 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) - - var last = sub._history[sub._history.length-1] - !can.core.Eq(last, cmds) && cmds[0] != "action" && sub._history.push(cmds) - + var last = sub._history[sub._history.length-1]; !can.core.Eq(last, cmds) && cmds[0] != "action" && sub._history.push(cmds) return run(event, cmds, cb, silent) } - // 添加事件 can.core.Item(input.onaction, function(key, value) { input._target && key.indexOf("on") == 0 && (input._target[key] = function(event) { value(event, input); @@ -205,28 +212,27 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { }), next(); // 自动执行 - if (item.type == "button" && item.action == "auto") { - input._target.click() - } + item.type == "button" && item.action == "auto" && input._target.click() }) - }) + } - var count = 0 - function run(event, cmds, cb, silent) { return sub.run(event, cmds, function(msg) { + var args = can.base.Obj(meta.args, []); can.core.Next(can.base.Obj(meta.inputs, []), add) + var count = 0; function run(event, cmds, cb, silent) { return 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") + var display = (msg.Option("_display")||meta.feature.display||"table.js") display.indexOf("/") == 0 || (display = "/plugin/"+display) - var table = Volcanos(display, { _help: display, _target: output, + var table = Volcanos(display, { _help: display, _follow: can._follow+"."+meta.name+"."+display, + _target: output, Option: sub.Option, Action: sub.Action, Status: sub.Status, _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 || [] + var last = sub._history[sub._history.length-1]; !can.core.Eq(last, cmds) && !silent && sub._history.push(cmds) return run(event, cmds, cb, silent) } @@ -235,11 +241,10 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { can.onappend._detail(table, msg, msg["_detail"] || sub.Conf("detail"), output) can.onappend._status(table, status) sub.Status("ncmd", sub._history.length+"/"+count) - }) - sub._outputs.push(table) + }); sub._outputs.push(table) }, silent) } - - }); cb(sub); + }); cb(sub) + return sub }, _legend: function(can, legend) { legend && (legend.onclick = function(event) { var msg = can.request(event) @@ -254,7 +259,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { }) }, _action: function(can, action) { // [string [class item...] {}] - action.innerHTML = "", can.onaction && can.core.List(can.onaction.list, function(item) { + action && (action.innerHTML = ""), can.onaction && can.core.List(can.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) { (can.onaction[item] || can.onkeymap && can.onkeymap._remote)(event, can, item) @@ -374,7 +379,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { var res = can.request(event); can.core.List(msg.append, function(key) { res.Option(key, msg[key][index]) - }); can.run(event, ["field", "action", item, key, event.target.value.trim(), value.trim()], function(res) {}, true) + }); can.run(event, ["action", item, key, event.target.value.trim(), value.trim()], function(res) {}, true) break case "Escape": td.innerHTML = back @@ -390,7 +395,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { var res = can.request(event); can.core.List(msg.append, function(key) { res.Option(key, msg[key][index]) - }); can.run(event, ["field", "action", item, key, value.trim()], function(res) {}, true) + }); can.run(event, ["action", item, key, value.trim()], function(res) {}, true) }) }) }, @@ -404,7 +409,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) { }}]).last meta = meta||can.ondetail||{}, cb = cb||function(ev, item, meta) { - (can.ondetail[item]||can.onaction[item])(event, can) + (can.ondetail[item]||can.onaction[item]||can.onkeymap&&can.onkeymap._remote)(event, can, item) } can.page.Appends(can, can._carte, can.core.List(list, function(item) { diff --git a/lib/core.js b/lib/core.js index 62f96f92..9533b207 100644 --- a/lib/core.js +++ b/lib/core.js @@ -133,6 +133,7 @@ var core = Volcanos("core", {help: "核心模块", return false } if (typeof obj == "object") { + if (obj.length != other.length) { return false } for (var i = 0; i < obj.length; i++) { if (!self(obj[i], other[i])) { return false diff --git a/plugin/inner.css b/plugin/inner.css index 6e4402a9..2f479ff4 100644 --- a/plugin/inner.css +++ b/plugin/inner.css @@ -122,6 +122,6 @@ fieldset.editor>div.output textarea.command { border:solid 1px red; padding:0; margin:0; padding-left:10px; - z-index:10; + z-index:200; } diff --git a/plugin/inner.js b/plugin/inner.js index 88a91bdb..08595bac 100644 --- a/plugin/inner.js +++ b/plugin/inner.js @@ -1,31 +1,14 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, target) { target.innerHTML = "" - if (can.user.Search(can, "share") && can.user.Search(can, "river") && can.user.Search(can, "storm")) { - can.onaction.list = ["项目", "运行", "列表"] - can.page.Modify(can, can._action, {style: {clear: "none"}}) - can.page.Select(can, can._option, "input[type=button]", function(item) { - can.page.Remove(can, item) - }) - can.Conf("height", can.Conf("height") + 64) - } - var width = can.Conf("width"), height = can.Conf("height") + can.onimport._share(can); var width = can.Conf("width"), height = can.Conf("height") can.page.Modify(can, target, {style: {"max-height": height-160+"px"}}) - - if (msg.key && msg.time && msg.key.length != msg.time.length) { - msg.key && (msg.key = msg.key.slice(2)) - } - msg.Option("_action") != "查看" && msg.Option("_action") != "打开" && can.onappend.table(can, target, "table", msg) - - can.ui = can.page.Append(can, target, [ + can.onappend.table(can, target, "table", msg), can.ui = can.page.Append(can, target, [ {view: ["project", "div"], style: {width: "80px", "max-height": height-180+"px"}}, {view: ["profile", "div"]}, {view: "preview", style: {width: "30px"}}, {view: "content"}, {type: "code", list: [{view: ["display", "pre"]}]}, - {view: ["command", "textarea"], onkeydown: function(event) { - can.onkeymap.parse(event, can, "command") - }}, {view: ["editor", "textarea"], onkeydown: function(event) { can.onkeymap.parse(event, can, "insert"), can.Timer(10, function() { can.onaction.modifyLine(can, can.current, can.editor.value) @@ -33,107 +16,95 @@ 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") }}, + {view: ["command", "textarea"], onkeydown: function(event) { + can.onkeymap.parse(event, can, "command") + }}, ]) msg.Option("path", can.Option("path")) msg.Option("name", can.Option("name")) msg.Option("key", can.Option("key")) can.tabview = {}, can.Timer(10, function() { - can.onlayout._init(can) - can.onsyntax._init(can, msg) - can.onkeymap._init(can, "normal") can.onimport.project(can, can.Option("path")) + can.onsyntax._init(can, msg) + can.onkeymap._init(can) + can.onlayout._init(can) }) return typeof cb == "function" && cb(msg) }, - tabview: function(can, path, name) { - can.user.Cookie(can, "path", path) - can.user.Cookie(can, "name", name) - can.Option("path", path) - can.Option("name", name) - can.Option("key", "") + _share: function(can) { + if (can.user.Search(can, "share") && can.user.Search(can, "river") && can.user.Search(can, "storm")) { + can.page.Select(can, can._option, "input[type=button]", function(item) { + can.page.Remove(can, item) + }) + can.onaction.list = ["项目", "运行", "列表"] + can.Conf("height", can.Conf("height") + 64) + } + }, + tabview: function(can, path, name) { can.Option({path: path, name: name, key: ""}) if (can.tabview[path+name]) { return can.onsyntax._init(can, can.tabview[path+name]) } - can.run({}, [path, name], function(msg) { - msg.Option("path", can.Option("path")) - msg.Option("name", can.Option("name")) - + msg.Option({path: can.Option("path"), name: can.Option("name")}) can.page.Append(can, can._action, [{view: ["file", "div", name], onclick: function(event) { - can.onsyntax._init(can, msg) + can.onsyntax._init(can, can.tabview[path+name] = msg) }, oncontextmenu: function(event) { can.onappend.carte(can, null, ["保存", "运行"]) - - }}]), can.onsyntax._init(can, can.tabview[path+name] = msg) + }}]).first.click() }, true) }, - project: function(can, path) { can.ui.project.innerHTML = "" - can.Option("path", path) + project: function(can, path) { can.Option({path: path}), can.ui.project.innerHTML = "" can.run({}, ["action", "project", path+"/"], function(res) { res.Table(function(value) { - var title = can.core.List(["time", "size"], function(item) { - return item + ": " + value[item] - }).join("\n") - + var title = can.core.List(["time", "size"], function(item) { return item + ": " + value[item] }).join("\n") can.page.Append(can, can.ui.project, [{text: [value.file, "div", "item"], title: title, onclick: function(event) { - if (value.file.endsWith("/")) { - can.onimport.project(can, can.Option("path", can.base.Path(can.Option("path"), value.file))) - } else { - can.onimport.tabview(can, can.Option("path"), can.Option("name", value.file)) - } + value.file.endsWith("/")? can.onimport.project(can, can.base.Path(can.Option("path"), value.file)): + can.onimport.tabview(can, can.Option("path"), value.file) }} ]) }) }, true) }, }, ["/plugin/inner.css"]) Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], _init: function(can, msg) { can._msg = msg - var file = can.base.Path(msg.Option("path"), msg.Option("name")) - - // option - can.core.List(["path", "name"], function(item) { - can.Option(item, msg.Option(item)) - }) // action can.page.Select(can, can._action, "div.file", function(item) { - item.innerText == msg.Option("name")? can.page.ClassList.add(can, item, "select"): can.page.ClassList.del(can, item, "select") + item.innerText == msg.Option("name")? can.page.ClassList.add(can, item, "select"): + can.page.ClassList.del(can, item, "select") }) - // caches + // caches save can.core.List(["preview", "content", "display"], function(item) { can.Cache(can.file+item, can.ui[item], can.current) }); - // caches - can.file = file; var cache = false; can.core.List(["preview", "content", "display"], function(item) { - var p = can.Cache(can.file+item, can.ui[item]); if (p) { p.click(), cache = true } + // caches load + can.file = can.base.Path(msg.Option("path"), msg.Option("name")) + var cache = false; can.core.List(["preview", "content", "display"], function(item) { + var p = can.Cache(can.file+item, can.ui[item]); if (!cache && p) { p.click(), cache = true } }); if (cache) { return } // remote - can.parse = can.base.Ext(file) - can.max = 0, can.core.List(can.ls = msg.Result().split("\n"), function(item) { + can.parse = can.base.Ext(can.file), can.max = 0, can.core.List(can.ls = msg.Result().split("\n"), function(item) { can.onaction.appendLine(can, item) }) // status - can.Status("当前行", can.onexport.position(can, 0)) can.Status("文件名", can.file), can.Status("解析器", can.parse) + can.Status("当前行", can.onexport.position(can, 0)) // plugin - function init() { - 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, - }}) - ) + function init(p) { p.display && can.onkeymap._remote({}, can, "运行") + typeof p.display == "object" && ( p.display.height && can.page.Modify(can, can.ui.display, {style: { + "max-height": p.display.height, + }})) }; var p = can.onsyntax[can.parse]; !p? can.run({}, ["action", "plug", can.Option("path"), can.Option("name")], function(msg) { - can.onsyntax[can.parse] = p = can.base.Obj(msg.Result()), p.display && init() - }, true): p.display && init() + p = can.onsyntax[can.parse] = can.base.Obj(msg.Result()), can.onsyntax._init(can, can._msg), init(p) + }, true): init(p) }, - parse: function(can, line) { var p = can.onsyntax[can.parse] + parse: function(can, line) { var p = can.onsyntax[can.parse]; if (!p) { return } function wrap(type, str) { return type? ''+str+'': str } - p && p.keyword && (line = can.core.List(can.core.Split(line, " ", p && p.split && p.split.operator || "{[()]}"), function(item, index, array) { - item = typeof item == "object"? item: {text: item} - p.word && (item = p.word(item, index, array)) + p.keyword && (line = can.core.List(can.core.Split(line, p.split && p.split.space || " ", p.split && p.split.operator || "{[(|)]}"), function(item, index, array) { + item = typeof item == "object"? item: {text: item}, p.word && (item = p.word(item, index, array)) var text = item.text; var key = item.keyword||p.keyword[text] switch (item.type) { @@ -143,16 +114,15 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], } }).join("")) - p && p.prefix && can.core.Item(p.prefix, function(pre, type) { + p.prefix && can.core.Item(p.prefix, function(pre, type) { if (line.startsWith(pre)) { line = wrap(type, line) } }) - p && p.suffix && can.core.Item(p.suffix, function(pre, type) { + p.suffix && can.core.Item(p.suffix, function(pre, type) { if (line.endsWith(pre)) { line = wrap(type, line) } }) - return p && p.line? p.line(can, line): line + return p.line? p.line(can, line): line }, makefile: { - split: {}, prefix: {"#": "comment"}, suffix: {":": "comment"}, keyword: { @@ -163,12 +133,16 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], }, }, sh: { - split: { - operator: "{[(|)]}", - }, + prefix: {"#": "comment"}, + suffix: {"\x7B": "comment"}, keyword: { + "export": "keyword", + "source": "keyword", + "require": "keyword", + "if": "keyword", "then": "keyword", + "fi": "keyword", "for": "keyword", "do": "keyword", "done": "keyword", @@ -190,47 +164,38 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], "ls": "function", "rm": "function", "go": "function", - - "export": "keyword", - "source": "keyword", - "require": "keyword", }, - prefix: {"#": "comment"}, - suffix: {"\x7B": "comment"}, - line: function(can, line) { return line }, }, vim: { - split: {}, + prefix: {"\"": "comment"}, keyword: { highlight: "keyword", syntax: "keyword", }, - prefix: {"\"": "comment"}, }, shy: { + prefix: {"#": "comment"}, profile: true, keyword: { "chapter": "keyword", "label": "keyword", }, - split: {}, - line: function(can, line) { return line }, }, mod: { - split: {}, + prefix: {"#": "comment"}, keyword: { "module": "keyword", "require": "keyword", "replace": "keyword", "=>": "keyword", }, - prefix: {"#": "comment"}, }, go: { - split: {}, + prefix: {"//": "comment"}, keyword: { "package": "keyword", "import": "keyword", + "const": "keyword", "func": "keyword", "var": "keyword", "type": "keyword", @@ -243,12 +208,13 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], "range": "keyword", "break": "keyword", "continue": "keyword", - "return": "keyword", - "defer": "keyword", "switch": "keyword", "case": "keyword", "default": "keyword", "fallthrough": "keyword", + + "return": "keyword", + "defer": "keyword", "go": "keyword", "select": "keyword", @@ -259,10 +225,10 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], "bool": "datatype", "int": "datatype", - "len": "datatype", - "cap": "datatype", - "copy": "datatype", - "append": "datatype", + "len": "function", + "cap": "function", + "copy": "function", + "append": "function", "nil": "string", @@ -270,13 +236,13 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], "msg": "function", "kit": "keyword", }, - prefix: {"//": "comment"}, }, js: { split: { space: " ", operator: "{[(.:,;!|)]}", }, + prefix: {"//": "comment"}, keyword: { "var": "keyword", "new": "keyword", @@ -305,6 +271,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], "0": "string", "1": "string", + "10": "string", "-1": "string", "true": "string", "false": "string", @@ -333,15 +300,8 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], "pane": "function", "plugin": "function", }, - prefix: {"//": "comment"}, word: function(value, index, array) { - var libs = { - base: true, - core: true, - misc: true, - page: true, - user: true, - } + var libs = {base: true, core: true, misc: true, page: true, user: true} return array[index-2]=="can"&&array[index-1]=="."&&(libs[value]||libs[value.text])? {keyword: "function", text: value.text||value}: value }, }, @@ -349,24 +309,17 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], png: { line: function(can, line) { return can.page.Format("img", "/share/local/"+line) } }, + jpg: { + line: function(can, line) { return can.page.Format("img", "/share/local/"+line) } + }, m4v: { - keymap: { - j: function(event, can) { - console.log("down") - }, - k: function(event, can) { - }, - }, - line: function(can, line) { var auto = true, loop = true + line: function(can, line) { var auto = true, loop = true, total = 0 var p = location.href.startsWith("https")? "": "http://localhost:9020" - var total = 0 function cb(event) { console.log(event) } - return {className: "preview", type: "video", style: { - height: can.Conf("height")-160+"px", width: can.Conf("width")-160+"px"}, + return {className: "preview", type: "video", style: {height: can.Conf("height")-160+"px", width: can.Conf("width")-160+"px"}, data: {src: p+"/share/local/"+line, controls: "controls", autoplay: auto, loop: loop}, oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb, - onloadedmetadata: function(event) { - total = event.timeStamp + onloadedmetadata: function(event) { total = event.timeStamp event.target.currentTime = can._msg.currentTime || 0 }, onloadeddata: cb, ontimeupdate: function(event) { can.Status("当前行", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration)) @@ -375,15 +328,12 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], }, }, url: { - line: function(can, line) { var auto = true, loop = true - var total = 0 + line: function(can, line) { var auto = true, loop = true, total = 0 function cb(event) { console.log(event) } - return {className: "preview", type: "video", style: { - height: can.Conf("height")-160+"px", width: can.Conf("width")-160+"px"}, + return {className: "preview", type: "video", style: {height: can.Conf("height")-160+"px", width: can.Conf("width")-160+"px"}, data: {src: line, controls: "controls", autoplay: auto, loop: loop}, oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb, - onloadedmetadata: function(event) { - total = event.timeStamp + onloadedmetadata: function(event) { total = event.timeStamp event.target.currentTime = can._msg.currentTime || 0 }, onloadeddata: cb, ontimeupdate: function(event) { can.Status("当前行", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration)) @@ -391,11 +341,6 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], } }, }, - jpg: { - keymap: { - }, - line: function(can, line) { return can.page.Format("img", "/share/local/"+line) } - }, }) Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert"], _init: function(can, mode) { can.page.Modify(can, can.ui.command, {style: {display: "none", width: can._target.offsetWidth-20+"px"}}) @@ -409,9 +354,8 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" }), can.onkeymap[item]._engine = engine }), can.onkeymap._mode(can, mode||"normal") }, - _mode: function(can, value) { can.Status("输入法", can.mode = value) - can.ui.editor.className = "editor "+can.mode - can.Action("mode", can.mode) + _mode: function(can, value) { + can.ui.editor.className = "editor "+can.Status("输入法", can.Action("mode", can.mode = value)) return value }, _command: function(can) { can.onkeymap._mode(can, "command") @@ -422,13 +366,10 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" _insert: function(can) { can.onkeymap._mode(can, "insert") }, _remote: function(event, can, key, arg, cb) { can.ui.display.innerHTML = "", can.ui.profile.innerHTML = "" - var p = can.onsyntax[can.parse] - can.display = p && p.profile && can.ui.profile || can.ui.display + var p = can.onsyntax[can.parse]; can.display = p && p.profile && can.ui.profile || can.ui.display + var msg = can.request(event); msg.Option("content", can.onexport.content(can)) can.run(event, arg||["action", key, can.Option("path"), can.Option("name")], cb||function(msg) { - if (msg.key && msg.time && msg.key.length != msg.time.length) { - msg.key && (msg.key = msg.key.slice(2)) - } can.page.Modify(can, can.display, {innerHTML: "", style: {display: "block"}}) can.onappend.table(can, can.display, "table", msg) can.onappend.board(can, can.display, "board", msg) @@ -437,7 +378,7 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" _engine: { w: function(event, can) { can.onkeymap._remote(event, can, "保存") }, e: function(event, can, line, ls) { ls = ls[1].split("/") - can.onimport.tabview(can, ls.slice(0, -1).join("/"), ls.slice(-1).join("")) + can.onimport.tabview(can, ls.slice(0, -1).join("/")||can.Option("path"), ls.slice(-1).join("")) }, r: function(event, can) { can.onkeymap._remote(event, can, "运行") }, @@ -452,16 +393,20 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" for (var pre = 0; pre < can.history.length; pre++) { if ("0" <= can.history[pre] && can.history[pre] <= "9") { continue } break - }; can.count = parseInt(can.history.slice(0, pre).join("")) + }; can.count = parseInt(can.history.slice(0, pre).join(""))||1 + + function repeat(cb, count) { + for (var i = 1; i <= count; i++) { if (cb(event, can, count)) { break } }; can.history = [] + } var p = can.onsyntax[can.parse] - var cb = (p&&p.keymap||can.onkeymap[can.mode])[event.key]; if (typeof cb == "function") { - return cb(event, can, can.count), can.history = [] + var cb = (p && p.keymap || can.onkeymap[can.mode])[event.key]; if (typeof cb == "function") { + return repeat(cb, can.count) } var map = can.onkeymap[can.mode]._engine; for (var i = can.history.length-1; i > pre-1; i--) { var cb = map[can.history[i]]; if (typeof cb == "function") { - return cb(event, can, can.count), can.history = [] + return repeat(cb, can.count) }; if (typeof cb == "object") { map = cb; continue }; break } }, @@ -470,12 +415,8 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" can.page.Modify(can, can.ui.command, {style: {display: "none"}}) can.editor.focus() }, - Enter: function(event, can) { can.onkeymap._normal(can) - var line = can.ui.command.value - var ls = can.core.Split(line, " ", ",", {simple: true}) - var cb = can.onkeymap._engine[ls[0]] - typeof cb == "function"? cb(event, can, line, ls): can.onkeymap._remote(event, can, line, ls) - + Enter: function(event, can) { var line = can.ui.command.value; var ls = can.core.Split(line, " ", ",", {simple: true}) + var cb = can.onkeymap._engine[ls[0]]; typeof cb == "function"? cb(event, can, line, ls): can.onkeymap._remote(event, can, line, ["action", "cmd"].concat(ls)) can.onkeymap.command.Escape(event, can) }, jk: function(event, can) { can.history = can.history.slice(0, -1) @@ -491,28 +432,22 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" l: function(event, can) { can.editor.setSelectionRange(can.editor.selectionStart+1, can.editor.selectionStart+1) }, - j: function(event, can, count) { count = count || 1 - for (var i = 0; i < count; i++) { - var pos = can.current.offsetTop-can._target.scrollTop - can.onaction.selectLine(can, can.current.nextSibling) - if (pos > 22*15) { - can._target.scrollBy(0, 22) - } + j: function(event, can) { can.onaction.selectLine(can, can.current.nextSibling) + var pos = can.current.offsetTop-can._target.scrollTop; if (pos > 22*15) { + can._target.scrollBy(0, 22) } }, - k: function(event, can, count) { count = count || 1 - for (var i = 0; i < count; i++) { - var pos = can.current.offsetTop-can._target.scrollTop - can.onaction.selectLine(can, can.current.previousSibling) - if (pos < 22*5) { - can._target.scrollBy(0, -22) - } + k: function(event, can) { can.onaction.selectLine(can, can.current.previousSibling) + var pos = can.current.offsetTop-can._target.scrollTop; if (pos < 22*5) { + can._target.scrollBy(0, -22) } }, + gg: function(event, can, count) { count = count || 1 can.onaction.selectLine(can, count - 1) can.current.scrollIntoView() can._target.scrollBy(0, -22*5) + return true }, G: function(event, can, count) { count = count || can.max can.onaction.selectLine(can, count - 1) @@ -520,17 +455,21 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" if (count - can.max < -5) { can._target.scrollBy(0, -22*5) } + return true }, zt: function(event, can, count) { count = count || 2 can.current.scrollIntoView() can._target.scrollBy(0, -22*count) + return true }, zz: function(event, can, count) { count = count || 5 can.current.scrollIntoView() can._target.scrollBy(0, -22*count) + return true }, zb: function(event, can, count) { count = count || 3 can._target.scrollBy(0, -(can._target.offsetHeight - (can.current.offsetTop - can._target.scrollTop))+22*count) + return true }, i: function(event, can) { can.onkeymap._insert(can) @@ -538,6 +477,11 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" I: function(event, can) { can.onkeymap._insert(can) can.editor.setSelectionRange(0, 0) }, + a: function(event, can) { can.onkeymap._insert(can) + }, + A: function(event, can) { can.onkeymap._insert(can) + can.editor.setSelectionRange(-1, -1) + }, o: function(event, can) { can.onkeymap._insert(can) can.onaction.insertLine(can, can.current).click() }, @@ -545,21 +489,14 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" can.onaction.insertLine(can, can.current, "", true).click() }, - yy: function(event, can) { can.last = can.current.innerText + yy: function(event, can) { can.last = can.current.innerText }, + dd: function(event, can) { can.last = can.current.innerText + var next = can.current.nextSibling || can.current.previousSibling + can.onaction.deleteLine(can, can.current) + next.click() }, - dd: function(event, can, count) { count = count || 1 - for (var i = 0; i < count; i++) { - can.last = can.current.innerText - var next = can.current.nextSibling || can.current.previousSibling - can.onaction.deleteLine(can, can.current) - next.click() - } - }, - p: function(event, can, count) { count = count || 1 - for (var i = 0; i < count; i++){ - var last = can.onaction.insertLine(can, can.current, can.last) - } - last.click() + p: function(event, can) { + can.onaction.insertLine(can, can.current, can.last).click() }, P: function(event, can) { can.onaction.insertLine(can, can.current, can.last, true).click() @@ -568,14 +505,15 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" insert: { Escape: function(event, can) { can.onkeymap._normal(can) can.onaction.modifyLine(can, can.current, can.editor.value) - }, - Enter: function(event, can) { - can.onaction.modifyLine(can, can.current, can.editor.value) - can.onaction.insertLine(can, can.current, "", event.shiftKey).click() event.stopPropagation(), event.preventDefault() }, - Backspace: function(event, can) { - can.editor.selectionStart == 0 && can.onaction.mergeLine(can, can.current.previousSibling).click() + Enter: function(event, can) { + can.onkeymap.insert.Escape(event, can) + can.onaction.insertLine(can, can.current, "", event.shiftKey).click() + }, + Backspace: function(event, can) { if (can.editor.selectionStart > 0) { return } + can.onaction.mergeLine(can, can.current.previousSibling).click() + event.stopPropagation(), event.preventDefault() }, ArrowDown: function(event, can) { can.onaction.selectLine(can, can.current.nextSibling) @@ -583,14 +521,18 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert" ArrowUp: function(event, can) { can.onaction.selectLine(can, can.current.previousSibling) }, - jk: function(event, can) { can.onkeymap._normal(can) + jk: function(event, can) { can.page.DelText(can.editor, can.editor.selectionStart-1, 1) - can.onaction.modifyLine(can, can.current, can.editor.value) - event.stopPropagation(), event.preventDefault() + can.onkeymap.insert.Escape(event, can) }, }, }) -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 }, @@ -619,14 +561,12 @@ Volcanos("onaction", {help: "控件交互", list: ["", "项目", "", "上传", " can.page.Append(can, can.ui.preview, [{view: ["item", "div", index+1], onclick: function(event) { can.onaction.selectLine(can, index) }}]) - var p = can.onsyntax.parse(can, value||"") - var line = can.page.Append(can, can.ui.content, [typeof p == "object"? p: {view: ["item", "pre", p], onclick: function(event) { + var line = can.page.Append(can, can.ui.content, [{view: ["item", "pre", ""], onclick: function(event) { can.onaction.selectLine(can, line) - }}]).last + }}]).first; value && can.onaction.modifyLine(can, line, value) return line }, - insertLine: function(can, target, value, before) { - var line = can.onaction.appendLine(can, value) + insertLine: function(can, target, value, before) { var line = can.onaction.appendLine(can, value) can.ui.content.insertBefore(line, before && target || target.nextSibling) return line }, diff --git a/plugin/input.js b/plugin/input.js index 5fdd0b1a..548b6817 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -12,12 +12,13 @@ Volcanos("onaction", {help: "控件交互", list: [], }, onkeydown: function(event, can) { switch (event.key) { - case "Enter": - can.run(event, [], function() {}) - event.stopPropagation() - event.preventDefault() - break + case "Enter": can.run(event, [], function() {}); break + case "b": if (!event.ctrlKey) { return }; can.CloneInput(); break + case "m": if (!event.ctrlKey) { return }; can.CloneField(); break + default: return } + event.stopPropagation() + event.preventDefault() }, onkeyup: function(event, can) { switch (event.key) { diff --git a/plugin/table.js b/plugin/table.js index d198cdf5..e108cd77 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -10,4 +10,12 @@ Volcanos("onaction", {help: "控件交互", list: [], can.run(event, [], function() {}) }, }) +Volcanos("ondetail", {help: "控件交互", list: ["编辑", "删除"], + "编辑": function(event, can, key) { + console.log(key) + }, + "删除": function(event, can, key) { + console.log(key) + }, +}) diff --git a/proto.js b/proto.js index f217d90c..18c7c41b 100644 --- a/proto.js +++ b/proto.js @@ -88,6 +88,7 @@ var Volcanos = shy("火山架", {cache: {}, index: 1, order: 1, debug: { event._msg = msg = msg || {}, msg._event = event, msg._can = can; msg.__proto__ = proto || { _name: meta.order++, _create_time: new Date(), Option: function(key, val) { + if (typeof key == "object") { can.core.Item(key, msg.Option) } if (val == undefined) { return msg && msg[key] && msg[key][0] || msg._msg && msg._msg.Option(key) || "" } msg.option = msg.option || [], can.core.List(msg.option, function(k) { if (k == key) {return k}