1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00

opt volcanos

This commit is contained in:
shaoying 2020-12-10 19:08:44 +08:00
parent daae818739
commit d221b3cf1b
32 changed files with 648 additions and 773 deletions

View File

@ -5,7 +5,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.onappend.table(can, msg, can.ui.content, "table")
can.onappend.board(can, msg,can.ui.display, "board")
var refresh = msg.Option("_refresh") || can.Conf("feature")["_refresh"]
refresh && can.Timer(refresh, function() {
refresh && can.core.Timer(refresh, function() {
can.run({})
})
return typeof cb == "function" && cb(msg)

219
frame.js
View File

@ -1,31 +1,33 @@
Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta, list, cb, target) {
can.core.Next(meta.panes, function(item, next) {
can.core.Next(meta.panes, function(item, next) { item.type = "pane"
can.onappend._init(can, item, item.list, function(pane) {
pane.onaction && pane.onappend._action(pane, pane._action, item._action||pane.onaction.list)
pane.run = function(event, cmds, cb, silent) { var msg = pane.request(event); cmds = cmds || []
return (can.onengine[cmds[0]]||can.onengine[meta.main.engine])(event, can, msg, pane, cmds, function(msg) {
return typeof cb == "function" && cb(msg)
typeof cb == "function" && cb(msg)
})
}, can[item.name] = pane, next()
}, target)
}, function() {
can.onlayout._init(can, meta, list, function() {}, target)
can.onlayout._init(can, meta, list, function() {
can.onkeypop._init(can)
}, target)
can.onengine._daemon(can, can.user.title())
can.require(Volcanos.meta.webpack? []: meta.main.list, function(can) {
can.require(meta.main.list, function(can) {
var pane = can[meta.main.name], msg = can.request({})
pane.onaction._init(pane, msg, msg.option||[], function(msg) {
return typeof cb == "function" && cb(msg)
pane.onengine._daemon(pane, pane.user.title())
pane.onaction._init(pane, msg, [], function(msg) {
typeof cb == "function" && cb(msg)
}, pane._target)
})
})
},
_daemon: function(can, name) { return
can.misc.WSS(can, "", {type: "chrome", name: name}, function(event, msg) {
_daemon: function(can, name) {
can.misc.WSS(can, "", {type: "chrome", name: name}, function(event, msg, cmd, arg) {
if (msg.Option("_handle")) { return can.user.toast(can, msg.result.join("")) }
can.user.toast(can, msg.detail.join(" "))
switch (msg.detail[0]) {
switch (cmd) {
case "pwd":
msg.Echo("hello world")
break
@ -47,49 +49,30 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta,
},
remote: function(event, can, msg, pane, cmds, cb) {
if (can.onengine.engine(event, can, msg, pane, cmds, cb)) { return }
if (Volcanos.meta.webpack == true || location.protocol == "file:") {
var res = Volcanos.meta.pack[pane._name+","+cmds.join(",")]
if (res) { res = can.request(event, res)
delete(msg._event), delete(msg._can)
return typeof cb == "function" && cb(res)
}
return typeof cb == "function" && cb(msg)
}
can.misc.Run(event, can, {names: pane._name}, cmds, cb)
pane.run(event, ["search", "Footer.onimport.ncmd"])
can.misc.Run(event, can, {names: pane._name}, cmds, function(msg) {
delete(msg._event), delete(msg._can)
Volcanos.meta.pack[pane._name+","+cmds.join(",")] = msg
typeof cb == "function" && cb(msg)
delete(msg.sessid)
})
},
engine: function(event, can, msg, pane, cmds, cb) { if (!can.onengine) { return false }
engine: function(event, can, msg, pane, cmds, cb) {
switch (pane._name) {
case "River":
cmds.length == 0 && can.core.Item(can.onengine.river, function(key, value) {
msg.Push("hash", key), msg.Push("name", value.name)
})
if (cmds.length != 1 && cmds[1] != "tool") { break }
case "Storm":
var river = can.onengine.river[cmds[0]]; if (!river) { break }
}); if (cmds.length != 1 && cmds[1] != "tool") { return false }
var river = can.onengine.river[cmds[0]]; if (!river) { return false }
can.core.Item(river.storm, function(key, value) {
msg.Push("hash", key), msg.Push("name", value.name)
})
typeof cb == "function" && cb(msg)
}), typeof cb == "function" && cb(msg)
return true
case "Action":
var river = can.onengine.river[cmds[0]||"main"]
var storm = river && river.storm[cmds[1]]
var action = storm && storm.action && storm.action[cmds[2]]
if (!storm) { break } if (cmds.length == 2) {
if (storm.index) {
if (Volcanos.meta.webpack == true) { typeof cb == "function" && cb(msg); return true }
can.misc.Run(event, can, {names: pane._name}, ["action", "command"].concat(storm.index), cb)
return true
}
case "Action":
var river = can.onengine.river[cmds[0]]
var storm = river && river.storm[cmds[1]]
if (!storm || cmds.length != 2) { break }
if (storm.index) {
can.misc.Run(event, can, {names: pane._name}, ["action", "command"].concat(storm.index), cb)
} else {
can.core.List(storm.action, function(value) {
msg.Push("name", value.name||"")
msg.Push("help", value.help||"")
@ -97,10 +80,9 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta,
msg.Push("feature", JSON.stringify(value.feature||{}))
msg.Push("index", value.index||"")
msg.Push("args", value.args||"[]")
})
typeof cb == "function" && cb(msg)
return true
}), typeof cb == "function" && cb(msg)
}
return true
}
return false
},
@ -216,58 +198,54 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta,
},
})
Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, list, cb, target, field) {
meta.name = meta.name.split(" ")[0]
field = field || can.onappend.field(can, target, meta.type, meta).first
var legend = can.page.Select(can, field, "legend")[0]
var option = can.page.Select(can, field, "form.option")[0]
var action = can.page.Select(can, field, "div.action")[0]
var output = can.page.Select(can, field, "div.output")[0]
var status = can.page.Select(can, field, "div.status")[0]
meta.id && (option.dataset.id = meta.id)
// 添加插件
var sub = Volcanos(meta.name, { _help: meta.name, _follow: can._follow+"."+meta.name,
_legend: legend, _option: option, _action: action, _output: output, _status: status,
_target: field, _inputs: {}, _outputs: [], _history: [],
Option: function(key, value) {
if (typeof key == "object") { return sub.core.Item(key, sub.Option), key }
if (key == undefined) { value = {}
sub.page.Select(sub, option, "textarea.args,input.args,select.args", function(item) {
item.name && item.value && (value[item.name] = item.value)
})
return value
}); return value
}
sub.page.Select(sub, option, "input[name="+key+"],"+"select[name="+key+"]", function(item) {
if (typeof key == "object") { return sub.core.Item(key, sub.Option), key }
sub.page.Select(sub, option, "textarea[name="+key+"],"+"input[name="+key+"],"+"select[name="+key+"]", function(item) {
value == undefined? (value = item.value): (item.value = value)
})
return value
}); return value
},
Action: function(key, value) {
if (typeof key == "object") { return sub.core.Item(key, sub.Action), key }
sub.page.Select(sub, action, "input[name="+key+"],"+"select[name="+key+"]", function(item) {
sub.page.Select(sub, action, "textarea[name="+key+"],"+"input[name="+key+"],"+"select[name="+key+"]", function(item) {
value == undefined? (value = item.value): (item.value = value)
})
return value
}); return value
},
Status: function(key, value) {
if (typeof key == "object") { return sub.core.Item(key, sub.Status), key }
sub.page.Select(sub, status, "div."+key+">span", function(item) {
value == undefined? (value = item.innerHTML): (item.innerHTML = value)
})
return value
}); return value
},
Clone: function() {
meta.args = sub.page.Select(sub, sub._option, "textarea.args,input.args,select.args", function(item) {
meta.args = sub.page.Select(sub, option, "textarea.args,input.args,select.args", function(item) {
return item.name && item.value || ""
})
can.onappend._init(can, meta, list, function(sub) {
typeof cb == "function" && cb(sub)
sub.Timer(10, function() {
can.core.Timer(10, function() {
for (var k in sub._inputs) { sub._inputs[k]._target.focus(); break }
})
}, target)
},
Pack: function(cmds, slient) {
cmds = cmds && cmds.length > 0? cmds: sub.page.Select(sub, sub._option, "textarea.args,input.args,select.args", function(item) {
cmds = cmds && cmds.length > 0? cmds: sub.page.Select(sub, option, "textarea.args,input.args,select.args", function(item) {
return item.name && item.value || ""
}); for (var i = cmds.length-1; i >= 0; i--) {
if (!cmds[i]) { cmds.pop() } else { break }
@ -283,23 +261,23 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
typeof cb == "function" && cb(sub)
meta.inputs && sub.onappend._option(sub, meta, list, cb)
})
return sub
},
_option: function(can, meta, list, cb) { var index = -1, args = can.base.Obj(meta.arg||meta.args, [])
_option: function(can, meta, list, cb) { var index = -1, args = can.base.Obj(meta.args||meta.arg, [])
function add(item, next) { item._input != "button" && index++
can._inputs[item.name] = Volcanos(item.name, { _help: item.name, _follow: can._follow+"."+item.name,
var input = Volcanos(item.name, { _help: item.name, _follow: can._follow+"."+item.name,
_target: can.onappend.input(can, can._option, item.type, item, args[index]),
_option: can._option, _action: can._action, _output: can._output,
CloneInput: function() { add(item)._target.focus() },
CloneField: function() { can.Clone() },
}, Volcanos.meta.libs.concat([item.display||"/plugin/input.js", Volcanos.meta.volcano]), function(input) {
input.Conf(item), input.sup = can, input.run = function(event, cmds, cb, silent) {
input.Conf(item), input.sup = can
input.run = function(event, cmds, cb, silent) {
var msg = can.request(event, can.Conf("option"))
return can.onappend._output(can, meta, event, can.Pack(cmds), cb, silent)
}
input.onaction && input.onaction._init && input.onaction._init(input, item, [], next, input._target)
})
}); return can._inputs[item.name] = input
}; can.core.Next(can.base.Obj(meta.inputs, []), add)
},
_action: function(can, action, list) {
@ -329,16 +307,19 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
typeof cb == "function" && cb(msg)
if (silent) { return }
if (can.onimport._process(can, msg)) { return }
var display = meta.feature.display || "table.js"
display.indexOf("/") == 0 || (display = "/plugin/"+display)
display.endsWith(".js") || (display += ".js")
can._outputs.push(Volcanos(display, { _help: display, _follow: can._follow+"."+display,
var output = Volcanos(display, { _help: display, _follow: can._follow+"."+display,
_target: can._output, _fields: can._target,
_option: can._option, _action: can._action, _output: can._output, _status: can._status,
Option: can.Option, Action: can.Action, Status: can.Status,
}, Volcanos.meta.libs.concat([display, Volcanos.meta.volcano]), function(table) {
table.Conf(can.Conf()), table.sup = can, table.run = function(event, cmds, cb, silent) {
table.Conf(can.Conf()), table.sup = can
table.run = function(event, cmds, cb, silent) {
var msg = can.request(event, can.Conf("option"))
return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent)
}, table._msg = msg
@ -348,13 +329,13 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
table.ondetail && table.onappend._detail(table, table._output, msg._detail||meta._detail||table.ondetail.list)
table.onexport && table.onappend._status(table, table._status, msg._export||meta._export||table.onexport.list)
}, can._output)
}))
}); can._outputs.push(output)
}, silent)
},
_detail: function(can, target, list) {
_detail: function(can, target, list, cb) {
list.length > 0 && (target.oncontextmenu = function(event) {
can.user.carte(can, can.ondetail||{}, list, function(ev, item, meta) {
(can.ondetail[item] || can.onaction[item])(event, can, item)
(cb||can.ondetail[item]||can.onaction[item])(event, can, item)
})
})
},
@ -390,15 +371,10 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
})
})
},
menu: function(can, msg, list) {
can.ondetail && can.onappend._detail(can, can._target, list||msg._detail||meta._detail||table.ondetail.list)
},
field: function(can, target, type, item) { var dataset = {}; item && item.name && (dataset.names = item.name)
item.help = typeof item.help == "string" && item.help.startsWith("[") && (item.help = can.base.Obj(item.help, [""])[0]) || item.help || ""
field: function(can, target, type, item) {
return can.page.Append(can, target, [{view: [(type||"")+" "+(item.name||"")+" "+(item.pos||""), "fieldset"], list: [
item.pos? undefined: {text: [(item.nick||item.name||"")+"("+(item.help||"")+")", "legend"]},
{view: ["option", "form"], dataset: dataset, list: []},
{view: ["action"]}, {view: ["output"]}, {view: ["status"]},
item.pos? undefined: {text: [(item.nick||item.name||"").split(" ")[0]+"("+(item.help||"").split(" ")[0]+")", "legend"]},
{view: ["option", "form"]}, {view: ["action"]}, {view: ["output"]}, {view: ["status"]},
]}])
},
input: function(can, option, type, item, value) {
@ -465,7 +441,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
can.onappend._init(can, value, ["/plugin/state.js"], function(story) {
story.page.Remove(story, story._legend)
return typeof cb == "function" && cb(story, value)
typeof cb == "function" && cb(story, value)
}, target || can._output)
}, true)
},
@ -475,7 +451,7 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, meta,
var width = can._width, height = can._height
can.page.Select(can, target, "fieldset.head", function(field) {
height -= field.offsetHeight
height -= field.offsetHeight + 15
})
can.page.Select(can, target, "fieldset.foot", function(field) {
height -= field.offsetHeight
@ -520,7 +496,7 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can) {
}}
})}])
var iu = can.page.Append(can, document.body, [{view: "nice", style: {position: "fixed", top: 40, width: 0, height: 40}}])
can.Timer({interval: 100}, function() {
can.core.Timer({interval: 100}, function() {
can.page.Select(can, ui.high, "div.char", function(item) {
item.offsetHeight > -2 && can.page.Modify(can, item, {style: {
height: item.offsetHeight-item.offsetHeight/200-1+"px",
@ -534,7 +510,7 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can) {
})
var count = 0, add = true
can.Timer({interval: 100}, function() {
can.core.Timer({interval: 100}, function() {
if (add) {
count++
if (count > 100) {
@ -596,7 +572,76 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can) {
}
document.body.onkeyup = function(event) {
}
}, action: null, show: function(event, can) {
},
oninput: function(event, can, local) {var target = event.target
if (event.ctrlKey) {
if (typeof local == "function" && local(event)) {
event.stopPropagation()
event.preventDefault()
return true
}
var his = target.History || []
var pos = target.Current || -1
switch (event.key) {
case "p":
pos = (pos-1+his.length+1) % (his.length+1)
target.value = pos < his.length? his[pos]: ""
target.Current = pos
break
case "n":
pos = (pos+1) % (his.length+1)
target.value = pos < his.length? his[pos]: ""
target.Current = pos
break
case "a":
case "e":
case "f":
case "b":
break
case "h":
can.page.DelText(target, target.selectionStart-1, target.selectionStart)
break
case "d":
can.page.DelText(target, 0, target.selectionStart)
break
case "k":
can.page.DelText(target, target.selectionStart)
break
case "u":
can.page.DelText(target, 0, target.selectionEnd)
break
case "w":
var start = target.selectionStart-2
var end = target.selectionEnd-1
for (var i = start; i >= 0; i--) {
if (target.value[end] == " " && target.value[i] != " ") {
break
}
if (target.value[end] != " " && target.value[i] == " ") {
break
}
}
can.page.DelText(target, i+1, end-i)
break
default:
return false
}
} else {
switch (event.key) {
case " ":
event.stopPropagation()
return true
default:
return false
}
}
event.stopPropagation()
event.preventDefault()
return true
},
action: null, show: function(event, can) {
var key = event.key, map = {
"~": "q",
"`": "q",
@ -726,7 +771,7 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can) {
time = typeof time == "object"? time: {value: 10, length: time||20}
can.page.Modify(can, target, {style: {opacity: 0, display: "block"}})
can.Timer(time, function(event, value, index) {
can.core.Timer(time, function(event, value, index) {
can.page.Modify(can, target, {style: {opacity: (index+1)/time.length}})
}, cb)
},
@ -734,7 +779,7 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can) {
time = typeof time == "object"? time: {value: 10, length: time||20}
can.page.Modify(can, target, {style: {opacity: 1}})
can.Timer(time, function(event, value, index) {
can.core.Timer(time, function(event, value, index) {
can.page.Modify(can, target, {style: {opacity: 1-(index+1)/time.length}})
}, cb)
},

254
index.css
View File

@ -1,27 +1,19 @@
body {
margin:0; padding:0;
background:black;
padding:0;
margin:0;
}
fieldset {
margin:0; border:0; padding:2px;
color:cyan;
padding:2px;
margin:0; border:0;
}
legend {
margin-left:10px;
box-shadow: 4px 4px 20px 4px #626bd0;
box-shadow:4px 4px 20px 4px #626bd0;
}
legend:hover {
cursor:pointer;
background:red;
}
div.hidden {
display:none;
}
h1 {
margin:0;
}
input[type=text] {
background-color:cyan;
@ -36,6 +28,58 @@ select {
color:cyan;
}
table {
border:0; white-space: pre;
font-size:14px; font-family:monospace;
cursor:pointer; overflow: auto;
}
table tr:hover {
background-color:#0fbd45;
}
table tr.select {
background-color:#0fbd45;
}
table tr.over {
background:red;
}
table th {
background-color:#0fbd45;
padding: 0 10px;
cursor:pointer;
}
table td {
overflow:auto;
max-width:1200px;
padding:0 10px;
}
table td.done {
background-color:green;
}
table td:hover {
background-color:red;
}
table td.select {
background-color:red;
}
table td input {
margin-left:4px;
}
h1 {
margin:0;
}
div.code {
box-shadow: 4px 4px 20px 4px #626bd0;
font-size:14px; font-family:monospace;
color:white; background-color:#343a34f2;
padding:10px; border:solid 3px green;
text-align:left; white-space:pre;
overflow:auto;
}
div.hidden {
display:none;
}
fieldset>form.option {
padding:0 5px;
}
@ -82,9 +126,6 @@ fieldset>form.option>div.item.textarea {
clear:both;
}
fieldset>div.action {
/* clear:none; */
}
fieldset>div.action>div.item {
float:left;
margin:2px 0;
@ -134,52 +175,19 @@ fieldset>div.output>pre.display:hover {
/* max-height:640px; */
}
table {
border:0; white-space: pre;
font-size:14px; font-family:monospace;
/* box-shadow: 4px 4px 10px 1px #626bd0; */
cursor:pointer; overflow: auto;
fieldset.input {
background-color:black;
position:fixed;
left:0; top:0;
}
table tr:hover {
background-color:#0fbd45;
fieldset.input {
z-index:99;
}
table tr.select {
background-color:#0fbd45;
fieldset.input.date {
z-index:101;
}
table tr.over {
background:red;
}
table th {
background-color:#0fbd45;
padding: 0 10px;
cursor:pointer;
}
table td {
overflow:auto;
max-width:1200px;
padding:0 10px;
}
table td.done {
background-color:green;
}
table td:hover {
background-color:red;
}
table td.select {
background-color:red;
}
table td input {
margin-left:4px;
}
div.code {
box-shadow: 4px 4px 20px 4px #626bd0;
font-size:14px; font-family:monospace;
color:white; background-color:#343a34f2;
padding:10px; border:solid 3px green;
text-align:left; white-space:pre;
overflow:auto;
/* max-height:640px; */
fieldset.input.key {
z-index:101;
}
div.toast {
@ -239,21 +247,6 @@ div.upload div.item {
float:left;
}
fieldset.input {
background-color:black;
position:fixed;
left:0; top:0;
}
fieldset.input {
z-index:99;
}
fieldset.input.date {
z-index:101;
}
fieldset.input.key {
z-index:101;
}
body.white {
margin:0; padding:0;
background-color:#0dabda;
@ -275,15 +268,6 @@ body.white input[type=button] {
background-color:#FF9900;
color:white;
}
body.white table input[type=button][value=结束] {
background:red;
}
body.white table input[type=button][value=停止] {
background:red;
}
body.white table input[type=button][value=启动] {
background:#52ce78;
}
body.white input[type=button]:hover {
border-radius:10px 10px 10px 10px;
border:2px solid #FFCC33;
@ -299,6 +283,15 @@ body.white select {
}
body.white select:hover {
}
body.white table input[type=button][value=结束] {
background:red;
}
body.white table input[type=button][value=停止] {
background:red;
}
body.white table input[type=button][value=启动] {
background:#52ce78;
}
body.white fieldset {
/* color:black; */
@ -312,100 +305,6 @@ body.white fieldset.plugin {
background-color:white;
color:black;
}
body.white fieldset.editor {
background:#0b2c54ab;
color:white;
}
body.white fieldset.Header {
border:solid 2px #1f2224;
background-color:#2f3638;
color:white;
}
body.white fieldset.Header input[type=text] {
border:2px solid #c4c7ce;
border-radius:10px 10px 10px 10px;
background-color:white;
color:white;
}
body.white fieldset.Footer {
border:solid 2px #1f2224;
background-color:#1f2224;
color:white;
}
body.white fieldset.River {
border:solid 2px #1f2224;
background-color:#1f2224;
color:white;
}
body.white fieldset.River>div.output div.item:hover {
background-color:black;
border:solid 2px black;
}
body.white fieldset.River>div.output div.item.select {
background-color:black;
border:solid 2px black;
}
body.white fieldset.River>div.output div.subitem:hover {
background-color:black;
border:solid 2px black;
}
body.white fieldset.River>div.output div.subitem.select {
background-color:black;
border:solid 2px black;
}
body.white fieldset.Storm {
border:solid 10px #1f2224;
background-color:#1f2224;
color:white;
}
body.white fieldset.Storm>div.output>div.item:hover {
background-color:black;
border:solid 2px black;
}
body.white fieldset.Storm>div.output>div.item.select {
background-color:black;
border:solid 2px black;
}
body.white fieldset.Action {
background-color:#0dabda;
border-top:0;
}
body.white fieldset.Action fieldset.plugin {
color:black; background-color:white;
border:0; border-top:solid 2px #CCCCFF;
box-shadow: 4px 4px 10px 4px #626bd0;
margin:8px 8px;
}
body.white fieldset.Action fieldset.plugin:hover {
border-top:solid 2px #6666FF;
}
body.white fieldset.Action fieldset.plugin legend {
font-size:16px; font-family:monospace;
color:white; background-color:#339999;
padding:2px 20px; border:2px solid #99CCFF;
border-radius:10px 10px 10px 10px;
}
body.white fieldset.Action fieldset.plugin legend:hover {
background-color:#6ee4e4;
}
body.white fieldset.Action fieldset.plugin div.output{
color:black;
padding:10px;
}
body.white fieldset.Action fieldset.plugin div.item input[type=button] {
letter-spacing:4px;
}
body.white fieldset.Action fieldset.plugin div.item input {
box-shadow: 4px 4px 10px 1px #626bd0;
}
body.white fieldset.Action fieldset.plugin div.item input[name=cmd] {
width:160px;
}
body.white fieldset.Action fieldset.plugin div.item select {
box-shadow: 4px 4px 10px 1px #626bd0;
margin-top:-2px;
}
body.white fieldset.plugin table {
color:black; background-color:white;
}
@ -428,6 +327,10 @@ body.white fieldset.plugin table td {
body.white fieldset.plugin table td:hover {
background-color:#98ecd4;
}
body.white fieldset.editor {
background:#0b2c54ab;
color:white;
}
fieldset.command>form.option>div.item input.args {
width:300px;
@ -435,7 +338,6 @@ fieldset.command>form.option>div.item input.args {
fieldset.command>form.option>div.item textarea {
height:160px;
}
fieldset.max>form.option>div.item textarea.args {
background-color:cyan;
width:500px;

View File

@ -1,5 +1,5 @@
_can_name = ""
Volcanos({name: "chat", volcano: "/frame.js", iceberg: "/chat/",
Volcanos({name: "chat", iceberg: "/chat/", volcano: "/frame.js",
libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"], panes: [
{name: "Header", help: "标题栏", pos: "head", state: ["time", "username"]},
{name: "Search", help: "搜索框", pos: "float"},
@ -8,8 +8,8 @@ Volcanos({name: "chat", volcano: "/frame.js", iceberg: "/chat/",
{name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]},
], main: {name: "Header", engine: "remote", list: ["publish/order.js"]}, plugin: [
"/plugin/state.js",
"/plugin/table.js",
"/plugin/input.js",
"/plugin/table.js",
"/plugin/input/key.js",
"/plugin/input/date.js",
"/plugin/local/team/plan.js",

View File

@ -1,38 +1,21 @@
var base = Volcanos("base", {help: "基础模块",
isNone: function(c) {return c === undefined || c === null},
isSpace: function(c) {return c == " " || c == "Enter"},
Ext: function(file) { return (file.split("/").pop().split(".").pop()||"txt").toLowerCase() },
Path: function() {var res = ""
for (var i = 0; i < arguments.length; i++) {
res += (arguments[i].indexOf("/") == 0 || res.endsWith("/")? "": "/") + arguments[i].trim()
}
return res
},
Volcanos("base", {help: "基础模块",
Int: function(value) {return parseInt(value)||0},
Obj: function(value, def) {
try {
return typeof value == "string" && value != ""? JSON.parse(value): value || def || {}
return (typeof value == "string" && value != ""? JSON.parse(value): value) || def || {}
} catch {
return [value]
}
},
parseSize: function(size) {
if (size.endsWith("TB") || size.endsWith("tb") || size.endsWith("T") || size.endsWith("t")) {
return parseInt(size) * 1024 * 1024 * 1024 * 1024
Ext: function(file) { return (file.split("/").pop().split(".").pop()||"txt").toLowerCase() },
Path: function() { var res = ""
for (var i = 0; i < arguments.length; i++) {
res += (arguments[i].indexOf("/") == 0 || res.endsWith("/")? "": "/") + arguments[i].trim()
}
if (size.endsWith("GB") || size.endsWith("gb") || size.endsWith("G") || size.endsWith("g")) {
return parseInt(size) * 1024 * 1024 * 1024
}
if (size.endsWith("MB") || size.endsWith("mb") || size.endsWith("M") || size.endsWith("m")) {
return parseInt(size) * 1024 * 1024
}
if (size.endsWith("KB") || size.endsWith("kb") || size.endsWith("K") || size.endsWith("k")) {
return parseInt(size) * 1024
}
return parseInt(size)
return res
},
Args: function(obj) {var res = [];
for (var k in obj) {
res.push(encodeURIComponent(k)+"="+encodeURIComponent(obj[k]))
@ -51,24 +34,6 @@ var base = Volcanos("base", {help: "基础模块",
}
return size + "B"
},
date: shy("时间格式化", function(t) {
var now = new Date()
if (t) { return now }
if (typeof t == "string") { var ls = t.split(" ")
var vs = ls[0].split("-")
now.setFullYear(parseInt(vs[0]))
now.setMonth(parseInt(vs[1]))
now.setDate(parseInt(vs[2]))
var vs = ls[1].split(":")
now.setHours(parseInt(vs[0]))
now.setMinutes(parseInt(vs[1]))
now.setSeconds(parseInt(vs[2]))
} else {
now = t
}
return now
}),
Time: shy("时间格式化", function(t, fmt) {
var now = new Date()
if (t && typeof t == "string") { var ls = t.split(" ")
@ -97,9 +62,6 @@ var base = Volcanos("base", {help: "基础模块",
fmt = fmt.replace("%S", this.Number(now.getSeconds(), 2))
return fmt
}),
TimeAdd: shy("时间格式化", function(t, d) {
return new Date(t - t%(24*3600*1000) - 8*3600*1000 + d*24*3600*1000)
}),
Duration: function(n) {var res = "", h = 0;
h = parseInt(n/3600000/24), h > 0 && (res += h+"d"), n = n % (3600000*24);
h = parseInt(n/3600000), h > 0 && (res += h+"h"), n = n % 3600000;
@ -115,8 +77,26 @@ var base = Volcanos("base", {help: "基础模块",
}),
Format: shy("数据格式化", function(obj) {return JSON.stringify(obj)}),
TimeAdd: shy("时间格式化", function(t, d) {
return new Date(t - t%(24*3600*1000) - 8*3600*1000 + d*24*3600*1000)
}),
isNight: function() { var now = new Date()
return now.getHours() < 7 || now.getHours() > 17
},
parseSize: function(size) {
if (size.endsWith("TB") || size.endsWith("tb") || size.endsWith("T") || size.endsWith("t")) {
return parseInt(size) * 1024 * 1024 * 1024 * 1024
}
if (size.endsWith("GB") || size.endsWith("gb") || size.endsWith("G") || size.endsWith("g")) {
return parseInt(size) * 1024 * 1024 * 1024
}
if (size.endsWith("MB") || size.endsWith("mb") || size.endsWith("M") || size.endsWith("m")) {
return parseInt(size) * 1024 * 1024
}
if (size.endsWith("KB") || size.endsWith("kb") || size.endsWith("K") || size.endsWith("k")) {
return parseInt(size) * 1024
}
return parseInt(size)
},
})

View File

@ -1,21 +1,4 @@
var core = Volcanos("core", {help: "核心模块",
Copy: function(to, from, fields) {
var list = []
for (var i = 2; i < arguments.length; i++) {
list.push(arguments[i])
}
for (var i = 0; i < list.length; i++) {
to[list[i]] = from[list[i]]
}
},
Item: shy("迭代器", function(obj, cb) {var list = [];
for (var k in obj) {
var res = typeof cb == "function"? cb(k, obj[k]): k
res && list.push(res)
}
return list
}),
Volcanos("core", {help: "核心模块",
Items: shy("迭代器", function(obj, cb) {var list = [];
for (var key in obj) {
list = list.concat(this.List(obj[key], function(value, index, array) {
@ -24,6 +7,13 @@ var core = Volcanos("core", {help: "核心模块",
}
return list
}),
Item: shy("迭代器", function(obj, cb) {var list = [];
for (var k in obj) {
var res = typeof cb == "function"? cb(k, obj[k]): k
res && list.push(res)
}
return list
}),
List: shy("迭代器", function(obj, cb, interval, cbs) {
if (typeof obj == "number") {
var begin = 0, end = obj, step = 1;
@ -128,6 +118,29 @@ var core = Volcanos("core", {help: "核心模块",
}
return res
}),
Timer: shy("定时器, value, [1,2,3,4], {value, length}", function(interval, cb, cbs) {
interval = typeof interval == "object"? interval || []: [interval]
var timer = {stop: false}; function loop(timer, i) {
if (timer.stop || i >= interval.length && interval.length >= 0) {
return typeof cbs == "function" && cbs(timer, interval)
}
return typeof cb == "function" && cb(timer, interval.value||interval[i], i, interval)?
typeof cbs == "function" && cbs(timer, interval): setTimeout(function() { loop(timer, i+1) }, interval.value||interval[i+1])
}
setTimeout(function() { loop(timer, 0) }, interval.value||interval[0])
return timer
}),
Copy: function(to, from, fields) {
var list = []
for (var i = 2; i < arguments.length; i++) {
list.push(arguments[i])
}
for (var i = 0; i < list.length; i++) {
to[list[i]] = from[list[i]]
}
},
Eq: function(obj, other) { var self = arguments.callee
// undefined null
// string number boolen
@ -151,18 +164,5 @@ var core = Volcanos("core", {help: "核心模块",
}
return obj === other
},
Timer: shy("定时器, value, [1,2,3,4], {value, length}", function(interval, cb, cbs) {
interval = typeof interval == "object"? interval || []: [interval]
var timer = {stop: false}; function loop(timer, i) {
if (timer.stop || i >= interval.length && interval.length >= 0) {
return typeof cbs == "function" && cbs(timer, interval)
}
return typeof cb == "function" && cb(timer, interval.value||interval[i], i, interval)?
typeof cbs == "function" && cbs(timer, interval): setTimeout(function() { loop(timer, i+1) }, interval.value||interval[i+1])
}
setTimeout(function() { loop(timer, 0) }, interval.value||interval[0])
return timer
}),
})

View File

@ -1,4 +1,84 @@
var misc = Volcanos("misc", {help: "工具模块",
Volcanos("misc", {help: "工具模块",
Message: function(event, can) { var msg = {}
msg.__proto__ = {_event: event, _can: can, _create_time: new Date(),
Option: function(key, val) {
if (key == undefined) { return msg && msg.option || [] }
if (typeof key == "object") { can.core.Item(key, msg.Option) }
if (val == undefined) { return msg && msg[key] && msg[key][0] || ""}
msg.option = msg.option || [], can.core.List(msg.option, function(k) { if (k == key) {return k} }).length > 0 || msg.option.push(key)
msg[key] = can.core.List(arguments).slice(1)
return val
},
Append: function(key, val) {
if (key == undefined) { return msg && msg.append || [] }
if (typeof key == "object") { can.core.Item(key, msg.Append) }
if (val == undefined) { return msg && msg[key] && msg[key][0] || ""}
msg.append = msg.append || [], can.core.List(msg.append, function(k) { if (k == key) {return k} }).length > 0 || msg.append.push(key)
msg[key] = can.core.List(arguments).slice(1)
return val
},
Result: function(cb) {
return msg.result && msg.result.join("") || ""
},
Table: function(cb) { if (!msg.append || !msg.append.length || !msg[msg.append[0]]) { return }
var max = "", len = 0; can.core.List(msg.append, function(key, index) {
if (msg[key] && msg[key].length > len) { max = key, len = msg[key].length }
})
return can.core.List(msg[max], function(value, index, array) { var one = {}, res
can.core.List(msg.append, function(key) { one[key] = (msg[key]&&msg[key][index]||"").trim() })
return typeof cb == "function" && (res = cb(one, index, array)) && res != undefined && res || one
})
},
Clear: function(key) {
switch (key) {
case "append":
case "option":
can.core.List(msg[key], function(item) {
delete(msg[item])
})
default:
msg[key] = []
}
},
Copy: function(res) { if (!res) { return msg }
res.result && (msg.result = (msg.result||[]).concat(res.result))
res.append && (msg.append = res.append) && res.append.forEach(function(item) {
res[item] && (msg[item] = (msg[item]||[]).concat(res[item]))
})
res.option && (msg.option = res.option) && res.option.forEach(function(item) {
res[item] && (msg[item] = res[item])
})
return msg
},
Push: function(key, value, detail) { msg.append = msg.append || []
if (typeof key == "object") {
value = value || can.core.Item(key)
can.core.List(value, function(item) {
detail? msg.Push("key", item).Push("value", key[item]||""):
msg.Push(item, key[item]||"")
})
return
}
for (var i = 0; i < msg.append.length; i++) {
if (msg.append[i] == key) {
break
}
}
if (i >= msg.append.length) {msg.append.push(key)}
msg[key] = msg[key] || []
msg[key].push(""+(typeof value == "object"? JSON.stringify(value): value)+"")
return msg
},
Echo: function(res) {msg.result = msg.result || []
msg._hand = true
for (var i = 0; i < arguments.length; i++) {msg.result.push(arguments[i])}
return msg
},
}
return msg
},
POST: shy("请求后端", {order: 0}, function(can, msg, url, form, cb) {
var xhr = new XMLHttpRequest()
xhr.open("POST", url), xhr.onreadystatechange = function() {
@ -99,14 +179,13 @@ var misc = Volcanos("misc", {help: "工具模块",
}
can._socket.onmessage = function(event) {var order = ++meta.order
try {
// 解析命令
var msg = JSON.parse(event.data)
try { // 解析命令
var data = JSON.parse(event.data)
} catch (e) {
var msg = {"result": [event.data]}
var data = {"result": [event.data]}
}
msg = (can.request||can.Event)(event, msg), msg.Reply = function() {
var msg = can.request(event); msg.Reply = function() {
// 回复命令
delete(msg._can)
delete(msg._event)
@ -114,16 +193,13 @@ var misc = Volcanos("misc", {help: "工具模块",
msg.Option("_target", msg.Option("_source"))
console.log(["wss", order, "result"].concat(msg.result).concat([msg]))
can._socket.send(JSON.stringify(msg))
}
}, msg.detail = data.detail, msg.Copy(data)
try {
// 执行命令
// c
try { // 执行命令
console.log(["wss", order].concat(msg.detail).concat([msg]))
typeof cb == "function" && cb(event, msg, msg.detail[0], msg.detail.slice(1))
} catch (e) {
// 执行失败
// con
} catch (e) { // 执行失败
console.log(e)
}
}

View File

@ -1,4 +1,4 @@
var page = Volcanos("page", {help: "网页模块",
Volcanos("page", {help: "网页模块",
ClassList: {
has: function(can, obj, key) {var list = obj.className? obj.className.split(" "): [];
for (var i = 2; i < arguments.length; i++) {
@ -185,13 +185,17 @@ var page = Volcanos("page", {help: "网页模块",
Remove: shy("删除节点", function(can, target) {
target && target.parentNode && target.parentNode.removeChild(target)
}),
Toggle: function(can, target, show, hide) {
var status = target.style.display == "none"
can.page.Modify(can, target, {style: {display: status? "": "none"}})
status? typeof show == "function" && show(): typeof hide == "function" && hide()
return status
},
AppendAction: shy("添加控件", function(can, action, list, cb) {
return can.page.Append(can, action, can.core.List(list, function(line) {
return ["br", "hr"].indexOf(line.type) > -1? line: {view: "item", list: [typeof line == "string"? {button: [line, cb]}: line.length > 0? {select: [line, cb]}:
line.input && typeof line.input != "string" ? {input: [line.input[0], function(event) {
typeof line.input[1] == "function" && line.input[1](event, can)
}, function(event) {
typeof line.input[2] == "function" && line.input[2](event, can)
}]}: line]}
}))
}),
AppendTable: shy("添加表格", function(can, msg, target, list, cb) {
if (!msg.append || msg.append.length == 0) {return}
@ -265,17 +269,6 @@ var page = Volcanos("page", {help: "网页模块",
})
},
AppendAction: shy("添加控件", function(can, action, list, cb) {
return can.page.Append(can, action, can.core.List(list, function(line) {
return ["br", "hr"].indexOf(line.type) > -1? line: {view: "item", list: [typeof line == "string"? {button: [line, cb]}: line.length > 0? {select: [line, cb]}:
line.input && typeof line.input != "string" ? {input: [line.input[0], function(event) {
typeof line.input[1] == "function" && line.input[1](event, can)
}, function(event) {
typeof line.input[2] == "function" && line.input[2](event, can)
}]}: line]}
}))
}),
Display: function(text) {
if (text.startsWith("http://") || text.startsWith("https://") || text.startsWith("ftp://")) {
var ls = text.split(" ")
@ -307,75 +300,39 @@ var page = Volcanos("page", {help: "网页模块",
target.value = target.value.substring(0, start)+target.value.substring(start+(count||target.value.length), target.value.length)
target.setSelectionRange(start, start)
},
oninput: function(event, can, local) {var target = event.target
if (event.ctrlKey) {
if (typeof local == "function" && local(event)) {
event.stopPropagation()
event.preventDefault()
return true
Cache: function(name, output, data) { var cache = output._cache || {}; output._cache = cache
if (data) { if (output.children.length == 0) { return }
// 写缓存
var temp = document.createDocumentFragment()
while (output.childNodes.length>0) {
var item = output.childNodes[0]
item.parentNode.removeChild(item)
temp.appendChild(item)
}
var his = target.History || []
var pos = target.Current || -1
switch (event.key) {
case "p":
pos = (pos-1+his.length+1) % (his.length+1)
target.value = pos < his.length? his[pos]: ""
target.Current = pos
break
case "n":
pos = (pos+1) % (his.length+1)
target.value = pos < his.length? his[pos]: ""
target.Current = pos
break
case "a":
case "e":
case "f":
case "b":
break
case "h":
can.page.DelText(target, target.selectionStart-1, target.selectionStart)
break
case "d":
can.page.DelText(target, 0, target.selectionStart)
break
case "k":
can.page.DelText(target, target.selectionStart)
break
case "u":
can.page.DelText(target, 0, target.selectionEnd)
break
case "w":
var start = target.selectionStart-2
var end = target.selectionEnd-1
for (var i = start; i >= 0; i--) {
if (target.value[end] == " " && target.value[i] != " ") {
break
}
if (target.value[end] != " " && target.value[i] == " ") {
break
}
}
can.page.DelText(target, i+1, end-i)
break
default:
return false
}
} else {
switch (event.key) {
case " ":
event.stopPropagation()
return true
default:
return false
}
cache[name] = {node: temp, data: data}
return name
}
event.stopPropagation()
event.preventDefault()
return true
output.innerHTML = ""
var list = cache[name]; if (!list) {return}
// 读缓存
while (list.node.childNodes.length>0) {
var item = list.node.childNodes[0]
item.parentNode.removeChild(item)
output.appendChild(item)
}
delete(cache[name])
return list.data
},
Toggle: function(can, target, show, hide) {
var status = target.style.display == "none"
can.page.Modify(can, target, {style: {display: status? "": "none"}})
status? typeof show == "function" && show(): typeof hide == "function" && hide()
return status
},
Anchor: function(event, target, pos, point) {
switch (pos) {
case 1:
@ -519,7 +476,6 @@ var page = Volcanos("page", {help: "网页模块",
break
}
},
EnableDrop: function(can, parent, search, target) {
return can.page.Modify(can, target, { draggable: true,
ondragstart: function(event) { var target = event.target; can.drop = function(event, tab) {

View File

@ -1,4 +1,4 @@
var user = Volcanos("user", {help: "用户模块", agent: {
Volcanos("user", {help: "用户模块", agent: {
getLocation: function(cb) {
typeof cb == "function" && cb({name: "some"})
},
@ -12,11 +12,21 @@ var user = Volcanos("user", {help: "用户模块", agent: {
typeof cb == "function" && cb([])
},
},
alert: function(text) {alert(JSON.stringify(text))},
confirm: function(text) {return confirm(JSON.stringify(text))},
prompt: function(text, cb, def, silent) {(text = silent? def: prompt(text, def||"")) != undefined && typeof cb == "function" && cb(text); return text},
reload: function(force) {(force || confirm("重新加载页面?")) && location.reload()},
title: function(text) {return text && (document.title = text), document.title},
isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1,
isMobile: navigator.userAgent.indexOf("Mobile") > -1,
isIPhone: navigator.userAgent.indexOf("iPhone") > -1,
isMacOSX: navigator.userAgent.indexOf("Mac OS X") > -1,
isWindows: navigator.userAgent.indexOf("Windows") > -1,
isLocalFile: location && location.protocol && location.protocol == "file:",
isExtension: location && location.protocol && location.protocol == "chrome-extension:",
alert: function(text) { alert(JSON.stringify(text)) },
confirm: function(text) { return confirm(JSON.stringify(text)) },
prompt: function(text, cb, def, silent) { (text = silent? def: prompt(text, def||"")) != undefined && typeof cb == "function" && cb(text); return text },
reload: function(force) { (force || confirm("重新加载页面?")) && location.reload() },
title: function(text) { return text && (document.title = text), document.title },
jumps: function(url) { location.href = url },
scan: function(str) {
try { var value = JSON.parse(str) } catch(e) { try {
var value = {"type": "url", "text": str}
@ -28,7 +38,6 @@ var user = Volcanos("user", {help: "用户模块", agent: {
} catch(e) { } }
return value
},
copy: function(can, text) {
var input = can.page.Append(can, document.body, [{type: "input", value: text}]).first
input.setSelectionRange(0,-1)
@ -37,24 +46,9 @@ var user = Volcanos("user", {help: "用户模块", agent: {
can.page.Remove(can, input)
can.user.toast(can, {text: text, title: "复制成功", width: 400})
},
login: function(can, cb) {
var ui = can.user.input({clientX: 200, clientY: 100}, can, [
{username: "username", name: "用户"},
{password: "password", name: "密码"},
{button: [["登录", function(event) {
can.user.Cookie(can, "sessid", "")
can.run({}, ["login", ui["用户"].value, ui["密码"].value], function(msg) {
if (can.user.Cookie(can, "sessid")||msg.Option("user.name")||msg.Result()) {
can.page.Remove(can, ui.first); return typeof cb == "function" && cb()
}
can.user.alert("用户或密码错误")
})
}], ["扫码", function(event) {
// TODO
}]]},
], function(event, button, data, list) {
// TODO
})
topic: function(can, name) {
can.page.Modify(can, document.body, {className: name})
},
toast: function(can, text, title, duration, progress) {
var meta = typeof text == "object"? text: {text: text, title: title||can._help, duration: duration, progress: progress}
@ -72,7 +66,7 @@ var user = Volcanos("user", {help: "用户模块", agent: {
]},
], ondblclick: function(event) { ui.Close() }}])
var timer = can.Timer({value: 100, length: (meta.duration||1000)/100}, function(event, interval, index) {
var timer = can.core.Timer({value: 100, length: (meta.duration||1000)/100}, function(event, interval, index) {
if (index > 20) { ui.duration.innerHTML = parseInt(index/10)+"."+(index%10)+"s..." }
}, function() { can.page.Remove(can, ui.first), timer.stop = true })
@ -111,12 +105,23 @@ var user = Volcanos("user", {help: "用户模块", agent: {
event.preventDefault()
return ui
},
select: function(event, can, type, fields, cb, cbs) {
var msg = can.request(event, {fields: fields||"pod,name,text"})
can.run(msg._event, ["search", "Search.onimport.select", type, "", ""], function(list) {
can.core.Next(list, cb, cbs||function() {
can.user.toast(can, "添加成功")
login: function(can, cb) {
var ui = can.user.input({clientX: 200, clientY: 100}, can, [
{username: "username", name: "用户"},
{password: "password", name: "密码"},
{button: [["登录", function(event) {
can.user.Cookie(can, "sessid", "")
can.run({}, ["login", ui["用户"].value, ui["密码"].value], function(msg) {
if (can.user.Cookie(can, "sessid")||msg.Option("user.name")||msg.Result()) {
can.page.Remove(can, ui.first); return typeof cb == "function" && cb()
}
can.user.alert("用户或密码错误")
})
}], ["扫码", function(event) {
// TODO
}]]},
], function(event, button, data, list) {
// TODO
})
},
input: function(event, can, form, cb) { // form [ string, {_input: }, array, object, button ]
@ -178,6 +183,14 @@ var user = Volcanos("user", {help: "用户模块", agent: {
})
return ui
},
select: function(event, can, type, fields, cb, cbs) {
var msg = can.request(event, {fields: fields||"pod,name,text"})
can.run(msg._event, ["search", "Search.onimport.select", type, "", ""], function(list) {
can.core.Next(list, cb, cbs||function() {
can.user.toast(can, "添加成功")
})
})
},
upload: function(event, can) { var begin = new Date()
var x = event.clientX, y = event.clientY; y += 10; if (x > 400) { x -= 200 }
var ui = can.page.Append(can, document.body, [{view: "upload", style: {left: x+"px", top: y+"px"}, list: [
@ -223,6 +236,12 @@ var user = Volcanos("user", {help: "用户模块", agent: {
a.click()
can.page.Remove(can, a)
},
logout: function(can) {
if (can.user.confirm("logout?")) {
can.user.Cookie(can, "sessid", "")
can.user.reload(true)
}
},
Share: shy("共享链接", function(can, objs, clear) {var obj = objs || {}; var path = location.pathname;
obj._path && (path = obj._path, delete(obj._path))
@ -246,7 +265,7 @@ var user = Volcanos("user", {help: "用户模块", agent: {
return args
} else if (value == undefined) {
// return args[key] || can.user.Cookie(can, key)
return args[key]||can.user.locals(can, key)
return args[key]
} else {
args[key] = value
args[key] == "" && delete(args[key])
@ -278,38 +297,5 @@ var user = Volcanos("user", {help: "用户模块", agent: {
var result = (new RegExp(key+"=([^;]*);?")).exec(document.cookie)
return result && result.length > 0? result[1]: ""
}),
locals: function(can, key, value) {
if (typeof key == "object") {
can.core.Item(key, function(key, value) {
localStorage.setItem(key, value)
})
return key
}
if (value != undefined) {
localStorage.setItem(key, value)
}
if (key != undefined) {
return localStorage.getItem(key)
}
},
topic: function(can, name) {
can.page.Modify(can, document.body, {className: name})
},
jumps: function(can, url) { location.href = url },
logout: function(can) {
if (can.user.confirm("logout?")) {
can.user.Cookie(can, "sessid", "")
can.user.reload(true)
}
},
isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1,
isMobile: navigator.userAgent.indexOf("Mobile") > -1,
isIPhone: navigator.userAgent.indexOf("iPhone") > -1,
isMacOSX: navigator.userAgent.indexOf("Mac OS X") > -1,
isWindows: navigator.userAgent.indexOf("Windows") > -1,
isLocalFile: location && location.protocol && location.protocol == "file:",
isExtension: location && location.protocol && location.protocol == "chrome-extension:",
})

View File

@ -23,3 +23,44 @@ fieldset.Action fieldset.plugin div.output {
margin:5px;
color:white;
}
body.white fieldset.Action {
background-color:#0dabda;
border-top:0;
}
body.white fieldset.Action fieldset.plugin {
color:black; background-color:white;
border:0; border-top:solid 2px #CCCCFF;
box-shadow: 4px 4px 10px 4px #626bd0;
margin:8px 8px;
}
body.white fieldset.Action fieldset.plugin:hover {
border-top:solid 2px #6666FF;
}
body.white fieldset.Action fieldset.plugin legend {
font-size:16px; font-family:monospace;
color:white; background-color:#339999;
padding:2px 20px; border:2px solid #99CCFF;
border-radius:10px 10px 10px 10px;
}
body.white fieldset.Action fieldset.plugin legend:hover {
background-color:#6ee4e4;
}
body.white fieldset.Action fieldset.plugin div.output{
color:black;
padding:10px;
}
body.white fieldset.Action fieldset.plugin div.item input[type=button] {
letter-spacing:4px;
}
body.white fieldset.Action fieldset.plugin div.item input {
box-shadow: 4px 4px 10px 1px #626bd0;
}
body.white fieldset.Action fieldset.plugin div.item input[name=cmd] {
width:160px;
}
body.white fieldset.Action fieldset.plugin div.item select {
box-shadow: 4px 4px 10px 1px #626bd0;
margin-top:-2px;
}

View File

@ -12,26 +12,27 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.onimport._plugin(can, target, river, storm, value), next()
}): (can.onimport._plugin(can, target, river, storm, value), next())
})
return typeof cb == "function" && cb(msg)
typeof cb == "function" && cb(msg)
},
_plugin: function(can, target, river, storm, value) { value.name = value.name.split(" ")[0]
value.action = value.id || value.index || value.key+"."+value.name
value.width = can._target.offsetWidth
value.type = "plugin"
// 添加插件
can.onappend._init(can, value, ["/plugin/state.js"], function(plugin) {
plugin.run = function(event, cmds, cb, silent) { var msg = plugin.request(event); cmds = cmds || []
return can.run(event, can.onengine[cmds[0]]? cmds: [river, storm, value.action].concat(cmds), function(msg) {
return typeof cb == "function" && cb(msg)
can.run(event, can.onengine[cmds[0]]? cmds: [river, storm, value.action].concat(cmds), function(msg) {
typeof cb == "function" && cb(msg)
}, silent)
}
}, target)
},
})
Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) {
can.Cache(can.Conf(RIVER)+"."+can.Conf(STORM), can._output, can._output.scrollTop+1)
can.page.Cache(can.Conf(RIVER)+"."+can.Conf(STORM), can._output, can._output.scrollTop+1)
var river = can.Conf(RIVER, msg.Option(RIVER)), storm = can.Conf(STORM, msg.Option(STORM))
var position = can.Conf(ACTION, msg.Option(ACTION, can.Cache(river+"."+storm, can._output)||""))
var position = can.Conf(ACTION, msg.Option(ACTION, can.page.Cache(river+"."+storm, can._output)||""))
if (position) { can._output.scrollTo(0, position-1); return }
can.run({}, [river, storm], function(msg) {

View File

@ -13,3 +13,9 @@ fieldset.Footer>div.output div.state {
margin-right:5px;
float:right;
}
body.white fieldset.Footer {
border:solid 2px #1f2224;
background-color:#1f2224;
color:white;
}

View File

@ -21,6 +21,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.page.Select(can, target, "span.ncmd", function(item) {
item.innerHTML = can.Conf("ncmd", parseInt(can.Conf("ncmd")||"0")+1+"")+""
})
typeof cb == "function" && cb(msg)
},
})
Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) {

View File

@ -29,8 +29,6 @@ fieldset.Header>div.output>div.item {
cursor:pointer;
float:left;
}
fieldset.Header>div.output>div.state {
cursor:pointer;
margin-right:5px;
@ -40,3 +38,14 @@ fieldset.Header>div.output>div.state:hover {
background-color:red;
}
body.white fieldset.Header {
border:solid 2px #1f2224;
background-color:#2f3638;
color:white;
}
body.white fieldset.Header input[type=text] {
border:2px solid #c4c7ce;
border-radius:10px 10px 10px 10px;
background-color:white;
color:white;
}

View File

@ -85,6 +85,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg, list, cb, target) {
function init() { can.run({}, [], function(msg) { can.Conf(USERNAME, msg.Option("user.nick")||msg.Option("user.name"))
can.onimport._init(can, msg, list, function(msg) {
typeof cb == "function" && cb(msg)
can.run({}, ["search", "River.onaction._init"])
can.run({}, ["search", "Footer.onaction._init"])
}, can._output)
@ -97,7 +98,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg,
var args = {}; can.core.List([POD, TOPIC, TITLE], function(key) {
var value = can.user.Search(can, key); value && (args[key] = value)
})
can.user.jumps(can, can.user.Share(can, args, true))
can.user.jumps(can.user.Share(can, args, true))
},
username: function(event, can) { can.user.logout(can) },

View File

@ -20,17 +20,28 @@ fieldset.River>div.output div.item.select {
background-color:red;
border:ridge 2px yellow;
}
fieldset.River>div.output div.sublist {
fieldset.River>div.output div.list {
margin-left:20px;
}
fieldset.River>div.output div.subitem {
body.white fieldset.River {
border:solid 2px #1f2224;
background-color:#1f2224;
color:white;
}
fieldset.River>div.output div.subitem:hover {
cursor:pointer;
background-color:red;
border:ridge 2px yellow;
body.white fieldset.River>div.output div.item:hover {
background-color:black;
border:solid 2px black;
}
fieldset.River>div.output div.subitem.select {
background-color:red;
border:ridge 2px yellow;
body.white fieldset.River>div.output div.item.select {
background-color:black;
border:solid 2px black;
}
body.white fieldset.River>div.output div.subitem:hover {
background-color:black;
border:solid 2px black;
}
body.white fieldset.River>div.output div.subitem.select {
background-color:black;
border:solid 2px black;
}

View File

@ -30,10 +30,10 @@ Volcanos("onaction", {help: "控件交互", list: ["创建", "刷新"], _init: f
var list = can.sublist[river]; if (list) { return can.page.Toggle(can, list) }
can.run({}, [river, "tool"], function(msg) {
var select = 0; list = can.page.Append(can, can._output, [{view: "sublist", list: msg.Table(function(storm, index) {
var select = 0; list = can.page.Append(can, can._output, [{view: "list", list: msg.Table(function(storm, index) {
river == can._main_river && storm.hash == can._main_storm && (select = index)
return {text: [storm.name, "div", "subitem"], onclick: function(event) {
return {text: [storm.name, "div", "item"], onclick: function(event) {
// 左键点击
can.onaction.action(event, can, river, storm.hash)
can.user.title(can.user.Search(can, POD) || storm.name)
@ -43,7 +43,7 @@ Volcanos("onaction", {help: "控件交互", list: ["创建", "刷新"], _init: f
can.ondetail[item](event, can, item, storm.hash, river)
})
}}
}) }]).sublist, list.children.length > 0 && list.children[select].click()
}) }]).first, list.children.length > 0 && list.children[select].click()
event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling)
can.sublist[river] = list
@ -53,7 +53,7 @@ Volcanos("onaction", {help: "控件交互", list: ["创建", "刷新"], _init: f
var msg = can.request(event, {river: can.Conf(RIVER, river), storm: can.Conf(STORM, storm)})
can.run(event, ["search", "Action.onaction._init"])
can.page.Select(can, can._output, "div.subitem.select", function(item) {
can.page.Select(can, can._output, "div.item.select", function(item) {
can.page.ClassList.del(can, item, "select")
}), can.page.ClassList.add(can, event.target, "select")
},

View File

@ -1,4 +1,4 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, list, cb, target) {
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) {
},
})
Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, list, cb, target) {
@ -38,7 +38,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta,
"查看": function(event, can) { can.run(event) },
"返回": function(event, can) {
can.sup._history.pop(); var his = can.sup._history.pop(); if (his) {
can.page.Select(can, can._option, "input.args,select.args", function(item, index) {
can.page.Select(can, can._option, "textarea.args,input.args,select.args", function(item, index) {
item.value = his[index] || ""
})
}
@ -46,7 +46,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta,
},
onchange: function(event, can) {
if (event.target.tagName == "SELECT") { can.run(event) }
if (can.Conf("type") == "select") { can.run(event) }
},
ondblclick: function(event, can) {
if (can.Conf("type") == "text") { event.target.setSelectionRange(0, -1) }
@ -71,31 +71,32 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta,
var cb = can.onaction[action] || can.onaction[name]
if (typeof cb == "function") { return cb(event, can, name) }
// 组件回调
var cb = can.sup.onaction[action] || can.sup.onaction[name]
if (typeof cb == "function") { return cb(event, can, name) }
// 通用回调
if (can.Conf("type") == "button") { can.run(event, [name].concat(can.sup.Pack())) }
},
onkeydown: function(event, can) {
can.onkeypop.show(event, can)
switch (event.key) {
case "Enter":
if (event.target.tagName == "INPUT") { event.target.setSelectionRange(0, -1), can.run(event) }
if (event.target.tagName == "TEXTAREA") { break }
if (can.Conf("type") == "text") { event.target.setSelectionRange(0, -1), can.run(event) }
if (can.Conf("type") == "textarea") { break }
event.stopPropagation()
event.preventDefault()
break
case "b": if (!event.ctrlKey) { return }; can.CloneInput(); break
case "m": if (!event.ctrlKey) { return }; can.CloneField(); break
default: return
case "b": if (!event.ctrlKey) { break }; can.CloneInput(); break
case "m": if (!event.ctrlKey) { break }; can.CloneField(); break
}
},
onkeyup: function(event, can) {
switch (event.key) {
case "Enter":
if (event.target.tagName == "TEXTAREA") { break }
if (can.Conf("type") == "textarea") { break }
event.stopPropagation()
event.preventDefault()
break
default: return
}
},
})

View File

@ -62,7 +62,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb,
project: function(can, path, cb) { can.Option({path: path})
var msg = can.request({}); msg.Option("dir_root", path), msg.Option("dir_deep", "true")
can.run(msg._event, ["action", "dir", "./"], function(msg) { can.ui.project.innerHTML = ""
can.Status("文件数", msg.path.length)
msg.path && can.Status("文件数", msg.path.length)
can.onappend.tree(can, msg, "path", "/", can.ui.project, function(event, value) {
can.onimport.tabview(can, can.Option("path"), value.path)
}), typeof cb == "function" && cb()
@ -75,7 +75,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
})
// caches save
can.core.List(["content"], function(item) { can.Cache(can.file+item, can.ui[item], {
can.core.List(["content"], function(item) { can.page.Cache(can.file+item, can.ui[item], {
scrollTop: can.ui.profile.parentNode.scrollTop,
current: can.current,
max: can.max,
@ -87,7 +87,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
// caches load
var cache = false; can.core.List(["content"], function(item) {
var p = can.Cache(can.file+item, can.ui[item]); if (p != undefined) { cache = true
var p = can.page.Cache(can.file+item, can.ui[item]); if (p != undefined) { cache = true
can.ui.profile.parentNode.scrollTo(0, p.scrollTop)
can.onaction.selectLine(can, p.current.line)
can.max = p.max

View File

@ -6,7 +6,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _merge: function(can, sub)
var ui = can.page.Append(can, can.ui.profile, [
{view: ["editor", "input"], onkeydown: function(event) {
can.onkeymap.parse(event, can, "insert")
can.Timer(1, function() {
can.core.Timer(1, function() {
can.current.text(can.ui.editor.value)
})
}, onfocus: function(event) {

View File

@ -73,8 +73,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
_profile: function(can, msg, task) {
task.extra && can.core.Item(can.base.Obj(task.extra), function(key, value) { task["extra."+key] = value }), delete(task.extra)
can.task && can.Cache(can.task.id, can.ui.display, can.task.id)
can.Status(can.task = task); can.Cache(task.id, can.ui.display) || task["extra.cmd"] && can.onappend.plugin(can, {
can.task && can.page.Cache(can.task.id, can.ui.display, can.task.id)
can.Status(can.task = task); can.page.Cache(task.id, can.ui.display) || task["extra.cmd"] && can.onappend.plugin(can, {
height: can.Conf("height"), width: can.Conf("width"), index: task["extra.ctx"]+"."+task["extra.cmd"], args: task["extra.arg"],
}, function(sub) {
sub.run = function(event, cmds, cb, silent) {

View File

@ -32,7 +32,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
}
})
can.Timer(10, function() {
can.core.Timer(10, function() {
// 默认参数
can.core.Item({
"font-size": "24",

View File

@ -1,13 +1,8 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, list, cb, target) {
},
})
Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) {
// can.onaction._process(can, sub, value, msg, cmds, cb, silent)
},
_process: function(can, sub, conf, msg, cmds, cb, silent) {
var p = can.onaction[msg.Option("_process")]
typeof p == "function"? p(can, sub, conf, msg, cmds, cb, silent): typeof cb == "function" && cb(msg)
can.run(msg._event, ["search", "Footer.onaction.ncmd"])
_process: function(can, msg) {
var cb = can.onimport[msg.Option("_process") || can.Conf("feature._process")]
return typeof cb == "function" && cb(can, msg)
},
_progress: function(can, sub, conf, msg, cmds, cb, silent) {
var size = msg.Append("size") || msg.Append("count")
@ -25,11 +20,36 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg,
can.page.ClassList.add(can, td, "done")
}
})
can.Timer(1000, function() {
can.core.Timer(1000, function() {
var res = sub.request({})
res.Option("_progress", msg.Option("_progress"))
sub.run(res._event, cmds, cb, silent)
})
return true
},
_refresh: function(can, msg) {
can.core.Timer(500, function(timer) {
var sub = can.request({}, {_count: parseInt(msg.Option("_count"))-1})
can.run(sub._event)
})
},
_field: function(can, msg) {
msg.Table(function(value) {
value.feature = can.base.Obj(msg.meta&&msg.meta[0]||"{}", {})
value.inputs = can.base.Obj(msg.list&&msg.list[0]||"[]", [])
value.width = can._target.offsetWidth
value.type = "story"
can.onappend._init(can, value, ["/plugin/state.js"], function(sub) {
sub.run = function(event, cmds, cb, silent) {
can.run(event, (msg["_prefix"]||[]).concat(cmds), cb, true)
}
}, can._output)
})
return true
},
})
Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) {
},
input: function(event, can, name, cb) { var feature = can.Conf("feature")
feature[name]? can.user.input(event, can, feature[name], function(ev, button, data, list) {
@ -50,5 +70,29 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg,
}
} })
},
getLocation: function(event, can, cmd) { var msg = can.request(can)
can.user.agent.getLocation(function(res) {
var arg = []; can.core.Item(res, function(key, value) { arg.push(key, value) })
can.run(event, ["action", cmd].concat(arg))
})
},
openLocation: function(event, can) { var msg = can.request(can)
can.user.agent.openLocation(msg)
},
scanQRCode0: function(event, can) { var msg = can.request(can)
can.user.agent.scanQRCode()
},
scanQRCode: function(event, can, cmd) { var msg = can.request(can)
can.user.agent.scanQRCode(function(res) {
var arg = []; can.core.Item(res, function(key, value) { arg.push(key, value) })
can.run(event, ["action", cmd].concat(arg))
})
},
"清空": function(event, can, name) { can._output.innerHTML = "" },
"结束": function(event, can, name) { can.user.confirm("确定结束?") && can.run(event, ["action", name], function(msg) {
can.run({})
}, true) },
})
Volcanos("onexport", {help: "导出数据", list: []})

View File

@ -24,7 +24,7 @@ Volcanos("onimport", {help: "导入数据", list: [],
can.page.Modify(can, sub._status, {style: {display: "none"}})
sub.run = function(event, cmds, cb, silent) {
typeof cb == "function" && cb(can.request(event))
can.Timer(1000, function() {
can.core.Timer(1000, function() {
can.sub = sub._outputs[0]
can.msg = msg, can.data = msg.Table()
can.Action("height", "400")
@ -228,7 +228,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "横向",
break
default:
can.run(event, ["inner"].concat(cmds), function(msg) {
cb(msg), can.Timer(10, function() {
cb(msg), can.core.Timer(10, function() {
// can.onaction._resize(sub, layout)
})
}, true)

View File

@ -23,7 +23,7 @@ Volcanos("onimport", {help: "导入数据", list: [],
can.page.Modify(can, sub._status, {style: {display: "none"}})
sub.run = function(event, cmds, cb, silent) {
typeof cb == "function" && cb(can.request(event))
can.Timer(100, function() {
can.core.Timer(100, function() {
can.sub = sub._outputs[0]
can.msg = msg, can.data = msg.Table()
var action = can.Conf("action")
@ -128,7 +128,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", ["view",
one.onmouseover = function(event) { can.Status(line) }
can.Timer(parseInt(can.Action("speed")), next)
can.core.Timer(parseInt(can.Action("speed")), next)
})()
})
},

View File

@ -1,40 +1,22 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
if (can.onimport._process(can, msg)) {
return typeof cb == "function" && cb(msg)
}
if (can.onimport._process(can, msg)) { return typeof cb == "function" && cb(can, msg) }
can.ui = can.page.Appends(can, target, [can.onimport._control(can, msg)].concat([
{view: ["content", "div"]},
{view: ["display", "pre"]},
{view: ["content", "div"]}, {view: ["display", "pre"]},
]))
var cmd = "", arg = ""
can.onappend.table(can, msg, can.ui.content, "table", function(value, key, index, line, array) {
if (key == "key") {
switch (value) {
case "extra.cmd": cmd += line.value; break
case "extra.ctx": cmd = line.value + "." + cmd; break
case "extra.arg": arg = line.value; break
}
}
return can.onimport._table(can, value, key, index, line, array)
})
cmd && can.onappend.plugin(can, {
height: can.Conf("height"), width: can.Conf("width"), index: cmd, args: arg,
}, function(sub) {
sub.run = function(event, cmds, cb, silent) {
var msg = can.request(event); can.core.List(msg["key"], function(key, index) {
msg.Option("list."+key, msg["value"][index])
})
can.run(event, ["action", "command", "run", cmd].concat(cmds), function(msg) {
typeof cb == "function" && cb(msg)
}, true)
}
}, can.ui.display)
can.onappend.board(can, msg, can.ui.display, "board")
can.onimport._board(can, msg)
return typeof cb == "function" && cb(msg)
typeof cb == "function" && cb(msg)
},
_control: function(can, msg) {
var cb = can.onimport[msg.Option("_control")]
return typeof cb == "function" && cb(can, msg)
},
_page: function(can, msg) {
return {view: ["control", "div"], list: [
@ -87,10 +69,6 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
}, data: {"className": "args"}},
]}
},
_control: function(can, msg) {
var cb = can.onimport[msg.Option("_control")]
return typeof cb == "function" && cb(can, msg)
},
_table: function(can, value, key, index, line, array) {
return {type: "td", inner: value, click: function(event) { var target = event.target
if (target.tagName == "INPUT" && target.type == "button") { var msg = can.sup.request(event); msg.Option(can.Option())
@ -139,9 +117,10 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.page.Modify(can, item, {style: can.base.Obj(data.style)})
})
},
_process: function(can, msg) {
var process = msg.Option("_process") || can.Conf("feature")["_process"]
var cb = can.onimport[process]; return typeof cb == "function" && cb(can, msg)
var cb = can.onimport[msg.Option("_process") || can.Conf("feature._process")]
return typeof cb == "function" && cb(can, msg)
},
_follow: function(can, msg) {
if (msg.Option("cache.status") == "stop") { return can.user.toast(can, msg.Option("cache.action")+" done!")}
@ -151,7 +130,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.page.Append(can, can.ui.content, [{text: msg.Result()}])
can.ui.content.scrollBy(0, 1000)
can.Timer(100, function() {
can.core.Timer(100, function() {
var sub = can.request({})
sub.Option("cache.hash", msg.Option("cache.hash"))
sub.Option("cache.begin", msg.Option("cache.begin"))
@ -170,26 +149,6 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.onappend.board(can, msg, can._output, "board")
// can.onimport._board(can, msg)
return true
},
_field: function(can, msg) {
msg.Table(function(value) {
value.inputs = can.base.Obj(msg.list&&msg.list[0]||"[]", [])
value.feature = can.base.Obj(msg.meta&&msg.meta[0]||"{}", {})
value.name && can.onappend._init(can, value, Volcanos.meta.libs.concat(["/plugin/state.js"]), function(sub) {
sub.run = function(event, cmds, cb, silent) {
can.run(event, (msg["_prefix"]||[]).concat(cmds), cb, true)
}
}, can._output)
})
return true
},
_refresh: function(can, msg) {
can.Timer(500, function(timer) {
var sub = can.request({})
sub.Option("_count", parseInt(msg.Option("_count"))-1)
can.run(sub._event)
})
},
spark: function(can, list, target) {
@ -206,29 +165,5 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
})
},
})
Volcanos("onaction", {help: "控件交互", list: [],
getLocation: function(event, can, cmd) { var msg = can.request(can)
can.user.agent.getLocation(function(res) {
var arg = []; can.core.Item(res, function(key, value) { arg.push(key, value) })
can.run(event, ["action", cmd].concat(arg))
})
},
openLocation: function(event, can) { var msg = can.request(can)
can.user.agent.openLocation(msg)
},
scanQRCode0: function(event, can) { var msg = can.request(can)
can.user.agent.scanQRCode()
},
scanQRCode: function(event, can, cmd) { var msg = can.request(can)
can.user.agent.scanQRCode(function(res) {
var arg = []; can.core.Item(res, function(key, value) { arg.push(key, value) })
can.run(event, ["action", cmd].concat(arg))
})
},
"清空": function(event, can, name) { can._output.innerHTML = "" },
"结束": function(event, can, name) { can.user.confirm("确定结束?") && can.run(event, ["action", name], function(msg) {
can.run({})
}, true) },
})
Volcanos("onaction", {help: "控件交互", list: []})
Volcanos("onexport", {help: "导出数据", list: []})

136
proto.js
View File

@ -11,14 +11,12 @@ function shy(help, meta, list, cb) {
cb.list = next("object") || []
return cb
}; var _can_name = ""
var Volcanos = shy("火山架", {libs: [], pack: {}, order: 1, cache: {}, index: 1}, [], function(name, can, libs, cb) {
var Volcanos = shy("火山架", {libs: [], cache: {}, index: 1}, [], function(name, can, libs, cb) {
var meta = arguments.callee.meta, list = arguments.callee.list
if (typeof name == "object") { var Config = name
meta.volcano = Config.volcano, meta.libs = Config.libs
var Preload = Config.libs; Config.panes.forEach(function(pane) {
pane.type= "pane"
pane.list = pane.list || ["/pane/"+pane.name+".css", "/pane/"+pane.name+".js"]
Preload = Preload.concat(pane.list)
Preload = Preload.concat(pane.list = pane.list || ["/pane/"+pane.name+".css", "/pane/"+pane.name+".js"])
}); Preload = Preload.concat(Config.plugin)
name = Config.name, can = { _follow: Config.name,
@ -26,11 +24,12 @@ var Volcanos = shy("火山架", {libs: [], pack: {}, order: 1, cache: {}, index:
_target: document.body, _head: document.head, _body: document.body,
}, libs = Preload.concat(Config.volcano), cb = function(can) {
can.onengine._init(can, can.Conf(Config), [], function(msg) {
console.log(can)
}, can._target)
}
}
var conf = {}, conf_cb = {}, cache = {}
var conf = {}, conf_cb = {}
can = can || {}, list.push(can) && (can.__proto__ = {__proto__: Volcanos.meta, _name: name, _create_time: new Date(), _load: function(name, cb) {
for (var cache = meta.cache[name] || []; meta.index < list.length; meta.index++) {
if (name == "/plugin/input/date.css" && cache.length > 0) { continue }
@ -91,97 +90,16 @@ var Volcanos = shy("火山架", {libs: [], pack: {}, order: 1, cache: {}, index:
},
request: function(event, option) { event = event || {}
if (event._msg) {
can.core.Item(option, function(key, value) {
event._msg.Option(key, value)
})
can.core.Item(option, event._msg.Option)
return event._msg
}
var ls = (can._name||can._help).split("/")
event._pane = ls[ls.length-1]
var msg = {}; event._msg = msg, msg._event = event, msg._can = can
msg.__proto__ = { _name: meta.order++, _create_time: new Date(),
Option: function(key, val) {
if (key == undefined) { return msg && msg.option || [] }
if (typeof key == "object") { can.core.Item(key, msg.Option) }
if (val == undefined) { return msg && msg[key] && msg[key][0] || ""}
msg.option = msg.option || [], can.core.List(msg.option, function(k) { if (k == key) {return k} }).length > 0 || msg.option.push(key)
msg[key] = can.core.List(arguments).slice(1)
return val
},
Append: function(key, val) {
if (key == undefined) { return msg && msg.append || [] }
if (typeof key == "object") { can.core.Item(key, msg.Append) }
if (val == undefined) { return msg && msg[key] && msg[key][0] || ""}
msg.append = msg.append || [], can.core.List(msg.append, function(k) { if (k == key) {return k} }).length > 0 || msg.append.push(key)
msg[key] = can.core.List(arguments).slice(1)
return val
},
Result: function(cb) {
return msg.result && msg.result.join("") || ""
},
Table: function(cb) { if (!msg.append || !msg.append.length || !msg[msg.append[0]]) { return }
var max = "", len = 0; can.core.List(msg.append, function(key, index) {
if (msg[key] && msg[key].length > len) { max = key, len = msg[key].length }
})
return can.core.List(msg[max], function(value, index, array) { var one = {}, res
can.core.List(msg.append, function(key) { one[key] = (msg[key]&&msg[key][index]||"").trim() })
return typeof cb == "function" && (res = cb(one, index, array)) && res != undefined && res || one
})
},
Clear: function(key) {
switch (key) {
case "append":
case "option":
can.core.List(msg[key], function(item) {
delete(msg[item])
})
default:
msg[key] = []
}
},
Copy: function(res) { if (!res) { return msg }
res.result && (msg.result = (msg.result||[]).concat(res.result))
res.append && (msg.append = res.append) && res.append.forEach(function(item) {
res[item] && (msg[item] = (msg[item]||[]).concat(res[item]))
})
res.option && (msg.option = res.option) && res.option.forEach(function(item) {
res[item] && (msg[item] = res[item])
})
return msg
},
Push: function(key, value, detail) { msg.append = msg.append || []
if (typeof key == "object") {
value = value || can.core.Item(key)
can.core.List(value, function(item) {
detail? msg.Push("key", item).Push("value", key[item]||""):
msg.Push(item, key[item]||"")
})
return
}
for (var i = 0; i < msg.append.length; i++) {
if (msg.append[i] == key) {
break
}
}
if (i >= msg.append.length) {msg.append.push(key)}
msg[key] = msg[key] || []
msg[key].push(""+(typeof value == "object"? JSON.stringify(value): value)+"")
return msg
},
Echo: function(res) {msg.result = msg.result || []
msg._hand = true
for (var i = 0; i < arguments.length; i++) {msg.result.push(arguments[i])}
return msg
},
}
can.core.Item(option, function(key, value) {
msg.Option(key, value)
})
return msg
var msg = can.misc.Message(event, can)
can.core.Item(option, msg.Option)
return event._msg = msg
},
Conf: function(key, value, cb) {
@ -200,44 +118,6 @@ var Volcanos = shy("火山架", {libs: [], pack: {}, order: 1, cache: {}, index:
}
return conf[key] || ""
},
Cache: function(name, output, data) {
if (data) { if (output.children.length == 0) { return }
// 写缓存
var temp = document.createDocumentFragment()
while (output.childNodes.length>0) {
var item = output.childNodes[0]
item.parentNode.removeChild(item)
temp.appendChild(item)
}
cache[name] = {node: temp, data: data}
return name
}
output.innerHTML = ""
var list = cache[name]; if (!list) {return}
// 读缓存
while (list.node.childNodes.length>0) {
var item = list.node.childNodes[0]
item.parentNode.removeChild(item)
output.appendChild(item)
}
delete(cache[name])
return list.data
},
Timer: shy("定时器, value, [1,2,3,4], {value, length}", function(interval, cb, cbs) {
interval = typeof interval == "object"? interval || []: [interval]
var timer = {stop: false}; function loop(timer, i) {
if (timer.stop || i >= interval.length && interval.length >= 0) {
return typeof cbs == "function" && cbs(timer, interval)
}
return typeof cb == "function" && cb(timer, interval.value||interval[i], i, interval)?
typeof cbs == "function" && cbs(timer, interval): setTimeout(function() { loop(timer, i+1) }, interval.value||interval[i+1])
}
setTimeout(function() { loop(timer, 0) }, interval.value||interval[0])
return timer
}),
})
if (_can_name) {

View File

@ -233,7 +233,7 @@ var can = Volcanos("chat", {
})
for (var i = args.length-1; i >= 0; i--) {if (args[i] == "") {args = args.slice(0, i)} else {break}}
show && plugin.Timer(1000, function() {show && plugin.user.toast(can.base.Format(args||["running..."]), meta.name, -1)});
show && can.core.Timer(1000, function() {show && plugin.user.toast(can.base.Format(args||["running..."]), meta.name, -1)});
run(event, args, function(msg) {if (silent) {return typeof cb == "function" && cb(msg)}
plugin.msg = msg, plugin.Show(feature.display || "table", msg, cb)
show = false, plugin.user.toast();

View File

@ -21,8 +21,8 @@ Volcanos("onimport", {help: "导入数据", list: [],
},
storm: function(event, can, value, cmd, field) {if (value == "update") {return}
// 保存界面
can.Cache(can.Conf("river")+"."+can.Conf("storm"), can.output, "some");
if (can.Cache(can.Conf("river", can.Conf("temp_river"))+"."+can.Conf("storm", value), can.output)) {
can.page.Cache(can.Conf("river")+"."+can.Conf("storm"), can.output, "some");
if (can.page.Cache(can.Conf("river", can.Conf("temp_river"))+"."+can.Conf("storm", value), can.output)) {
// 恢复界面
return
}

View File

@ -12,7 +12,7 @@ Volcanos("onimport", {help: "导入数据", list: [],
return {text: meta[item]||"", className: item, click: function(event) {can.Export(event, meta[item], item)}};
})}])
can.timer = can.Timer({interval: 1000, length: -1}, function(event) {
can.timer = can.core.Timer({interval: 1000, length: -1}, function(event) {
can.onimport.time(event, can, can.base.Time().split(" ")[1], "time")
})
})

View File

@ -27,7 +27,7 @@ Volcanos("onimport", {help: "导入数据", list: [],
if (text.duration == -1) {return {toast: toast}}
var begin = can.base.Time().split(" ")[1]
timer = can.Timer({value: 1000, length: text.duration > 0? text.duration/1000: text.duration}, function(t, i) {
timer = can.core.Timer({value: 1000, length: text.duration > 0? text.duration/1000: text.duration}, function(t, i) {
if (i < 10) {return}
if (i > 10000) {return true}
toast.tick.innerHTML = can.base.Duration(i*t) + " after " + begin

View File

@ -882,7 +882,7 @@ Volcanos("ondetail", {help: "组件详情", list: ["标签", "编辑", "复制",
}
var list = ["red", "green", "yellow", "blue"]
target._timer = can.Timer({value: 500, length: -1}, function() {
target._timer = can.core.Timer({value: 500, length: -1}, function() {
target.Value("fill", list[parseInt(Math.random()*list.length%list.length)])
})
},
@ -893,7 +893,7 @@ Volcanos("ondetail", {help: "组件详情", list: ["标签", "编辑", "复制",
return
}
target._timer = can.Timer({value: 500, length: -1}, function(event) {
target._timer = can.core.Timer({value: 500, length: -1}, function(event) {
can.onaction._run({type: "click", target: target}, can, target)
})
},