mirror of
https://shylinux.com/x/volcanos
synced 2025-04-25 16:58:06 +08:00
add inner.tabview
This commit is contained in:
parent
669a883193
commit
440a3b3a94
143
frame.js
143
frame.js
@ -25,6 +25,7 @@ Volcanos("onaction", { _init: function(can, meta, list, cb, target) {
|
|||||||
can.onengine && getRiver(can.onengine.river)
|
can.onengine && getRiver(can.onengine.river)
|
||||||
|
|
||||||
// 应用入口
|
// 应用入口
|
||||||
|
can.user.title(can.user.Search(can, "title"))
|
||||||
var pane = can[meta.main.name], msg = can.request({});
|
var pane = can[meta.main.name], msg = can.request({});
|
||||||
pane.onaction._init(pane, msg, msg.option||[], cb, target);
|
pane.onaction._init(pane, msg, msg.option||[], cb, target);
|
||||||
})
|
})
|
||||||
@ -33,7 +34,7 @@ Volcanos("onaction", { _init: function(can, meta, list, cb, target) {
|
|||||||
search: function(event, can, msg, pane, cmds, cb) { var chain = cmds[1]
|
search: function(event, can, msg, pane, cmds, cb) { var chain = cmds[1]
|
||||||
var sub, mod = can, key, fun = can; can.core.List(chain.split("."), function(value, index, array) {
|
var sub, mod = can, key, fun = can; can.core.List(chain.split("."), function(value, index, array) {
|
||||||
fun && (sub = mod, mod = fun, key = value, fun = mod[value])
|
fun && (sub = mod, mod = fun, key = value, fun = mod[value])
|
||||||
}); if (!sub || !mod || !fun) { console.error("not found", chain); return }
|
}); if (!sub || !mod || !fun) { console.info("not found", chain); return }
|
||||||
|
|
||||||
typeof fun == "function" && fun(sub, msg, cmds.slice(2), cb, sub._target)
|
typeof fun == "function" && fun(sub, msg, cmds.slice(2), cb, sub._target)
|
||||||
},
|
},
|
||||||
@ -57,8 +58,8 @@ Volcanos("onaction", { _init: function(can, meta, list, cb, target) {
|
|||||||
typeof cb == "function" && cb(msg)
|
typeof cb == "function" && cb(msg)
|
||||||
return true
|
return true
|
||||||
case "Action":
|
case "Action":
|
||||||
var river = can.onengine.river[cmds[0]];
|
var river = can.onengine.river[cmds[0]||can.user.Search(can, "river")];
|
||||||
var storm = river && river.storm[cmds[1]];
|
var storm = river && river.storm[cmds[1]||can.user.Search(can, "storm")];
|
||||||
var action = storm && storm.action[cmds[2]];
|
var action = storm && storm.action[cmds[2]];
|
||||||
if (!storm) { break } if (cmds.length == 2) {
|
if (!storm) { break } if (cmds.length == 2) {
|
||||||
can.core.List(storm.action, function(value) {
|
can.core.List(storm.action, function(value) {
|
||||||
@ -96,6 +97,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) {
|
|||||||
var output = can.page.Select(can, field, "div.output")[0];
|
var output = can.page.Select(can, field, "div.output")[0];
|
||||||
var status = can.page.Select(can, field, "div.status")[0];
|
var status = can.page.Select(can, field, "div.status")[0];
|
||||||
var feature = can.base.Obj(meta.feature)
|
var feature = can.base.Obj(meta.feature)
|
||||||
|
can.page.ClassList.add(can, field, feature.style||"")
|
||||||
|
|
||||||
// 添加插件
|
// 添加插件
|
||||||
var sub = Volcanos(meta.name, { _help: meta.name, _target: field,
|
var sub = Volcanos(meta.name, { _help: meta.name, _target: field,
|
||||||
@ -133,6 +135,10 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) {
|
|||||||
_follow: can._follow+"."+meta.name+"."+item.name,
|
_follow: can._follow+"."+meta.name+"."+item.name,
|
||||||
}, Volcanos.meta.libs.concat([item.display||"/plugin/input.js"]), function(input) {
|
}, Volcanos.meta.libs.concat([item.display||"/plugin/input.js"]), function(input) {
|
||||||
input.onimport._init(input, input.Conf(item), item.list||[], function() {}, input._target);
|
input.onimport._init(input, input.Conf(item), item.list||[], function() {}, input._target);
|
||||||
|
if (can.user.Search(can, "active") == meta.name) {
|
||||||
|
var p = sub.user.Search(can, item.name) || ""
|
||||||
|
p && (input._target.value = p)
|
||||||
|
}
|
||||||
|
|
||||||
input.run = function(event, cmds, cb, silent) {
|
input.run = function(event, cmds, cb, silent) {
|
||||||
// 控件回调
|
// 控件回调
|
||||||
@ -153,48 +159,9 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) {
|
|||||||
if (!cmds[i]) { cmds.pop() } else { break }
|
if (!cmds[i]) { cmds.pop() } else { break }
|
||||||
}
|
}
|
||||||
|
|
||||||
sub._history.push(cmds); sub.run(event, cmds, function(msg) {
|
var msg = sub.request(event); msg.Option("_action", item.name);
|
||||||
if (silent) { typeof cb == "function" && cb(msg); return }
|
cmds[0] != "action" && sub._history.push(cmds);
|
||||||
|
run(event, cmds, cb, silent)
|
||||||
// 添加组件
|
|
||||||
var display = (msg.Option("_display")||feature.display||"table.js")
|
|
||||||
display.indexOf("/") == 0 || (display = "/plugin/"+display)
|
|
||||||
|
|
||||||
sub[display] = Volcanos(display, { _help: display, _target: output,
|
|
||||||
_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._init(table, msg, msg.append||[], function() {}, output)
|
|
||||||
|
|
||||||
table.run = function(event, cmds, cb, silent) { cmds = cmds || []
|
|
||||||
// 组件回调
|
|
||||||
cmds[0] == "field"? sub.run(event, cmds.slice(1), cb, silent): input.run(event, cmds, cb, silent)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 工具栏
|
|
||||||
action.innerHTML = "", table.onaction && can.core.List(table.onaction.list, function(item) {
|
|
||||||
typeof item == "string"? can.onappend.input(can, action, "input", {type: "button", value: item, onclick: function(event) {
|
|
||||||
table.onaction[item](event, table, msg)
|
|
||||||
}}): item.length > 0? can.onappend.input(can, action, "input", {type: "select", values: item.slice(1), name: item[0], onchange: function(event) {
|
|
||||||
table.onaction[item[0]](event, table, msg, item[event.target.selectedIndex+1])
|
|
||||||
}}): typeof item == "object" && can.onappend.input(can, action, "input", item)
|
|
||||||
})
|
|
||||||
|
|
||||||
// 上下文
|
|
||||||
table.ondetail && table.ondetail.list && table.ondetail.list.length > 0 && (table._target.oncontextmenu = function(event) {
|
|
||||||
can.onappend.carte(sub, table.ondetail||{}, msg["_detail"] || sub.Conf("detail"), function(ev, item, meta) {
|
|
||||||
(table.ondetail[item]||table.onaction[item])(event, table, msg)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
// 状态条
|
|
||||||
status.innerHTML = "", table.onexport && can.core.List(table.onexport.list, function(item) {
|
|
||||||
can.page.Append(can, status, [{view: "item "+item, title: item, list: [{text: [item+": ", "label"]}, {text: ["", "span"]}]}])
|
|
||||||
})
|
|
||||||
})
|
|
||||||
var table = sub[display];
|
|
||||||
}, silent)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加事件
|
// 添加事件
|
||||||
@ -210,6 +177,49 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
function run(event, cmds, cb, silent) { sub.run(event, cmds, function(msg) {
|
||||||
|
if (silent) { typeof cb == "function" && cb(msg); return }
|
||||||
|
|
||||||
|
// 添加组件
|
||||||
|
var display = (msg.Option("_display")||feature.display||"table.js")
|
||||||
|
display.indexOf("/") == 0 || (display = "/plugin/"+display)
|
||||||
|
|
||||||
|
sub[display] = Volcanos(display, { _help: display, _target: output,
|
||||||
|
_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._init(table, msg, msg.result||[], function() {}, output)
|
||||||
|
|
||||||
|
table.run = function(event, cmds, cb, silent) { cmds = cmds || []
|
||||||
|
sub.run(event, cmds, cb, silent)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 工具栏
|
||||||
|
action.innerHTML = "", table.onaction && can.core.List(table.onaction.list, function(item) {
|
||||||
|
typeof item == "string"? can.onappend.input(can, action, "input", {type: "button", value: item, onclick: function(event) {
|
||||||
|
table.onaction[item](event, table, msg)
|
||||||
|
}}): item.length > 0? can.onappend.input(can, action, "input", {type: "select", values: item.slice(1), name: item[0], onchange: function(event) {
|
||||||
|
table.onaction[item[0]](event, table, msg, item[event.target.selectedIndex+1])
|
||||||
|
}}): typeof item == "object" && can.onappend.input(can, action, "input", item)
|
||||||
|
})
|
||||||
|
|
||||||
|
// 上下文
|
||||||
|
table.ondetail && table.ondetail.list && table.ondetail.list.length > 0 && (table._target.oncontextmenu = function(event) {
|
||||||
|
can.onappend.carte(sub, table.ondetail||{}, msg["_detail"] || sub.Conf("detail"), function(ev, item, meta) {
|
||||||
|
(table.ondetail[item]||table.onaction[item])(event, table, msg)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
// 状态条
|
||||||
|
status.innerHTML = "", table.onexport && can.core.List(table.onexport.list, function(item) {
|
||||||
|
can.page.Append(can, status, [{view: "item "+item, title: item, list: [{text: [item+": ", "label"]}, {text: ["", "span"]}]}])
|
||||||
|
})
|
||||||
|
})
|
||||||
|
var table = sub[display];
|
||||||
|
}, silent) }
|
||||||
|
|
||||||
}); cb(sub);
|
}); cb(sub);
|
||||||
},
|
},
|
||||||
item: function(can, target, type, item, cb, cbs) {
|
item: function(can, target, type, item, cb, cbs) {
|
||||||
@ -280,7 +290,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) {
|
|||||||
return target;
|
return target;
|
||||||
},
|
},
|
||||||
table: function(can, target, type, msg) {
|
table: function(can, target, type, msg) {
|
||||||
var table = can.page.AppendTable(can, can._output, msg, msg.append, function(event, value, key, index, tr, td) {
|
var table = can.page.AppendTable(can, target, msg, msg.append, function(event, value, key, index, tr, td) {
|
||||||
can.page.Select(can, can._option, "input.args", function(input) { if (input.name == key) { var data = input.dataset || {}
|
can.page.Select(can, can._option, "input.args", function(input) { if (input.name == key) { var data = input.dataset || {}
|
||||||
input.value = value; if (data.action == "auto") {
|
input.value = value; if (data.action == "auto") {
|
||||||
can.run(event, [], function(msg) {})
|
can.run(event, [], function(msg) {})
|
||||||
@ -320,7 +330,7 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) {
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
board: function(can, target, type, msg) {
|
board: function(can, target, type, msg) {
|
||||||
msg.result && can.page.AppendBoard(can, can._output, can.page.Display(msg.Result()))
|
msg.result && can.page.AppendBoard(can, target, can.page.Display(msg.Result()))
|
||||||
},
|
},
|
||||||
|
|
||||||
carte: function(can, meta, list, cb) { list = list && list.length > 0? list: meta.list; if (list.length == 0) { return }
|
carte: function(can, meta, list, cb) { list = list && list.length > 0? list: meta.list; if (list.length == 0) { return }
|
||||||
@ -394,7 +404,44 @@ Volcanos("onappend", { _init: function(can, meta, list, cb, target, field) {
|
|||||||
can.page.Modify(can, can._toast, {style: {display: "none"}})
|
can.page.Modify(can, can._toast, {style: {display: "none"}})
|
||||||
}]}] });
|
}]}] });
|
||||||
})
|
})
|
||||||
}
|
},
|
||||||
|
|
||||||
|
upload: function(can) { var begin = new Date();
|
||||||
|
can._upload = can._upload || can.page.Append(can, can._target, [{view: "upload", list: [{view: "action"}, {view: "output"}]}])
|
||||||
|
|
||||||
|
function show(event, value, total, loaded) {
|
||||||
|
var now = new Date(); can.page.Appends(can, can._upload.output, [
|
||||||
|
{view: ["progress"], style: {height: "10px", border: "solid 2px red"}, list: [{
|
||||||
|
view: ["progress"], style: {height: "10px", width: value + "%", background: "red"},
|
||||||
|
}]},
|
||||||
|
{text: [value+"%", "div"], style: {"float": "right"}},
|
||||||
|
{text: [can.base.Duration(now - begin), "div"], style: {"float": "left"}},
|
||||||
|
{text: [can.base.Size(loaded)+"/"+can.base.Size(total), "div"], style: {"text-align": "center"}},
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
var action = can.page.AppendAction(can, can._upload.action, [
|
||||||
|
{type: "input", data: {name: "upload", type: "file", onchange: function(event) {
|
||||||
|
var file = action.upload.files[0]
|
||||||
|
show(event, 0, file.size, 0)
|
||||||
|
}}, style: {width: "200px"}}, "上传", "关闭"], function(event, value, cmd) {
|
||||||
|
if (action.upload.files.length == 0) {return action.upload.focus()}
|
||||||
|
if (value == "关闭") {can._upload.stick = false; return can.page.Remove(can, can._upload.output.parentNode)}
|
||||||
|
|
||||||
|
var msg = can.request(event);
|
||||||
|
can.page.Select(can, can._option, "input", function(item) {
|
||||||
|
item.name && item.value && msg.Option(item.name, item.value)
|
||||||
|
})
|
||||||
|
|
||||||
|
// 上传文件
|
||||||
|
begin = new Date();
|
||||||
|
msg._progress = show
|
||||||
|
msg.upload = action.upload.files[0];
|
||||||
|
can.run(event, ["action", "upload"], function(msg) {
|
||||||
|
can.onappend.toast(can, "上传成功")
|
||||||
|
}, true);
|
||||||
|
})
|
||||||
|
},
|
||||||
}, [], function(can) {})
|
}, [], function(can) {})
|
||||||
Volcanos("onlayout", { _init: function(can, meta, list, cb, target) {
|
Volcanos("onlayout", { _init: function(can, meta, list, cb, target) {
|
||||||
var width = can._width, height = can._height;
|
var width = can._width, height = can._height;
|
||||||
|
53
index.css
53
index.css
@ -77,6 +77,17 @@ fieldset>div.action {
|
|||||||
fieldset>div.action>div.item {
|
fieldset>div.action>div.item {
|
||||||
float:left;
|
float:left;
|
||||||
}
|
}
|
||||||
|
fieldset>div.action>div.item>input {
|
||||||
|
color:cyan;
|
||||||
|
background:black;
|
||||||
|
}
|
||||||
|
fieldset>div.action>div.item>input:hover {
|
||||||
|
background:gray;
|
||||||
|
}
|
||||||
|
fieldset>div.action>div.item>select {
|
||||||
|
color:cyan;
|
||||||
|
background:black;
|
||||||
|
}
|
||||||
fieldset>div.status>div.item {
|
fieldset>div.status>div.item {
|
||||||
float:left;
|
float:left;
|
||||||
padding:4px;
|
padding:4px;
|
||||||
@ -86,27 +97,32 @@ fieldset>div.status>div.item>label {
|
|||||||
color:gray;
|
color:gray;
|
||||||
}
|
}
|
||||||
|
|
||||||
fieldset div.output {
|
fieldset>div.output {
|
||||||
margin-top:4px;
|
margin-top:4px;
|
||||||
clear:both;
|
clear:both;
|
||||||
overflow:auto;
|
overflow:auto;
|
||||||
|
position:relative;
|
||||||
}
|
}
|
||||||
fieldset div.output>div.project {
|
fieldset>div.output>div.project {
|
||||||
float:left;
|
float:left;
|
||||||
|
/* position:fixed; */
|
||||||
}
|
}
|
||||||
fieldset div.output>div.project>div.item {
|
fieldset>div.output>div.project>div.item {
|
||||||
clear:both;
|
clear:both;
|
||||||
}
|
}
|
||||||
fieldset div.output>div.project>div.item:hover {
|
fieldset>div.output>div.project>div.item:hover {
|
||||||
border:solid 1px red;
|
border:solid 1px red;
|
||||||
}
|
}
|
||||||
fieldset div.output>pre.display {
|
fieldset>div.output>pre.profile {
|
||||||
padding:4px;
|
float:right;
|
||||||
max-height:80px;
|
|
||||||
border:solid 2px red;
|
|
||||||
margin:0;
|
|
||||||
overflow:auto;
|
|
||||||
}
|
}
|
||||||
|
fieldset>div.output>div.profile>div.item {
|
||||||
|
clear:both;
|
||||||
|
}
|
||||||
|
fieldset>div.output>div.profile>div.item:hover {
|
||||||
|
border:solid 1px red;
|
||||||
|
}
|
||||||
|
|
||||||
fieldset div.code {
|
fieldset div.code {
|
||||||
color:white;
|
color:white;
|
||||||
font-size:14px;
|
font-size:14px;
|
||||||
@ -172,7 +188,8 @@ div.toast {
|
|||||||
border:solid 2px red;
|
border:solid 2px red;
|
||||||
position:absolute;
|
position:absolute;
|
||||||
padding:5px;
|
padding:5px;
|
||||||
color:yellow
|
color:yellow;
|
||||||
|
z-index:100;
|
||||||
}
|
}
|
||||||
div.toast div.title {
|
div.toast div.title {
|
||||||
font-size:14px;
|
font-size:14px;
|
||||||
@ -185,3 +202,17 @@ div.toast div.duration {
|
|||||||
font-size:14px;
|
font-size:14px;
|
||||||
color:gray;
|
color:gray;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.upload {
|
||||||
|
background:black;
|
||||||
|
border:solid 2px red;
|
||||||
|
position:absolute;
|
||||||
|
padding:5px;
|
||||||
|
color:yellow;
|
||||||
|
z-index:100;
|
||||||
|
left:20px;
|
||||||
|
top:20px;
|
||||||
|
}
|
||||||
|
div.upload div.item {
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
30
lib/core.js
30
lib/core.js
@ -62,7 +62,9 @@ Volcanos("core", {help: "核心模块",
|
|||||||
}),
|
}),
|
||||||
|
|
||||||
Split: shy("分词器", function(str) { if (!str || !str.length) {return []}
|
Split: shy("分词器", function(str) { if (!str || !str.length) {return []}
|
||||||
var arg = []; for (var i = 1; i < arguments.length; i++) { arg.push(arguments[i]) }
|
var opt = {simple: false}, arg = []; for (var i = 1; i < arguments.length; i++) {
|
||||||
|
typeof arguments[i] == "object"? opt=arguments[i]: arg.push(arguments[i])
|
||||||
|
}
|
||||||
|
|
||||||
function trans(str) { var res = {}; for (var i = 0; i < str.length; i++) { res[str[i]] = true }; return res }
|
function trans(str) { var res = {}; for (var i = 0; i < str.length; i++) { res[str[i]] = true }; return res }
|
||||||
// 空白符
|
// 空白符
|
||||||
@ -74,36 +76,28 @@ Volcanos("core", {help: "核心模块",
|
|||||||
|
|
||||||
// 开始分词
|
// 开始分词
|
||||||
var res = [], list = str;
|
var res = [], list = str;
|
||||||
var left = '\000', space = true, begin = 0;
|
var left = "", space = true, begin = 0;
|
||||||
for (var i = 0; i < list.length; i++) {
|
for (var i = 0; i < list.length; i++) {
|
||||||
if (seps[list[i]]) {
|
if (seps[list[i]]) {
|
||||||
// 空白符
|
// 空白符
|
||||||
if (left == '\000') {
|
if (left == "") {
|
||||||
if (!space) {
|
if (!space) {
|
||||||
res.push(list.slice(begin, i))
|
res.push(list.slice(begin, i))
|
||||||
}
|
}
|
||||||
res.push({text: list.slice(i, i+1), type: "space", left: left})
|
opt.simple || res.push({text: list.slice(i, i+1), type: "space", left: left})
|
||||||
space = true, begin = i+1
|
space = true, begin = i+1
|
||||||
}
|
}
|
||||||
} else if (subs[list[i]]) {
|
} else if (subs[list[i]]) {
|
||||||
// 引用符
|
// 引用符
|
||||||
if (arg.length > 0) {
|
if (left == "") {
|
||||||
if (left == '\000') {
|
left = list[i], space = false, begin = i+1
|
||||||
left = list[i]
|
} else if (left == list[i]) {
|
||||||
} else if (left == list[i]) {
|
res.push({text: list.slice(begin, i), type: "string", left: left})
|
||||||
left = '\000'
|
left = "", space = true, begin = i+1
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (left == '\000') {
|
|
||||||
left = list[i], space = false, begin = i+1
|
|
||||||
} else if (left == list[i]) {
|
|
||||||
res.push({text: list.slice(begin, i), type: "string", left: left})
|
|
||||||
left = '\000', space = true, begin = i+1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else if (sups[list[i]]) {
|
} else if (sups[list[i]]) {
|
||||||
// 分隔符
|
// 分隔符
|
||||||
if (left == '\000') {
|
if (left == "") {
|
||||||
if (!space) {
|
if (!space) {
|
||||||
res.push(list.slice(begin, i))
|
res.push(list.slice(begin, i))
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<meta name="viewport" content="width=device-width,initial-scale=0.7,user-scalable=no">
|
<meta name="viewport" content="width=device-width,initial-scale=0.7,user-scalable=no">
|
||||||
<title>volcanos</title>
|
<title>volcanos</title>
|
||||||
|
|
||||||
<link rel="shortcut icon" type="image/ico" href="/static/volcanos/favicon.ico">
|
<link rel="shortcut icon" type="image/ico" href="/favicon.ico">
|
||||||
<link rel="stylesheet" type="text/css" href="/index.css">
|
<link rel="stylesheet" type="text/css" href="/index.css">
|
||||||
<link rel="stylesheet" type="text/css" href="/page/share.css">
|
<link rel="stylesheet" type="text/css" href="/page/share.css">
|
||||||
</head>
|
</head>
|
||||||
|
@ -1,26 +1,13 @@
|
|||||||
var Config = {name: "demo", volcano: "/frame.js", iceberg: "/chat/", intshell: "plug.sh",
|
Volcanos({name: "demo", volcano: "/frame.js", iceberg: "/chat/", intshell: "plug.sh",
|
||||||
libs: ["/lib/base", "/lib/core", "/lib/misc", "/lib/page", "/lib/user"], panes: [
|
libs: ["/lib/base", "/lib/core", "/lib/misc", "/lib/page", "/lib/user"], panes: [
|
||||||
{type: "pane", name: "Action", help: "工作台", pos: "middle", list: ["/pane/Action.js", "/pane/Action.css"]},
|
{type: "pane", name: "Action", help: "工作台", pos: "middle", list: ["/pane/Action.js", "/pane/Action.css"]},
|
||||||
], main: {name: "Action", engine: "remote", list: []},
|
], main: {name: "Action", engine: "remote", list: ["/publish/order.js"]}, plugin: [
|
||||||
list: ["/plugin/state.js", "/plugin/input.js", "/plugin/table.js",
|
"/plugin/state.js",
|
||||||
|
"/plugin/input.js",
|
||||||
|
"/plugin/table.js",
|
||||||
"/plugin/input/key",
|
"/plugin/input/key",
|
||||||
"/plugin/input/date",
|
"/plugin/input/date",
|
||||||
"/plugin/input/upload",
|
"/plugin/input/upload",
|
||||||
"/plugin/input/province",
|
"/plugin/input/province",
|
||||||
],
|
],
|
||||||
}
|
|
||||||
|
|
||||||
var Preload = Config.libs; Config.panes.forEach(function(pane) {
|
|
||||||
Preload = Preload.concat(pane.list);
|
|
||||||
}); Preload = Preload.concat(Config.list)
|
|
||||||
|
|
||||||
Volcanos(Config.name, { _target: document.body, _follow: "demo",
|
|
||||||
_head: document.head, _body: document.body,
|
|
||||||
_width: window.innerWidth, _height: window.innerHeight,
|
|
||||||
}, Preload.concat(Config.volcano), function(can) { // 程序入口
|
|
||||||
can.onaction._init(can, can.Conf(Config), [], function(msg) {
|
|
||||||
console.log(can._root, can._name, "start", can, msg);
|
|
||||||
}, can._target)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ fieldset.Action fieldset.plugin legend {
|
|||||||
margin-top:5px;
|
margin-top:5px;
|
||||||
}
|
}
|
||||||
fieldset.Action fieldset.plugin form.option div.item {
|
fieldset.Action fieldset.plugin form.option div.item {
|
||||||
margin:5px;
|
margin:2px;
|
||||||
}
|
}
|
||||||
fieldset.Action fieldset.plugin div.output {
|
fieldset.Action fieldset.plugin div.output {
|
||||||
margin:5px;
|
margin:5px;
|
||||||
|
@ -32,6 +32,8 @@ Volcanos("onexport", {help: "导出数据", list: [],
|
|||||||
{type: "button", name: "查看", action: "auto"},
|
{type: "button", name: "查看", action: "auto"},
|
||||||
{type: "button", name: "返回"},
|
{type: "button", name: "返回"},
|
||||||
]);
|
]);
|
||||||
|
value.width = can._target.offsetWidth
|
||||||
|
value.height = can._target.offsetHeight
|
||||||
can.onappend._init(can, value, Volcanos.meta.libs.concat(["/plugin/state.js"]), function(sub) {
|
can.onappend._init(can, value, Volcanos.meta.libs.concat(["/plugin/state.js"]), function(sub) {
|
||||||
sub.run = function(event, cmds, cb, silent) { var msg = can.request(event, event._msg||{_msg: sup});
|
sub.run = function(event, cmds, cb, silent) { var msg = can.request(event, event._msg||{_msg: sup});
|
||||||
// 插件回调
|
// 插件回调
|
||||||
|
146
plugin/inner.css
146
plugin/inner.css
@ -1,62 +1,116 @@
|
|||||||
fieldset.editor>div.output textarea.editor {
|
fieldset.editor>div.action>div.file {
|
||||||
font-family:monospace;
|
border:solid 2px red;
|
||||||
background-color:black;
|
padding:2px;
|
||||||
color:white;
|
|
||||||
border:solid 1px red;
|
|
||||||
padding:0;
|
|
||||||
width:0;
|
|
||||||
height:20px;
|
|
||||||
margin:0;
|
|
||||||
position:relative;
|
|
||||||
float:right;
|
|
||||||
}
|
|
||||||
fieldset.editor>div.output div.lineno {
|
|
||||||
font-family:monospace;
|
|
||||||
float:left;
|
float:left;
|
||||||
}
|
}
|
||||||
fieldset.editor>div.output div.lineno>div.item {
|
fieldset.editor>div.action>div.file:hover {
|
||||||
text-align:right;
|
background-color:green;
|
||||||
border:solid 1px black;
|
cursor:pointer;
|
||||||
padding:0 4px;
|
|
||||||
height:20px;
|
|
||||||
margin:0;
|
|
||||||
}
|
}
|
||||||
fieldset.editor>div.output div.lineno>div.item:hover {
|
fieldset.editor>div.action>div.file.select {
|
||||||
background-color:green;
|
background-color:green;
|
||||||
}
|
}
|
||||||
fieldset.editor>div.output div.lineno>div.item.select {
|
fieldset.editor>div.output {
|
||||||
|
min-height:300px;
|
||||||
|
}
|
||||||
|
fieldset.editor>div.output>div.project {
|
||||||
|
width:80px; overflow:auto;
|
||||||
|
position:fixed;
|
||||||
|
}
|
||||||
|
fieldset.editor>div.output>div.profile {
|
||||||
|
position:absolute; right:0;
|
||||||
|
width:80px; overflow:auto;
|
||||||
|
}
|
||||||
|
fieldset.editor>div.output>div.profile:hover {
|
||||||
|
position:absolute; right:0;
|
||||||
|
width:480px;
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldset.editor>div.output div.preview {
|
||||||
|
font-family:monospace;
|
||||||
|
float:left; margin-left:80px;
|
||||||
|
}
|
||||||
|
fieldset.editor>div.output div.preview>div.item {
|
||||||
|
text-align:right;
|
||||||
|
height:20px; border:solid 1px black;
|
||||||
|
padding:0 4px; margin:0;
|
||||||
|
}
|
||||||
|
fieldset.editor>div.output div.preview>div.item:hover {
|
||||||
|
background-color:green;
|
||||||
|
}
|
||||||
|
fieldset.editor>div.output div.preview>div.item.select {
|
||||||
background-color:red;
|
background-color:red;
|
||||||
}
|
}
|
||||||
fieldset.editor>div.output div.content {
|
fieldset.editor>div.output div.content {
|
||||||
font-family:monospace;
|
font-size:16px; font-family:monospace;
|
||||||
border-left:solid 2px red;
|
border-left:solid 2px red;
|
||||||
padding-left:10px;
|
padding-left:10px;
|
||||||
}
|
}
|
||||||
fieldset.editor>div.output div.content>pre.item {
|
fieldset.editor>div.output div.content>pre.item {
|
||||||
border:solid 1px black;
|
height:20px; border:solid 1px black;
|
||||||
padding:0;
|
padding:0; margin:0;
|
||||||
height:20px;
|
|
||||||
margin:0;
|
|
||||||
}
|
|
||||||
fieldset.editor>div.output div.content>pre.item span.comment {
|
|
||||||
background-color:blue;
|
|
||||||
color:cyan;
|
|
||||||
}
|
|
||||||
fieldset.editor>div.output div.content>pre.item span.keyword {
|
|
||||||
color:yellow;
|
|
||||||
font-weight:bold;
|
|
||||||
}
|
|
||||||
fieldset.editor>div.output div.content>pre.item span.function {
|
|
||||||
color:cyan;
|
|
||||||
font-weight:bold;
|
|
||||||
}
|
|
||||||
fieldset.editor>div.output div.content>pre.item span.datatype {
|
|
||||||
color:lightgreen;
|
|
||||||
font-weight:bold;
|
|
||||||
}
|
|
||||||
fieldset.editor>div.output div.content>pre.item span.string {
|
|
||||||
color:magenta;
|
|
||||||
}
|
}
|
||||||
fieldset.editor>div.output div.content>pre.item:hover {
|
fieldset.editor>div.output div.content>pre.item:hover {
|
||||||
border:solid 1px red;
|
border:solid 1px red;
|
||||||
}
|
}
|
||||||
|
fieldset.editor>div.output div.content>pre.item span.comment {
|
||||||
|
background-color:blue; color:cyan;
|
||||||
|
}
|
||||||
|
fieldset.editor>div.output div.content>pre.item span.keyword {
|
||||||
|
font-weight:bold;
|
||||||
|
color:yellow;
|
||||||
|
}
|
||||||
|
fieldset.editor>div.output div.content>pre.item span.function {
|
||||||
|
font-weight:bold;
|
||||||
|
color:cyan;
|
||||||
|
}
|
||||||
|
fieldset.editor>div.output div.content>pre.item span.datatype {
|
||||||
|
font-weight:bold;
|
||||||
|
color:lightgreen;
|
||||||
|
}
|
||||||
|
fieldset.editor>div.output div.content>pre.item span.string {
|
||||||
|
color:magenta;
|
||||||
|
}
|
||||||
|
fieldset.editor>div.output pre.display {
|
||||||
|
padding:6px; border:solid 1px red;
|
||||||
|
max-height:80px; overflow:auto;
|
||||||
|
position:sticky; bottom:0;
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
fieldset.editor>div.output pre.display:hover {
|
||||||
|
background-color:black;
|
||||||
|
max-height:360px;
|
||||||
|
z-index:100;
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldset.editor>div.output textarea.editor.normal {
|
||||||
|
background-color:#00000000; color:#00000000;
|
||||||
|
caret-color:#00000000;
|
||||||
|
}
|
||||||
|
fieldset.editor>div.output textarea.editor {
|
||||||
|
font-size:16px; font-family:monospace;
|
||||||
|
background-color:black; color:white;
|
||||||
|
caret-color:yellow;
|
||||||
|
|
||||||
|
position:absolute; left:0;
|
||||||
|
border:solid 1px red;
|
||||||
|
width:0; height:20px;
|
||||||
|
padding:0; margin:0;
|
||||||
|
|
||||||
|
background-color:#00000000; color:#00000000;
|
||||||
|
padding-left:12px;
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
fieldset.editor>div.output textarea.command {
|
||||||
|
background-color:black; color:white;
|
||||||
|
font-family:monospace;
|
||||||
|
caret-color:red;
|
||||||
|
|
||||||
|
position:sticky; bottom:0;
|
||||||
|
width:0; height:20px;
|
||||||
|
border:solid 1px red;
|
||||||
|
padding:0; margin:0;
|
||||||
|
padding-left:10px;
|
||||||
|
z-index:10;
|
||||||
|
}
|
||||||
|
|
||||||
|
660
plugin/inner.js
660
plugin/inner.js
@ -1,71 +1,125 @@
|
|||||||
Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, target) { target.innerHTML = "";
|
Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb, target) { target.innerHTML = ""
|
||||||
// can.onappend.table(can, target, "table", msg);
|
var width = can.Conf("width"), height = can.Conf("height")
|
||||||
|
can.page.Modify(can, target, {style: {"max-height": height-160+"px"}})
|
||||||
|
|
||||||
can.history = []
|
msg.Option("_action") != "查看" && can.onappend.table(can, target, "table", msg)
|
||||||
can.ui = can.page.Append(can, target, [{view: ["editor", "textarea"], onkeydown: function(event) {
|
can.ui = can.page.Append(can, target, [
|
||||||
can.history.push(event.key); if (can.mode != "insert") {
|
|
||||||
event.stopPropagation()
|
|
||||||
event.preventDefault()
|
|
||||||
}
|
|
||||||
|
|
||||||
can.Status("输入值", can.history.join())
|
|
||||||
var cb = can.onkeymap[can.mode][event.key]
|
|
||||||
if (typeof cb == "function") { return cb(event, can), can.history = [] }
|
|
||||||
|
|
||||||
var map = can.onkeymap[can.mode]._engine
|
|
||||||
for (var i = can.history.length-1; i > -1; i--) {
|
|
||||||
var pos = map[can.history[i]]
|
|
||||||
if (typeof pos == "object") { map = pos; continue }
|
|
||||||
if (typeof pos == "function") { pos(event, can); can.history = [] } break
|
|
||||||
}
|
|
||||||
}, onkeyup: function(event) {
|
|
||||||
|
|
||||||
}, onblur: function(event) {
|
|
||||||
can.onaction.modifyLine(can, can.current, can.editor.value)
|
|
||||||
}},
|
|
||||||
{view: ["project", "div"], style: {width: "80px"}},
|
{view: ["project", "div"], style: {width: "80px"}},
|
||||||
{view: "lineno", style: {width: "30px"}},
|
{view: ["profile", "div"]},
|
||||||
{view: "content"},
|
|
||||||
{view: "preview"}, {view: ["display", "pre"]},
|
|
||||||
]);
|
|
||||||
can.onlayout.show_project(can);
|
|
||||||
can.onlayout.show_project(can);
|
|
||||||
|
|
||||||
can.core.List(can.onkeymap.list, function(item) { var engine = {};
|
{view: "preview", style: {width: "30px"}},
|
||||||
can.core.Item(can.onkeymap[item], function(key, cb) { var map = engine;
|
{view: "content"}, {type: "code", list: [{view: ["display", "pre"]}]},
|
||||||
for (var i = key.length-1; i > -1; i--) {
|
|
||||||
map = map[key[i]] = i == 0? cb: (map[key[i]]||{});
|
{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)
|
||||||
|
})
|
||||||
|
}, onblur: function(event) {
|
||||||
|
can.onaction.modifyLine(can, can.current, can.editor.value)
|
||||||
|
}},
|
||||||
|
])
|
||||||
|
|
||||||
|
msg.Option("path", can.Option("path"))
|
||||||
|
msg.Option("name", can.Option("name"))
|
||||||
|
can.tabview = {}, can.Timer(10, function() {
|
||||||
|
can.onlayout._init(can)
|
||||||
|
can.onkeymap._init(can, "normal")
|
||||||
|
can.onimport.project(can, can.Option("path"))
|
||||||
|
can.onimport.tabview(can, can.Option("path"), can.Option("name"))
|
||||||
|
})
|
||||||
|
return typeof cb == "function" && cb(msg)
|
||||||
|
},
|
||||||
|
tabview: function(can, path, name) {
|
||||||
|
can.Option("path", path)
|
||||||
|
can.Option("name", name)
|
||||||
|
if (can.tabview[path+name]) { return can.onsyntax._init(can, can.tabview[path+name]) }
|
||||||
|
|
||||||
|
var p = can.onsyntax[can.parse]
|
||||||
|
!p && can.run({}, ["action", "plug", can.Option("path"), can.Option("name")], function(msg) {
|
||||||
|
can.onsyntax[can.parse] = p
|
||||||
|
}, true)
|
||||||
|
|
||||||
|
can.run({}, [path, name], function(msg) {
|
||||||
|
msg.Option("path", can.Option("path"))
|
||||||
|
msg.Option("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)
|
||||||
|
}, true)
|
||||||
|
},
|
||||||
|
project: function(can, path) { can.ui.project.innerHTML = ""
|
||||||
|
can.Option("path", path)
|
||||||
|
can.run({}, ["action", "project", path], function(res) {
|
||||||
|
res.Table(function(value) { can.page.Append(can, can.ui.project, [{text: [value.file, "div", "item"], 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))
|
||||||
}
|
}
|
||||||
})
|
}} ]) })
|
||||||
can.onkeymap[item]._engine = engine
|
}, true)
|
||||||
})
|
|
||||||
console.log(can.onkeymap)
|
|
||||||
|
|
||||||
var ls = can.Option("name").split(".");
|
|
||||||
can.parse = ls.pop()||"txt";
|
|
||||||
can.editor = can.ui.editor, can.max = 0, can.ls = msg.Result().split("\n");
|
|
||||||
can.core.List(can.ls, function(item) { can.onaction.appendLine(can, item) });
|
|
||||||
can.Timer(100, function() {
|
|
||||||
can.onaction.project(can);
|
|
||||||
can.onaction.selectLine(can, 0);
|
|
||||||
can.onaction.mode(null, can, null, "normal");
|
|
||||||
can.Status("文件名", can.Option("name"))
|
|
||||||
can.Status("解析器", can.parse)
|
|
||||||
})
|
|
||||||
return typeof cb == "function" && cb(msg);
|
|
||||||
},
|
},
|
||||||
}, ["/plugin/inner.css"])
|
}, ["/plugin/inner.css"])
|
||||||
Volcanos("onsyntax", {help: "语法高亮", list: ["normal", "insert"],
|
Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], _init: function(can, msg) {
|
||||||
parse: function(can, line) { var p = can.onsyntax[can.parse];
|
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")
|
||||||
|
})
|
||||||
|
|
||||||
|
// caches
|
||||||
|
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 }
|
||||||
|
}); if (cache) { return }
|
||||||
|
|
||||||
|
// remote
|
||||||
|
can.ui.preview.innerHTML = ""
|
||||||
|
can.ui.content.innerHTML = ""
|
||||||
|
can.parse = file.split(".").pop()||"txt"
|
||||||
|
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)
|
||||||
|
|
||||||
|
// plugin
|
||||||
|
function init() {
|
||||||
|
can.onkeymap._remote(event, 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()
|
||||||
|
},
|
||||||
|
parse: function(can, line) { var p = can.onsyntax[can.parse]
|
||||||
function wrap(type, str) { return type? '<span class="'+type+'">'+str+'</span>': str }
|
function wrap(type, str) { return type? '<span class="'+type+'">'+str+'</span>': str }
|
||||||
p && p.keyword && (line = can.core.List(can.core.Split(line), function(item, index, array) {
|
p && p.keyword && (line = can.core.List(can.core.Split(line, " ", p.split.operator), function(item, index, array) {
|
||||||
var text = item.text || item;
|
item = typeof item == "object"? item: {text: item}
|
||||||
var key = p.keyword[text];
|
p.word && (item = p.word(item, index, array))
|
||||||
|
var text = item.text; var key = item.keyword||p.keyword[text]
|
||||||
|
|
||||||
switch (item.type) {
|
switch (item.type) {
|
||||||
case "string": return wrap("string", item.left+text+item.left);
|
|
||||||
case "space": return text
|
case "space": return text
|
||||||
default: return wrap(key, text);
|
case "string": return wrap("string", item.left+text+item.left)
|
||||||
|
default: return wrap(key, text)
|
||||||
}
|
}
|
||||||
}).join(""))
|
}).join(""))
|
||||||
|
|
||||||
@ -75,47 +129,43 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["normal", "insert"],
|
|||||||
return p && p.line? p.line(can, line): line
|
return p && p.line? p.line(can, line): line
|
||||||
},
|
},
|
||||||
sh: {
|
sh: {
|
||||||
|
display: true,
|
||||||
|
split: {},
|
||||||
keyword: {
|
keyword: {
|
||||||
"require": "keyword",
|
export: "keyword",
|
||||||
"export": "keyword",
|
source: "keyword",
|
||||||
"source": "keyword",
|
require: "keyword",
|
||||||
},
|
|
||||||
prefix: {
|
|
||||||
"#": "comment",
|
|
||||||
},
|
|
||||||
line: function(can, line) {
|
|
||||||
return line
|
|
||||||
},
|
},
|
||||||
|
prefix: {"#": "comment"},
|
||||||
|
line: function(can, line) { return line },
|
||||||
},
|
},
|
||||||
vim: {
|
vim: {
|
||||||
|
split: {},
|
||||||
keyword: {
|
keyword: {
|
||||||
syntax: "keyword",
|
|
||||||
highlight: "keyword",
|
highlight: "keyword",
|
||||||
|
syntax: "keyword",
|
||||||
},
|
},
|
||||||
prefix: {
|
prefix: {"\"": "comment"},
|
||||||
"\"": "comment",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
shy: {
|
shy: {
|
||||||
keyword: {
|
profile: true,
|
||||||
},
|
display: true,
|
||||||
prefix: {
|
split: {},
|
||||||
"~": "keyword",
|
line: function(can, line) { return line },
|
||||||
"#": "comment",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
mod: {
|
mod: {
|
||||||
|
split: {},
|
||||||
keyword: {
|
keyword: {
|
||||||
"module": "keyword",
|
"module": "keyword",
|
||||||
"require": "keyword",
|
"require": "keyword",
|
||||||
"replace": "keyword",
|
"replace": "keyword",
|
||||||
"=>": "keyword",
|
"=>": "keyword",
|
||||||
},
|
},
|
||||||
prefix: {
|
prefix: {"#": "comment"},
|
||||||
"#": "comment",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
go: {
|
go: {
|
||||||
|
display: true,
|
||||||
|
split: {},
|
||||||
keyword: {
|
keyword: {
|
||||||
"package": "keyword",
|
"package": "keyword",
|
||||||
"import": "keyword",
|
"import": "keyword",
|
||||||
@ -158,142 +208,332 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["normal", "insert"],
|
|||||||
"msg": "function",
|
"msg": "function",
|
||||||
"kit": "keyword",
|
"kit": "keyword",
|
||||||
},
|
},
|
||||||
|
prefix: {"//": "comment"},
|
||||||
|
},
|
||||||
|
js: {
|
||||||
|
display: true,
|
||||||
|
split: {
|
||||||
|
space: " ",
|
||||||
|
operator: "{[(.:,;!|)]}",
|
||||||
|
},
|
||||||
|
keyword: {
|
||||||
|
"var": "keyword",
|
||||||
|
"new": "keyword",
|
||||||
|
"delete": "keyword",
|
||||||
|
"typeof": "keyword",
|
||||||
|
"function": "keyword",
|
||||||
|
|
||||||
|
"if": "keyword",
|
||||||
|
"else": "keyword",
|
||||||
|
"for": "keyword",
|
||||||
|
"while": "keyword",
|
||||||
|
"break": "keyword",
|
||||||
|
"continue": "keyword",
|
||||||
|
"switch": "keyword",
|
||||||
|
"case": "keyword",
|
||||||
|
"default": "keyword",
|
||||||
|
"return": "keyword",
|
||||||
|
|
||||||
|
"window": "function",
|
||||||
|
"console": "function",
|
||||||
|
"document": "function",
|
||||||
|
"arguments": "function",
|
||||||
|
"event": "function",
|
||||||
|
"Date": "function",
|
||||||
|
"JSON": "function",
|
||||||
|
|
||||||
|
"0": "string",
|
||||||
|
"1": "string",
|
||||||
|
"-1": "string",
|
||||||
|
"true": "string",
|
||||||
|
"false": "string",
|
||||||
|
"undefined": "string",
|
||||||
|
"null": "string",
|
||||||
|
|
||||||
|
"__proto__": "function",
|
||||||
|
"setTimeout": "function",
|
||||||
|
"createElement": "function",
|
||||||
|
"appendChild": "function",
|
||||||
|
"removeChild": "function",
|
||||||
|
"parentNode": "function",
|
||||||
|
"childNodes": "function",
|
||||||
|
|
||||||
|
"Volcanos": "function",
|
||||||
|
"request": "function",
|
||||||
|
"require": "function",
|
||||||
|
|
||||||
|
"cb": "function",
|
||||||
|
"cbs": "function",
|
||||||
|
"shy": "function",
|
||||||
|
"can": "function",
|
||||||
|
"sub": "function",
|
||||||
|
"msg": "function",
|
||||||
|
"res": "function",
|
||||||
|
"pane": "function",
|
||||||
|
"plugin": "function",
|
||||||
|
},
|
||||||
|
prefix: {"//": "comment"},
|
||||||
|
word: function(value, index, array) {
|
||||||
|
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
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
png: {
|
||||||
|
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) {
|
||||||
|
},
|
||||||
|
},
|
||||||
|
display: true,
|
||||||
|
line: function(can, line) { var auto = false, loop = true
|
||||||
|
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"},
|
||||||
|
data: {src: "/share/local/"+line, controls: "controls", autoplay: auto, loop: loop},
|
||||||
|
oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb,
|
||||||
|
onloadedmetadata: function(event) { total = event.timeStamp }, onloadeddata: cb, ontimeupdate: function(event) {
|
||||||
|
can.Status("当前行", can.onexport.position(can, event.target.currentTime-1, event.target.duration))
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert"],
|
Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert"], _init: function(can, mode) {
|
||||||
_command: function(can) { can.onaction.mode(null, can, null, "command") },
|
can.page.Modify(can, can.ui.command, {style: {display: "none", width: can._target.offsetWidth-20+"px"}})
|
||||||
_normal: function(can) { can.onaction.mode(null, can, null, "normal") },
|
|
||||||
_insert: function(can) { can.onaction.mode(null, can, null, "insert") },
|
can.history = [], can.editor = can.ui.editor
|
||||||
|
can.core.List(can.onkeymap.list, function(item) { var engine = {}
|
||||||
|
can.core.Item(can.onkeymap[item], function(key, cb) { var map = engine
|
||||||
|
for (var i = key.length-1; i > -1; i--) {
|
||||||
|
map = map[key[i]] = i == 0? cb: (map[key[i]]||{})
|
||||||
|
}
|
||||||
|
}), 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)
|
||||||
|
return value
|
||||||
|
},
|
||||||
|
_command: function(can) { can.onkeymap._mode(can, "command")
|
||||||
|
can.page.Modify(can, can.ui.command, {value: "", style: {display: "block"}})
|
||||||
|
can.ui.command.focus()
|
||||||
|
},
|
||||||
|
_normal: function(can) { can.onkeymap._mode(can, "normal") },
|
||||||
|
_insert: function(can) { can.onkeymap._mode(can, "insert") },
|
||||||
|
|
||||||
|
_remote: function(event, can, key, arg) { 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 msg = can.request(event); msg.Option("content", can.onexport.content(can))
|
||||||
|
can.run(event, arg||["action", key, can.Option("path"), can.Option("name")], function(msg) {
|
||||||
|
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)
|
||||||
|
}, true)
|
||||||
|
},
|
||||||
_engine: {
|
_engine: {
|
||||||
w: function(event, can) {
|
w: function(event, can) { can.onkeymap._remote(event, can, "保存") },
|
||||||
can.onaction.remote(event, can, null, "保存")
|
e: function(event, can, line, ls) { ls = ls[1].split("/")
|
||||||
|
can.onimport.tabview(can, ls.slice(0, -1).join("/"), ls.slice(-1).join(""))
|
||||||
},
|
},
|
||||||
|
r: function(event, can) { can.onkeymap._remote(event, can, "运行") },
|
||||||
|
|
||||||
|
commit: function(event, can) { can.onkeymap._remote(event, can, "提交") },
|
||||||
|
history: function(event, can) { can.onkeymap._remote(event, can, "历史") },
|
||||||
|
},
|
||||||
|
|
||||||
|
parse: function(event, can, mode) {
|
||||||
|
event.key.length == 1 && can.history.push(event.key); if (can.mode != mode) {
|
||||||
|
event.stopPropagation(), event.preventDefault()
|
||||||
|
}; can.mode != "command" && can.Status("输入值", can.history.join())
|
||||||
|
|
||||||
|
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(""))
|
||||||
|
|
||||||
|
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 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 = []
|
||||||
|
}; if (typeof cb == "object") { map = cb; continue }; break
|
||||||
|
}
|
||||||
},
|
},
|
||||||
command: {
|
command: {
|
||||||
Enter: function(event, can) { can.onkeymap._normal(can);
|
Escape: function(event, can) { can.onkeymap._normal(can)
|
||||||
var line = can.history.slice(0, -1).join("");
|
can.page.Modify(can, can.ui.command, {style: {display: "none"}})
|
||||||
var cb = can.onkeymap._engine[line]; if (typeof cb == "function") {
|
can.editor.focus()
|
||||||
return cb(event, can)
|
|
||||||
}
|
|
||||||
can.run(event, ["action", line, can.base.Path(can.Option("path"), can.Option("name"))], function(res) {
|
|
||||||
can.ui.display.innerHTML = res.Result()
|
|
||||||
}, true);
|
|
||||||
},
|
},
|
||||||
jk: function(event, can) { can.history = can.history.slice(0, -1);
|
Enter: function(event, can) { can.onkeymap._normal(can)
|
||||||
can.onkeymap.command.Enter(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, ls)
|
||||||
|
|
||||||
|
can.onkeymap.command.Escape(event, can)
|
||||||
|
},
|
||||||
|
jk: function(event, can) { can.history = can.history.slice(0, -1)
|
||||||
|
can.onkeymap.command.Enter(event, can)
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
normal: {
|
normal: {
|
||||||
":": function(event, can) {
|
":": function(event, can) { can.onkeymap._command(can) },
|
||||||
can.onkeymap._command(can)
|
|
||||||
},
|
|
||||||
h: function(event, can) {
|
h: function(event, can) {
|
||||||
can.editor.setSelectionRange(can.editor.selectionStart-1, can.editor.selectionStart-1)
|
can.editor.setSelectionRange(can.editor.selectionStart-1, can.editor.selectionStart-1)
|
||||||
},
|
},
|
||||||
l: function(event, can) {
|
l: function(event, can) {
|
||||||
can.editor.setSelectionRange(can.editor.selectionStart+1, can.editor.selectionStart+1)
|
can.editor.setSelectionRange(can.editor.selectionStart+1, can.editor.selectionStart+1)
|
||||||
},
|
},
|
||||||
j: function(event, can) {
|
j: function(event, can, count) { count = count || 1
|
||||||
can.onaction.selectLine(can, can.current.nextSibling)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
k: function(event, can) {
|
k: function(event, can, count) { count = count || 1
|
||||||
can.onaction.selectLine(can, can.current.previousSibling)
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
gg: function(event, can, count) { count = count || 1
|
||||||
|
can.onaction.selectLine(can, count - 1)
|
||||||
|
can.current.scrollIntoView()
|
||||||
|
can._target.scrollBy(0, -22*5)
|
||||||
|
},
|
||||||
|
G: function(event, can, count) { count = count || can.max
|
||||||
|
can.onaction.selectLine(can, count - 1)
|
||||||
|
can.current.scrollIntoView()
|
||||||
|
if (count - can.max < -5) {
|
||||||
|
can._target.scrollBy(0, -22*5)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
zt: function(event, can, count) { count = count || 2
|
||||||
|
can.current.scrollIntoView()
|
||||||
|
can._target.scrollBy(0, -22*count)
|
||||||
|
},
|
||||||
|
zz: function(event, can, count) { count = count || 5
|
||||||
|
can.current.scrollIntoView()
|
||||||
|
can._target.scrollBy(0, -22*count)
|
||||||
|
},
|
||||||
|
zb: function(event, can, count) { count = count || 3
|
||||||
|
can._target.scrollBy(0, -(can._target.offsetHeight - (can.current.offsetTop - can._target.scrollTop))+22*count)
|
||||||
},
|
},
|
||||||
|
|
||||||
r: function(event, can) {
|
i: function(event, can) { can.onkeymap._insert(can)
|
||||||
can.run(event)
|
|
||||||
},
|
},
|
||||||
i: function(event, can) {
|
I: function(event, can) { can.onkeymap._insert(can)
|
||||||
can.onkeymap._insert(can)
|
can.editor.setSelectionRange(0, 0)
|
||||||
},
|
},
|
||||||
O: function(event, can) {
|
o: function(event, can) { can.onkeymap._insert(can)
|
||||||
can.onkeymap._insert(can)
|
|
||||||
can.onaction.insertLine(can, can.current, "", true).click()
|
|
||||||
},
|
|
||||||
o: function(event, can) {
|
|
||||||
can.onkeymap._insert(can)
|
|
||||||
can.onaction.insertLine(can, can.current).click()
|
can.onaction.insertLine(can, can.current).click()
|
||||||
},
|
},
|
||||||
yy: function(event, can) {
|
O: function(event, can) { can.onkeymap._insert(can)
|
||||||
can.last = can.current.innerText
|
can.onaction.insertLine(can, can.current, "", true).click()
|
||||||
},
|
},
|
||||||
dd: function(event, can) {
|
|
||||||
can.last = can.current.innerText
|
yy: 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) {
|
dd: function(event, can, count) { count = count || 1
|
||||||
can.onaction.insertLine(can, can.current, can.last).click()
|
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) {
|
P: function(event, can) {
|
||||||
can.onaction.insertLine(can, can.current, can.last, true).click()
|
can.onaction.insertLine(can, can.current, can.last, true).click()
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
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()
|
||||||
|
},
|
||||||
ArrowDown: function(event, can) {
|
ArrowDown: function(event, can) {
|
||||||
can.onaction.selectLine(can, can.current.nextSibling)
|
can.onaction.selectLine(can, can.current.nextSibling)
|
||||||
},
|
},
|
||||||
ArrowUp: function(event, can) {
|
ArrowUp: function(event, can) {
|
||||||
can.onaction.selectLine(can, can.current.previousSibling)
|
can.onaction.selectLine(can, can.current.previousSibling)
|
||||||
},
|
},
|
||||||
Escape: function(event, can) {
|
jk: function(event, can) { can.onkeymap._normal(can)
|
||||||
can.onaction.modifyLine(can, can.current, can.editor.value)
|
|
||||||
can.onkeymap._normal(can)
|
|
||||||
},
|
|
||||||
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()
|
|
||||||
},
|
|
||||||
jk: function(event, can) {
|
|
||||||
can.page.DelText(can.editor, can.editor.selectionStart-1, 1)
|
can.page.DelText(can.editor, can.editor.selectionStart-1, 1)
|
||||||
|
|
||||||
can.onaction.modifyLine(can, can.current, can.editor.value)
|
can.onaction.modifyLine(can, can.current, can.editor.value)
|
||||||
can.onkeymap._normal(can)
|
event.stopPropagation(), event.preventDefault()
|
||||||
event.stopPropagation()
|
|
||||||
event.preventDefault()
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onaction", {help: "控件交互", list: ["项目", "保存", "运行", "提交", ["mode", "normal", "insert"]],
|
Volcanos("onaction", {help: "控件交互", list: ["项目", "上传", "保存", "运行", "提交", "历史"],
|
||||||
modifyLine: function(can, target, value) {
|
modifyLine: function(can, target, value) { var p = can.onsyntax.parse(can, value)
|
||||||
value = can.onsyntax.parse(can, value)
|
typeof p == "object"? can.page.Appends(can, target, [p]): target.innerHTML = p
|
||||||
target.innerHTML = value
|
|
||||||
},
|
},
|
||||||
deleteLine: function(can, target) {
|
deleteLine: function(can, target) { can.page.Remove(can, target)
|
||||||
can.page.Remove(can, target)
|
var ls = can.page.Select(can, can.ui.preview, "div.item")
|
||||||
|
can.page.Remove(can, ls[ls.length-1]), can.max--
|
||||||
var ls = can.page.Select(can, can.ui.lineno, "div.item")
|
|
||||||
can.page.Remove(can, ls[ls.length-1])
|
|
||||||
// can.max--
|
|
||||||
},
|
},
|
||||||
selectLine: function(can, target) { if (!target) { return }
|
selectLine: function(can, target) { if (target !== 0 && !target) { return }
|
||||||
can.page.Select(can, can.ui.content, "pre.item", function(item, index) {
|
can.page.Select(can, can.ui.content, "pre.item", function(item, index) { if (item != target && index != target) { return }
|
||||||
if (item != target && index != target) { return }
|
target = item, can.Status("当前行", can.onexport.position(can, index))
|
||||||
target = item, can.Status("当前行", can.onexport.position(can, index)), can.page.Select(can, can.ui.lineno, "div.item", function(item, i) {
|
can.page.Select(can, can.ui.preview, "div.item", function(item, i) {
|
||||||
can.page.ClassList.del(can, item, "select")
|
can.page.ClassList[index==i? "add": "del"](can, item, "select")
|
||||||
index == i && can.page.ClassList.add(can, item, "select")
|
|
||||||
})
|
})
|
||||||
})
|
}); if (typeof target != "object") { return }; can.current = target
|
||||||
|
|
||||||
can.current = target, can.page.Modify(can, can.editor, {value: can.current.innerText, style: {
|
can.page.Modify(can, can.editor, {className: "editor "+can.mode, value: can.current.innerText, style: {
|
||||||
height: target.offsetHeight+"px", width: target.offsetWidth+"px",
|
height: target.offsetHeight+"px", width: target.offsetWidth+"px",
|
||||||
top: (target.offsetTop-can._output.offsetTop)+"px",
|
top: (target.offsetTop)+"px", display: "block",
|
||||||
}}), can.editor.focus();
|
}}), can.editor.focus()
|
||||||
|
|
||||||
|
can.page.Modify(can, can.ui.command, {value: can.current.innerText, style: {
|
||||||
|
height: target.offsetHeight+"px", width: target.offsetWidth+"px",
|
||||||
|
}})
|
||||||
},
|
},
|
||||||
appendLine: function(can, value) { var index = can.max++;
|
appendLine: function(can, value) { var index = can.max++
|
||||||
can.page.Append(can, can.ui.lineno, [{view: ["item", "div", index+1], onclick: function(event) {
|
can.page.Append(can, can.ui.preview, [{view: ["item", "div", index+1], onclick: function(event) {
|
||||||
can.onaction.selectLine(can, index)
|
can.onaction.selectLine(can, index)
|
||||||
}}])
|
}}])
|
||||||
value = can.onsyntax.parse(can, value)
|
var p = can.onsyntax.parse(can, value||"")
|
||||||
return can.page.Append(can, can.ui.content, [{view: ["item", "pre", value||""], onclick: function(event) {
|
var line = can.page.Append(can, can.ui.content, [typeof p == "object"? p: {view: ["item", "pre", p], onclick: function(event) {
|
||||||
can.onaction.selectLine(can, event.target)
|
can.onaction.selectLine(can, line)
|
||||||
}}]).last
|
}}]).last
|
||||||
|
return line
|
||||||
},
|
},
|
||||||
insertLine: function(can, target, value, before) {
|
insertLine: function(can, target, value, before) {
|
||||||
var line = can.onaction.appendLine(can, value)
|
var line = can.onaction.appendLine(can, value)
|
||||||
@ -301,52 +541,17 @@ Volcanos("onaction", {help: "控件交互", list: ["项目", "保存", "运行",
|
|||||||
return line
|
return line
|
||||||
},
|
},
|
||||||
mergeLine: function(can, target) { if (!target) {return}
|
mergeLine: function(can, target) { if (!target) {return}
|
||||||
can.onaction.modifyLine(can, target, target.innerHTML + target.nextSibling.innerHTML);
|
can.onaction.modifyLine(can, target, target.innerHTML + target.nextSibling.innerHTML)
|
||||||
can.onaction.deleteLine(can, target.nextSibling);
|
can.onaction.deleteLine(can, target.nextSibling)
|
||||||
return target
|
return target
|
||||||
},
|
},
|
||||||
|
|
||||||
project: function(can) { can.ui.project.innerHTML = ""
|
"项目": function(event, can, msg) { can.onlayout.project(can) },
|
||||||
can.run({}, ["action", "project", can.Option("path")], function(res) {
|
"上传": function(event, can, msg) { can.onappend.upload(can) },
|
||||||
res.Table(function(value) {
|
"保存": function(event, can, msg) { can.onkeymap._remote(event, can, "保存") },
|
||||||
can.page.Append(can, can.ui.project, [{text: [value.file, "div", "item"], onclick: function(event) {
|
"运行": function(event, can, msg) { can.onkeymap._remote(event, can, "运行") },
|
||||||
if (value.file.endsWith("/")) {
|
"提交": function(event, can, msg) { can.onkeymap._remote(event, can, "提交") },
|
||||||
can.Option("path", can.base.Path(can.Option("path"), value.file))
|
"历史": function(event, can, msg) { can.onkeymap._remote(event, can, "历史") },
|
||||||
can.onaction.project(can)
|
|
||||||
} else {
|
|
||||||
can.Option("name", value.file)
|
|
||||||
can.run(event)
|
|
||||||
}
|
|
||||||
}}])
|
|
||||||
})
|
|
||||||
}, true)
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
remote: function(event, can, msg, key, cb) {
|
|
||||||
msg = can.request(event), msg.Option("content", can.onexport.content(can))
|
|
||||||
can.run(event, ["action", key, can.base.Path(can.Option("path"), can.Option("name"))], function(res) {
|
|
||||||
}, true)
|
|
||||||
},
|
|
||||||
mode: function(event, can, msg, value) {
|
|
||||||
can.Action("mode", can.mode = value)
|
|
||||||
can.Status("输入法", can.mode)
|
|
||||||
return value
|
|
||||||
},
|
|
||||||
"项目": function(event, can, msg) {
|
|
||||||
can.onlayout.show_project(can)
|
|
||||||
},
|
|
||||||
"保存": function(event, can, msg) {
|
|
||||||
can.onaction.remote(event, can, msg, "保存")
|
|
||||||
},
|
|
||||||
"运行": function(event, can, msg) {
|
|
||||||
can.run(event, ["action", can.parse, can.base.Path(can.Option("path"), can.Option("name"))], function(res) {
|
|
||||||
can.ui.display.innerHTML = res.Result()
|
|
||||||
}, true);
|
|
||||||
},
|
|
||||||
"提交": function(event, can, msg) {
|
|
||||||
can.onaction.remote(event, can, msg, "提交")
|
|
||||||
},
|
|
||||||
})
|
})
|
||||||
Volcanos("ondetail", {help: "菜单交互", list: ["删除行", "合并行", "插入行", "添加行", "追加行"],
|
Volcanos("ondetail", {help: "菜单交互", list: ["删除行", "合并行", "插入行", "添加行", "追加行"],
|
||||||
"删除行": function(event, can, msg) {
|
"删除行": function(event, can, msg) {
|
||||||
@ -365,19 +570,29 @@ Volcanos("ondetail", {help: "菜单交互", list: ["删除行", "合并行", "
|
|||||||
can.onaction.appendLine(can)
|
can.onaction.appendLine(can)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onlayout", {help: "页面布局", list: [],
|
Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can) {
|
||||||
show_project: function(can) {
|
can.onlayout.project(can)
|
||||||
var hide = can.ui.project.style.display == "none"
|
can.onlayout.project(can)
|
||||||
can.page.Modify(can, can.ui.project, {style: {
|
|
||||||
display: hide? "": "none",
|
|
||||||
}})
|
|
||||||
can.page.Modify(can, can.ui.content, {style: {
|
|
||||||
"margin-left": hide? "110px": "30px",
|
|
||||||
}})
|
|
||||||
can.page.Modify(can, can.ui.display, {style: {
|
|
||||||
"margin-left": hide? "110px": "30px",
|
|
||||||
}})
|
|
||||||
},
|
},
|
||||||
|
|
||||||
|
project: function(can) { var hide = can.ui.project.style.display == "none"
|
||||||
|
can.page.Modify(can, can.ui.project, {style: {display: hide? "": "none"}})
|
||||||
|
|
||||||
|
var style = {style: {
|
||||||
|
"margin-left": hide? "80px": "0px",
|
||||||
|
}}; can.page.Modify(can, can.ui.preview, style)
|
||||||
|
|
||||||
|
var style = {style: {
|
||||||
|
"margin-left": hide? "110px": "30px",
|
||||||
|
}}; can.page.Modify(can, can.ui.content, style)
|
||||||
|
|
||||||
|
can.page.Modify(can, can.ui.display, style)
|
||||||
|
can.page.Modify(can, can.ui.command, style)
|
||||||
|
can.page.Modify(can, can.ui.editor, style)
|
||||||
|
},
|
||||||
|
})
|
||||||
|
Volcanos("ondaemon", {help: "数据刷新", list: [], _init: function(can) {
|
||||||
|
},
|
||||||
})
|
})
|
||||||
Volcanos("onexport", {help: "导出数据", list: ["输入法", "输入值", "文件名", "解析器", "当前行"],
|
Volcanos("onexport", {help: "导出数据", list: ["输入法", "输入值", "文件名", "解析器", "当前行"],
|
||||||
content: function(can) {
|
content: function(can) {
|
||||||
@ -385,7 +600,8 @@ Volcanos("onexport", {help: "导出数据", list: ["输入法", "输入值", "
|
|||||||
return can.current == item? can.editor.value: item.innerText
|
return can.current == item? can.editor.value: item.innerText
|
||||||
}).join("\n")
|
}).join("\n")
|
||||||
},
|
},
|
||||||
position: function(can, index) {
|
position: function(can, index, total) { total = total || can.max
|
||||||
return parseInt((index+1)*100/can.max)+"%"+" = "+(index+1)+"/"+can.max
|
return parseInt((index+1)*100/total)+"%"+" = "+(parseInt(index)+1)+"/"+parseInt(total)
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user