mirror of
https://shylinux.com/x/volcanos
synced 2025-04-25 16:58:06 +08:00
opt inner
This commit is contained in:
parent
c113a9a64d
commit
37419ab203
83
frame.js
83
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) {
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
316
plugin/inner.js
316
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: {
|
||||
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? '<span class="'+type+'">'+str+'</span>': 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 = []
|
||||
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) {
|
||||
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) {
|
||||
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
|
||||
},
|
||||
dd: function(event, can, count) { count = count || 1
|
||||
for (var i = 0; i < count; i++) {
|
||||
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()
|
||||
}
|
||||
},
|
||||
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
|
||||
},
|
||||
|
@ -12,12 +12,13 @@ Volcanos("onaction", {help: "控件交互", list: [],
|
||||
},
|
||||
onkeydown: function(event, can) {
|
||||
switch (event.key) {
|
||||
case "Enter":
|
||||
can.run(event, [], function() {})
|
||||
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()
|
||||
break
|
||||
}
|
||||
},
|
||||
onkeyup: function(event, can) {
|
||||
switch (event.key) {
|
||||
|
@ -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)
|
||||
},
|
||||
})
|
||||
|
||||
|
1
proto.js
1
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}
|
||||
|
Loading…
x
Reference in New Issue
Block a user