diff --git a/frame.js b/frame.js
index 54284ab0..393f76ac 100644
--- a/frame.js
+++ b/frame.js
@@ -1,5 +1,5 @@
var _can_name = "/frame.js"
-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(list, function(item, next) { item.type = "panel"
can.onappend._init(can, item, item.list, function(panel) {
panel.onaction && panel.onappend._action(panel, item.action||panel.onaction.list)
@@ -8,10 +8,6 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta,
panel.run = function(event, cmds, cb) { var msg = panel.request(event); cmds = cmds || []
return (can.onengine[cmds[0]]||can.onengine[meta.main.engine]||can.onengine.remote)(event, can, msg, panel, cmds, cb)
}, can[item.name] = panel, next()
-
- panel.page.Modify(panel, panel._output, {onmouseover: function(event) {
- Volcanos.meta.data.menu && panel.page.Remove(panel, Volcanos.meta.data.menu.first)
- }})
}, target)
}, function() {
var panel = can[meta.main.name], msg = can.request()
@@ -23,7 +19,7 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta,
var sub, mod = can, fun = can, key = ""; can.core.List(cmds[1].split("."), function(value) {
fun && (sub = mod, mod = fun, fun = mod[value], key = value)
}); if (!sub || !mod || !fun) {
- can.base.Warn("not found", cmds[1])
+ can.misc.Warn("not found", cmds[1])
can.base.isFunc(cb) && cb(msg.Echo("warn: ", "not found: ", cmds[1]))
return
}
@@ -37,7 +33,18 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta,
remote: function(event, can, msg, panel, cmds, cb) {
delete(msg._handle), delete(msg._toast)
if (panel.onengine.engine(event, can, msg, panel, cmds, cb)) { return }
- can.misc.Runs(event, can, {names: panel._name, daemon: can._daemon+"."+msg._daemon}, cmds, cb)
+
+ var key = panel._name+"."+cmds.join(",")
+ if (can.user.isLocalFile) { var msg = can.request(event); msg.Clear("append")
+ var res = Volcanos.meta.pack[key]; res? msg.Copy(res): can.user.toast(can, "缺失数据")
+ return typeof cb == "function" && cb(msg)
+ }
+
+ can.misc.Run(event, can, {names: (can.Conf("iceberg")||"/chat/")+panel._name, daemon: can._daemon+"."+msg._daemon}, cmds, function(msg) {
+ Volcanos.meta.pack[key] = msg
+ can.base.isFunc(cb) && cb(msg)
+ })
+
panel.search(event, ["Footer.onimport.ncmd"])
}, engine: function(event, can, msg, panel, cmds, cb) { return false },
listen: shy("事件回调", {}, [], function(can, name, cb) {
@@ -170,7 +177,7 @@ Volcanos("onengine", {help: "解析引擎", list: [], _init: function(can, meta,
}},
},
})
-Volcanos("ondaemon", {help: "解析引擎", list: [], _init: function(can) {
+Volcanos("ondaemon", {help: "推荐引擎", list: [], _init: function(can) {
if (can.user.isLocalFile) { return }
can.misc.WSS(can, {type: "chrome", name: can.user.Search(can, "daemon")||""}, function(event, msg, cmd, arg) { if (!msg) { return }
if (can.base.isFunc(can.ondaemon[cmd])) {
@@ -188,8 +195,8 @@ Volcanos("ondaemon", {help: "解析引擎", list: [], _init: function(can) {
},
_list: [{}],
toast: function(can, msg, arg) { arg[0] = can
- can._toast && can._toast.Close()
- can._toast = can.core.CallFunc(can.user.toast, arg)
+ Volcanos.meta.float.toast && can.page.Remove(can, Volcanos.meta.float.toast._target)
+ Volcanos.meta.float.toast = can.core.CallFunc(can.user.toast, {can: can, msg: msg, cmds: arg})
},
grow: function(can, msg, arg) {
var sub = can.ondaemon._list[msg.Option("_target")]
@@ -199,7 +206,7 @@ Volcanos("ondaemon", {help: "解析引擎", list: [], _init: function(can) {
out.onimport._grow(out, arg.join(""))
},
pwd: function(can, msg, arg) {
- can.base.Log(msg)
+ can.misc.Log(msg)
can._daemon = arg[0]
},
})
@@ -324,11 +331,9 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
can.core.CallFunc(meta[which], [event, can, which])
can.core.CallFunc(meta[item[0]], [event, can, item[0], which])
- }}: item.input? /*文本*/ {type: "input", name: item.input[0], onkeydown: function(event) {
- can.core.CallFunc(item.input[1], [event, can])
-
- }}: typeof item == "object" && /*其它*/ item
+ }}: /*其它*/ item
, "", action)})
+ return meta
},
_output: function(can, meta, event, cmds, cb, silent) {
var msg = can.request(event); can.page.Select(can, can._output, "div.control .args", function(item) {
@@ -472,6 +477,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
break
case "button": item.value = item.value||item.name||"查看"; break
case "upfile": item.type = "file"; break
+ case "upload": item.type = "file", input.name = "upload"; break
}
return can.page.Append(can, target, [{view: ["item "+item.type], list: [input]}])[item.name]
@@ -520,31 +526,23 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
},
figure: function(can, meta, key, target) {
- if (!key || key.indexOf("@") != 0) { return }
+ if (!key || key[0] != "@") { return }
var list = can.core.Split(key, "@=", "@=")
var pkey = list[0], pval = list[1]||""
- target.type != "button" && target.value && target.value.indexOf("@") == 0 && (target.value = pval||"")
- pkey && can.require(["/plugin/input/"+pkey+".js"], function(can) {
- can.onfigure && can.core.Item(can.onfigure[pkey], function(key, cb) { if (key.indexOf("on") == 0) {
- target[key] = function(event) { can._figure && can.page.Remove(can, can._figure._target)
- can.onappend._init(can, {type: "input", name: pkey, pos: "float"}, [], function(sub) {
- sub.Conf(meta), sub.run = function(event, cmds, cb) {
- var msg = sub.request(event, can.Option());
- (meta.run||can.run)(event, cmds, cb, true)
- }, can._figure = sub
+ target.type != "button" && (target.value = pval||""), can.require(["/plugin/input/"+pkey+".js"], function(can) {
+ can.core.Item(can.onfigure[pkey], function(key, cb) { if (key.indexOf("on") == 0) { target[key] = function(event) {
+ can.onappend._init(can, {type: "input", name: pkey, pos: "float"}, [], function(sub) {
+ sub.run = function(event, cmds, cb) {
+ var msg = sub.request(event, can.Option());
+ (meta.run||can.run)(event, cmds, cb, true)
+ }, sub.Conf(meta)
- meta.style && sub.page.Modify(sub, sub._target, {style: meta.style})
-
- var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight
- var left = event.clientX, top = event.clientY
- if (left+sub._target.offsetWidth>window.innerWidth) { left = window.innerWidth - sub._target.offsetWidth }
- can.page.Modify(can, sub._target, {style: {left: left, top: top}})
-
- cb(event, sub, meta, target)
- }, document.body)
- }
- } })
+ Volcanos.meta.float.input && can.page.Remove(can, Volcanos.meta.float.input._target), Volcanos.meta.float.input = sub
+ meta.style && sub.page.Modify(sub, sub._target, {style: meta.style})
+ cb(event, sub, meta, target)
+ }, document.body)
+ } } })
})
},
_plugin: function(can, value, meta, cb, target) {
@@ -612,20 +610,15 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can) {
topic: function(can, topic) { topic && (can._topic = topic)
can.user.topic(can, can._topic || can.user.Search(can, "topic") || ((can.user.Search(can, "pod")||can.base.isNight())? "black": "white"))
},
- figure: function(event, can, target) { var p = target||can._target
- var layout = {left: event.clientX, top: event.clientY+10}
- can.page.Modify(can, p, {style: layout})
- can.onmotion.move(can, p, layout)
+ figure: function(event, can, target) { target = target||can._target
+ if (!event.target) { return }
+ var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight
+ if (left+target.offsetWidth>window.innerWidth) { left = window.innerWidth - target.offsetWidth }
+ if (top+target.offsetHeight>window.innerHeight) { top = window.innerHeight - target.offsetHeight }
- var left = p.offsetLeft; if (p.offsetLeft+p.offsetWidth > window.innerWidth) {
- left = window.innerWidth - p.offsetWidth
- } if (left < 120) { left = 120 }
-
- var top = p.offsetTop; if (p.offsetTop+p.offsetHeight > window.innerHeight) {
- top = window.innerHeight - p.offsetHeight
- } if (top < 32) { top = 32 }
-
- can.page.Modify(can, p, {style: {left: can.user.isMobile? 30: left, top: top+30}})
+ var layout = {left: left, top: top}
+ can.page.Modify(can, target, {style: layout})
+ can.onmotion.move(can, target, layout)
},
resize: function(can, name, cb) {
var list = []; can.onengine.listen(can, name, function(width, height) {
@@ -667,155 +660,7 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can) {
]}])
},
})
-Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can, target) {
- var focus = []; can.onengine.listen(can, "keymap.focus", function(cb) {
- cb? focus.push(cb): focus.pop()
- })
- can.onkeypop._build(can)
- target.onkeydown = function(event) {
- if (focus.length > 0) { return focus[focus.length-1](event) }
- if (event.target != target) { return }
- can.page.Select(can, target, "fieldset.Action>div.output", function(item) {
- target._keys = can.onkeypop._parse(event, can, "normal", target._keys||[], item)
- })
- }
- },
- _build: function(can) {
- can.core.Item(can.onkeypop._mode, function(item, value) { var engine = {}
- can.core.Item(value, function(key, cb) { var map = engine
- for (var i = key.length-1; i > -1; i--) {
- map = map[key[i]] = i == 0? cb: (map[key[i]]||{})
- }
- }), can.onkeypop._engine[item] = engine
- })
- },
- _parse: function(event, can, mode, list, target) { list = list||[], list.push(event.key)
- // can.Status("按键", list.join(""))
- for (var pre = 0; pre < list.length; pre++) {
- if ("0" <= list[pre] && list[pre] <= "9") { continue } break
- }; var count = parseInt(list.slice(0, pre).join(""))||1
-
- function repeat(cb, count) { list = []
- for (var i = 1; i <= count; i++) { if (cb(event, can, target, count)) { break } }
- event.stopPropagation(), event.preventDefault()
- // can.Status("按键", list.join(""))
- }
-
- var map = can.onkeypop._mode[mode]
- var cb = map && map[event.key]; if (can.base.isFunc(cb) && event.key.length > 1) {
- repeat(cb, count); return list
- }
- var cb = map && map[event.key.toLowerCase()]; if (can.base.isFunc(cb) && event.key.length > 1) {
- repeat(cb, count); return list
- }
-
- var map = can.onkeypop._engine[mode]; for (var i = list.length-1; i > pre-1; i--) {
- var cb = map[list[i]]; switch (typeof cb) {
- case "function": repeat(cb, count); return list
- case "object": map = cb; continue
- case "string":
- default: return list
- }
- }
- return list
- },
- _mode: {
- normal: {
- j: function(event, can, target) { target.scrollBy(0, event.ctrlKey? 300: 30) },
- k: function(event, can, target) { target.scrollBy(0, -30) },
-
- b: function(event, can, target) { can.search(event, ["Header.onaction.black"]) },
- w: function(event, can, target) { can.search(event, ["Header.onaction.white"]) },
-
- s: function(event, can, target) { can.search(event, ["River.ondetail.添加应用"]) },
- t: function(event, can, target) { can.search(event, ["River.ondetail.添加工具"]) },
-
- " ": function(event, can, target) {
- can.page.Select(can, document.body, "fieldset.panel.Header div.search input", function(target) {
- target.focus()
- })
- },
- enter: function(event, can, target) { can.base.Log("enter") },
- escape: function(event, can, target) {
- can.search(event, ["Search.onaction.hide"])
- can.base.Log("enter")
- },
- },
- insert: {
- escape: function(event, can, target) {
- target.blur()
- },
- jk: function(event, can, target) {
- can.page.DelText(target, target.selectionStart-1, target.selectionStart)
- target.blur()
- },
- enter: function(event, can, target) {
- var his = target._history || []
- his.push(target.value)
-
- can.base.Log("input", target, his)
- target.setSelectionRange(0, -1)
- target._current = his.length
- target._history = his
- },
- },
- insert_ctrl: {
- p: function(event, can, target) {
- var his = target._history||[]
- var pos = target._current||0
-
- pos = --pos % (his.length+1)
- if (pos < 0) { pos = his.length}
- target.value = his[pos]||""
- can.base.Log(pos, his)
-
- target._current = pos
- },
- n: function(event, can, target) {
- var his = target._history||[]
- var pos = target._current||0
-
- pos = ++pos % (his.length+1)
- target.value = his[pos]||""
- can.base.Log(pos, his)
-
- target._current = pos
- },
-
- u: function(event, can, target) {
- can.page.DelText(target, 0, target.selectionEnd)
- },
- k: function(event, can, target) {
- can.page.DelText(target, target.selectionStart)
- },
- h: function(event, can, target) {
- can.page.DelText(target, target.selectionStart-1, target.selectionStart)
- },
- d: function(event, can, target) {
- can.page.DelText(target, 0, target.selectionStart)
- },
- w: function(event, can, target) {
- 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)
- },
- },
- }, _engine: {},
-
- input: function(event, can) { var target = event.target
- target._keys = can.onkeypop._parse(event, can, event.ctrlKey? "insert_ctrl": "insert", target._keys||[], target)
- if (target._keys.length == 0) { event.stopPropagation(), event.preventDefault() }
- },
-})
-Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can, target) {
+Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, target) {
if ((can.user.Search(can, "topic")||"").indexOf("print") > -1) { return }
return
@@ -854,6 +699,10 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can, targe
})
},
+ focus: function(can, target) {
+ target.setSelectionRange(0, -1)
+ target.focus()
+ },
clear: function(can, target) {
can.page.Modify(can, target||can._output, "")
},
@@ -882,7 +731,7 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can, targe
can.page.Modify(can, target||can._target, {style: {display: "none"}})
},
toggle: function(can, target) {
- return can.page.Toggle(can, target||can._target)
+ return can.onmotion.Toggle(can, target||can._target)
},
select: function(can, target, name, which) {
can.page.Select(can, target, name, function(item, index) {
@@ -971,7 +820,6 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can, targe
can.page.Modify(can, target, {style: {width: begin+=space}})
})
},
-
autosize: function(can, target, max, min) {
can.page.Modify(can, target, {
onfocus: function(event) {
@@ -984,6 +832,325 @@ Volcanos("onmotion", {help: "动态交互", list: [], _init: function(can, targe
can.onmotion.resize(can, target, min, 5)
},
})
- }
+ },
+
+ EnableDrop: function(can, parent, search, target) {
+ return can.page.Modify(can, target, { draggable: true,
+ ondragstart: function(event) { var target = event.target; can.drop = function(event, tab) {
+ parent.insertBefore(target, tab)
+ can.page.Select(can, parent, search, function(item) {
+ can.page.ClassList.del(can, item, "over")
+ })
+ } },
+ ondragover: function(event) { event.preventDefault()
+ can.page.Select(can, parent, search, function(item) {
+ can.page.ClassList.del(can, item, "over")
+ }), can.page.ClassList.add(can, event.target, "over")
+ },
+ ondrop: function(event) { event.preventDefault()
+ can.drop(event, event.target)
+ },
+ })
+ },
+ Resizes: function(event, item, begin, p0, p1, pos) {
+ switch (pos) {
+ case 5:
+ item.Value("x", begin.x + p1.x - p0.x)
+ item.Value("y", begin.y + p1.y - p0.y)
+ return
+ }
+
+ switch (pos) {
+ case 1:
+ case 2:
+ case 3:
+ item.Value("y", begin.y + p1.y - p0.y)
+ item.Value("height", begin.height - p1.y + p0.y)
+ break
+ }
+ switch (pos) {
+ case 1:
+ case 4:
+ case 7:
+ item.Value("x", begin.x + p1.x - p0.x)
+ item.Value("width", begin.width - p1.x + p0.x)
+ break
+ }
+ switch (pos) {
+ case 3:
+ case 6:
+ case 9:
+ item.Value("width", begin.width + p1.x - p0.x)
+ break
+ }
+ switch (pos) {
+ case 7:
+ case 8:
+ case 9:
+ item.Value("height", begin.height + p1.y - p0.y)
+ break
+ }
+ },
+ Resize: function(event, item, begin, pos) {
+ switch (pos) {
+ case 5:
+ item.style.left = begin.left + event.clientX - begin.x + "px"
+ item.style.top = begin.top + event.clientY - begin.y + "px"
+ return
+ }
+
+ switch (pos) {
+ case 1:
+ case 2:
+ case 3:
+ item.style.top = begin.top + event.clientY - begin.y + "px"
+ item.style.height = begin.height - event.clientY + begin.y + "px"
+ break
+ }
+ switch (pos) {
+ case 1:
+ case 4:
+ case 7:
+ item.style.left = begin.left + event.clientX - begin.x + "px"
+ item.style.width = begin.width - event.clientX + begin.x + "px"
+ break
+ }
+ switch (pos) {
+ case 3:
+ case 6:
+ case 9:
+ item.style.width = begin.width + event.clientX - begin.x + "px"
+ break
+ }
+ switch (pos) {
+ case 7:
+ case 8:
+ case 9:
+ item.style.height = begin.height + event.clientY - begin.y + "px"
+ break
+ }
+ },
+ Anchor: function(event, target, pos, point) {
+ switch (pos) {
+ case 1:
+ case 2:
+ case 3:
+ point.y = target.Val("y")
+ break
+ case 4:
+ case 5:
+ case 6:
+ point.y = target.Val("y") + target.Val("height") / 2
+ break
+ case 7:
+ case 8:
+ case 9:
+ point.y = target.Val("y") + target.Val("height")
+ break
+ }
+
+ switch (pos) {
+ case 1:
+ case 4:
+ case 7:
+ point.x = target.Val("x")
+ break
+ case 2:
+ case 5:
+ case 8:
+ point.x = target.Val("x") + target.Val("width") / 2
+ break
+ case 3:
+ case 6:
+ case 9:
+ point.x = target.Val("x") + target.Val("width")
+ break
+ }
+ return point
+ },
+ Prepos: function(event, item, p, q) {
+ var max = 20
+ p = p || item.getBoundingClientRect()
+ q = q || {x: event.clientX, y: event.clientY}
+
+ var pos = 5
+ var y = (q.y - p.y) / p.height
+ if (y < 0.2 && q.y - p.y < max) {
+ pos -= 3
+ } else if (y > 0.8 && q.y - p.y - p.height > -max) {
+ pos += 3
+ }
+ var x = (q.x - p.x) / p.width
+ if (x < 0.2 && q.x - p.x < max) {
+ pos -= 1
+ } else if (x > 0.8 && q.x - p.x - p.width > -max) {
+ pos += 1
+ }
+
+ var cursor = [
+ "nw-resize", "n-resize", "ne-resize",
+ "w-resize", "move", "e-resize",
+ "sw-resize", "s-resize", "se-resize",
+ ]
+ item.style.cursor = cursor[pos-1]
+ return pos
+ },
+ 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
+ },
+})
+Volcanos("onkeypop", {help: "键盘交互", list: [], _init: function(can, target) {
+ var focus = []; can.onengine.listen(can, "keymap.focus", function(cb) {
+ cb? focus.push(cb): focus.pop()
+ })
+ can.onkeypop._build(can)
+ target.onkeydown = function(event) {
+ if (focus.length > 0) { return focus[focus.length-1](event) }
+ if (event.target != target) { return }
+ can.page.Select(can, target, "fieldset.Action>div.output", function(item) {
+ target._keys = can.onkeypop._parse(event, can, "normal", target._keys||[], item)
+ })
+ }
+ },
+ _build: function(can) {
+ can.core.Item(can.onkeypop._mode, function(item, value) { var engine = {}
+ can.core.Item(value, function(key, cb) { var map = engine
+ for (var i = key.length-1; i > -1; i--) {
+ map = map[key[i]] = i == 0? cb: (map[key[i]]||{})
+ }
+ }), can.onkeypop._engine[item] = engine
+ })
+ },
+ _parse: function(event, can, mode, list, target) { list = list||[], list.push(event.key)
+ // can.Status("按键", list.join(""))
+ for (var pre = 0; pre < list.length; pre++) {
+ if ("0" <= list[pre] && list[pre] <= "9") { continue } break
+ }; var count = parseInt(list.slice(0, pre).join(""))||1
+
+ function repeat(cb, count) { list = []
+ for (var i = 1; i <= count; i++) { if (cb(event, can, target, count)) { break } }
+ event.stopPropagation(), event.preventDefault()
+ // can.Status("按键", list.join(""))
+ }
+
+ var map = can.onkeypop._mode[mode]
+ var cb = map && map[event.key]; if (can.base.isFunc(cb) && event.key.length > 1) {
+ repeat(cb, count); return list
+ }
+ var cb = map && map[event.key.toLowerCase()]; if (can.base.isFunc(cb) && event.key.length > 1) {
+ repeat(cb, count); return list
+ }
+
+ var map = can.onkeypop._engine[mode]; for (var i = list.length-1; i > pre-1; i--) {
+ var cb = map[list[i]]; switch (typeof cb) {
+ case "function": repeat(cb, count); return list
+ case "object": map = cb; continue
+ case "string":
+ default: return list
+ }
+ }
+ return list
+ },
+ _mode: {
+ normal: {
+ j: function(event, can, target) { target.scrollBy(0, event.ctrlKey? 300: 30) },
+ k: function(event, can, target) { target.scrollBy(0, -30) },
+
+ b: function(event, can, target) { can.search(event, ["Header.onaction.black"]) },
+ w: function(event, can, target) { can.search(event, ["Header.onaction.white"]) },
+
+ s: function(event, can, target) { can.search(event, ["River.ondetail.添加应用"]) },
+ t: function(event, can, target) { can.search(event, ["River.ondetail.添加工具"]) },
+
+ " ": function(event, can, target) {
+ can.page.Select(can, document.body, "fieldset.panel.Header div.search input", function(target) {
+ target.focus()
+ })
+ },
+ enter: function(event, can, target) { can.misc.Log("enter") },
+ escape: function(event, can, target) {
+ can.search(event, ["Search.onaction.hide"])
+ can.misc.Log("enter")
+ },
+ },
+ insert: {
+ escape: function(event, can, target) {
+ target.blur()
+ },
+ jk: function(event, can, target) {
+ can.onkeypop.DelText(target, target.selectionStart-1, target.selectionStart)
+ target.blur()
+ },
+ enter: function(event, can, target) {
+ var his = target._history || []
+ his.push(target.value)
+
+ can.misc.Log("input", target, his)
+ target.setSelectionRange(0, -1)
+ target._current = his.length
+ target._history = his
+ },
+ },
+ insert_ctrl: {
+ p: function(event, can, target) {
+ var his = target._history||[]
+ var pos = target._current||0
+
+ pos = --pos % (his.length+1)
+ if (pos < 0) { pos = his.length}
+ target.value = his[pos]||""
+ can.misc.Log(pos, his)
+
+ target._current = pos
+ },
+ n: function(event, can, target) {
+ var his = target._history||[]
+ var pos = target._current||0
+
+ pos = ++pos % (his.length+1)
+ target.value = his[pos]||""
+ can.misc.Log(pos, his)
+
+ target._current = pos
+ },
+
+ u: function(event, can, target) {
+ can.onkeypop.DelText(target, 0, target.selectionEnd)
+ },
+ k: function(event, can, target) {
+ can.onkeypop.DelText(target, target.selectionStart)
+ },
+ h: function(event, can, target) {
+ can.onkeypop.DelText(target, target.selectionStart-1, target.selectionStart)
+ },
+ d: function(event, can, target) {
+ can.onkeypop.DelText(target, 0, target.selectionStart)
+ },
+ w: function(event, can, target) {
+ 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.onkeypop.DelText(target, i+1, end-i)
+ },
+ },
+ }, _engine: {},
+
+ DelText: function(target, start, count) {
+ target.value = target.value.substring(0, start)+target.value.substring(start+(count||target.value.length), target.value.length)
+ target.setSelectionRange(start, start)
+ },
+ input: function(event, can) { var target = event.target
+ target._keys = can.onkeypop._parse(event, can, event.ctrlKey? "insert_ctrl": "insert", target._keys||[], target)
+ if (target._keys.length == 0) { event.stopPropagation(), event.preventDefault() }
+ },
})
diff --git a/lib/base.js b/lib/base.js
index f04e0c84..2e2761eb 100644
--- a/lib/base.js
+++ b/lib/base.js
@@ -1,6 +1,7 @@
Volcanos("base", {help: "数据类型",
- isFunc: function(cb) { return typeof cb == "function" },
- Int: function(value, def) { return parseInt(value)||def||0 },
+ Int: function(value, def) {
+ return parseInt(value)||def||0
+ },
Obj: function(value, def) {
try {
return (typeof value == "string" && value != ""? JSON.parse(value): value) || def || {}
@@ -9,8 +10,7 @@ Volcanos("base", {help: "数据类型",
}
},
Copy: function(to, from, fields) {
- var list = []
- for (var i = 2; i < arguments.length; i++) {
+ var list = []; for (var i = 2; i < arguments.length; i++) {
list.push(arguments[i])
}
@@ -18,24 +18,26 @@ Volcanos("base", {help: "数据类型",
to[list[i]] = from[list[i]]
}
},
- Eq: function(obj, other) { var self = arguments.callee
- if (typeof obj != typeof other) { return false }
+ Eq: function(to, from) { var self = arguments.callee
+ if (typeof to != typeof from) { return false }
- if (typeof obj == "object") {
- if (obj.length != other.length) { return false }
- for (var i = 0; i < obj.length; i++) {
- if (!self(obj[i], other[i])) { return false }
+ if (typeof to == "object") {
+ if (to.length != from.length) { return false }
+ for (var i = 0; i < to.length; i++) {
+ if (!self(to[i], from[i])) { return false }
}
- for (var k in obj) {
- if (!self(obj[k], other[k])) { return false }
+ for (var k in to) {
+ if (!self(to[k], from[k])) { return false }
}
return true
}
- return obj === other
+ return to === from
},
- Ext: function(file) { return (file.split("/").pop().split(".").pop()).toLowerCase() },
+ Ext: function(file) {
+ return (file.split("/").pop().split(".").pop()).toLowerCase()
+ },
Path: function() { var res = ""
for (var i = 0; i < arguments.length; i++) {
res += (arguments[i][0]=="/" || res=="" || res[res.length-1]=="/"? "": "/") + arguments[i].trim()
@@ -56,21 +58,20 @@ Volcanos("base", {help: "数据类型",
})
for (var i = 1; i < arguments.length; i++) {
switch (typeof arguments[i]) {
+ case "string":
+ args[arguments[i]] = arguments[i+1], i++
+ break
case "object":
if (arguments[i].length > 0) {
for (var j = 0; j < arguments[i].length; j += 2) {
args[arguments[i][j]] = arguments[i][j]
}
- break
- }
- for (var k in arguments[i]) {
- args[k] = arguments[i][k]
+ } else {
+ for (var k in arguments[i]) {
+ args[k] = arguments[i][k]
+ }
}
break
- case "string":
- args[arguments[i]] = arguments[i+1]
- i++
- break
}
}
var list = []; for (var k in args) {
@@ -79,6 +80,45 @@ Volcanos("base", {help: "数据类型",
return url.split("?")[0]+(list.length>0? "?"+list.join("&"): "")
},
+ Size: function(size) {size = parseInt(size)
+ if (size > 1000000000) {
+ return parseInt(size / 1000000000) + "." + parseInt(size / 10000000 % 100) + "G"
+ }
+ if (size > 1000000) {
+ return parseInt(size / 1000000) + "." + parseInt(size / 10000 % 100) + "M"
+ }
+ if (size > 1000) {
+ return parseInt(size / 1000) + "." + parseInt(size / 10 % 100) + "K"
+ }
+ return size + "B"
+ },
+ Number: function(d, n) { var result = []
+ while (d > 0) { result.push(d % 10); d = parseInt(d / 10); n-- }
+ while (n > 0) { result.push("0"); n-- }
+ return result.reverse(), result.join("")
+ },
+ Format: function(obj) {
+ return JSON.stringify(obj)
+ },
+ Simple: function() { var res = []
+ for (var i = 0; i < arguments.length; i++) {
+ var arg = arguments[i]; switch (typeof arguments[i]) {
+ case "number": res.push(arg); break
+ case "string": res.push(arg); break
+ case "object":
+ if (arg.length > 0) {
+ res = res.concat(arg)
+ } else {
+ for (var k in arg) { res.push(k, arg[k]) }
+ }
+ }
+ }
+ return res
+ },
+ AddUniq: function(list, value) { list = list || []
+ return list.indexOf(value) > -1 && list.push(value), list
+ },
+
Date: function(time) { var now = new Date()
if (typeof time == "string" && time != "") { var ls = time.split(" ")
var vs = ls[0].split("-")
@@ -95,7 +135,7 @@ Volcanos("base", {help: "数据类型",
}
return now
},
- Time: shy("时间格式化", function(time, fmt) { var now = this.Date(time)
+ Time: function(time, fmt) { var now = this.Date(time)
var list = ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]
fmt = fmt || "%y-%m-%d %H:%M:%S"
fmt = fmt.replace("%y", now.getFullYear())
@@ -106,7 +146,10 @@ Volcanos("base", {help: "数据类型",
fmt = fmt.replace("%M", this.Number(now.getMinutes(), 2))
fmt = fmt.replace("%S", this.Number(now.getSeconds(), 2))
return fmt
- }),
+ },
+ TimeAdd: function(t, d) {
+ return new Date(t - t%(24*3600*1000) - 8*3600*1000 + d*24*3600*1000)
+ },
Duration: function(n) { var res = "", h = 0
h = parseInt(n/3600000/24), h > 0 && (res += h+"d"), n = n % (3600000*24)
h = parseInt(n/3600000), h > 0 && (res += h+"h"), n = n % 3600000
@@ -114,40 +157,22 @@ Volcanos("base", {help: "数据类型",
h = parseInt(n/1000), h > 0 && (res += h), n = n % 1000
return res + (n > 0? "."+parseInt(n/10): "") + "s"
},
- Format: shy("数据格式化", function(obj) { return JSON.stringify(obj) }),
- Simple: function() { var res = []
- for (var i = 0; i < arguments.length; i++) {
- var arg = arguments[i]; switch (typeof arguments[i]) {
- case "number": res.push(arg); break
- case "string": res.push(arg); break
- case "object":
- if (arg.length > 0) {
- res = res.concat(arg)
- } else {
- for (var k in arg) { res.push(k, arg[k]) }
- }
- }
- }
- return res
- },
- Number: shy("数字格式化", function(d, n) { var result = []
- while (d > 0) { result.push(d % 10); d = parseInt(d / 10); n-- }
- while (n > 0) { result.push("0"); n-- }
- return result.reverse(), result.join("")
- }),
- Size: function(size) {size = parseInt(size)
- if (size > 1000000000) {
- return parseInt(size / 1000000000) + "." + parseInt(size / 10000000 % 100) + "G"
- }
- if (size > 1000000) {
- return parseInt(size / 1000000) + "." + parseInt(size / 10000 % 100) + "M"
- }
- if (size > 1000) {
- return parseInt(size / 1000) + "." + parseInt(size / 10 % 100) + "K"
- }
- return size + "B"
- },
+ parseSize: function(size) { size = size.toLowerCase()
+ if (size.endsWith("tb") || size.endsWith("t")) {
+ return parseInt(size) * 1024 * 1024 * 1024 * 1024
+ }
+ if (size.endsWith("gb") || size.endsWith("g")) {
+ return parseInt(size) * 1024 * 1024 * 1024
+ }
+ if (size.endsWith("mb") || size.endsWith("m")) {
+ return parseInt(size) * 1024 * 1024
+ }
+ if (size.endsWith("kb") || size.endsWith("k")) {
+ return parseInt(size) * 1024
+ }
+ return parseInt(size)
+ },
parseJSON: function(str) { var res
if (typeof str == "object") { return str }
if (str.indexOf("http") == 0) { var ls = str.split("?")
@@ -166,54 +191,11 @@ Volcanos("base", {help: "数据类型",
}
return res
},
- parseSize: function(size) { size = size.toLowerCase()
- if (size.endsWith("tb") || size.endsWith("t")) {
- return parseInt(size) * 1024 * 1024 * 1024 * 1024
- }
- if (size.endsWith("gb") || size.endsWith("g")) {
- return parseInt(size) * 1024 * 1024 * 1024
- }
- if (size.endsWith("mb") || size.endsWith("m")) {
- return parseInt(size) * 1024 * 1024
- }
- if (size.endsWith("kb") || size.endsWith("k")) {
- return parseInt(size) * 1024
- }
- return parseInt(size)
- },
isNight: function() { var now = new Date()
return now.getHours() < 7 || now.getHours() > 17
},
- TimeAdd: shy("时间格式化", function(t, d) {
- return new Date(t - t%(24*3600*1000) - 8*3600*1000 + d*24*3600*1000)
- }),
-
- Debug: function() {
- var args = [this.Time(null, "%H:%M:%S"), this.FileLine(2, 3), "debug"]
- for (var i in arguments) { args.push(arguments[i]) }
- args.push(this.fileLine(2, 3))
- console.log.apply(console, args)
- },
- Warn: function() {
- var args = [this.Time(null, "%H:%M:%S"), this.FileLine(2, 3), "warn"]
- for (var i in arguments) { args.push(arguments[i]) }
- args.push("\n", this._fileLine().split("\n").slice(2).join("\n"))
- console.log.apply(console, args)
- },
- Log: function() {
- var args = [this.Time(null, "%H:%M:%S"), this.FileLine(2, 3)]
- for (var i in arguments) { args.push(arguments[i]) }
- console.log.apply(console, args)
- },
- FileLine: function(depth, length) {
- return this.fileLine(depth+1).split("/").slice(3).slice(-length).join("/").split(")")[0]
- },
- fileLine: function(depth) {
- return (this._fileLine().split("\n")[1+depth]||"").trim()
- },
- _fileLine: function() { var obj = {}
- Error.captureStackTrace && Error.captureStackTrace(obj, arguments.callee)
- return obj.stack || ""
+ isFunc: function(cb) {
+ return typeof cb == "function"
},
})
diff --git a/lib/core.js b/lib/core.js
index 366216f2..180dda4c 100644
--- a/lib/core.js
+++ b/lib/core.js
@@ -1,150 +1,14 @@
Volcanos("core", {help: "数据结构",
- Split: shy("分词器", function(str) { if (!str || !str.length) { return [] }
- var opt = {detail: false}, arg = []; for (var i = 1; i < arguments.length; i++) {
- typeof arguments[i] == "object"? opt = arguments[i]: arg.push(arguments[i])
- }
-
- function _list(str) { var res = {}; for (var i = 0; i < str.length; i++) { res[str[i]] = true }; return res }
- // 空白符
- var seps = _list(arg[0]||"\t ,\n")
- // 分隔符
- var sups = _list(arg[1]||"{[(.:)]}")
- // 引用符
- var subs = _list(arg[2]||"'\"`")
-
- // 开始分词
- var res = [], list = str
- var left = "", space = true, begin = 0
- for (var i = 0; i < list.length; i++) {
- if (seps[list[i]]) {
- // 空白符
- if (left == "") {
- if (!space) {
- res.push(list.slice(begin, i))
- }
- opt.detail && res.push({text: list.slice(i, i+1), type: "space", left: left})
- space = true, begin = i+1
- }
- } else if (subs[list[i]]) {
- // 引用符
- if (left == "") {
- left = list[i], space = false, begin = i+1
- } else if (left == list[i]) {
- res.push({text: list.slice(begin, i), type: "string", left: left, right: left})
- left = "", space = true, begin = i+1
- }
- } else if (sups[list[i]]) {
- // 分隔符
- if (left == "") {
- if (!space) {
- res.push(list.slice(begin, i))
- }
- res.push(list.slice(i, i+1))
- space = true, begin = i+1
- }
- } else if (list[0] == '\\') {
- // 转义符
- for (var i = i; i < list.length-1; i++) {
- list[i] = list[i+1]
- }
- list = list.slice(0, list.length-1)
- space = false
- } else {
- space = false
- }
- }
-
- // 末尾字符
- if (left != "") {
- res.push({text: list.slice(begin), type: "string", left: left, right: ""})
- } else if (begin < list.length) {
- res.push(list.slice(begin))
- }
- return res
- }),
- Timer: shy("定时器, value, [1,2,3,4], {interval, 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.interval||interval[i], i, interval)?
- typeof cbs == "function" && cbs(timer, interval): setTimeout(function() { loop(timer, i+1) }, interval.interval||interval[i+1])
- }
- if (interval.interval == 0) { cb(); return timer }
- setTimeout(function() { loop(timer, 0) }, interval.interval||interval[0])
- return timer
- }),
- Delay: shy("延时器", function(list, interval, cb, cbs) {
- list.push(cb); this.Timer(interval, function() {
- var cb = list.pop(); list.length = 0
- typeof cb == "function" && cb()
- }, cbs)
- }),
-
- Items: shy("迭代器", function(obj, cb) { var list = []
- for (var key in obj) {
- list = list.concat(this.List(obj[key], function(value, index, array) {
- return typeof cb == "function" && cb(value, index, key, obj)
- }))
- }
- return list
- }),
- Item: shy("迭代器", function(obj, cb) { var list = []
- for (var k in obj) {
- var res = typeof cb == "function"? cb(k, obj[k]): k
- res && list.push(res)
- }
- return list
- }),
- List: shy("迭代器", function(obj, cb, interval, cbs) {
- if (typeof obj == "number") {
- var begin = 0, end = obj, step = 1
- if (typeof interval == "number") {
- step = interval
- }
- if (typeof cb == "number") {
- begin = obj, end = cb
- }
-
- var list = []
- for (var i = begin; i < end; i += step) {
- list.push(i)
- }
- return list
- }
-
- obj = typeof obj == "string"? [obj]: (obj || [])
- if (interval > 0) {
- function loop(i) { if (i >= obj.length) { return typeof cbs == "function" && cbs(obj) }
- typeof cb == "function" && cb(obj[i], i, obj), setTimeout(function() { loop(i+1) }, interval)
- }
- obj.length > 0 && setTimeout(function() { loop(0) }, interval/4)
- return obj
- }
-
- var list = [], res
- for (var i = 0; i < obj.length; i++) {
- typeof cb == "function"? (res = cb(obj[i], i, obj)) != undefined && list.push(res): list.push(obj[i])
- }
- return list
- }),
- Next: shy("迭代器", function(obj, cb, cbs) { obj = typeof obj == "string"? [obj]: (obj || [])
- function next(list, cb, index) {
- list && list.length > 0? typeof cb == "function" && cb(list[0], function() {
- list.length > 0 && next(list.slice(1), cb, index+1)
- }, index, obj): typeof cbs == "function" && cbs()
- }
- next(obj, cb, 0)
- }),
-
- Keys: shy("生成器", function() { var list = []
+ Keys: shy("连接器", function() { var list = []
for (var i = 0; i < arguments.length; i++) { var v = arguments[i]
switch (typeof v) {
- case "number": list.push(v+""); break
- case "string": list.push(v); break
- case "object": list.push(arguments.callee.apply(this, v)); break
- case "function": list.push(v()); break
+ case "object":
+ for (var j = 0; j < v.length; j++) {
+ // list.push(arguments.callee.apply({}, v[j]))
+ list.push(v[j])
+ }
+ break
+ case "function": v = v()
default: v && list.push(v+"")
}
}
@@ -153,6 +17,7 @@ Volcanos("core", {help: "数据结构",
Value: shy("存储器", function(data, key, value) {
if (data == undefined) { return }
if (key == undefined) { return data }
+
if (typeof key == "object") { for (var k in key) {
arguments.callee.call(this, data, k, key[k])
}; return data }
@@ -165,17 +30,65 @@ Volcanos("core", {help: "数据结构",
p = p[ls[0]], ls = ls.slice(1)
}; return p
}),
- CallFunc: shy("调用器", function(func, args, mod) { args = args||{}
- var can = args["can"]||args[0], msg = args["msg"]||args[1]
- var cmds = args["cmds"]||[]
+ Split: shy("分词器", function(str) { if (!str || !str.length) { return [] }
+ var opt = {detail: false}, arg = []; for (var i = 1; i < arguments.length; i++) {
+ typeof arguments[i] == "object"? opt = arguments[i]: arg.push(arguments[i])
+ }
+ // 字符定义
+ function _list(str) { var res = {}; for (var i = 0; i < str.length; i++) { res[str[i]] = true }; return res }
+ var soos = _list("\\") // 转义符
+ var seps = _list(arg[0]||"\t ,;\n") // 空白符
+ var subs = _list(arg[1]||"{[(.:)]}") // 分隔符
+ var sups = _list(arg[2]||"'\"`") // 引用符
+
+ var res = [], begin = 0; function push(obj) {
+ obj != "" && res.push(typeof obj == "string" || opt.detail? obj: obj.text), begin = -1
+ }
+
+ // 开始分词
+ for (var s = "", i = 0; i < str.length; i++) {
+ if (soos[str[i]]) { // 转义符
+ begin == -1 && (begin = i++)
+
+ } else if (seps[str[i]]) { // 空白符
+ if (s) { continue }
+ begin > -1 && push(str.slice(begin, i))
+ opt.detail && push({type: "space", text: str.slice(i, i+1)})
+
+ } else if (subs[str[i]]) { // 分隔符
+ if (s) { continue }
+ begin > -1 && push(str.slice(begin, i))
+ push(str.slice(i, i+1))
+
+ } else if (sups[str[i]]) { // 引用符
+ if (s == "") {
+ s = str[i], begin = i+1
+ } else if (s == str[i]) {
+ push({type: "string", text: str.slice(begin, i), left: s, right: str[i]})
+ s = "", begin = -1
+ }
+
+ } else { // 普通符
+ begin == -1 && (begin = i)
+ }
+ }
+
+ // 剩余字符
+ begin > 0 && (s? push({type: "string", text: str.slice(begin), left: s, right: ""})
+ : push(str.slice(begin)))
+
+ return res
+ }),
+ CallFunc: shy("调用器", function(func, args, mod) { args = args || {}
func = typeof func == "function"? func: typeof func == "string"? this.Value(mod||can, func):
- typeof func == "object" && func.slice? this.Value(func[0], this.Keys(func.slice(1))): null
+ typeof func == "object" && func.length > 0? this.Value(func[0], this.Keys(func.slice(1))): null
if (typeof func != "function") { return }
- var cb = args["cb"]
- var ls = func.toString().split(")")[0].split("(")[1].split(",")
- var list = [], echo = false; this.List(ls, function(item, index) { item = item.trim()
+ var can = args["can"]||args[0], msg = args["msg"]||args[1], cmds = args["cmds"]||[]
+
+ var list = [], echo = false, cb = args["cb"]
+ this.List(func.toString().split(")")[0].split("(")[1].split(","), function(item, index) { item = item.trim()
list.push(args[item] || msg&&msg.Option&&msg.Option(item) || can&&can.Conf&&can.Conf(item) || cmds[index] || args[index] || null)
if (item == "cb") { echo = true }
})
@@ -184,5 +97,78 @@ Volcanos("core", {help: "数据结构",
if (!echo && typeof cb == "function") { res && msg.Echo(res), arguments.callee.apply(this, [cb, {msg: msg, res: res}]) }
return res
}),
+
+ List: shy("迭代器", function(list, cb, interval, cbs) { list = list || []
+ if (typeof list == "string") { // 默认序列
+ list = [list]
+
+ } else if (typeof list == "number") { // 等差序列
+ var begin = 0, end = list, step = typeof interval == "number"? interval: 1
+ if (typeof cb == "number") { begin = list, end = cb, cb = null }
+
+ list = []; for (var i = begin; i < end; i += step) {
+ list.push(i)
+ }
+ }
+
+ if (interval > 0) { // 时间序列
+ function loop(i) { if (i >= list.length) { return typeof cbs == "function" && cbs(list) }
+ cb(list[i], i, list), setTimeout(function() { loop(i+1) }, interval)
+ }
+ typeof cb == "function" && list.length > 0 && setTimeout(function() { loop(0) }, interval/4)
+
+ } else { // 选择序列
+ var slice = [], res
+ for (var i = 0; i < list.length; i++) {
+ typeof cb == "function" && (res = cb(list[i], i, list)) != undefined? slice.push(res): slice.push(list[i])
+ }
+ list = slice
+ }
+
+ return list
+ }),
+ Next: shy("迭代器", function(list, cb, cbs) {
+ function next(i) {
+ i < list.length? cb(list[i], function(skip) {
+ next(i+1+(skip||0))
+ }, i, list): typeof cbs == "function" && cbs(list)
+ }
+
+ list = typeof list == "object"? list: [list]
+ list && list.length > 0 && typeof cb == "function"? next(0): typeof cbs == "function" && cbs(list)
+ }),
+ Timer: shy("定时器, value, [1,2,3,4], {interval, length}", function(interval, cb, cbs) {
+ var timer = {stop: false}; function loop(i) {
+ timer.stop || i >= interval.length && interval.length >= 0 || cb(timer, interval.interval||interval[i], i, interval)?
+ typeof cbs == "function" && cbs(timer, interval): setTimeout(function() { loop(i+1) }, interval.interval||interval[i+1])
+ }
+
+ interval = typeof interval == "object"? interval: [interval]
+ if (interval.interval == 0) { cb(); return timer }
+
+ typeof cb == "function" && setTimeout(function() { loop(0) }, interval.interval||interval[0])
+ return timer
+ }),
+ Delay: shy("延时器", function(list, interval, cb, cbs) {
+ list.push(cb); this.Timer(interval, function() {
+ var cb = list.pop(); list.length = 0
+ typeof cb == "function" && cb()
+ }, cbs)
+ }),
+ Items: shy("迭代器", function(obj, cb) { var list = []
+ for (var k in obj) {
+ list = list.concat(this.List(obj[k], function(v, i) {
+ return typeof cb == "function" && cb(v, i, k, obj)
+ }))
+ }
+ 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 != undefined && list.push(res)
+ }
+ return list
+ }),
})
diff --git a/lib/misc.js b/lib/misc.js
index 5cad022a..736a360a 100644
--- a/lib/misc.js
+++ b/lib/misc.js
@@ -4,36 +4,38 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var 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)
- return msg[key] = can.core.List(arguments).slice(1), val
+ return msg.option = can.base.AddUniq(msg.option, key), msg[key] = can.core.List(arguments).slice(1), 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)
- return msg[key] = can.core.List(arguments).slice(1), val
+ return msg.append = can.base.AddUniq(msg.append, key), msg[key] = can.core.List(arguments).slice(1), val
},
Result: function() { return msg.result && msg.result.join("") || "" },
- Table: function(cb) { if (!msg.append || msg.append.length == 0 || !msg[msg.append[0]]) { return }
+ Length: function() {
+ 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 len
+ },
+ Table: function(cb) { if (!msg.append || msg.append.length == 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]||"") })
- return typeof cb == "function" && (res = cb(one, index, array)) && res != undefined && res || one
+ return can.base.isFunc(cb) && (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] = []
- }
- },
+ 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) {
@@ -44,7 +46,7 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg
})
return msg
},
- Push: function(key, value, detail) { msg.append = msg.append || []
+ Push: function(key, value, detail) {
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]||""):
@@ -53,11 +55,7 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg
return msg
}
- for (var i = 0; i < msg.append.length; i++) {
- if (msg.append[i] == key) { break }
- }; i >= msg.append.length && msg.append.push(key)
-
- msg[key] = msg[key] || []
+ msg.append = can.base.AddUniq(msg.append, key), msg[key] = msg[key] || []
msg[key].push(typeof value == "string" || typeof value == "function"? value: JSON.stringify(value))
return msg
},
@@ -65,17 +63,12 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg
for (var i = 0; i < arguments.length; i++) { msg.result.push(arguments[i]) }
return msg._hand = true, msg
},
- Length: function() {
- return msg.append && msg.append[0] && msg[msg.append[0]] && msg[msg.append[0]].length || 0
- },
- }
-
- for (var k in proto) { msg[k] = proto[k] }
+ }; msg.__proto__ = proto
return msg
},
- POST: shy("请求后端", {order: 0}, function(can, msg, url, form, cb) {
+ POST: function(can, msg, url, form, cb) {
var xhr = new XMLHttpRequest(); msg._xhr = xhr
- xhr.open("POST", url), xhr.onreadystatechange = function() {
+ xhr.open(msg._method||"POST", url), xhr.onreadystatechange = function() {
if (xhr.readyState != 4) { return }
try { // 解析响应
@@ -83,17 +76,16 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg
} catch (e) {
var res = {"result": [xhr.responseText]}
}
- xhr.status == 200 && typeof cb == "function" && cb(msg.Copy(res))
+ xhr.status == 200 && can.base.isFunc(cb) && cb(msg.Copy(res))
}
- if (msg.upload) { // 上传文件
- var data = new FormData()
- can.core.Items(form, function(value, index, key) {
+ if (msg._upload) { // 上传文件
+ var data = new FormData(); can.core.Items(form, function(value, index, key) {
data.append(key, value)
- }), data.append("upload", msg.upload)
+ }), data.append("upload", msg._upload)
xhr.upload.onprogress = function(event) {
- typeof msg._progress == "function" && msg._progress(event, parseInt(event.loaded*100/event.total), event.total, event.loaded)
+ can.base.isFunc(msg._progress) && msg._progress(event, parseInt(event.loaded*100/event.total), event.total, event.loaded)
}
} else { // 请求数据
var data = can.core.Items(form, function(value, index, key) {
@@ -105,48 +97,32 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg
// 发送请求
xhr.setRequestHeader("Accept", "application/json")
- try { xhr.send(data) } catch(e) { can.base.Log(e) }
- }),
- Runs: shy("请求后端", {order: 0}, function(event, can, dataset, cmds, cb) {
- var key = dataset.names+"."+cmds.join(",")
- if (can.user.isLocalFile) { var msg = can.request(event); msg.Clear("append")
- var res = Volcanos.meta.pack[key]; res? msg.Copy(res): can.user.toast(can, "缺失数据")
- return typeof cb == "function" && cb(msg)
- }
- can.misc.Run(event, can, dataset, cmds, function(msg) {
- Volcanos.meta.pack[key] = msg
- typeof cb == "function" && cb(msg)
- })
- }),
- Run: shy("请求后端", {order: 0}, function(event, can, dataset, cmds, cb) {
- var msg = can.request(event = event || {})
- var form = {cmds: cmds||msg.cmd}
- msg.option && msg.option.forEach(function(item) {
+ try { xhr.send(data) } catch(e) { can.misc.Log(e) }
+ },
+ Run: function(event, can, dataset, cmds, cb) {
+ var msg = can.request(event||{})
+ var form = {cmds: cmds||msg.cmd}; msg.option && msg.option.forEach(function(item) {
msg[item] && (form[item] = msg[item])
})
- can.misc.POST(can, msg, can.base.MergeURL(
- (can.Conf("iceberg")||"/chat/")+dataset.names.toLowerCase(),
- "_", (msg._can.sup||msg._can)._name,
- "_daemon", dataset.daemon,
- ), form, function(msg) {
- typeof cb == "function" && cb(msg)
- })
- }),
- WSS: shy("请求后端", {order: 0}, function(can, args, cb, onopen, onclose, onerror) {
+ can.misc.POST(can, msg, can.base.MergeURL(dataset.names.toLowerCase(),
+ "_", (msg._can.sup||msg._can)._name, "_daemon", dataset.daemon,
+ ), form, cb)
+ },
+ WSS: function(can, args, cb, onopen, onclose, onerror) {
var url = location.protocol.replace("http", "ws")+"//"+location.host+"/space/"
if (url.indexOf("chrome") == 0) { url = "ws://localhost:9020/space/" }
var socket = new WebSocket(can.base.MergeURL(url, args))
- socket.onclose = function() { can.base.Log("wss", "close", args)
- typeof onclose == "function"? onclose(socket): can.core.Timer(1000, function() {
+ socket.onclose = function() { can.misc.Log("wss", "close", args)
+ can.base.isFunc(onclose)? onclose(socket): can.core.Timer(1000, function() {
can.misc.WSS(can, args, cb, onopen, onerror, onclose)
})
- }, socket.onerror = function() { can.base.Log("wss", "error", args)
- typeof onerror == "function"? onerror(socket): socket.close()
+ }, socket.onerror = function() { can.misc.Log("wss", "error", args)
+ can.base.isFunc(onerror)? onerror(socket): socket.close()
- }, socket.onopen = function() { can.base.Log("wss", "open", args)
- typeof onopen == "function" && onopen(socket)
+ }, socket.onopen = function() { can.misc.Log("wss", "open", args)
+ can.base.isFunc(onopen) && onopen(socket)
}
socket.onmessage = function(event) {
@@ -164,18 +140,49 @@ Volcanos("misc", {help: "工具模块", Message: function(event, can) { var msg
delete(msg._event)
msg.Option("_handle", true)
msg.Option("_target", msg.Option("_source"))
- can.base.Log("wss", "result", msg.result, msg)
+ can.misc.Log("wss", "result", msg.result, msg)
socket.send(JSON.stringify(msg))
}, msg.detail = data.detail, msg.Copy(data)
- try { // 执行命令
- can.base.Log("wss", "detail", msg.detail, msg)
- typeof cb == "function" && cb(event, msg, msg.detail[0], msg.detail.slice(1))
+ // 执行命令
+ try { can.misc.Log("wss", "detail", msg.detail, msg)
+ can.isFunc(cb) && cb(event, msg, msg.detail[0], msg.detail.slice(1))
} catch (e) { // 执行失败
- can.base.Log(e)
- msg.Reply(e)
+ can.misc.Log(e), msg.Reply(e)
}
}
- }),
+ },
+
+ Log: function() {
+ var args = [this._time(), this.FileLine(2, 3)]
+ for (var i in arguments) { args.push(arguments[i]) }
+ console.log.apply(console, args)
+ },
+ Warn: function() {
+ var args = [this._time(), this.FileLine(2, 3), "warn"]
+ for (var i in arguments) { args.push(arguments[i]) }
+ args.push("\n", this._fileLine().split("\n").slice(2).join("\n"))
+ console.log.apply(console, args)
+ },
+ Debug: function() {
+ var args = [this._time(), this.FileLine(2, 3), "debug"]
+ for (var i in arguments) { args.push(arguments[i]) }
+ args.push(this.fileLine(2, 3))
+ console.log.apply(console, args)
+ navigator.userAgent.indexOf("Mobile") > -1 && alert(JSON.stringify(args.join(" ")))
+ },
+ FileLine: function(depth, length) {
+ return this.fileLine(depth+1).split("/").slice(3).slice(-length).join("/").split(")")[0]
+ },
+ fileLine: function(depth) {
+ return (this._fileLine().split("\n")[1+depth]||"").trim()
+ },
+ _fileLine: function() { var obj = {}
+ Error.captureStackTrace && Error.captureStackTrace(obj, arguments.callee)
+ return obj.stack || ""
+ },
+ _time: function() { var now = new Date()
+ return now.getHours()+":"+now.getMinutes()+":"+now.getSeconds()
+ },
})
diff --git a/lib/page.js b/lib/page.js
index 92babfed..c2921f3a 100644
--- a/lib/page.js
+++ b/lib/page.js
@@ -1,51 +1,40 @@
-Volcanos("page", {help: "网页模块",
- ClassList: {
- has: function(can, obj, key) {var list = obj.className? obj.className.split(" "): []
- for (var i = 2; i < arguments.length; i++) {
- if (list.indexOf(arguments[i]) == -1) {return false}
- }
- return true
+Volcanos("page", {help: "网页模块", ClassList: {
+ has: function(can, obj, key) { var list = obj.className? obj.className.split(" "): []
+ return list.indexOf(key) > -1
},
- add: function(can, obj, key) {var list = obj.className? obj.className.split(" "): []
- return obj.className = list.concat(can.core.List(key, function(value, index) {
- return list.indexOf(value) == -1? value: undefined
- })).join(" ").trim()
+ add: function(can, obj, key) { var list = obj.className? obj.className.split(" "): []
+ return obj.className = can.base.AddUniq(list, key).join(" ").trim()
},
- del: function(can, obj, key) {var list = can.core.List(arguments, function(value, index) {return index > 0? value: undefined})
- return obj.className = can.core.List(obj.className.split(" "), function(value) {
- return list.indexOf(value) == -1? value: undefined
+ del: function(can, obj, key) { var list = obj.className? obj.className.split(" "): []
+ return obj.className = can.core.List(list, function(value) {
+ return value == key? undefined: value
}).join(" ").trim()
},
set: function(can, obj, key, condition) {
- condition? can.page.ClassList.add(can, obj, key): can.page.ClassList.del(can, obj, key)
+ condition? this.add(can, obj, key): this.del(can, obj, key)
},
neg: function(can, obj, key) {
this.has(can, obj, key)? this.del(can, obj, key): this.add(can, obj, key)
},
},
-
- Select: shy("选择节点", function(can, obj, key, cb, interval, cbs) {if (key == ".") {return []}
- var item = obj && obj.querySelectorAll(key)
- return can.core.List(item, cb, interval, cbs)
+ Select: shy("选择节点", function(can, target, key, cb, interval, cbs) { if (key == ".") { return [] }
+ return can.core.List(target && target.querySelectorAll(key), cb, interval, cbs)
}),
Modify: shy("修改节点", function(can, target, value) { target = target || {}
target = typeof target == "string"? document.querySelector(target): target
- typeof value == "string"? (target.innerHTML = value): can.core.Item(value, function(key, value) {
- typeof value != "object"? (target[key] = value): can.core.Item(value, function(sub, value) {
+ typeof value == "string"? (target.innerHTML = value): can.core.Item(value, function(key, val) {
+ typeof val != "object"? (target[key] = val): can.core.Item(val, function(k, v) {
var size = {
"width": true, "max-width": true, "min-width": true,
"height": true, "max-height": true, "min-height": true,
"left": true, "right": true, "top": true, "bottom": true,
"margin-top": true, "margin-left": true,
+ }; if (size[k] && parseInt(v) < 0) { return target[key] && (target[key][k] = "") }
+
+ if (size[k] && v && (typeof v == "number" || v.indexOf && v.indexOf("px") == -1)) {
+ v += "px"
}
- if (parseInt(value) < 0 && sub == "height") {
- target[key] && (target[key][sub] = "")
- return
- }
- if (size[sub] && value && (typeof value == "number" || value.indexOf && value.indexOf("px") == -1)) {
- value += "px"
- }
- target[key] && (target[key][sub] = value)
+ target[key] && (target[key][k] = v)
})
})
return target
@@ -53,6 +42,9 @@ Volcanos("page", {help: "网页模块",
Create: shy("创建节点", function(can, key, value) {
return can.page.Modify(can, document.createElement(key), value)
}),
+ Remove: shy("删除节点", function(can, target) {
+ target && target.parentNode && target.parentNode.removeChild(target)
+ }),
Append: shy("添加节点", function(can, target, key, value) {
if (typeof key == "string") { var res = can.page.Create(can, key, value); return target.appendChild(res), res }
@@ -68,61 +60,50 @@ Volcanos("page", {help: "网页模块",
// 数据调整
can.core.Item(item, function(key, value) {
switch (key) {
- case "type":
- case "name":
- case "data":
- case "list":
- break
- case "click":
- data.onclick = item.click
- break
- case "inner":
- data.innerHTML = item.inner
- break
- default:
- data[key] = item[key]
+ case "type": break
+ case "name": break
+ case "data": break
+ case "list": break
+ case "inner": data.innerHTML = item.inner; break
+ case "click": data.onclick = item.click; break
+ default: data[key] = item[key]
}
})
if (item.view) { var list = can.core.List(item.view)
list.length > 0 && list[0] && can.page.ClassList.add(can, data, list[0])
type = list[1] || "div"
- data.innerHTML = can.user.trans(can, list[2]) || data.innerHTML || ""
+ data.innerHTML = list[2] || data.innerHTML || ""
name = name || list[3] || ""
} else if (item.text) { var list = can.core.List(item.text)
data.innerHTML = list[0] || data.innerHTML || ""
type = list[1] || "span"
- list.length > 2 && list[2] && can.page.ClassList.add(can, data, list[2])
+ list[2] && can.page.ClassList.add(can, data, list[2])
} else if (item.button) { var list = can.core.List(item.button)
type = "button", name = name || list[0]
data.innerText = can.user.trans(can, list[0]), data.onclick = function(event) {
typeof list[1] == "function" && list[1](event, name)
- event.stopPropagation()
- event.preventDefault()
+ event.stopPropagation(), event.preventDefault()
return true
}
} else if (item.select) { var list = item.select
- type = "select", name = name || list[0][0]
- data.onchange = function(event) {
- typeof list[1] == "function" && list[1](event, event.target.value, name)
- }
+ type = "select", data.name = name = name || list[0][0]
+ data.title = can.user.trans(can, data.title || name)
+ data.className = data.className || list[0][0] || ""
+
item.list = list[0].slice(1).map(function(value) {
return {type: "option", value: value, inner: can.user.trans(can, value)}
})
- data.className = data.className || list[0][0] || ""
- data.title = can.user.trans(can, data.title || name)
- data.name = name
+ data.onchange = function(event) {
+ typeof list[1] == "function" && list[1](event, event.target.value, name)
+ }
} else if (item.input) { var list = can.core.List(item.input)
- type = "input", name = name || list[0] || ""
- data.name = data.name || name
+ type = "input", name = name || list[0] || "", data.name = data.name || name
data.className = data.className || data.name
- data.placeholder = data.placeholder || data.name
- data.placeholder = data.placeholder.split(".").pop()
- data.title = data.title || data.placeholder
data.autocomplete = "off"
data.onfocus = data.onfocus || function(event) {
@@ -135,96 +116,80 @@ Volcanos("page", {help: "网页模块",
typeof list[2] == "function" && list[2](event)
}
} else if (item.username) { var list = can.core.List(item.username)
- type = "input", name = name || list[0] || "username"
- data.name = data.name || name
+ type = "input", name = name || list[0] || "username", data.name = data.name || name
data.className = list[1] || data.className || data.name
- data.placeholder = data.placeholder || data.name
- data.title = data.title || data.placeholder
data.autocomplete = data.autocomplete || "username"
} else if (item.password) { var list = can.core.List(item.password)
- type = "input", name = name || list[0] || "password"
- data.type = "password"
- data.name = data.name || name
- data.className = list[1], data.className || data.name
- data.placeholder = data.placeholder || data.name
- data.title = data.title || data.placeholder
+ type = "input", name = name || list[0] || "password", data.name = data.name || name
+ data.className = list[1] || data.className || data.name
data.autocomplete = data.autocomplete || "current-password"
+ data.type = "password"
} else if (item.img) { var list = can.core.List(item.img)
- type = "img"
- data.src = list[0]
+ type = "img", data.src = list[0]
} else if (item.row) { type = "tr"
- item.list = item.row.map(function(text) {return {text: [text, item.sub||"td"]}})
+ item.list = item.row.map(function(text) { return {text: [text, item.sub||"td"]} })
} else if (item.th) { type = "tr"
- item.list = item.th.map(function(text) {return {text: [text, "th"]}})
+ item.list = item.th.map(function(text) { return {text: [text, "th"]} })
} else if (item.td) { type = "tr"
- item.list = item.td.map(function(text) {return {text: [text, "td"]}})
-
- } else if (item.include) {var list = can.core.List(item.include)
- type = "script"
- data.src = list[0]
- data.onload = list[1]
+ item.list = item.td.map(function(text) { return {text: [text, "td"]} })
}
- item.type == "input" && data.type == "button" && (data.value = can.user.trans(can, data.value))
- item.type == "input" && data.type == "text" && (data.autocomplete = data.autocomplete||"off")
- data.placeholder && (data.placeholder = can.user.trans(can, data.placeholder))
- data.title && (data.title = can.user.trans(can, data.title))
+ if (type == "input") {
+ data.type == "button" && (data.value = can.user.trans(can, data.value))
+ data.type == "text" && (data.autocomplete = data.autocomplete||"off")
+ (data.placeholder = can.user.trans(can, (data.placeholder||data.name).split(".").pop()))
+ data.title = can.user.trans(can, data.title||data.placeholder)
+ }
// 创建节点
- name = name || data.className || type || ""
!data.name && item.name && (data.name = item.name)
var node = can.page.Create(can, type, data)
- value.last = node, value.first = value.first || node, value[name||""] = value[data.className||""] = value[type] = node
+ // 创建索引
+ name = name || data.className || type || ""
+ value[name||""] = value[data.className||""] = value[type] = node
+ value.first = value.first || node, value.last = node
+ value._target = value._target || node
+
+ // 递归节点
item.list && can.page.Append(can, node, item.list, value)
- typeof item._init == "function" && item._init(node)
target && target.append && target.appendChild(node)
- target.appendChild(node)
+ typeof item._init == "function" && item._init(node)
})
return value
}),
Appends: shy("添加节点", function(can, target, key, value) {
return target.innerHTML = "", can.page.Append(can, target, key, value)
}),
- Remove: shy("删除节点", function(can, target) {
- target && target.parentNode && target.parentNode.removeChild(target)
- }),
- AppendAction: shy("添加控件", function(can, action, list, cb) {
- return can.page.Append(can, action, can.core.List(list, function(line) {
- return ["br", "hr"].indexOf(line.type) > -1? line: {view: "item", list: [typeof line == "string"? {button: [line, cb]}: line.length > 0? {select: [line, cb]}:
- line.input && typeof line.input != "string" ? {input: [line.input[0], function(event) {
- typeof line.input[1] == "function" && line.input[1](event, can)
- }, function(event) {
- typeof line.input[2] == "function" && line.input[2](event, can)
- }]}: line]}
- }))
- }),
AppendTable: shy("添加表格", function(can, msg, target, list, cb) {
if (!msg.append || msg.append.length == 0) {return}
var table = can.page.Append(can, target, "table")
- var tr = can.page.Append(can, table, "tr", {dataset: {index: -1}})
- can.core.List(list, function(key, index) { if (key.indexOf("_") == 0) { return }
- key = can.Conf("feature.table.trans."+key) || {}[key] || key
-
- can.page.Append(can, tr, "th", key.trim()).onclick = function(event) {
- var dataset = event.target.dataset
- dataset["sort_asc"] = (dataset["sort_asc"] == "1") ? 0: 1
- can.page.RangeTable(can, table, index, dataset["sort_asc"] == "1")
- }
- })
-
+ can.page.Append(can, table, [{type: "tr", {dataset: {index: -1}}, list:
+ can.core.List(list, function(key) {
+ return key[0] == "_"? undefined: {text: [key.trim(), "th"]}
+ })
+ }])
can.page.Append(can, table, can.core.List(msg.Table(), function(line, index, array) {
return {type: "tr", dataset: {index: index}, list: can.core.List(list, function(key) { if (key.indexOf("_") == 0) { return }
return cb(can.page.Display(line[key]).trim(), key, index, line, array)
})}
}))
- return table
+ return can.page.OrderTable(can, table)
}),
+ OrderTable: function(can, table) {
+ can.page.Select(can, table, "th", function(th, index) {
+ th.onclick = function(event) { var dataset = event.target.dataset
+ dataset["sort_asc"] = (dataset["sort_asc"] == "1") ? 0: 1
+ can.page.RangeTable(can, table, index, dataset["sort_asc"] == "1")
+ }
+ })
+ return table
+ },
RangeTable: function(can, table, index, sort_asc) {
var list = can.page.Select(can, table, "tr", function(tr) {
return tr.style.display == "none" || can.page.ClassList.has(can, tr, "hide")? null: tr
@@ -276,22 +241,14 @@ Volcanos("page", {help: "网页模块",
tbody.appendChild(list[i])
}
},
- OrderTable: function(can, table) {
- can.page.Select(can, table, "th", function(th, index) {
- table.onclick = function(event) {
- var dataset = event.target.dataset
- dataset["sort_asc"] = (dataset["sort_asc"] == "1") ? 0: 1
- can.page.RangeTable(can, table, index, dataset["sort_asc"] == "1")
- }
- })
- },
Display: function(text) { if (typeof text != "string") { return "" }
if (text.indexOf("http://") == 0 || text.indexOf("https://") == 0 || text.indexOf("ftp://") == 0) {
- var ls = text.split(" ")
- return ""+ls[0]+""+ls.slice(1).join(" ")
- }
+ var ls = text.split(" ");
+ text = ""+ls[0]+""+ls.slice(1).join(" ")
+ }; text = text.replace(/\\n/g, "
")
+ if (!text.indexOf("\033\[")) { return text }
text = text.replace(/\033\[31m/g, "")
text = text.replace(/\033\[32m/g, "")
text = text.replace(/\033\[33m/g, "")
@@ -302,213 +259,34 @@ Volcanos("page", {help: "网页模块",
text = text.replace(/\033\[1m/g, "")
text = text.replace(/\033\[0m/g, "")
text = text.replace(/\033\[m/g, "")
- text = text.replace(/\\n/g, "
")
return text
},
Format: function(type, src) {
switch (type) {
- case "a":
- return ""+(arguments[2]||arguments[1])+""
- case "img":
- return arguments[2]? "
": "
"
+ case "a": return ""+(arguments[2]||arguments[1])+""
+ case "img": return arguments[2]? "
": "
"
}
},
- DelText: function(target, start, count) {
- target.value = target.value.substring(0, start)+target.value.substring(start+(count||target.value.length), target.value.length)
- target.setSelectionRange(start, start)
- },
-
Cache: function(name, output, data) { var cache = output._cache || {}; output._cache = cache
if (data) { if (output.children.length == 0) { return }
- // 写缓存
var temp = document.createDocumentFragment()
- while (output.childNodes.length>0) {
+ while (output.childNodes.length > 0) { // 写缓存
var item = output.childNodes[0]
- item.parentNode.removeChild(item)
+ item.parentNode.removeChild(item),
temp.appendChild(item)
}
-
- cache[name] = {node: temp, data: data}
- return name
+ return cache[name] = {node: temp, data: data}, name
}
output.innerHTML = ""
- var list = cache[name]; if (!list) {return}
- // 读缓存
- while (list.node.childNodes.length>0) {
+ var list = cache[name]; if (!list) { return }
+ while (list.node.childNodes.length > 0) { // 读缓存
var item = list.node.childNodes[0]
item.parentNode.removeChild(item)
output.appendChild(item)
}
- delete(cache[name])
- return list.data
- },
- Toggle: function(can, target, show, hide) { var status = target.style.display == "none"
- can.page.Modify(can, target, {style: {display: status? "": "none"}})
- status? typeof show == "function" && show(): typeof hide == "function" && hide()
- return status
- },
- Anchor: function(event, target, pos, point) {
- switch (pos) {
- case 1:
- case 2:
- case 3:
- point.y = target.Val("y")
- break
- case 4:
- case 5:
- case 6:
- point.y = target.Val("y") + target.Val("height") / 2
- break
- case 7:
- case 8:
- case 9:
- point.y = target.Val("y") + target.Val("height")
- break
- }
-
- switch (pos) {
- case 1:
- case 4:
- case 7:
- point.x = target.Val("x")
- break
- case 2:
- case 5:
- case 8:
- point.x = target.Val("x") + target.Val("width") / 2
- break
- case 3:
- case 6:
- case 9:
- point.x = target.Val("x") + target.Val("width")
- break
- }
- return point
- },
- Prepos: function(event, item, p, q) {
- var max = 20
- p = p || item.getBoundingClientRect()
- q = q || {x: event.clientX, y: event.clientY}
-
- var pos = 5
- var y = (q.y - p.y) / p.height
- if (y < 0.2 && q.y - p.y < max) {
- pos -= 3
- } else if (y > 0.8 && q.y - p.y - p.height > -max) {
- pos += 3
- }
- var x = (q.x - p.x) / p.width
- if (x < 0.2 && q.x - p.x < max) {
- pos -= 1
- } else if (x > 0.8 && q.x - p.x - p.width > -max) {
- pos += 1
- }
-
- var cursor = [
- "nw-resize", "n-resize", "ne-resize",
- "w-resize", "move", "e-resize",
- "sw-resize", "s-resize", "se-resize",
- ]
- item.style.cursor = cursor[pos-1]
- return pos
- },
- Resize: function(event, item, begin, pos) {
- switch (pos) {
- case 5:
- item.style.left = begin.left + event.clientX - begin.x + "px"
- item.style.top = begin.top + event.clientY - begin.y + "px"
- return
- }
-
- switch (pos) {
- case 1:
- case 2:
- case 3:
- item.style.top = begin.top + event.clientY - begin.y + "px"
- item.style.height = begin.height - event.clientY + begin.y + "px"
- break
- }
- switch (pos) {
- case 1:
- case 4:
- case 7:
- item.style.left = begin.left + event.clientX - begin.x + "px"
- item.style.width = begin.width - event.clientX + begin.x + "px"
- break
- }
- switch (pos) {
- case 3:
- case 6:
- case 9:
- item.style.width = begin.width + event.clientX - begin.x + "px"
- break
- }
- switch (pos) {
- case 7:
- case 8:
- case 9:
- item.style.height = begin.height + event.clientY - begin.y + "px"
- break
- }
- },
- Resizes: function(event, item, begin, p0, p1, pos) {
- switch (pos) {
- case 5:
- item.Value("x", begin.x + p1.x - p0.x)
- item.Value("y", begin.y + p1.y - p0.y)
- return
- }
-
- switch (pos) {
- case 1:
- case 2:
- case 3:
- item.Value("y", begin.y + p1.y - p0.y)
- item.Value("height", begin.height - p1.y + p0.y)
- break
- }
- switch (pos) {
- case 1:
- case 4:
- case 7:
- item.Value("x", begin.x + p1.x - p0.x)
- item.Value("width", begin.width - p1.x + p0.x)
- break
- }
- switch (pos) {
- case 3:
- case 6:
- case 9:
- item.Value("width", begin.width + p1.x - p0.x)
- break
- }
- switch (pos) {
- case 7:
- case 8:
- case 9:
- item.Value("height", begin.height + p1.y - p0.y)
- break
- }
- },
- EnableDrop: function(can, parent, search, target) {
- return can.page.Modify(can, target, { draggable: true,
- ondragstart: function(event) { var target = event.target; can.drop = function(event, tab) {
- parent.insertBefore(target, tab)
- can.page.Select(can, parent, search, function(item) {
- can.page.ClassList.del(can, item, "over")
- })
- } },
- ondragover: function(event) { event.preventDefault()
- can.page.Select(can, parent, search, function(item) {
- can.page.ClassList.del(can, item, "over")
- }), can.page.ClassList.add(can, event.target, "over")
- },
- ondrop: function(event) { event.preventDefault()
- can.drop(event, event.target)
- },
- })
+ return delete(cache[name]), list.data
},
})
diff --git a/lib/user.js b/lib/user.js
index b8c14e8f..3561b711 100644
--- a/lib/user.js
+++ b/lib/user.js
@@ -1,6 +1,6 @@
Volcanos("user", {help: "用户模块", agent: {
scanQRCode: function(cb, can) {
- can.user.input(event, can, [{_input: "textarea"}], function(ev, button, data, list, args) {
+ can.user.input(event, can, [{type: "textarea"}], function(ev, button, data, list, args) {
cb(list[0])
})
},
@@ -15,7 +15,7 @@ Volcanos("user", {help: "用户模块", agent: {
typeof cb == "function" && cb([])
},
},
- isLandscape: window.innerWidth>window.innerHeight,
+ isLandscape: window.innerWidth > window.innerHeight,
isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1,
isMobile: navigator.userAgent.indexOf("Mobile") > -1,
isIPhone: navigator.userAgent.indexOf("iPhone") > -1,
@@ -28,10 +28,103 @@ Volcanos("user", {help: "用户模块", agent: {
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 },
open: function(url) { window.open(url) },
+ title: function(text) { return text && (document.title = text), document.title },
+ topic: function(can, name) {
+ can.page.Modify(can, document.body, {className: name})
+ can.user.isMobile && can.page.ClassList.add(can, document.body, "mobile")
+ can.user.isMobile && can.page.ClassList.set(can, document.body, "landscape", can.user.isLandscape)
+ },
+ trans: function(can, text) { if (typeof text == "function") { text = text.name || "" }
+ return can._trans&&can._trans[text] || can.Conf("trans."+text) || can.Conf("feature.trans."+text) || {
+ "submit": "提交", "cancel": "取消",
+ "open": "打开", "close": "关闭",
+ "begin": "启动", "end": "结束",
+ }[text] || text
+ },
+ toast: function(can, content, title, duration, progress) {
+ var meta = typeof content == "object"? content: {content: content, title: title||can._help, duration: duration, progress: progress}
+ var width = meta.width||400, height = meta.height||100; if (width < 0) { width = window.innerWidth + width }
+
+ var ui = can.page.Append(can, document.body, [{view: "toast", style: {
+ left: (window.innerWidth-width)/2, width: width, bottom: 100,
+ }, list: [
+ {text: [meta.title||"", "div", "title"], title: "点击复制", onclick: function(event) {
+ can.user.copy(event, can, meta.title)
+ }},
+ {view: "duration", title: "点击关闭", onclick: function() { action.close() }},
+ typeof meta.content == "object"? meta.content: {text: [meta.content||"执行成功", "div", "content"]},
+
+ {view: "action"}, meta.progress != undefined && {view: "progress", style: {width: width}, list: [
+ {view: "current", style: {width: (meta.progress||0)/100*width}},
+ ]},
+ ] }])
+
+ var action = can.onappend._action(can, meta.action||["close"], ui.action, {
+ close: function(event) { can.page.Remove(can, action._target), action.timer.stop = true },
+ timer: can.core.Timer({interval: 100, length: (parseInt(meta.duration||1000))/100}, function(event, interval, index) {
+ if (index > 30) { ui.duration.innerHTML = parseInt(index/10)+"."+(index%10)+"s..." }
+ }, function() { action.close() }), _target: ui._target, ui: ui,
+ }); can.onmotion.story(can, ui._target)
+
+ can.search(can.request({}, {
+ title: meta.title, content: meta.content,
+ time: can.base.Time(), fileline: can.misc.FileLine(2, 2),
+ })._event, ["Footer.onimport.toast"])
+ return action
+ },
+ share: function(can, msg, cmd) {
+ can.run(msg._event, cmd||["action", "share"], function(msg) {
+ can.user.toast(can, {height: 300, width: 500,
+ title: msg.Append("name"), duration: -1,
+ content: msg.Append("text"), button: ["close"],
+ })
+ })
+ },
+ login: function(can, cb) {
+ var ui = can.user.input({}, can, [
+ {username: "username"}, {password: "password"},
+ ], function(event, button, data, list) { return {
+ "登录": function() {
+ can.run({}, ["action", "login", data["username"], data["password"]], function(msg) {
+ if (msg.Option("user.name")) {
+ can.page.Remove(can, ui._target), can.base.isFunc(cb) && cb()
+ } else {
+ can.user.toast(can, "用户名或密码错误")
+ }
+ })
+ return true
+ },
+ "扫码": function() {
+ can.misc.WSS(can, {type: "chrome"}, function(event, msg, cmd, arg) { if (!msg) { return }
+ if (cmd == "pwd") {
+ return can.user.toast(can, arg[2], arg[1], -1), msg.Reply()
+ }
+
+ if (cmd == "sessid") {
+ return can.user.Cookie(can, "sessid", arg[0]), msg.Reply(), can.user.reload(true)
+ }
+
+ can.search(event, msg["detail"]||[], function(msg) { msg.Reply() })
+ })
+ },
+ }[button]() }, ["登录", "扫码"])
+
+ can.page.Modify(can, ui._target, {className: "input login", style: {left: (window.innerWidth-ui._target.offsetWidth)/2, top: window.innerHeight/6}})
+ },
+ logout: function(can, force) { if (force||can.user.confirm("logout?")) {
+ can.run({}, ["action", "logout"], function(msg) { can.user.Cookie(can, "sessid", "")
+ can.user.Search(can, "share")? can.user.Search(can, "share", ""): can.user.reload(true)
+ })
+ } },
+ camera: function(can, msg, cb) {
+ navigator.getUserMedia({video: true}, cb, function(error) {
+ can.misc.Log(error)
+ })
+ },
+
copy: function(event, can, text) {
if (navigator.clipboard) { var ok = false
navigator.clipboard.writeText(text).then(() => { ok = true })
@@ -43,179 +136,64 @@ Volcanos("user", {help: "用户模块", agent: {
can.page.Remove(can, input), can.user.toast(can, text, "复制成功")
event.stopPropagation(), event.preventDefault()
},
-
- camera: function(can, msg, cb) {
- navigator.getUserMedia({video: true}, cb, function(error) {
- can.base.Log(error)
- })
- },
- trans: function(can, text) {
- if (typeof text == "function") { text = text.name || "" }
- return can._trans && can._trans[text] || can.Conf("trans."+text) || can.Conf("feature.trans."+text) || {
- "submit": "提交", "cancel": "取消",
- "begin": "启动", "end": "结束",
- "close": "关闭",
- }[text] || text
- },
- topic: function(can, name) {
- can.page.Modify(can, document.body, {className: name})
- var width = window.innerWidth, height = window.innerHeight
- can.user.isMobile && can.page.ClassList.add(can, document.body, "mobile")
- can.user.isMobile && can.page.ClassList.set(can, document.body, "landscape", width > height)
- },
- toast: function(can, content, title, duration, progress) {
- var meta = typeof content == "object"? content: {content: content, title: title||can._help, duration: duration, progress: progress}
- var width = meta.width||400, height = meta.height||100; if (width < 0) { width = window.innerWidth + width }
-
- var ui = can.page.Append(can, document.body, [{view: "toast", style: {
- width: width, bottom: 100, left: (window.innerWidth-width)/2,
- }, list: [
- {text: [meta.title||"", "div", "title"]},
- typeof meta.content == "object"? meta.content: {text: [meta.content||"执行成功", "div", "content"]},
- {view: "button"},
- {view: "duration"}, meta.progress != undefined && {view: "progress", style: {width: width}, list: [
- {view: "current", style: {width: (meta.progress||0)/100*width}},
- ]},
- ] }]); can.onmotion.story(can, ui.first)
-
- ui.Close = function() { can.page.Remove(can, ui.first), timer.stop = true }
- var timer = can.core.Timer({interval: 100, length: (parseInt(meta.duration||1000))/100}, function(event, interval, index) {
- if (index > 30) { ui.duration.innerHTML = parseInt(index/10)+"."+(index%10)+"s..." }
- }, ui.Close)
-
- can.onappend._action(can, meta.button||[], ui.button, {
- close: function(event) { ui.Close() },
- })
-
- can.search && can.search(can.request({}, {
- title: meta.title, content: meta.content,
- time: can.base.Time(), fileline: can.base.FileLine(2, 2),
- })._event, ["Footer.onimport.toast"], null, true)
- return ui
- },
- share: function(can, msg, cmd) {
- can.run(msg._event, cmd||["action", "share"], function(msg) {
- var ui = can.user.toast(can, {
- title: msg.Append("name"), content: msg.Append("text"),
- button: ["close"], duration: 100000,
- height: 300,
- })
- })
- },
- login: function(can, cb) {
- var ui = can.user.input({clientX: 100, clientY: 100}, can, [
- {username: "username", name: "用户"},
- {password: "password", name: "密码"},
- {button: ["登录", "扫码", "注册"]},
- ], function(event, button, data, list) {
- switch (button) {
- case "登录": 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("用户或密码错误")
- })
- break
- case "扫码":
- can.misc.WSS(can, {type: "chrome"}, function(event, msg, cmd, arg) { if (!msg) { return }
- if (cmd == "pwd") {
- can.user.toast(can, arg[2], arg[1], 1000000)
- msg.Reply()
- return
- }
- if (cmd == "sessid") {
- can.user.Cookie(can, "sessid", arg[0])
- can.user.reload(true)
- return
- }
- can.search(event, msg["detail"]||[], function(msg) {
- msg.Reply()
- })
- })
-
- return true
- break
- case "注册":
-
- break
- }
- })
-
- can.page.Modify(can, ui.first, {style: {left: (window.innerWidth-ui.first.offsetWidth)/2}})
- },
carte: function(event, can, meta, list, cb) {
meta = meta||can.ondetail||can.onaction||{}, list = list&&list.length > 0? list: meta.list||[]; if (list.length == 0) { return }
cb = cb||function(ev, item, meta) { var cb = meta[item]; can.base.isFunc(cb) && cb(event, can, item) }
var ui = can.page.Append(can, document.body, [{view: "carte", style: {left: 0, top: 0}, onmouseleave: function(event) {
- can.page.Remove(can, ui.first)
+ can.page.Remove(can, ui._target)
}, list: can.core.List(list, function(item) {
return {view: "item", list: [{text: can.user.trans(can, item), click: function(event) {
- can.user.isMobile && can.page.Remove(can, ui.first)
+ can.user.isMobile && can.page.Remove(can, ui._target)
can.base.isFunc(cb) && cb(event, item, meta)
} }] }
- }) }] )
+ }) }] ); can.onlayout.figure(event, can, ui._target)
- var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight
- if (left+ui.first.offsetWidth>window.innerWidth) { left = window.innerWidth - ui.first.offsetWidth }
- can.page.Modify(can, ui.first, {style: {left: left, top: top}})
-
- Volcanos.meta.data.menu && can.page.Remove(can, Volcanos.meta.data.menu.first)
- return event.stopPropagation(), event.preventDefault(), Volcanos.meta.data.menu = ui
+ Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target)
+ return event.stopPropagation(), event.preventDefault(), Volcanos.meta.float.carte = ui, {_target: ui._target}
},
- input: function(event, can, form, cb) { // form [ string, array, object, {_input: }, {button: []} ]
+ input: function(event, can, form, cb, button) { // form [ string, array, object, {_input: "select", values: []}
var msg = can.request(event, can.Option())
- var x = event.clientX||can.user.isMobile? 20: 200, y = event.clientY+10||48
-
- var button; var ui = can.page.Append(can, document.body, [{view: ["input inputs", "fieldset"], style: {left: x, top: y}, list: [
+ var ui = can.page.Append(can, document.body, [{view: ["input"], style: {left: 0, top: 0}, list: [
{view: ["option", "table"], list: can.core.List(form, function(item) {
- if (item.button) { button = item.button; return }
+ item._input == "select" && (item = {select: [[item.name].concat(item.values)], data: item, name: item.name})
+ item = typeof item == "string"? {input: item, name: item}: item.length > 0? {select: [item], name: item[0]}: item
+ item.type = item.type||"input", item.type == "input" && (item.data=item.data||{}, item.data.type = item.data.type||"text")
- function _init(target) {
+ item._init = item._init||function(target) {
item.run = function(event, cmds, cb) {
var msg = can.request(event, function() { var value = {_handle: "true"}
can.page.Select(can, ui.table, "textarea,input,select", function(item) {
item.name && item.value && (value[item.name] = item.value)
}); return value
- })
- can.run(event, cmds, cb, true)
+ }); can.run(event, cmds, cb, true)
}
can.onappend.figure(can, item, item.value, target)
target.value = target.value || msg.Option(item.name)
}
- item = typeof item == "string"? {_input: "text", name: item}:
- item.length > 0? {_input: "select", name: item[0], values: item.slice(1)}: item
- item._input = item.type||item._input||"text"
-
- return {type: "tr", list: [{type: "td", list: [{text: item.name||""}]}, {type: "td", list: [
- item._input == "textarea"? /* textarea */ {type: "textarea", data: item, _init: _init}:
- item._input == "select"? /* select */ {select: [[item.name].concat(item.values)], data: item}:
- item._input? /* input */ {type: "input", data: (item.type = item._input, item), _init: _init}:
- /* other */ item,
- ]} ]}
+ return {type: "tr", list: [{type: "td", list: [{text: item.name||""}]}, {type: "td", list: [item]} ]}
})},
{view: "action"},
- ]}])
+ ]}]); can.onlayout.figure(event, can, ui._target)
- function cbs(event, button) { var data = {}, args = [], list = []
- list = can.page.Select(can, ui.table, "textarea,input,select", function(item) {
- return args.push(item.name, item.value), data[item.name] = item.value
- })
- typeof cb == "function" && !cb(event, button, data, list, args) && can.page.Remove(can, ui.first)
- }
- can.onappend._action(can, button||["submit", "cancel"], ui.action, {
- cancel: function(event) { can.page.Remove(can, ui.first) },
- _engine: function(event, can, key) { cbs(event, key) },
- submit: function(event) { cbs(event, "submit") },
+ var action = can.onappend._action(can, button||["submit", "cancel"], ui.action, {
+ cancel: function(event) { can.page.Remove(can, ui._target) },
+ _engine: function(event, can, button) { action.submit(event, can, button) },
+ submit: function(event, can, button) { var data = {}, args = [], list = []
+ list = can.page.Select(can, ui.table, "textarea,input,select", function(item) {
+ return args.push(item.name, item.value), data[item.name] = item.value
+ })
+ can.base.isFunc(cb) && !cb(event, button, data, list, args) && action.cancel()
+ }, _target: ui._target,
})
- can.onlayout.figure(event, can, ui.first), can.page.Select(can, ui.table, "textarea,input", function(item, index) {
- index == 0 && can.core.Timer(100, function() { item.focus(), item.setSelectionRange(0, -1) })
+ can.page.Select(can, ui._target, "input", function(item, index) {
+ index == 0 && can.onmotion.focus(can, item)
})
- return ui
+
+ return action
},
select: function(event, can, type, fields, cb, cbs) {
var msg = can.request(event, {fields: fields||"type,name,text"})
@@ -226,69 +204,49 @@ Volcanos("user", {help: "用户模块", agent: {
})
},
upload: function(event, can) { var begin = new Date()
- var x = event.clientX, y = event.clientY; y += 10; if (x > 400) { x -= 200 }
- if (can.user.isMobile) { x = 100, y = 100 }
- var ui = can.page.Append(can, document.body, [{view: "upload", style: {left: x, top: y}, list: [
- {view: "action"}, {view: "output"},
- ]}])
+ var ui = can.page.Append(can, document.body, [{view: "upload", style: {left: 0, top: 0}, list: [
+ {view: "action"}, {view: "output", list: [{view: "progress"}]},
+ {view: "status", list: [{view: "show"}, {view: "cost"}, {view: "size"}]},
+ ]}]); can.onlayout.figure(event, can, ui._target)
- function show(event, value, total, loaded) {
- var now = new Date(); can.page.Appends(can, ui.output, [
- {view: ["progress"], style: {height: "10px", border: "solid 2px red"}, list: [{
- view: ["progress"], style: {height: "10px", width: value + "%", background: "red"},
- }]},
- {text: [value+"%", "div"], style: {"float": "right"}},
- {text: [can.base.Duration(now - begin), "div"], style: {"float": "left"}},
- {text: [can.base.Size(loaded)+"/"+can.base.Size(total), "div"], style: {"text-align": "center"}},
- ])
- }
+ var action = can.onappend._action(can, [
+ {type: "upload", onchange: function(event) {
+ action.show(event, 0, event.target.files[0].size, 0)
+ }}, "close",
+ ], ui.action, {
+ close: function(event) { can.page.Remove(can, ui._target) },
+ begin: function(event) { begin = new Date()
+ var upload = can.page.Select(can, ui.action, "input[type=file]")
+ if (upload[0].files.length == 0) { return upload[0].focus() }
- var action = can.page.AppendAction(can, ui.action, [
- {type: "input", data: {name: "upload", type: "file", onchange: function(event) {
- var file = action.upload.files[0]
- show(event, 0, file.size, 0)
- }}, style: {width: "200px"}}, "上传", "关闭"], function(event, value, cmd) {
- if (value == "关闭") { return can.page.Remove(can, ui.first) }
- if (action.upload.files.length == 0) {return action.upload.focus()}
+ var msg = can.request(event, can.Option(), {_handle: "true"})
+ msg._upload = upload[0].files[0], msg._progress = action.show
- var msg = can.request(event, can.Option(), {_upload: "file", _handle: "true"})
-
- // 上传文件
- begin = new Date()
- msg._progress = show
- msg.upload = action.upload.files[0]
can.run(event, ["action", "upload"], function(msg) {
can.user.toast(can, "上传成功"), can.run()
}, true)
- })
- action.upload.click()
- return ui
+ },
+ show: function (event, value, total, loaded) { now = new Date()
+ value == 0 && action.begin(event)
+
+ ui.show.innerHTML = value+"%"
+ ui.cost.innerHTML = can.base.Duration(now - begin)
+ ui.size.innerHTML = can.base.Size(loaded)+"/"+can.base.Size(total)
+ can.page.Modify(can, ui.progress, {style: {width: value*(ui.output.offsetWidth-2)/100}})
+ },
+ }); can.page.Select(can, ui.action, "input[type=file]")[0].click()
+
+ return action
},
download: function(can, path, name) {
var a = can.page.Append(can, document.body, [{type: "a", href: path, download: name||path.split("/").pop()}]).first
a.click(), can.page.Remove(can, a)
},
- logout: function(can) {
- if (can.user.confirm("logout?")) {
- can.run({}, ["action", "logout"], function(msg) {
- can.user.Cookie(can, "sessid", "")
+ downloads: function(can, text, name) { can.user.download(can, URL.createObjectURL(new Blob([text])), name) },
- if (can.user.Search(can, "share")) {
- can.user.Search(can, "share", "")
- } else {
- can.user.reload(true)
- }
- })
- }
- },
-
- MergeURL: shy("地址链接", function(can, objs, clear) { var obj = objs || {}; var path = location.pathname;
- obj._path && (path = obj._path, delete(obj._path))
- !clear && can.core.Item(can.user.Search(), function(key, value) {obj[key] || (obj[key] = value)});
- return can.core.List([location.origin+path, can.core.Item(obj, function(key, value) {
- if (!value) { return }
- return can.core.List(value, function(value) {return key+"="+encodeURIComponent(value)}).join("&")
- }).join("&")], function(item) { return item? item: undefined }).join("?")
+ MergeURL: shy("地址链接", function(can, objs, clear) {
+ var path = location.pathname; objs._path && (path = objs._path, delete(objs._path))
+ return can.base.MergeURL(location.origin+path+(clear?"":location.search), objs)
}),
Search: shy("请求参数", function(can, key, value) { var args = {}
location.search && location.search.slice(1).split("&").forEach(function(item) { var x = item.split("=")
diff --git a/page/index.css b/page/index.css
index 59ddc4e9..614b55ff 100644
--- a/page/index.css
+++ b/page/index.css
@@ -1,4 +1,5 @@
a {
+
color:yellow;
}
body.mobile.landscape fieldset.Header.head {
@@ -62,6 +63,9 @@ body.mobile select {
body.mobile div.carte {
font-size:24px;
}
+body.mobile div.input.login input {
+ font-size:24px
+}
body {
margin:0; padding:0;
@@ -105,24 +109,26 @@ input[type=text] {
input[type=text]:hover {
background-color:white;
}
+input[type=button] {
+ background-color:black; color:cyan;
+ letter-spacing:4px;
+ padding-left:10px;
+ cursor:pointer;
+}
+input[type=button]:hover {
+ background-color:gray; color:cyan;
+}
td>input[type=button][name=remove] {
background-color:red;
}
td>input[type=button][name=create] {
background-color:blue;
}
-input[type=button] {
- background-color:black; color:cyan;
- letter-spacing:4px;
- padding-left:10px;
-}
-input[type=button]:hover {
- background-color:gray; color:cyan;
-}
select {
box-shadow: 4px 4px 10px 1px #626bd0;
background-color:black; color:cyan;
padding:0 10px;
+ cursor:pointer;
}
option {
font-family:monospace;
@@ -147,7 +153,7 @@ table.content {
/* width:-webkit-fill-available; */
border:0; white-space:pre;
font-size:14px; font-family:monospace;
- cursor:pointer; overflow: auto;
+ overflow: auto;
}
table.content tr {
background-color:#04272f45;
@@ -185,6 +191,13 @@ table.content td:hover {
h1 {
margin:0;
+ clear:both;
+}
+h2 {
+ clear:both;
+}
+h2 {
+ clear:both;
}
h1:hover {
background:green;
@@ -198,6 +211,9 @@ h3:hover {
background:green;
cursor:pointer;
}
+div.item {
+ cursor:pointer;
+}
div.code {
background-color:#343a3445; color:white;
font-size:14px; font-family:monospace;
@@ -216,33 +232,37 @@ div.hidden {
div.toast {
background:#0e3369b3; color:yellow;
- position:fixed;
- overflow:auto;
- padding:5px;
- z-index:100;
+ position:fixed; z-index:100;
+ padding:5px; overflow:auto;
}
div.toast a {
color:yellow;
}
div.toast div.title {
- font-size:14px;
- color:#cae850;
+ color:#cae850; font-size:14px;
+ cursor:copy;
+ float:left;
+}
+div.toast div.duration {
+ color:gray; font-size:14px;
+ float:right;
+ cursor:pointer;
}
div.toast div.content {
text-align:center;
white-space:pre;
+ clear:both;
}
-div.toast div.duration {
- font-size:14px;
- color:gray;
+div.toast div.action div.item {
+ float:left;
}
div.toast div.progress {
- border:solid 2px green;
- height:10px;
+ height:10px; border:solid 2px green;
+ margin-left:-2px;
+ clear:both;
}
div.toast div.progress div.current {
- background:red;
- height:10px;
+ height:10px; background:red;
}
div.carte {
@@ -255,11 +275,24 @@ div.carte {
}
div.carte div.item {
padding:3px 12px;
- cursor:pointer;
}
div.carte div.item:hover {
background:red;
}
+div.input {
+ position:fixed;
+ background-color:#0d4142a6;
+ z-index:50;
+}
+div.input div.item {
+ float:left;
+}
+div.input.login {
+ padding:10px;
+}
+div.input.login input {
+ font-size:18px
+}
div.upload {
background:black; color:yellow;
@@ -270,6 +303,26 @@ div.upload {
div.upload div.item {
float:left;
}
+div.upload div.output {
+ border:solid 1px red;
+ clear:both;
+}
+div.upload div.progress {
+ width:0; height:10px;
+ background:red;
+}
+div.upload div.status div.cost {
+ float:left;
+}
+div.upload div.status div.show {
+ float:right;
+}
+div.upload div.status div.size {
+ text-align:center;
+}
+div.upload input[type=file] {
+ width: 240px;
+}
div.story[data-type=spark] {
background-color:#2169a9a6; color:white;
@@ -388,6 +441,9 @@ fieldset>div.output div.project div.list {
margin-left:10px;
}
+body>fieldset.input table {
+ color:white;
+}
body>fieldset.input td {
word-break:keep-all;
}
diff --git a/panel/Action.css b/panel/Action.css
index 99e00bab..97a7b20a 100644
--- a/panel/Action.css
+++ b/panel/Action.css
@@ -19,7 +19,6 @@ fieldset.Action>div.action div.item {
fieldset.Action>div.action div.item:hover {
border-bottom:solid 2px red;
background-color:#2e515f;
- cursor:pointer;
}
fieldset.Action>div.action div.item.select {
border-bottom:solid 2px red;
diff --git a/panel/Action.js b/panel/Action.js
index f2f4815a..8b441124 100644
--- a/panel/Action.js
+++ b/panel/Action.js
@@ -15,12 +15,17 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg)
}, function() {
can.onaction._layout(can, can.Conf(can._LAYOUT)||can.user.Search(can, can._LAYOUT))
})
+
+ can.page.Modify(can, can._output, {onmouseover: function(event) {
+ Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target)
+ // Volcanos.meta.float.input && can.page.Remove(can, Volcanos.meta.float.input._target)
+ }})
},
_plugin: function(can, river, storm, sub, item) {
sub.run = function(event, cmds, cb) { var msg = sub.request(event)
var toast = msg.Option("_toast") && can.user.toast(can, msg.Option("_toast"), "", 1000000)
return can.run(event, (can.onengine[cmds[0]]? []: [river, storm, item.id||item.index||item.key+"."+item.name]).concat(cmds), function(msg) {
- toast && toast.Close(), can.base.isFunc(cb) && cb(msg)
+ toast && toast.close(), can.base.isFunc(cb) && cb(msg)
})
}, can._plugins = (can._plugins||[]).concat([sub])
@@ -66,7 +71,7 @@ Volcanos("onengine", {help: "解析引擎", list: [],
if (!storm || cmds.length != 2) { return false }
if (storm.index) { cmds = [can._ACTION, "command"].concat(storm.index)
- can.misc.Runs(event, can, {names: can._name}, cmds, cb)
+ can.run(event, cmds, cb)
} else {
can.core.List(storm.action, function(value) {
msg.Push("name", value.name||"")
diff --git a/panel/Header.js b/panel/Header.js
index 2338a65e..61865ba1 100644
--- a/panel/Header.js
+++ b/panel/Header.js
@@ -32,6 +32,11 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.onimport._menu(can, msg, target)
can.base.isFunc(cb) && cb(msg)
+
+ can.page.Modify(can, can._output, {onmouseover: function(event) {
+ Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target)
+ Volcanos.meta.float.input && can.page.Remove(can, Volcanos.meta.float.input._target)
+ }})
},
_title: function(can, msg, target) {
can.user.title(can.user.Search(can, can._TITLE)||can.user.Search(can, "pod"))
@@ -122,7 +127,12 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
_time: function(can, target) {
can.core.Timer({interval: 1000}, function() { can.onimport.time(can, target) })
- can.onappend.figure(can, {style: {left: "", right: "0", top: can._target.offsetHeight, "min-width": 310}}, "@date", target)
+ can.onappend.figure(can, {style: {"min-width": 306}}, "@date", target)
+ target.onmouseenter = function(event) { target.click()
+ can.core.Timer(10, function() {
+ can.onlayout.figure(event, can, Volcanos.meta.float.input._target)
+ })
+ }
},
time: function(can, target) { can.onlayout.topic(can)
target.innerHTML = can.base.Time(null, "%w %H:%M:%S")
@@ -201,7 +211,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg,
})
can.user.jumps(can.user.MergeURL(can, args, true))
},
- carte: function(event, can, list, cb) { can.user.carte(event, can, can.onaction, list) },
+ carte: function(event, can, list, cb) { can.user.carte(event, can, can.onaction, list, cb) },
river: function(event, can) { can.onaction.River(can) },
black: function(event, can, button) {
can.onlayout.topic(can, button)
@@ -239,7 +249,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg,
var toast = can.user.toast(can, "打包中...", "webpack", 1000000)
can.run(event, ["webpack"], function(msg) {
- toast.Close(), can.user.toast(can, "打包成功", "webpack")
+ toast.close(), can.user.toast(can, "打包成功", "webpack")
can.user.download(can, "/share/local/"+msg.Result(), name+".html")
})
})
@@ -255,7 +265,7 @@ Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, msg,
can.user.share(can, can.request(event), [can._ACTION, can._SHARE].concat(arg))
},
usernick: function(event, can) {
- can.user.input(event, can, [{_input: "text", name: "usernick", value: can.Conf(can._USERNAME)}], function(ev, button, data, list, args) {
+ can.user.input(event, can, [{name: "usernick", value: can.Conf(can._USERNAME)}], function(ev, button, data, list, args) {
can.run(event, ["usernick", list[0]], function(msg) {
can.page.Select(can, can._output, "div.username", function(item) {
can.page.Modify(can, item, can.Conf(can._USERNAME, list[0]))
diff --git a/panel/River.css b/panel/River.css
index dc618e97..ac65b994 100644
--- a/panel/River.css
+++ b/panel/River.css
@@ -4,7 +4,6 @@ fieldset.River {
fieldset.River>div.output div.item {
border-left:solid 3px #00ffae;
padding:3px 16px;
- cursor:pointer;
}
fieldset.River>div.output div.item:hover {
background-color:#2e515f;
diff --git a/panel/River.js b/panel/River.js
index aa4af95c..051db9db 100644
--- a/panel/River.js
+++ b/panel/River.js
@@ -9,7 +9,14 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
var select; msg.Table(function(value, index, array) {
var item = can.onimport._river(can, value)
if (index == 0 || [value.hash, value.name].indexOf(can._main_river) > -1) { select = item }
- }), select && select.click()
+ })
+
+ select && select.click()
+
+ can.page.Modify(can, can._output, {onmouseover: function(event) {
+ Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target)
+ Volcanos.meta.float.input && can.page.Remove(can, Volcanos.meta.float.input._target)
+ }})
},
_main: function(can, msg) {
can._main_river = "project", can._main_storm = "studio"
@@ -41,18 +48,37 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.onaction.storm(event, can, meta.hash)
}, function(event) {
// 右键菜单
- can.onaction.carte(event, can, can.ondetail.list, function(ev, button, module) {
+ can.onaction.carte(event, can, can.ondetail.list, function(event, button, module) {
module[button](event, can, button, meta.hash)
})
})
!can.user.isMobile && can.page.Modify(can, item, {onmouseenter: function(event) {
- can.onaction.carte(event, can, can.ondetail.list, function(ev, button, module) {
+ can.onaction.carte(event, can, can.ondetail.list, function(event, button, module) {
module[button](event, can, item, meta.hash)
})
}})
return item
},
+ _storm: function(can, meta, river) {
+ return {text: [meta.name, "div", "item"], onclick: function(event) {
+ // 左键点击
+ can.onaction.action(event, can, river, meta.hash)
+ can.user.title(can._main_title || meta.name)
+ }, onmouseenter: function(event) {
+ can.onaction.carte(event, can, ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], function(event, button, module) {
+ module[button](event, can, button, river, meta.hash)
+ })
+ }, oncontextmenu: function(event) {
+ can.onaction.action(event, can, river, meta.hash)
+ can.user.title(can._main_title || meta.name)
+
+ // 右键点击
+ can.onaction.carte(event, can, ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], function(event, button, module) {
+ module[button](event, can, button, river, meta.hash)
+ })
+ }}
+ },
height: function(can, height) {
can.page.Modify(can, can._target, {style: {
@@ -86,29 +112,16 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg,
can.onengine.listen(can, "action.touch", function() {
can.user.isMobile && can.onmotion.hidden(can)
- Volcanos.meta.data.menu && can.page.Remove(can, Volcanos.meta.data.menu.first)
+ Volcanos.meta.float.carte && can.page.Remove(can, Volcanos.meta.float.carte._target)
})
},
storm: function(event, can, river) {
- var list = can.sublist[river]; if (list) { return can.page.Toggle(can, list) }
+ var list = can.sublist[river]; if (list) { return can.onmotion.Toggle(can, list) }
can.run({}, [river, "tool"], function(msg) {
- var select = 0; list = can.page.Append(can, can._output, [{view: "list", list: msg.Table(function(storm, index) {
- river == can._main_river && storm.hash == can._main_storm && (select = index)
-
- return {text: [storm.name, "div", "item"], onclick: function(event) {
- // 左键点击
- can.onaction.action(event, can, river, storm.hash)
- can.user.title(can._main_title || storm.name)
- }, oncontextmenu: function(event) {
- can.onaction.action(event, can, river, storm.hash)
- can.user.title(can._main_title || storm.name)
-
- // 右键点击
- can.onaction.carte(event, can, ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], function(ev, button, module) {
- module[button](event, can, button, river, storm.hash)
- })
- }}
+ var select = 0; list = can.page.Append(can, can._output, [{view: "list", list: msg.Table(function(meta, index) {
+ river == can._main_river && meta.hash == can._main_storm && (select = index)
+ return can.onimport._storm(can, meta, river)
}) }]).first, list.children.length > 0 && list.children[select].click()
event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling)
@@ -127,8 +140,8 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg,
create: function(event, can) {
can.user.input(event, can, [
["类型", "public", "protected", "private"],
- {_input: "text", name: "群名", value: "hi"},
- {_input: "text", name: "简介", value: "hello"},
+ {name: "群名", value: "hi"},
+ {name: "简介", value: "hello"},
], function(event, button, meta, list) {
can.run(event, ["action", "create"].concat(["type", list[0], "name", list[1], "text", list[2]]), function(msg) {
can.user.Search(can, {river: msg.Result()})
@@ -136,8 +149,8 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg,
})
},
carte: function(event, can, list, cb) {
- var ui = can.user.carte(event, can, can.ondetail, list, cb)
- can.page.Modify(can, ui.first, {style: {
+ var carte = can.user.carte(event, can, can.ondetail, list, cb)
+ can.page.Modify(can, carte._target, {style: {
left: event.clientX-event.offsetX+event.target.offsetWidth-3, top: event.clientY-event.offsetY,
}})
},
@@ -156,7 +169,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
"共享群组": function(event, can, button, river) {
can.user.input(event, can, [
- {_input: "text", name: "name", value: river},
+ {name: "name", value: river},
], function(event, button, meta, list) {
var msg = can.request(event)
can.user.share(can, msg, [river, "action", "share", "type", can._RIVER, "name", meta.name])
@@ -179,8 +192,8 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
"添加应用": function(event, can, button, river) {
can.user.input(event, can, [
["类型", "public", "protected", "private"],
- {_input: "text", name: "名称", value: "hi"},
- {_input: "text", name: "简介", value: "hello"},
+ {name: "名称", value: "hi"},
+ {name: "简介", value: "hello"},
], function(event, button, meta, list) {
can.run({}, [river, "tool", "action", "create"].concat(["type", list[0], "name", list[1], "text", list[2]]), function(msg) {
can.user.Search(can, {river: river, storm: msg.Result()})
@@ -203,7 +216,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
"共享应用": function(event, can, button, river, storm) {
can.user.input(event, can, [
- {_input: "text", name: "name", value: storm},
+ {name: "name", value: storm},
], function(event, button, meta, list) {
var msg = can.request(event)
can.user.share(can, msg, [river, "action", "share", "type", can._STORM, "name", meta.name,
@@ -224,7 +237,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
can.search(event, ["Action.onexport.args"], function(item, next, index, array) {
var msg = can.request({}, {hash: storm, id: item.dataset.id})
can.run(msg._event, [river, "tool", "action", "modify", "arg", item.dataset.args], function(msg) {
- can.user.toast(can, "保存"+(index+1)+"/"+array.length)
+ can.user.toast(can, (index+1)+"/"+array.length, "保存参数", 10000, (index+1)/array.length)
next()
})
})
@@ -268,7 +281,7 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
"共享主机": function(event, can, button, river, storm) {
can.run(event, ["action", "invite"], function(msg) {
- var toast = can.user.toast(can, {
+ can.user.toast(can, {
title: "共享主机", content: msg.Result(),
button: ["close"], duration: -1, width: -100,
})
@@ -288,9 +301,9 @@ Volcanos("ondetail", {help: "菜单交互", list: ["共享群组", "添加用户
var msg = can.request(event, {action: "start"})
can.run(event, cmds, cb, silent)
}}, [
- {_input: "text", name: "name", value: "@key"},
- {_input: "text", name: "repos", value: "@key"},
- {_input: "text", name: "template", value: "@key"},
+ {name: "name", value: "@key"},
+ {name: "repos", value: "@key"},
+ {name: "template", value: "@key"},
], function(event, button, data, list, args) {
can.run(event, ["action", "start"].concat(args), function(msg) {
can.user.open(can.user.MergeURL(can, {pod: can.core.Keys(can.user.Search(can, "pod"), msg.Option("name"))}))
diff --git a/plugin/input.js b/plugin/input.js
index 9c890e28..f66bbdfe 100644
--- a/plugin/input.js
+++ b/plugin/input.js
@@ -13,7 +13,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta,
}
},
- "upload": function(event, can) { can.user.upload(event, can) },
+ upload: function(event, can) { can.user.upload(event, can) },
"执行": function(event, can) { can.run(event) },
"刷新": function(event, can) { can.run(event) },
"查看": function(event, can) { can.run(event) },
diff --git a/plugin/input/date.css b/plugin/input/date.css
index e4be3dc8..588c4656 100644
--- a/plugin/input/date.css
+++ b/plugin/input/date.css
@@ -7,3 +7,7 @@ fieldset.input.date div.output td.last {
fieldset.input.date div.output td.next {
color:gray;
}
+fieldset.input.date div.output td {
+ padding:2px 12px;
+}
+
diff --git a/plugin/input/date.js b/plugin/input/date.js
index a7fd4896..d4636e4a 100644
--- a/plugin/input/date.js
+++ b/plugin/input/date.js
@@ -56,7 +56,7 @@ Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(e
for (var day = new Date(one); day < end; day.setDate(day.getDate()+1)) {add(day, "main")}
for (var day = new Date(end); end.getDay() != 0 && day < tail; day.setDate(day.getDate()+1)) {add(day, "next")}
- can.onlayout.figure(event, can); return now
+ return can.onlayout.figure(event, can), now
}; show(now)
}} }, ["/plugin/input/date.css"])
diff --git a/plugin/local/chat/media.js b/plugin/local/chat/media.js
index 93ed06b5..62e486f5 100644
--- a/plugin/local/chat/media.js
+++ b/plugin/local/chat/media.js
@@ -24,7 +24,7 @@ Volcanos("onaction", {help: "操作数据", list: [], _init: function(can, msg,
video.srcObject = stream, video.play()
can.ui.video = video
}, function(error) {
- can.base.Log("open camera", error)
+ can.misc.Log("open camera", error)
})
},
snapshot: function(event, can) {
diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js
index 32dc6772..40c57769 100644
--- a/plugin/local/code/inner.js
+++ b/plugin/local/code/inner.js
@@ -95,7 +95,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, list, cb,
can.onimport.tabview(can, path, file, "", cb)
}, _init: function(item) {
can.core.Timer(10, function() { item.click() })
- can.page.EnableDrop(can, can._action, "div.file", item)
+ can.onmotion.EnableDrop(can, can._action, "div.file", item)
}}
]).last
}, true)
@@ -264,7 +264,7 @@ Volcanos("onaction", {help: "控件交互", list: ["项目"],
can.page.Modify(can, can.ui.search, {style: {display: ""}})
value = can.ui.word.value = value || can.ui.word.value || "main"
- var msg = can.request(event, {_toast: "搜索中..."})
+ can.request(event, {_toast: "搜索中..."})
can.run(event, ["action", "search", can.parse, value, can.Option("path")], function(msg) {
can.onmotion.clear(can, can.ui.tags)
@@ -304,8 +304,8 @@ Volcanos("onaction", {help: "控件交互", list: ["项目"],
favorLine: function(can, value) {
can.user.input(event, can, [
- {_input: "text", name: "topic", value: "@key"},
- {_input: "text", name: "name", value: "@key"},
+ {name: "topic", value: "@key"},
+ {name: "name", value: "@key"},
], function(event, button, meta, list) {
can.run(event, ["action", "favor",
"action", "insert", "topic", meta.topic||"some",
diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js
index 1e740507..953db26a 100644
--- a/plugin/local/code/vimer.js
+++ b/plugin/local/code/vimer.js
@@ -86,9 +86,8 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert"
can.ui.current.focus()
},
- _remote: function(event, can, key, arg, cb) {
- var toast = can.user.toast(can, "执行中...", key, 1000000)
- can.run(event, arg||["action", key, can.parse, can.Option("file"), can.Option("path")], cb||function(msg) { toast.Close()
+ _remote: function(event, can, key, arg, cb) { can.request(event, {_toast: "执行中..."})
+ can.run(event, arg||["action", key, can.parse, can.Option("file"), can.Option("path")], cb||function(msg) {
can.onappend.table(can, msg, function(value, key, index) { return {text: [value, "td"]} }, can.ui.output)
can.onappend.board(can, msg.Result(), can.ui.output)
}, true)
@@ -273,7 +272,7 @@ Volcanos("onkeymap", {help: "键盘交互", list: ["command", "normal", "insert"
can.ui.current.setSelectionRange(can.ui.current.selectionStart, can.ui.current.selectionEnd)
},
jk: function(event, can) {
- can.page.DelText(can.ui.current, can.ui.current.selectionStart-1, 1)
+ can.onkeypop.DelText(can.ui.current, can.ui.current.selectionStart-1, 1)
can.onkeymap.insert.Escape(event, can)
},
},
diff --git a/plugin/local/wiki/draw.js b/plugin/local/wiki/draw.js
index dac1de4b..39374ab1 100644
--- a/plugin/local/wiki/draw.js
+++ b/plugin/local/wiki/draw.js
@@ -105,7 +105,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg,
can.onimport._figure(event, can, can.point = can.point.concat(point))
},
onmousemove: function(event, can) { var point = can.onimport._point(event, can)
- can.page.Prepos(event, event.target)
+ can.onmotion.Prepos(event, event.target)
if (can.Action("go") == "run") { return can.page.Modify(can, event.target, {style: {cursor: ""}}) }
if (can.Action("go") == "auto") { can.onaction._auto(can, event.target) }
can.onimport._figure(event, can, can.point.concat(point))
@@ -213,8 +213,8 @@ Volcanos("onfigure", {help: "图形绘制", list: [],
},
grid: function(event, can, point) { var target = event.target
if (target == can.svg) { return }
- var p = point[point.length-1], pos = can.page.Prepos(event, target)
- target.Val && can.page.Anchor(event, target, pos, p)
+ var p = point[point.length-1], pos = can.onmotion.Prepos(event, target)
+ target.Val && can.onmotion.Anchor(event, target, pos, p)
return p.target = target, p.anchor = pos, point
},
draw: function(event, can, point) { if (point.length < 2) { return }
@@ -327,7 +327,7 @@ Volcanos("onaction", {help: "组件菜单", list: [
can.user.toast(can, "保存成功")
}, true)
},
- "项目": function(event, can) { can.page.Toggle(can, can.ui.project) },
+ "项目": function(event, can) { can.onmotion.Toggle(can, can.ui.project) },
"显示": function(event, can) { can.onmotion.show(can, {value: 100, length: 10}, null, can.group) },
"隐藏": function(event, can) { can.onmotion.hide(can, {value: 100, length: 10}, null, can.group) },
"添加": function(event, can) {
@@ -359,7 +359,7 @@ Volcanos("onaction", {help: "组件菜单", list: [
_auto: function(can, target) {
if (can.point.length > 0) { return }
- var pos = can.page.Prepos(event, event.target)
+ var pos = can.onmotion.Prepos(event, event.target)
if (target.tagName == "text") {
} else if (target == can.svg) {
@@ -406,7 +406,7 @@ Volcanos("onaction", {help: "组件菜单", list: [
return ship.pid && (ship.target = can.page.Select(can, can.svg, "."+ship.pid)[0]) && ship
})
}
- }), pos: can.page.Prepos(event, target)}
+ }), pos: can.onmotion.Prepos(event, target)}
}
return
}
@@ -415,12 +415,12 @@ Volcanos("onaction", {help: "组件菜单", list: [
}
can.core.List(can.current.begin, function(item) { var figure = can.onfigure._get(can, item.target)
- can.page.Resizes(event, item.target, item, point[0], point[1], can.current.pos)
+ can.onmotion.Resizes(event, item.target, item, point[0], point[1], can.current.pos)
can.page.Select(can, can.svg, "."+item.target.Value("text"), function(text) {
text.Value(figure.text(can, {}, item.target))
})
can.core.List(item.ship, function(ship) {
- var p = can.page.Anchor(event, item.target, ship.anchor, {})
+ var p = can.onmotion.Anchor(event, item.target, ship.anchor, {})
if (ship.which == 0) {
ship.target.Val("x1", p.x)
ship.target.Val("y1", p.y)
diff --git a/plugin/local/wiki/word.css b/plugin/local/wiki/word.css
index 40b7ca8f..d57eff0e 100644
--- a/plugin/local/wiki/word.css
+++ b/plugin/local/wiki/word.css
@@ -5,28 +5,6 @@ fieldset.word>form.option>div.item.text input {
fieldset.word a {
word-break:break-word;
}
-fieldset.word h1.story {
- clear:both;
-}
-fieldset.word h2.story {
- clear:both;
-}
-fieldset.word h3.story {
- clear:both;
-}
-fieldset.word h1:hover {
- background:green;
- cursor:pointer;
-}
-fieldset.word h2:hover {
- background:green;
- cursor:pointer;
-}
-fieldset.word h3:hover {
- background:green;
- cursor:pointer;
-}
-
fieldset.word ul.story[data-type=premenu] {
cursor:pointer;
}
diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js
index 10fd5cfc..234b950a 100644
--- a/plugin/local/wiki/word.js
+++ b/plugin/local/wiki/word.js
@@ -133,12 +133,12 @@ Volcanos("onaction", {help: "控件交互", list: [],
"快闪": function(event, sub) { sub.sup.onaction.flash(sub) },
"网格": function(event, sub) { sub.sup.onaction.grid(sub) },
- "大纲": function(event, sub) { sub.page.Toggle(sub, sub.ui.project) },
+ "大纲": function(event, sub) { sub.onmotion.Toggle(sub, sub.ui.project) },
"首页": function(event, sub) { sub.sup.onaction.show(sub, 0) },
"上一页": function(event, sub) { sub.sup.onaction.prev(sub, sub.ui.content) },
"菜单": function(event, sub) { sub.sup.onaction.show(sub, event.target.selectedIndex) },
"下一页": function(event, sub) { sub.sup.onaction.next(sub, sub.ui.content) },
- "隐藏": function(event, sub) { sub.page.Toggle(sub, sub._output) },
+ "隐藏": function(event, sub) { sub.onmotion.Toggle(sub, sub._output) },
"结束": function(event, sub) { sub.page.Remove(sub, sub._target)
sub.onengine.signal(sub, "keymap.focus", sub.request(event, {cb: null}))
},
diff --git a/plugin/state.js b/plugin/state.js
index c53e8acd..d5619ccd 100644
--- a/plugin/state.js
+++ b/plugin/state.js
@@ -98,8 +98,8 @@ Volcanos("onaction", {help: "交互操作", list: ["保存参数", "清空参数
res.push(can.core.Item(line, function(key, value) { return value }).join(","))
})
- res.length > 1 && can.user.download(can, URL.createObjectURL(new Blob([res.join("\n")])), meta.name+".csv")
- msg.result && can.user.download(can, URL.createObjectURL(new Blob([msg.Result()])), meta.name+".txt")
+ res.length > 1 && can.user.downloads(can, res.join("\n"), meta.name+".csv")
+ msg.result && can.user.downloads(can, msg.Result(), meta.name+".txt")
},
"清空数据": function(event, can) {
can.onmotion.clear(can, can._output)
@@ -135,10 +135,10 @@ Volcanos("onaction", {help: "交互操作", list: ["保存参数", "清空参数
can.run(event, can.base.Simple("action", cmd, can.base.parseJSON(text)), function(msg) {
can.user.toast(can, text, "添加成功"), can.run()
}, true)
- }).catch((err) => { can.base.Log(err) })
+ }).catch((err) => { can.misc.Log(err) })
return
} else {
- can.user.input(event, can, [{_input: "textarea"}], function(ev, button, data, list, args) {
+ can.user.input(event, can, [{type: "textarea"}], function(ev, button, data, list, args) {
can.run(event, can.base.Simple("action", cmd, can.base.parseJSON(list[0])), function(msg) {
can.user.toast(can, list[0], "添加成功"), can.run()
}, true)
@@ -157,7 +157,7 @@ Volcanos("onaction", {help: "交互操作", list: ["保存参数", "清空参数
},
openLocation: function(event, can) { can.user.agent.openLocation(can.request(event)) },
- "参数": function(event, can) { can.page.Toggle(can, can._action) },
+ "参数": function(event, can) { can.onmotion.Toggle(can, can._action) },
"关闭": function(event, can) { can.page.Remove(can, can._target) },
"清空": function(event, can, name) { can.onmotion.clear(can, can._output) },
})
diff --git a/proto.js b/proto.js
index 4e4aa840..a88f37d7 100644
--- a/proto.js
+++ b/proto.js
@@ -11,7 +11,7 @@ function shy(help, meta, list, cb) {
cb.list = next("object") || []
return cb
}; var _can_name = ""
-var Volcanos = shy("火山架", {args: {}, data: {}, pack: {}, libs: [], cache: {}}, [], function(name, can, libs, cb) {
+var Volcanos = shy("火山架", {args: {}, pack: {}, libs: [], cache: {}, float: {}}, [], function(name, can, libs, cb) {
var meta = arguments.callee.meta, list = arguments.callee.list
if (typeof name == "object") { var Config = name; _can_name = ""
meta.libs = Config.libs, meta.volcano = Config.volcano
@@ -24,7 +24,7 @@ var Volcanos = shy("火山架", {args: {}, data: {}, pack: {}, libs: [], cache:
// 根模块
name = Config.name, can = {_follow: Config.name, _target: document.body}
libs = Preload.concat(Config.main.list, Config.libs), cb = function(can) {
- can.onengine._init(can, can.Conf(Config), Config.panels, function(msg) { can.base.Log(can.user.title(), "run", can)
+ can.onengine._init(can, can.Conf(Config), Config.panels, function(msg) { can.misc.Log(can.user.title(), "run", can)
document.body.onresize = function() { can.onlayout._init(can, can._target) }
}, can._target)
}
@@ -82,7 +82,7 @@ var Volcanos = shy("火山架", {args: {}, data: {}, pack: {}, libs: [], cache:
cmd: function(target, field) {
return can.search({}, [target+".onaction."+field])
},
- search: function(event, cmds, cb) { can.run(event, ["search"].concat(cmds), cb, true) },
+ search: function(event, cmds, cb) { can.run && can.run(event, ["search"].concat(cmds), cb, true) },
Conf: function(key, value) { return can.core.Value(can._conf, key, value) }, _conf: {},
// }; can = can || {}; for (var k in proto) { can.hasOwnProperty(k) || (can[k] = proto[k]) }
}; can = can || {}; can.__proto__ = proto