1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-29 02:09:23 +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.table(can, msg, can.ui.content, "table")
can.onappend.board(can, msg,can.ui.display, "board") can.onappend.board(can, msg,can.ui.display, "board")
var refresh = msg.Option("_refresh") || can.Conf("feature")["_refresh"] var refresh = msg.Option("_refresh") || can.Conf("feature")["_refresh"]
refresh && can.Timer(refresh, function() { refresh && can.core.Timer(refresh, function() {
can.run({}) can.run({})
}) })
return typeof cb == "function" && cb(msg) 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) { 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) { 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 || [] 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 (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() }, can[item.name] = pane, next()
}, target) }, target)
}, function() { }, function() {
can.onlayout._init(can, meta, list, function() {}, target) can.onlayout._init(can, meta, list, function() {
can.onkeypop._init(can) can.onkeypop._init(can)
}, target)
can.onengine._daemon(can, can.user.title()) can.require(meta.main.list, function(can) {
can.require(Volcanos.meta.webpack? []: meta.main.list, function(can) {
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||[], function(msg) { pane.onengine._daemon(pane, pane.user.title())
return typeof cb == "function" && cb(msg) pane.onaction._init(pane, msg, [], function(msg) {
typeof cb == "function" && cb(msg)
}, pane._target) }, pane._target)
}) })
}) })
}, },
_daemon: function(can, name) { return _daemon: function(can, name) {
can.misc.WSS(can, "", {type: "chrome", name: name}, function(event, msg) { 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("")) } if (msg.Option("_handle")) { return can.user.toast(can, msg.result.join("")) }
can.user.toast(can, msg.detail.join(" ")) can.user.toast(can, msg.detail.join(" "))
switch (msg.detail[0]) { switch (cmd) {
case "pwd": case "pwd":
msg.Echo("hello world") msg.Echo("hello world")
break break
@ -47,49 +49,30 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta,
}, },
remote: function(event, can, msg, pane, cmds, cb) { remote: function(event, can, msg, pane, cmds, cb) {
if (can.onengine.engine(event, can, msg, pane, cmds, cb)) { return } if (can.onengine.engine(event, can, msg, pane, cmds, cb)) { return }
can.misc.Run(event, can, {names: pane._name}, cmds, cb)
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)
}
pane.run(event, ["search", "Footer.onimport.ncmd"]) 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) { switch (pane._name) {
case "River": case "River":
cmds.length == 0 && can.core.Item(can.onengine.river, function(key, value) { cmds.length == 0 && can.core.Item(can.onengine.river, function(key, value) {
msg.Push("hash", key), msg.Push("name", value.name) msg.Push("hash", key), msg.Push("name", value.name)
}) }); if (cmds.length != 1 && cmds[1] != "tool") { return false }
if (cmds.length != 1 && cmds[1] != "tool") { break }
case "Storm": var river = can.onengine.river[cmds[0]]; if (!river) { return false }
var river = can.onengine.river[cmds[0]]; if (!river) { break }
can.core.Item(river.storm, function(key, value) { can.core.Item(river.storm, function(key, value) {
msg.Push("hash", key), msg.Push("name", value.name) msg.Push("hash", key), msg.Push("name", value.name)
}) }), typeof cb == "function" && cb(msg)
typeof cb == "function" && cb(msg)
return true 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) { can.core.List(storm.action, function(value) {
msg.Push("name", value.name||"") msg.Push("name", value.name||"")
msg.Push("help", value.help||"") 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("feature", JSON.stringify(value.feature||{}))
msg.Push("index", value.index||"") msg.Push("index", value.index||"")
msg.Push("args", value.args||"[]") msg.Push("args", value.args||"[]")
}) }), typeof cb == "function" && cb(msg)
typeof cb == "function" && cb(msg)
return true
} }
return true
} }
return false 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) { 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 field = field || can.onappend.field(can, target, meta.type, meta).first
var legend = can.page.Select(can, field, "legend")[0] var legend = can.page.Select(can, field, "legend")[0]
var option = can.page.Select(can, field, "form.option")[0] var option = can.page.Select(can, field, "form.option")[0]
var action = can.page.Select(can, field, "div.action")[0] var action = can.page.Select(can, field, "div.action")[0]
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]
meta.id && (option.dataset.id = meta.id)
// 添加插件
var sub = Volcanos(meta.name, { _help: meta.name, _follow: can._follow+"."+meta.name, var sub = Volcanos(meta.name, { _help: meta.name, _follow: can._follow+"."+meta.name,
_legend: legend, _option: option, _action: action, _output: output, _status: status, _legend: legend, _option: option, _action: action, _output: output, _status: status,
_target: field, _inputs: {}, _outputs: [], _history: [], _target: field, _inputs: {}, _outputs: [], _history: [],
Option: function(key, value) { Option: function(key, value) {
if (typeof key == "object") { return sub.core.Item(key, sub.Option), key }
if (key == undefined) { value = {} if (key == undefined) { value = {}
sub.page.Select(sub, option, "textarea.args,input.args,select.args", function(item) { sub.page.Select(sub, option, "textarea.args,input.args,select.args", function(item) {
item.name && item.value && (value[item.name] = item.value) 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) value == undefined? (value = item.value): (item.value = value)
}) }); return value
return value
}, },
Action: function(key, value) { Action: function(key, value) {
if (typeof key == "object") { return sub.core.Item(key, sub.Action), key } 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) value == undefined? (value = item.value): (item.value = value)
}) }); return value
return value
}, },
Status: function(key, value) { Status: function(key, value) {
if (typeof key == "object") { return sub.core.Item(key, sub.Status), key } if (typeof key == "object") { return sub.core.Item(key, sub.Status), key }
sub.page.Select(sub, status, "div."+key+">span", function(item) { sub.page.Select(sub, status, "div."+key+">span", function(item) {
value == undefined? (value = item.innerHTML): (item.innerHTML = value) value == undefined? (value = item.innerHTML): (item.innerHTML = value)
}) }); return value
return value
}, },
Clone: function() { 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 || "" return item.name && item.value || ""
}) })
can.onappend._init(can, meta, list, function(sub) { can.onappend._init(can, meta, list, function(sub) {
typeof cb == "function" && cb(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 } for (var k in sub._inputs) { sub._inputs[k]._target.focus(); break }
}) })
}, target) }, target)
}, },
Pack: function(cmds, slient) { 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 || "" return item.name && item.value || ""
}); for (var i = cmds.length-1; i >= 0; i--) { }); for (var i = cmds.length-1; i >= 0; i--) {
if (!cmds[i]) { cmds.pop() } else { break } if (!cmds[i]) { cmds.pop() } else { break }
@ -283,23 +261,23 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
typeof cb == "function" && cb(sub) typeof cb == "function" && cb(sub)
meta.inputs && sub.onappend._option(sub, meta, list, cb) 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++ 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]), _target: can.onappend.input(can, can._option, item.type, item, args[index]),
_option: can._option, _action: can._action, _output: can._output, _option: can._option, _action: can._action, _output: can._output,
CloneInput: function() { add(item)._target.focus() }, CloneInput: function() { add(item)._target.focus() },
CloneField: function() { can.Clone() }, CloneField: function() { can.Clone() },
}, Volcanos.meta.libs.concat([item.display||"/plugin/input.js", Volcanos.meta.volcano]), function(input) { }, 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")) var msg = can.request(event, can.Conf("option"))
return can.onappend._output(can, meta, event, can.Pack(cmds), cb, silent) 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) 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) }; can.core.Next(can.base.Obj(meta.inputs, []), add)
}, },
_action: function(can, action, list) { _action: function(can, action, list) {
@ -329,16 +307,19 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
typeof cb == "function" && cb(msg) typeof cb == "function" && cb(msg)
if (silent) { return } if (silent) { return }
if (can.onimport._process(can, msg)) { return }
var display = meta.feature.display || "table.js" var display = meta.feature.display || "table.js"
display.indexOf("/") == 0 || (display = "/plugin/"+display) display.indexOf("/") == 0 || (display = "/plugin/"+display)
display.endsWith(".js") || (display += ".js") 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, _target: can._output, _fields: can._target,
_option: can._option, _action: can._action, _output: can._output, _status: can._status, _option: can._option, _action: can._action, _output: can._output, _status: can._status,
Option: can.Option, Action: can.Action, Status: can.Status, Option: can.Option, Action: can.Action, Status: can.Status,
}, Volcanos.meta.libs.concat([display, Volcanos.meta.volcano]), function(table) { }, 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")) var msg = can.request(event, can.Conf("option"))
return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent) return can.onappend._output(can, meta, event, can.Pack(cmds, silent), cb, silent)
}, table._msg = msg }, 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.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) table.onexport && table.onappend._status(table, table._status, msg._export||meta._export||table.onexport.list)
}, can._output) }, can._output)
})) }); can._outputs.push(output)
}, silent) }, silent)
}, },
_detail: function(can, target, list) { _detail: function(can, target, list, cb) {
list.length > 0 && (target.oncontextmenu = function(event) { list.length > 0 && (target.oncontextmenu = function(event) {
can.user.carte(can, can.ondetail||{}, list, function(ev, item, meta) { 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) { field: function(can, target, type, item) {
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 || ""
return can.page.Append(can, target, [{view: [(type||"")+" "+(item.name||"")+" "+(item.pos||""), "fieldset"], list: [ 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"]}, item.pos? undefined: {text: [(item.nick||item.name||"").split(" ")[0]+"("+(item.help||"").split(" ")[0]+")", "legend"]},
{view: ["option", "form"], dataset: dataset, list: []}, {view: ["option", "form"]}, {view: ["action"]}, {view: ["output"]}, {view: ["status"]},
{view: ["action"]}, {view: ["output"]}, {view: ["status"]},
]}]) ]}])
}, },
input: function(can, option, type, item, value) { 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) { can.onappend._init(can, value, ["/plugin/state.js"], function(story) {
story.page.Remove(story, story._legend) story.page.Remove(story, story._legend)
return typeof cb == "function" && cb(story, value) typeof cb == "function" && cb(story, value)
}, target || can._output) }, target || can._output)
}, true) }, true)
}, },
@ -475,7 +451,7 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, meta,
var width = can._width, height = can._height var width = can._width, height = can._height
can.page.Select(can, target, "fieldset.head", function(field) { 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) { can.page.Select(can, target, "fieldset.foot", function(field) {
height -= field.offsetHeight 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}}]) 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) { can.page.Select(can, ui.high, "div.char", function(item) {
item.offsetHeight > -2 && can.page.Modify(can, item, {style: { item.offsetHeight > -2 && can.page.Modify(can, item, {style: {
height: item.offsetHeight-item.offsetHeight/200-1+"px", height: item.offsetHeight-item.offsetHeight/200-1+"px",
@ -534,7 +510,7 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can) {
}) })
var count = 0, add = true var count = 0, add = true
can.Timer({interval: 100}, function() { can.core.Timer({interval: 100}, function() {
if (add) { if (add) {
count++ count++
if (count > 100) { if (count > 100) {
@ -596,7 +572,76 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can) {
} }
document.body.onkeyup = function(event) { 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 = { var key = event.key, map = {
"~": "q", "~": "q",
"`": "q", "`": "q",
@ -726,7 +771,7 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can) {
time = typeof time == "object"? time: {value: 10, length: time||20} time = typeof time == "object"? time: {value: 10, length: time||20}
can.page.Modify(can, target, {style: {opacity: 0, display: "block"}}) 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}}) can.page.Modify(can, target, {style: {opacity: (index+1)/time.length}})
}, cb) }, cb)
}, },
@ -734,7 +779,7 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can) {
time = typeof time == "object"? time: {value: 10, length: time||20} time = typeof time == "object"? time: {value: 10, length: time||20}
can.page.Modify(can, target, {style: {opacity: 1}}) 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}}) can.page.Modify(can, target, {style: {opacity: 1-(index+1)/time.length}})
}, cb) }, cb)
}, },

254
index.css
View File

@ -1,27 +1,19 @@
body { body {
margin:0; padding:0;
background:black; background:black;
padding:0;
margin:0;
} }
fieldset { fieldset {
margin:0; border:0; padding:2px;
color:cyan; color:cyan;
padding:2px;
margin:0; border:0;
} }
legend { legend {
margin-left:10px; margin-left:10px;
box-shadow: 4px 4px 20px 4px #626bd0; box-shadow:4px 4px 20px 4px #626bd0;
} }
legend:hover { legend:hover {
cursor:pointer; cursor:pointer;
background:red; background:red;
} }
div.hidden {
display:none;
}
h1 {
margin:0;
}
input[type=text] { input[type=text] {
background-color:cyan; background-color:cyan;
@ -36,6 +28,58 @@ select {
color:cyan; 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 { fieldset>form.option {
padding:0 5px; padding:0 5px;
} }
@ -82,9 +126,6 @@ fieldset>form.option>div.item.textarea {
clear:both; clear:both;
} }
fieldset>div.action {
/* clear:none; */
}
fieldset>div.action>div.item { fieldset>div.action>div.item {
float:left; float:left;
margin:2px 0; margin:2px 0;
@ -134,52 +175,19 @@ fieldset>div.output>pre.display:hover {
/* max-height:640px; */ /* max-height:640px; */
} }
table { fieldset.input {
border:0; white-space: pre; background-color:black;
font-size:14px; font-family:monospace; position:fixed;
/* box-shadow: 4px 4px 10px 1px #626bd0; */ left:0; top:0;
cursor:pointer; overflow: auto;
} }
table tr:hover { fieldset.input {
background-color:#0fbd45; z-index:99;
} }
table tr.select { fieldset.input.date {
background-color:#0fbd45; z-index:101;
} }
table tr.over { fieldset.input.key {
background:red; z-index:101;
}
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; */
} }
div.toast { div.toast {
@ -239,21 +247,6 @@ div.upload div.item {
float:left; 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 { body.white {
margin:0; padding:0; margin:0; padding:0;
background-color:#0dabda; background-color:#0dabda;
@ -275,15 +268,6 @@ body.white input[type=button] {
background-color:#FF9900; background-color:#FF9900;
color:white; 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 { body.white input[type=button]:hover {
border-radius:10px 10px 10px 10px; border-radius:10px 10px 10px 10px;
border:2px solid #FFCC33; border:2px solid #FFCC33;
@ -299,6 +283,15 @@ body.white select {
} }
body.white select:hover { 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 { body.white fieldset {
/* color:black; */ /* color:black; */
@ -312,100 +305,6 @@ body.white fieldset.plugin {
background-color:white; background-color:white;
color:black; 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 { body.white fieldset.plugin table {
color:black; background-color:white; color:black; background-color:white;
} }
@ -428,6 +327,10 @@ body.white fieldset.plugin table td {
body.white fieldset.plugin table td:hover { body.white fieldset.plugin table td:hover {
background-color:#98ecd4; background-color:#98ecd4;
} }
body.white fieldset.editor {
background:#0b2c54ab;
color:white;
}
fieldset.command>form.option>div.item input.args { fieldset.command>form.option>div.item input.args {
width:300px; width:300px;
@ -435,7 +338,6 @@ fieldset.command>form.option>div.item input.args {
fieldset.command>form.option>div.item textarea { fieldset.command>form.option>div.item textarea {
height:160px; height:160px;
} }
fieldset.max>form.option>div.item textarea.args { fieldset.max>form.option>div.item textarea.args {
background-color:cyan; background-color:cyan;
width:500px; width:500px;

View File

@ -1,5 +1,5 @@
_can_name = "" _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: [ 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: "Header", help: "标题栏", pos: "head", state: ["time", "username"]},
{name: "Search", help: "搜索框", pos: "float"}, {name: "Search", help: "搜索框", pos: "float"},
@ -8,8 +8,8 @@ Volcanos({name: "chat", volcano: "/frame.js", iceberg: "/chat/",
{name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]}, {name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]},
], main: {name: "Header", engine: "remote", list: ["publish/order.js"]}, plugin: [ ], main: {name: "Header", engine: "remote", list: ["publish/order.js"]}, plugin: [
"/plugin/state.js", "/plugin/state.js",
"/plugin/table.js",
"/plugin/input.js", "/plugin/input.js",
"/plugin/table.js",
"/plugin/input/key.js", "/plugin/input/key.js",
"/plugin/input/date.js", "/plugin/input/date.js",
"/plugin/local/team/plan.js", "/plugin/local/team/plan.js",

View File

@ -1,38 +1,21 @@
var base = Volcanos("base", {help: "基础模块", 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
},
Int: function(value) {return parseInt(value)||0}, Int: function(value) {return parseInt(value)||0},
Obj: function(value, def) { Obj: function(value, def) {
try { try {
return typeof value == "string" && value != ""? JSON.parse(value): value || def || {} return (typeof value == "string" && value != ""? JSON.parse(value): value) || def || {}
} catch { } catch {
return [value] return [value]
} }
}, },
parseSize: function(size) { Ext: function(file) { return (file.split("/").pop().split(".").pop()||"txt").toLowerCase() },
if (size.endsWith("TB") || size.endsWith("tb") || size.endsWith("T") || size.endsWith("t")) { Path: function() { var res = ""
return parseInt(size) * 1024 * 1024 * 1024 * 1024 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 res
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)
}, },
Args: function(obj) {var res = []; Args: function(obj) {var res = [];
for (var k in obj) { for (var k in obj) {
res.push(encodeURIComponent(k)+"="+encodeURIComponent(obj[k])) res.push(encodeURIComponent(k)+"="+encodeURIComponent(obj[k]))
@ -51,24 +34,6 @@ var base = Volcanos("base", {help: "基础模块",
} }
return size + "B" 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) { Time: shy("时间格式化", function(t, fmt) {
var now = new Date() var now = new Date()
if (t && typeof t == "string") { var ls = t.split(" ") 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)) fmt = fmt.replace("%S", this.Number(now.getSeconds(), 2))
return fmt 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; 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/24), h > 0 && (res += h+"d"), n = n % (3600000*24);
h = parseInt(n/3600000), h > 0 && (res += h+"h"), n = n % 3600000; 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)}), 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() isNight: function() { var now = new Date()
return now.getHours() < 7 || now.getHours() > 17 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: "核心模块", 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
}),
Items: shy("迭代器", function(obj, cb) {var list = []; Items: shy("迭代器", function(obj, cb) {var list = [];
for (var key in obj) { for (var key in obj) {
list = list.concat(this.List(obj[key], function(value, index, array) { list = list.concat(this.List(obj[key], function(value, index, array) {
@ -24,6 +7,13 @@ var core = Volcanos("core", {help: "核心模块",
} }
return list 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) { List: shy("迭代器", function(obj, cb, interval, cbs) {
if (typeof obj == "number") { if (typeof obj == "number") {
var begin = 0, end = obj, step = 1; var begin = 0, end = obj, step = 1;
@ -128,6 +118,29 @@ var core = Volcanos("core", {help: "核心模块",
} }
return res 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 Eq: function(obj, other) { var self = arguments.callee
// undefined null // undefined null
// string number boolen // string number boolen
@ -151,18 +164,5 @@ var core = Volcanos("core", {help: "核心模块",
} }
return obj === other 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) { POST: shy("请求后端", {order: 0}, function(can, msg, url, form, cb) {
var xhr = new XMLHttpRequest() var xhr = new XMLHttpRequest()
xhr.open("POST", url), xhr.onreadystatechange = function() { 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 can._socket.onmessage = function(event) {var order = ++meta.order
try { try { // 解析命令
// 解析命令 var data = JSON.parse(event.data)
var msg = JSON.parse(event.data)
} catch (e) { } 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._can)
delete(msg._event) delete(msg._event)
@ -114,16 +193,13 @@ var misc = Volcanos("misc", {help: "工具模块",
msg.Option("_target", msg.Option("_source")) msg.Option("_target", msg.Option("_source"))
console.log(["wss", order, "result"].concat(msg.result).concat([msg])) console.log(["wss", order, "result"].concat(msg.result).concat([msg]))
can._socket.send(JSON.stringify(msg)) can._socket.send(JSON.stringify(msg))
} }, msg.detail = data.detail, msg.Copy(data)
try { try { // 执行命令
// 执行命令
// c
console.log(["wss", order].concat(msg.detail).concat([msg])) console.log(["wss", order].concat(msg.detail).concat([msg]))
typeof cb == "function" && cb(event, msg, msg.detail[0], msg.detail.slice(1)) typeof cb == "function" && cb(event, msg, msg.detail[0], msg.detail.slice(1))
} catch (e) {
// 执行失败 } catch (e) { // 执行失败
// con
console.log(e) console.log(e)
} }
} }

View File

@ -1,4 +1,4 @@
var page = Volcanos("page", {help: "网页模块", Volcanos("page", {help: "网页模块",
ClassList: { ClassList: {
has: function(can, obj, key) {var list = obj.className? obj.className.split(" "): []; has: function(can, obj, key) {var list = obj.className? obj.className.split(" "): [];
for (var i = 2; i < arguments.length; i++) { for (var i = 2; i < arguments.length; i++) {
@ -185,13 +185,17 @@ var page = Volcanos("page", {help: "网页模块",
Remove: shy("删除节点", function(can, target) { Remove: shy("删除节点", function(can, target) {
target && target.parentNode && target.parentNode.removeChild(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) { AppendTable: shy("添加表格", function(can, msg, target, list, cb) {
if (!msg.append || msg.append.length == 0) {return} 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) { Display: function(text) {
if (text.startsWith("http://") || text.startsWith("https://") || text.startsWith("ftp://")) { if (text.startsWith("http://") || text.startsWith("https://") || text.startsWith("ftp://")) {
var ls = text.split(" ") 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.value = target.value.substring(0, start)+target.value.substring(start+(count||target.value.length), target.value.length)
target.setSelectionRange(start, start) target.setSelectionRange(start, start)
}, },
oninput: function(event, can, local) {var target = event.target
if (event.ctrlKey) { Cache: function(name, output, data) { var cache = output._cache || {}; output._cache = cache
if (typeof local == "function" && local(event)) { if (data) { if (output.children.length == 0) { return }
event.stopPropagation() // 写缓存
event.preventDefault() var temp = document.createDocumentFragment()
return true while (output.childNodes.length>0) {
var item = output.childNodes[0]
item.parentNode.removeChild(item)
temp.appendChild(item)
} }
var his = target.History || [] cache[name] = {node: temp, data: data}
var pos = target.Current || -1 return name
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() output.innerHTML = ""
event.preventDefault() var list = cache[name]; if (!list) {return}
return true
// 读缓存
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) { Anchor: function(event, target, pos, point) {
switch (pos) { switch (pos) {
case 1: case 1:
@ -519,7 +476,6 @@ var page = Volcanos("page", {help: "网页模块",
break break
} }
}, },
EnableDrop: function(can, parent, search, target) { EnableDrop: function(can, parent, search, target) {
return can.page.Modify(can, target, { draggable: true, return can.page.Modify(can, target, { draggable: true,
ondragstart: function(event) { var target = event.target; can.drop = function(event, tab) { 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) { getLocation: function(cb) {
typeof cb == "function" && cb({name: "some"}) typeof cb == "function" && cb({name: "some"})
}, },
@ -12,11 +12,21 @@ var user = Volcanos("user", {help: "用户模块", agent: {
typeof cb == "function" && cb([]) typeof cb == "function" && cb([])
}, },
}, },
alert: function(text) {alert(JSON.stringify(text))}, isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1,
confirm: function(text) {return confirm(JSON.stringify(text))}, isMobile: navigator.userAgent.indexOf("Mobile") > -1,
prompt: function(text, cb, def, silent) {(text = silent? def: prompt(text, def||"")) != undefined && typeof cb == "function" && cb(text); return text}, isIPhone: navigator.userAgent.indexOf("iPhone") > -1,
reload: function(force) {(force || confirm("重新加载页面?")) && location.reload()}, isMacOSX: navigator.userAgent.indexOf("Mac OS X") > -1,
title: function(text) {return text && (document.title = text), document.title}, 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) { scan: function(str) {
try { var value = JSON.parse(str) } catch(e) { try { try { var value = JSON.parse(str) } catch(e) { try {
var value = {"type": "url", "text": str} var value = {"type": "url", "text": str}
@ -28,7 +38,6 @@ var user = Volcanos("user", {help: "用户模块", agent: {
} catch(e) { } } } catch(e) { } }
return value return value
}, },
copy: function(can, text) { copy: function(can, text) {
var input = can.page.Append(can, document.body, [{type: "input", value: text}]).first var input = can.page.Append(can, document.body, [{type: "input", value: text}]).first
input.setSelectionRange(0,-1) input.setSelectionRange(0,-1)
@ -37,24 +46,9 @@ var user = Volcanos("user", {help: "用户模块", agent: {
can.page.Remove(can, input) can.page.Remove(can, input)
can.user.toast(can, {text: text, title: "复制成功", width: 400}) can.user.toast(can, {text: text, title: "复制成功", width: 400})
}, },
login: function(can, cb) {
var ui = can.user.input({clientX: 200, clientY: 100}, can, [ topic: function(can, name) {
{username: "username", name: "用户"}, can.page.Modify(can, document.body, {className: 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
})
}, },
toast: function(can, text, title, duration, progress) { toast: function(can, text, title, duration, progress) {
var meta = typeof text == "object"? text: {text: text, title: title||can._help, duration: duration, progress: 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() }}]) ], 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..." } if (index > 20) { ui.duration.innerHTML = parseInt(index/10)+"."+(index%10)+"s..." }
}, function() { can.page.Remove(can, ui.first), timer.stop = true }) }, function() { can.page.Remove(can, ui.first), timer.stop = true })
@ -111,12 +105,23 @@ var user = Volcanos("user", {help: "用户模块", agent: {
event.preventDefault() event.preventDefault()
return ui return ui
}, },
select: function(event, can, type, fields, cb, cbs) { login: function(can, cb) {
var msg = can.request(event, {fields: fields||"pod,name,text"}) var ui = can.user.input({clientX: 200, clientY: 100}, can, [
can.run(msg._event, ["search", "Search.onimport.select", type, "", ""], function(list) { {username: "username", name: "用户"},
can.core.Next(list, cb, cbs||function() { {password: "password", name: "密码"},
can.user.toast(can, "添加成功") {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 ] input: function(event, can, form, cb) { // form [ string, {_input: }, array, object, button ]
@ -178,6 +183,14 @@ var user = Volcanos("user", {help: "用户模块", agent: {
}) })
return ui 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() upload: function(event, can) { var begin = new Date()
var x = event.clientX, y = event.clientY; y += 10; if (x > 400) { x -= 200 } 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: [ 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() a.click()
can.page.Remove(can, a) 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; Share: shy("共享链接", function(can, objs, clear) {var obj = objs || {}; var path = location.pathname;
obj._path && (path = obj._path, delete(obj._path)) obj._path && (path = obj._path, delete(obj._path))
@ -246,7 +265,7 @@ var user = Volcanos("user", {help: "用户模块", agent: {
return args return args
} else if (value == undefined) { } else if (value == undefined) {
// return args[key] || can.user.Cookie(can, key) // return args[key] || can.user.Cookie(can, key)
return args[key]||can.user.locals(can, key) return args[key]
} else { } else {
args[key] = value args[key] = value
args[key] == "" && delete(args[key]) args[key] == "" && delete(args[key])
@ -278,38 +297,5 @@ var user = Volcanos("user", {help: "用户模块", agent: {
var result = (new RegExp(key+"=([^;]*);?")).exec(document.cookie) var result = (new RegExp(key+"=([^;]*);?")).exec(document.cookie)
return result && result.length > 0? result[1]: "" 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; margin:5px;
color:white; 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()
}): (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] _plugin: function(can, target, river, storm, value) { value.name = value.name.split(" ")[0]
value.action = value.id || value.index || value.key+"."+value.name value.action = value.id || value.index || value.key+"."+value.name
value.width = can._target.offsetWidth value.width = can._target.offsetWidth
value.type = "plugin" value.type = "plugin"
// 添加插件
can.onappend._init(can, value, ["/plugin/state.js"], function(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 || [] 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) { can.run(event, can.onengine[cmds[0]]? cmds: [river, storm, value.action].concat(cmds), function(msg) {
return typeof cb == "function" && cb(msg) typeof cb == "function" && cb(msg)
}, silent) }, silent)
} }
}, target) }, target)
}, },
}) })
Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, 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 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 } if (position) { can._output.scrollTo(0, position-1); return }
can.run({}, [river, storm], function(msg) { can.run({}, [river, storm], function(msg) {

View File

@ -13,3 +13,9 @@ fieldset.Footer>div.output div.state {
margin-right:5px; margin-right:5px;
float:right; 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) { can.page.Select(can, target, "span.ncmd", function(item) {
item.innerHTML = can.Conf("ncmd", parseInt(can.Conf("ncmd")||"0")+1+"")+"" 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) { 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; cursor:pointer;
float:left; float:left;
} }
fieldset.Header>div.output>div.state { fieldset.Header>div.output>div.state {
cursor:pointer; cursor:pointer;
margin-right:5px; margin-right:5px;
@ -40,3 +38,14 @@ fieldset.Header>div.output>div.state:hover {
background-color:red; 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) { 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")) 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) { can.onimport._init(can, msg, list, function(msg) {
typeof cb == "function" && cb(msg)
can.run({}, ["search", "River.onaction._init"]) can.run({}, ["search", "River.onaction._init"])
can.run({}, ["search", "Footer.onaction._init"]) can.run({}, ["search", "Footer.onaction._init"])
}, can._output) }, 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 args = {}; can.core.List([POD, TOPIC, TITLE], function(key) {
var value = can.user.Search(can, key); value && (args[key] = value) 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) }, username: function(event, can) { can.user.logout(can) },

View File

@ -20,17 +20,28 @@ fieldset.River>div.output div.item.select {
background-color:red; background-color:red;
border:ridge 2px yellow; border:ridge 2px yellow;
} }
fieldset.River>div.output div.sublist { fieldset.River>div.output div.list {
margin-left:20px; 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 { body.white fieldset.River>div.output div.item:hover {
cursor:pointer; background-color:black;
background-color:red; border:solid 2px black;
border:ridge 2px yellow;
} }
fieldset.River>div.output div.subitem.select { body.white fieldset.River>div.output div.item.select {
background-color:red; background-color:black;
border:ridge 2px yellow; 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) } var list = can.sublist[river]; if (list) { return can.page.Toggle(can, list) }
can.run({}, [river, "tool"], function(msg) { 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) 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.onaction.action(event, can, river, storm.hash)
can.user.title(can.user.Search(can, POD) || storm.name) 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) 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) event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling)
can.sublist[river] = list 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)}) var msg = can.request(event, {river: can.Conf(RIVER, river), storm: can.Conf(STORM, storm)})
can.run(event, ["search", "Action.onaction._init"]) 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.del(can, item, "select")
}), can.page.ClassList.add(can, event.target, "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) { 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.run(event) },
"返回": function(event, can) { "返回": function(event, can) {
can.sup._history.pop(); var his = can.sup._history.pop(); if (his) { 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] || "" item.value = his[index] || ""
}) })
} }
@ -46,7 +46,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta,
}, },
onchange: function(event, can) { onchange: function(event, can) {
if (event.target.tagName == "SELECT") { can.run(event) } if (can.Conf("type") == "select") { can.run(event) }
}, },
ondblclick: function(event, can) { ondblclick: function(event, can) {
if (can.Conf("type") == "text") { event.target.setSelectionRange(0, -1) } 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] var cb = can.onaction[action] || can.onaction[name]
if (typeof cb == "function") { return cb(event, can, 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())) } if (can.Conf("type") == "button") { can.run(event, [name].concat(can.sup.Pack())) }
}, },
onkeydown: function(event, can) { onkeydown: function(event, can) {
can.onkeypop.show(event, can)
switch (event.key) { switch (event.key) {
case "Enter": case "Enter":
if (event.target.tagName == "INPUT") { event.target.setSelectionRange(0, -1), can.run(event) } if (can.Conf("type") == "text") { event.target.setSelectionRange(0, -1), can.run(event) }
if (event.target.tagName == "TEXTAREA") { break } if (can.Conf("type") == "textarea") { break }
event.stopPropagation() event.stopPropagation()
event.preventDefault() event.preventDefault()
break break
case "b": if (!event.ctrlKey) { return }; can.CloneInput(); break case "b": if (!event.ctrlKey) { break }; can.CloneInput(); break
case "m": if (!event.ctrlKey) { return }; can.CloneField(); break case "m": if (!event.ctrlKey) { break }; can.CloneField(); break
default: return
} }
}, },
onkeyup: function(event, can) { onkeyup: function(event, can) {
switch (event.key) { switch (event.key) {
case "Enter": case "Enter":
if (event.target.tagName == "TEXTAREA") { break } if (can.Conf("type") == "textarea") { break }
event.stopPropagation() event.stopPropagation()
event.preventDefault() event.preventDefault()
break 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}) project: function(can, path, cb) { can.Option({path: path})
var msg = can.request({}); msg.Option("dir_root", path), msg.Option("dir_deep", "true") 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.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.onappend.tree(can, msg, "path", "/", can.ui.project, function(event, value) {
can.onimport.tabview(can, can.Option("path"), value.path) can.onimport.tabview(can, can.Option("path"), value.path)
}), typeof cb == "function" && cb() }), typeof cb == "function" && cb()
@ -75,7 +75,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
}) })
// caches save // 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, scrollTop: can.ui.profile.parentNode.scrollTop,
current: can.current, current: can.current,
max: can.max, max: can.max,
@ -87,7 +87,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
// caches load // caches load
var cache = false; can.core.List(["content"], function(item) { 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.ui.profile.parentNode.scrollTo(0, p.scrollTop)
can.onaction.selectLine(can, p.current.line) can.onaction.selectLine(can, p.current.line)
can.max = p.max 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, [ var ui = can.page.Append(can, can.ui.profile, [
{view: ["editor", "input"], onkeydown: function(event) { {view: ["editor", "input"], onkeydown: function(event) {
can.onkeymap.parse(event, can, "insert") can.onkeymap.parse(event, can, "insert")
can.Timer(1, function() { can.core.Timer(1, function() {
can.current.text(can.ui.editor.value) can.current.text(can.ui.editor.value)
}) })
}, onfocus: function(event) { }, onfocus: function(event) {

View File

@ -73,8 +73,8 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
_profile: function(can, msg, task) { _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) 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.task && can.page.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.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"], height: can.Conf("height"), width: can.Conf("width"), index: task["extra.ctx"]+"."+task["extra.cmd"], args: task["extra.arg"],
}, function(sub) { }, function(sub) {
sub.run = function(event, cmds, cb, silent) { 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({ can.core.Item({
"font-size": "24", "font-size": "24",

View File

@ -1,13 +1,8 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, list, cb, target) { Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, list, cb, target) {
}, },
}) _process: function(can, msg) {
Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { var cb = can.onimport[msg.Option("_process") || can.Conf("feature._process")]
// can.onaction._process(can, sub, value, msg, cmds, cb, silent) return typeof cb == "function" && cb(can, msg)
},
_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"])
}, },
_progress: function(can, sub, conf, msg, cmds, cb, silent) { _progress: function(can, sub, conf, msg, cmds, cb, silent) {
var size = msg.Append("size") || msg.Append("count") 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.page.ClassList.add(can, td, "done")
} }
}) })
can.Timer(1000, function() { can.core.Timer(1000, function() {
var res = sub.request({}) var res = sub.request({})
res.Option("_progress", msg.Option("_progress")) res.Option("_progress", msg.Option("_progress"))
sub.run(res._event, cmds, cb, silent) 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") 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) { 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: []}) Volcanos("onexport", {help: "导出数据", list: []})

View File

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

View File

@ -23,7 +23,7 @@ Volcanos("onimport", {help: "导入数据", list: [],
can.page.Modify(can, sub._status, {style: {display: "none"}}) can.page.Modify(can, sub._status, {style: {display: "none"}})
sub.run = function(event, cmds, cb, silent) { sub.run = function(event, cmds, cb, silent) {
typeof cb == "function" && cb(can.request(event)) typeof cb == "function" && cb(can.request(event))
can.Timer(100, function() { can.core.Timer(100, function() {
can.sub = sub._outputs[0] can.sub = sub._outputs[0]
can.msg = msg, can.data = msg.Table() can.msg = msg, can.data = msg.Table()
var action = can.Conf("action") var action = can.Conf("action")
@ -128,7 +128,7 @@ Volcanos("onaction", {help: "组件菜单", list: ["编辑", "清空", ["view",
one.onmouseover = function(event) { can.Status(line) } 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) { Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
if (can.onimport._process(can, msg)) { if (can.onimport._process(can, msg)) { return typeof cb == "function" && cb(can, msg) }
return typeof cb == "function" && cb(msg)
}
can.ui = can.page.Appends(can, target, [can.onimport._control(can, msg)].concat([ can.ui = can.page.Appends(can, target, [can.onimport._control(can, msg)].concat([
{view: ["content", "div"]}, {view: ["content", "div"]}, {view: ["display", "pre"]},
{view: ["display", "pre"]},
])) ]))
var cmd = "", arg = ""
can.onappend.table(can, msg, can.ui.content, "table", function(value, key, index, line, array) { 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) 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.onappend.board(can, msg, can.ui.display, "board")
can.onimport._board(can, msg) 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) { _page: function(can, msg) {
return {view: ["control", "div"], list: [ return {view: ["control", "div"], list: [
@ -87,10 +69,6 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
}, data: {"className": "args"}}, }, 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) { _table: function(can, value, key, index, line, array) {
return {type: "td", inner: value, click: function(event) { var target = event.target 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()) 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)}) can.page.Modify(can, item, {style: can.base.Obj(data.style)})
}) })
}, },
_process: function(can, msg) { _process: function(can, msg) {
var process = msg.Option("_process") || can.Conf("feature")["_process"] var cb = can.onimport[msg.Option("_process") || can.Conf("feature._process")]
var cb = can.onimport[process]; return typeof cb == "function" && cb(can, msg) return typeof cb == "function" && cb(can, msg)
}, },
_follow: function(can, msg) { _follow: function(can, msg) {
if (msg.Option("cache.status") == "stop") { return can.user.toast(can, msg.Option("cache.action")+" done!")} 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.page.Append(can, can.ui.content, [{text: msg.Result()}])
can.ui.content.scrollBy(0, 1000) can.ui.content.scrollBy(0, 1000)
can.Timer(100, function() { can.core.Timer(100, function() {
var sub = can.request({}) var sub = can.request({})
sub.Option("cache.hash", msg.Option("cache.hash")) sub.Option("cache.hash", msg.Option("cache.hash"))
sub.Option("cache.begin", msg.Option("cache.begin")) 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.onappend.board(can, msg, can._output, "board")
// can.onimport._board(can, msg) // can.onimport._board(can, msg)
return true 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) { spark: function(can, list, target) {
@ -206,29 +165,5 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
}) })
}, },
}) })
Volcanos("onaction", {help: "控件交互", list: [], 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("onexport", {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") || [] cb.list = next("object") || []
return cb return cb
}; var _can_name = "" }; 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 var meta = arguments.callee.meta, list = arguments.callee.list
if (typeof name == "object") { var Config = name if (typeof name == "object") { var Config = name
meta.volcano = Config.volcano, meta.libs = Config.libs meta.volcano = Config.volcano, meta.libs = Config.libs
var Preload = Config.libs; Config.panes.forEach(function(pane) { var Preload = Config.libs; Config.panes.forEach(function(pane) {
pane.type= "pane" Preload = Preload.concat(pane.list = pane.list || ["/pane/"+pane.name+".css", "/pane/"+pane.name+".js"])
pane.list = pane.list || ["/pane/"+pane.name+".css", "/pane/"+pane.name+".js"]
Preload = Preload.concat(pane.list)
}); Preload = Preload.concat(Config.plugin) }); Preload = Preload.concat(Config.plugin)
name = Config.name, can = { _follow: Config.name, 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, _target: document.body, _head: document.head, _body: document.body,
}, libs = Preload.concat(Config.volcano), cb = function(can) { }, libs = Preload.concat(Config.volcano), cb = function(can) {
can.onengine._init(can, can.Conf(Config), [], function(msg) { can.onengine._init(can, can.Conf(Config), [], function(msg) {
console.log(can)
}, can._target) }, 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) { 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++) { for (var cache = meta.cache[name] || []; meta.index < list.length; meta.index++) {
if (name == "/plugin/input/date.css" && cache.length > 0) { continue } 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 || {} request: function(event, option) { event = event || {}
if (event._msg) { if (event._msg) {
can.core.Item(option, function(key, value) { can.core.Item(option, event._msg.Option)
event._msg.Option(key, value)
})
return event._msg return event._msg
} }
var ls = (can._name||can._help).split("/") var ls = (can._name||can._help).split("/")
event._pane = ls[ls.length-1] event._pane = ls[ls.length-1]
var msg = {}; event._msg = msg, msg._event = event, msg._can = can var msg = can.misc.Message(event, can)
msg.__proto__ = { _name: meta.order++, _create_time: new Date(), can.core.Item(option, msg.Option)
Option: function(key, val) { return event._msg = msg
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
}, },
Conf: function(key, value, cb) { Conf: function(key, value, cb) {
@ -200,44 +118,6 @@ var Volcanos = shy("火山架", {libs: [], pack: {}, order: 1, cache: {}, index:
} }
return conf[key] || "" 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) { 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}} 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)} run(event, args, function(msg) {if (silent) {return typeof cb == "function" && cb(msg)}
plugin.msg = msg, plugin.Show(feature.display || "table", msg, cb) plugin.msg = msg, plugin.Show(feature.display || "table", msg, cb)
show = false, plugin.user.toast(); 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} storm: function(event, can, value, cmd, field) {if (value == "update") {return}
// 保存界面 // 保存界面
can.Cache(can.Conf("river")+"."+can.Conf("storm"), can.output, "some"); can.page.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)) { if (can.page.Cache(can.Conf("river", can.Conf("temp_river"))+"."+can.Conf("storm", value), can.output)) {
// 恢复界面 // 恢复界面
return 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)}}; 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") 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}} if (text.duration == -1) {return {toast: toast}}
var begin = can.base.Time().split(" ")[1] 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 < 10) {return}
if (i > 10000) {return true} if (i > 10000) {return true}
toast.tick.innerHTML = can.base.Duration(i*t) + " after " + begin 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"] 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)]) target.Value("fill", list[parseInt(Math.random()*list.length%list.length)])
}) })
}, },
@ -893,7 +893,7 @@ Volcanos("ondetail", {help: "组件详情", list: ["标签", "编辑", "复制",
return 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) can.onaction._run({type: "click", target: target}, can, target)
}) })
}, },