1
0
forked from x/volcanos
This commit is contained in:
IT 老营长 @云轩领航-创始人 2022-01-26 02:51:05 +08:00
parent 3865cbb3b9
commit 73d4c76f1c
41 changed files with 6413 additions and 6417 deletions

1804
frame.js

File diff suppressed because it is too large Load Diff

View File

@ -1,264 +1,264 @@
Volcanos("base", {help: "数据类型",
Int: function(val, def) {
return parseInt(val)||def||0
},
Obj: function(val, def) {
try {
val = typeof val == lang.STRING && val != ""? JSON.parse(val): val
if (val && val.length == 0 && def && def.length > 0) { return def }
return val||def
} catch (e) {
return [val]
}
},
Copy: function(to, from) {
if (arguments.length == 2) {
for (var k in from) { to[k] = from[k] }
return to
}
for (var i = 2; i < arguments.length; i++) {
var k = arguments[i]; to[k] = from[k]
}
return to
},
Eq: function(to, from) { var call = arguments.callee
if (typeof to != typeof from) { return false }
Int: function(val, def) {
return parseInt(val)||def||0
},
Obj: function(val, def) {
try {
val = typeof val == lang.STRING && val != ""? JSON.parse(val): val
if (val && val.length == 0 && def && def.length > 0) { return def }
return val||def
} catch (e) {
return [val]
}
},
Copy: function(to, from) {
if (arguments.length == 2) {
for (var k in from) { to[k] = from[k] }
return to
}
for (var i = 2; i < arguments.length; i++) {
var k = arguments[i]; to[k] = from[k]
}
return to
},
Eq: function(to, from) { var call = arguments.callee
if (typeof to != typeof from) { return false }
if (typeof to == lang.OBJECT) {
if (to.length != from.length) { return false }
for (var i = 0; i < to.length; i++) {
if (!call(to[i], from[i])) { return false }
}
for (var k in to) {
if (!call(to[k], from[k])) { return false }
}
return true
}
return to === from
},
if (typeof to == lang.OBJECT) {
if (to.length != from.length) { return false }
for (var i = 0; i < to.length; i++) {
if (!call(to[i], from[i])) { return false }
}
for (var k in to) {
if (!call(to[k], from[k])) { return false }
}
return true
}
return to === from
},
Ext: function(path) {
return (path.split(ice.PS).pop().split(ice.PT).pop()).toLowerCase()
},
Path: function(path) { var res = ""
for (var i = 0; i < arguments.length; i++) {
res += (arguments[i][0]==ice.PS || res=="" || res[res.length-1]==ice.PS? "": ice.PS) + arguments[i].trim()
}
return res
},
Args: function(obj) { var res = []
for (var k in obj) {
res.push(encodeURIComponent(k)+"="+encodeURIComponent(obj[k]))
}
return res.join("&")
},
MergeURL: function(url) {
var args = {}; (url.split("?")[1]||"").split("&").forEach(function(item) { if (!item) { return }
var ls = item.split("="); args[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1])
})
for (var i = 1; i < arguments.length; i++) {
switch (typeof arguments[i]) {
case lang.STRING:
args[arguments[i]] = arguments[i+1], i++
break
case lang.OBJECT:
if (arguments[i].length > 0) {
for (var j = 0; j < arguments[i].length; j += 2) {
args[arguments[i][j]] = arguments[i][j]
}
} else {
for (var k in arguments[i]) {
args[k] = arguments[i][k]
}
}
break
}
}
var list = []; for (var k in args) {
list.push(encodeURIComponent(k)+"="+encodeURIComponent(args[k]))
}
return url.split("?")[0]+(list.length>0? "?"+list.join("&"): "")
},
ParseURL: function(url) { var res = {link: url}
var list = url.split("?"); res["origin"] = list[0]
list[1] && list[1].split("&").forEach(function(item) {
var ls = item.split("="); res[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1])
})
return res
},
ParseJSON: function(str) { var res
if (typeof str == lang.OBJECT) { return str }
if (str.indexOf("http") == 0) { var ls = str.split("?")
res = {type: mdb.LINK, name: "", text: str}
res.name = ls[0].split("://").pop().split(ice.PS)[0]
ls[1] && ls[1].split("&").forEach(function(item) { var ls = item.split("=")
res[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1])
})
return res
}
try { res = JSON.parse(str)
res.text = res.text||str
res.type = res.type||nfs.JSON
} catch (e) {
res = {type: mdb.TEXT, text: str}
}
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)
},
Ext: function(path) {
return (path.split(ice.PS).pop().split(ice.PT).pop()).toLowerCase()
},
Path: function(path) { var res = ""
for (var i = 0; i < arguments.length; i++) {
res += (arguments[i][0]==ice.PS || res=="" || res[res.length-1]==ice.PS? "": ice.PS) + arguments[i].trim()
}
return res
},
Args: function(obj) { var res = []
for (var k in obj) {
res.push(encodeURIComponent(k)+"="+encodeURIComponent(obj[k]))
}
return res.join("&")
},
MergeURL: function(url) {
var args = {}; (url.split("?")[1]||"").split("&").forEach(function(item) { if (!item) { return }
var ls = item.split("="); args[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1])
})
for (var i = 1; i < arguments.length; i++) {
switch (typeof arguments[i]) {
case lang.STRING:
args[arguments[i]] = arguments[i+1], i++
break
case lang.OBJECT:
if (arguments[i].length > 0) {
for (var j = 0; j < arguments[i].length; j += 2) {
args[arguments[i][j]] = arguments[i][j]
}
} else {
for (var k in arguments[i]) {
args[k] = arguments[i][k]
}
}
break
}
}
var list = []; for (var k in args) {
list.push(encodeURIComponent(k)+"="+encodeURIComponent(args[k]))
}
return url.split("?")[0]+(list.length>0? "?"+list.join("&"): "")
},
ParseURL: function(url) { var res = {link: url}
var list = url.split("?"); res["origin"] = list[0]
list[1] && list[1].split("&").forEach(function(item) {
var ls = item.split("="); res[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1])
})
return res
},
ParseJSON: function(str) { var res
if (typeof str == lang.OBJECT) { return str }
if (str.indexOf("http") == 0) { var ls = str.split("?")
res = {type: mdb.LINK, name: "", text: str}
res.name = ls[0].split("://").pop().split(ice.PS)[0]
ls[1] && ls[1].split("&").forEach(function(item) { var ls = item.split("=")
res[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1])
})
return res
}
try { res = JSON.parse(str)
res.text = res.text||str
res.type = res.type||nfs.JSON
} catch (e) {
res = {type: mdb.TEXT, text: str}
}
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)
},
Size: function(size) { size = parseInt(size)
if (size > 1000000000) {
return parseInt(size/1000000000) + ice.PT + parseInt(size/10000000%100) + "G"
}
if (size > 1000000) {
return parseInt(size/1000000) + ice.PT + parseInt(size/10000%100) + "M"
}
if (size > 1000) {
return parseInt(size/1000) + ice.PT + 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 lang.NUMBER: res.push(arg); break
case lang.STRING: res.push(arg); break
case lang.OBJECT:
if (arg.length > 0) { res = res.concat(arg); break }
for (var k in arg) { k && arg[k] && res.push(k, arg[k]) }
break
default: res.push(arg);
}
}
return res
},
AddUniq: function(list, value) { list = list||[]
return list.indexOf(value) == -1 && list.push(value), list
},
Size: function(size) { size = parseInt(size)
if (size > 1000000000) {
return parseInt(size/1000000000) + ice.PT + parseInt(size/10000000%100) + "G"
}
if (size > 1000000) {
return parseInt(size/1000000) + ice.PT + parseInt(size/10000%100) + "M"
}
if (size > 1000) {
return parseInt(size/1000) + ice.PT + 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 lang.NUMBER: res.push(arg); break
case lang.STRING: res.push(arg); break
case lang.OBJECT:
if (arg.length > 0) { res = res.concat(arg); break }
for (var k in arg) { k && arg[k] && res.push(k, arg[k]) }
break
default: res.push(arg);
}
}
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 == lang.STRING && time != "") { var ls = time.split(ice.SP)
var vs = ls[0].split("-")
now.setFullYear(parseInt(vs[0]))
now.setMonth(parseInt(vs[1])-1)
now.setDate(parseInt(vs[2]))
Date: function(time) { var now = new Date()
if (typeof time == lang.STRING && time != "") { var ls = time.split(ice.SP)
var vs = ls[0].split("-")
now.setFullYear(parseInt(vs[0]))
now.setMonth(parseInt(vs[1])-1)
now.setDate(parseInt(vs[2]))
var vs = ls[1].split(":")
now.setHours(parseInt(vs[0]))
now.setMinutes(parseInt(vs[1]))
now.setSeconds(parseInt(vs[2]))
} else if (time) {
now = time
}
return now
},
Time: function(time, fmt) { var now = this.Date(time)
var list = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
fmt = fmt||"%H:%M:%S"
fmt = fmt.replace("%y", now.getFullYear())
fmt = fmt.replace("%m", this.Number(now.getMonth()+1, 2))
fmt = fmt.replace("%d", this.Number(now.getDate(), 2))
fmt = fmt.replace("%w", list[now.getDay()])
fmt = fmt.replace("%H", this.Number(now.getHours(), 2))
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
h = parseInt(n/60000), h > 0 && (res += h+"m"), n = n % 60000
h = parseInt(n/1000), h > 0 && (res += h), n = n % 1000
return res + (n > 0? ice.PT+parseInt(n/10): "") + "s"
},
var vs = ls[1].split(":")
now.setHours(parseInt(vs[0]))
now.setMinutes(parseInt(vs[1]))
now.setSeconds(parseInt(vs[2]))
} else if (time) {
now = time
}
return now
},
Time: function(time, fmt) { var now = this.Date(time)
var list = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
fmt = fmt||"%H:%M:%S"
fmt = fmt.replace("%y", now.getFullYear())
fmt = fmt.replace("%m", this.Number(now.getMonth()+1, 2))
fmt = fmt.replace("%d", this.Number(now.getDate(), 2))
fmt = fmt.replace("%w", list[now.getDay()])
fmt = fmt.replace("%H", this.Number(now.getHours(), 2))
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
h = parseInt(n/60000), h > 0 && (res += h+"m"), n = n % 60000
h = parseInt(n/1000), h > 0 && (res += h), n = n % 1000
return res + (n > 0? ice.PT+parseInt(n/10): "") + "s"
},
getValid: function() {
for (var i = 0; i < arguments.length; i++) { var v = arguments[i]
if (typeof v == lang.OBJECT) {
if (v == null) { continue }
for (var k in v) { return v }
if (v.length > 0) { return v }
} else if (typeof v == lang.STRING && v) {
return v
} else if (v == undefined) {
continue
} else {
return v
}
}
},
isNumber: function(val) { return typeof val == lang.NUMBER },
isString: function(val) { return typeof val == lang.STRING },
isObject: function(val) { return typeof val == lang.OBJECT },
isArray: function(val) { return typeof val == lang.OBJECT && val.length != undefined },
isFunc: function(val) { return typeof val == lang.FUNCTION },
isFunction: function(val) { return typeof val == lang.FUNCTION },
isCallback: function(key, value) { return key.indexOf("on") == 0 && typeof value == lang.FUNCTION },
isUndefined: function(val) { return val == undefined },
isNull: function(val) { return val == null },
replaceAll: function(str) {
for (var i = 1; i < arguments.length; i += 2) {
str = str.replaceAll(arguments[i], arguments[i+1])
}
return str
},
getValid: function() {
for (var i = 0; i < arguments.length; i++) { var v = arguments[i]
if (typeof v == lang.OBJECT) {
if (v == null) { continue }
for (var k in v) { return v }
if (v.length > 0) { return v }
} else if (typeof v == lang.STRING && v) {
return v
} else if (v == undefined) {
continue
} else {
return v
}
}
},
isNumber: function(val) { return typeof val == lang.NUMBER },
isString: function(val) { return typeof val == lang.STRING },
isObject: function(val) { return typeof val == lang.OBJECT },
isArray: function(val) { return typeof val == lang.OBJECT && val.length != undefined },
isFunc: function(val) { return typeof val == lang.FUNCTION },
isFunction: function(val) { return typeof val == lang.FUNCTION },
isCallback: function(key, value) { return key.indexOf("on") == 0 && typeof value == lang.FUNCTION },
isUndefined: function(val) { return val == undefined },
isNull: function(val) { return val == null },
replaceAll: function(str) {
for (var i = 1; i < arguments.length; i += 2) {
str = str.replaceAll(arguments[i], arguments[i+1])
}
return str
},
isNight: function() { var now = new Date()
return now.getHours() < 7 || now.getHours() > 17
},
beginWith: function(str, begin) {
return str.trim().indexOf(begin) == 0
},
endWith: function(str, end) {
return str.lastIndexOf(end) + end.length == str.length
},
trim: function(args) { if (this.isString(args)) { return args.trim() }
if (this.isArray(args)) { for (var i = args.length-1; i >= 0; i--) { if (!args[i]) { args.pop() } else { break } } }
return args
},
trimPrefix: function(str, pre) {
if (str.indexOf(pre) == -1) {
return str
}
return str.slice(pre.length)
},
trimSuffix: function(str, end) {
if (str.indexOf(end) == -1) {
return str
}
return str.slice(0, str.indexOf(end))
},
join: function(list, sp) { return (list||[]).join(sp||ice.SP) },
joins: function(list, inner, outer) {
for (var i = 0; i < list.length; i++) {
list[i] = typeof list[i] == lang.STRING? list[i]: list[i].join(inner||ice.FS)
}
return list.join(outer||ice.SP)
},
isNight: function() { var now = new Date()
return now.getHours() < 7 || now.getHours() > 17
},
beginWith: function(str, begin) {
return str.trim().indexOf(begin) == 0
},
endWith: function(str, end) {
return str.lastIndexOf(end) + end.length == str.length
},
trim: function(args) { if (this.isString(args)) { return args.trim() }
if (this.isArray(args)) { for (var i = args.length-1; i >= 0; i--) { if (!args[i]) { args.pop() } else { break } } }
return args
},
trimPrefix: function(str, pre) {
if (str.indexOf(pre) == -1) {
return str
}
return str.slice(pre.length)
},
trimSuffix: function(str, end) {
if (str.indexOf(end) == -1) {
return str
}
return str.slice(0, str.indexOf(end))
},
join: function(list, sp) { return (list||[]).join(sp||ice.SP) },
joins: function(list, inner, outer) {
for (var i = 0; i < list.length; i++) {
list[i] = typeof list[i] == lang.STRING? list[i]: list[i].join(inner||ice.FS)
}
return list.join(outer||ice.SP)
},
})

View File

@ -1,191 +1,191 @@
Volcanos("core", {help: "数据结构",
Keys: shy("连接器", function() { var list = []
for (var i = 0; i < arguments.length; i++) { var v = arguments[i]
switch (typeof v) {
case lang.OBJECT:
for (var j = 0; j < v.length; j++) {
list.push(v[j])
}
break
case lang.FUNCTION: v = v()
default: v && list.push(v+"")
}
}
return list.join(ice.PT)
}),
Value: shy("存储器", function(data, key, value) {
if (data == undefined) { return }
if (key == undefined) { return data }
Keys: shy("连接器", function() { var list = []
for (var i = 0; i < arguments.length; i++) { var v = arguments[i]
switch (typeof v) {
case lang.OBJECT:
for (var j = 0; j < v.length; j++) {
list.push(v[j])
}
break
case lang.FUNCTION: v = v()
default: v && list.push(v+"")
}
}
return list.join(ice.PT)
}),
Value: shy("存储器", function(data, key, value) {
if (data == undefined) { return }
if (key == undefined) { return data }
if (typeof key == lang.OBJECT) { for (var k in key) {
arguments.callee.call(this, data, k, key[k])
}; return data }
if (typeof key == lang.OBJECT) { for (var k in key) {
arguments.callee.call(this, data, k, key[k])
}; return data }
if (value != undefined) { data[key] = value }
if (data[key] != undefined) { return data[key] }
if (value != undefined) { data[key] = value }
if (data[key] != undefined) { return data[key] }
var p = data, ls = key.split(ice.PT); while (p && ls.length > 0) {
if (ls[0] == "-1") { ls[0] = p.length-1 }
p = p[ls[0]], ls = ls.slice(1)
}; return p
}),
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] == lang.OBJECT? opt = arguments[i]: arg.push(arguments[i])
}
var p = data, ls = key.split(ice.PT); while (p && ls.length > 0) {
if (ls[0] == "-1") { ls[0] = p.length-1 }
p = p[ls[0]], ls = ls.slice(1)
}; return p
}),
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] == lang.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 space = _list(arg[0]||"\t ,;\n") // 空白符
var block = _list(arg[1]||"{[()]}") // 分隔符
var quote = _list(arg[2]||"'\"`") // 引用符
var trans = _list(arg[3]||"\\") // 转义符
// 字符定义
function _list(str) { var res = {}; for (var i = 0; i < str.length; i++) { res[str[i]] = true }; return res }
var space = _list(arg[0]||"\t ,;\n") // 空白符
var block = _list(arg[1]||"{[()]}") // 分隔符
var quote = _list(arg[2]||"'\"`") // 引用符
var trans = _list(arg[3]||"\\") // 转义符
var res = [], begin = 0; function push(obj) {
obj && res.push(typeof obj == lang.STRING || opt.detail? obj: obj.text), begin = -1
}
var res = [], begin = 0; function push(obj) {
obj && res.push(typeof obj == lang.STRING || opt.detail? obj: obj.text), begin = -1
}
// 开始分词
for (var s = "", i = 0; i < str.length; i++) {
if (space[str[i]]) { // 空白符
if (s) { continue }
begin > -1 && push(str.slice(begin, i))
opt.detail && push({type: "space", text: str.slice(i, i+1)})
// 开始分词
for (var s = "", i = 0; i < str.length; i++) {
if (space[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 (block[str[i]]) { // 分隔符
if (s) { continue }
begin > -1 && push(str.slice(begin, i))
push(str.slice(i, i+1))
} else if (block[str[i]]) { // 分隔符
if (s) { continue }
begin > -1 && push(str.slice(begin, i))
push(str.slice(i, i+1))
} else if (quote[str[i]]) { // 引用符
if (s == "") {
s = str[i], begin = i+1
} else if (s == str[i]) {
push({type: lang.STRING, text: str.slice(begin, i), left: s, right: str[i]})
s = "", begin = -1
}
} else if (quote[str[i]]) { // 引用符
if (s == "") {
s = str[i], begin = i+1
} else if (s == str[i]) {
push({type: lang.STRING, text: str.slice(begin, i), left: s, right: str[i]})
s = "", begin = -1
}
} else if (trans[str[i]]) { // 转义符
begin == -1 && (begin = i++)
} else if (trans[str[i]]) { // 转义符
begin == -1 && (begin = i++)
} else { // 普通符
begin == -1 && (begin = i)
}
}
} else { // 普通符
begin == -1 && (begin = i)
}
}
// 剩余字符
begin >= 0 && (s? push({type: lang.STRING, text: str.slice(begin), left: s, right: ""}): push(str.slice(begin)))
return res
}),
CallFunc: shy("调用器", function(func, args, mod) { args = args||{}
var can = args["can"]||args[0], msg = args["msg"]||args[1], cmds = args["cmds"]||[], event = args["event"]||{}
// 剩余字符
begin >= 0 && (s? push({type: lang.STRING, text: str.slice(begin), left: s, right: ""}): push(str.slice(begin)))
return res
}),
CallFunc: shy("调用器", function(func, args, mod) { args = args||{}
var can = args["can"]||args[0], msg = args["msg"]||args[1], cmds = args["cmds"]||[], event = args["event"]||{}
// 查找调用
func = typeof func == lang.FUNCTION? func: typeof func == lang.STRING? this.Value(mod||can, func):
typeof func == lang.OBJECT && func.length > 0? this.Value(func[0], this.Keys(func.slice(1))): null
if (typeof func != lang.FUNCTION) { return }
// 查找调用
func = typeof func == lang.FUNCTION? func: typeof func == lang.STRING? this.Value(mod||can, func):
typeof func == lang.OBJECT && func.length > 0? this.Value(func[0], this.Keys(func.slice(1))): null
if (typeof func != lang.FUNCTION) { return }
// 解析参数
var list = [], echo = false, cb = args["cb"]
this.List(func.toString().split(")")[0].split("(")[1].split(ice.FS), function(item, index) { item = item.trim(); if (item == "") { return }
var arg = args[item] || msg&&msg.Option&&msg.Option(item) || can&&can.Conf&&can.Conf(item) ||
event&&!(event instanceof Event)&&event[item] || args[index] || cmds[index] || null
if (item == "cb") { echo = true }
list.push(arg)
})
// 解析参数
var list = [], echo = false, cb = args["cb"]
this.List(func.toString().split(")")[0].split("(")[1].split(ice.FS), function(item, index) { item = item.trim(); if (item == "") { return }
var arg = args[item] || msg&&msg.Option&&msg.Option(item) || can&&can.Conf&&can.Conf(item) ||
event&&!(event instanceof Event)&&event[item] || args[index] || cmds[index] || null
if (item == "cb") { echo = true }
list.push(arg)
})
// 执行调用
var res = func.apply(mod||can, list)
if (!echo && typeof cb == lang.FUNCTION) { res && msg && msg.Echo(res), arguments.callee.apply(this, [cb, {msg: msg, res: res}]) }
return res
}),
// 执行调用
var res = func.apply(mod||can, list)
if (!echo && typeof cb == lang.FUNCTION) { res && msg && msg.Echo(res), arguments.callee.apply(this, [cb, {msg: msg, res: res}]) }
return res
}),
List: shy("迭代器", function(list, cb, interval, cbs) {
if (typeof list == lang.STRING) { // 默认序列
list = [list]
} else if (typeof list == lang.NUMBER) { // 等差序列 [end cb interval]|[begin end interval]
var begin = 0, end = list, step = typeof interval == lang.NUMBER? interval: 1
if (typeof cb == lang.NUMBER) { begin = list, end = cb, cb = null }
list = []; for (var i = begin; i < end; i += step) { list.push(i) }
}
List: shy("迭代器", function(list, cb, interval, cbs) {
if (typeof list == lang.STRING) { // 默认序列
list = [list]
} else if (typeof list == lang.NUMBER) { // 等差序列 [end cb interval]|[begin end interval]
var begin = 0, end = list, step = typeof interval == lang.NUMBER? interval: 1
if (typeof cb == lang.NUMBER) { begin = list, end = cb, cb = null }
list = []; for (var i = begin; i < end; i += step) { list.push(i) }
}
list = list||[]
list = list||[]
if (interval > 0) { // 时间序列
function loop(i) { if (i >= list.length) { return typeof cbs == lang.FUNCTION && cbs(list) }
cb(list[i], i, list), setTimeout(function() { loop(i+1) }, interval)
}
typeof cb == lang.FUNCTION && list.length > 0 && setTimeout(function() { loop(0) }, interval/4)
} else { // 选择序列
var slice = [], res
for (var i = 0; i < list.length; i++) {
typeof cb == lang.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) {
switch (typeof list) {
case lang.OBJECT: if (list == null) { list = []; break }
if (list.length == undefined) { var ls = []; for (var k in list) { ls.push(k) } list = ls } break
default: if (list == undefined) { list = []; break }
list = [list]
}
if (interval > 0) { // 时间序列
function loop(i) { if (i >= list.length) { return typeof cbs == lang.FUNCTION && cbs(list) }
cb(list[i], i, list), setTimeout(function() { loop(i+1) }, interval)
}
typeof cb == lang.FUNCTION && list.length > 0 && setTimeout(function() { loop(0) }, interval/4)
} else { // 选择序列
var slice = [], res
for (var i = 0; i < list.length; i++) {
typeof cb == lang.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) {
switch (typeof list) {
case lang.OBJECT: if (list == null) { list = []; break }
if (list.length == undefined) { var ls = []; for (var k in list) { ls.push(k) } list = ls } break
default: if (list == undefined) { list = []; break }
list = [list]
}
function next(i) { i < list.length? typeof cb == lang.FUNCTION && cb(list[i], function() { next(i+1) }, i, list):
typeof cbs == lang.FUNCTION && cbs(list) }
return next(0), list
}),
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 == lang.FUNCTION && cb(v, i, k, obj)
}))
}
return list
}),
Item: shy("迭代器", function(obj, cb) { var list = []
for (var k in obj) {
var res = typeof cb == lang.FUNCTION? cb(k, obj[k]): k
res != undefined && list.push(res)
}
return list
}),
ItemCB: shy("迭代器", function(meta, cb, can, item) { var list = []
for (var k in meta) { (function(k) {
if (k.indexOf("on") == 0 && typeof meta[k] == lang.FUNCTION) {
if (typeof cb == lang.FUNCTION) {
cb(k, meta[k])
} else {
cb[k] = function(event) { meta[k](event, can, item) }
}
list.push(k)
}
})(k) }
return list
}),
function next(i) { i < list.length? typeof cb == lang.FUNCTION && cb(list[i], function() { next(i+1) }, i, list):
typeof cbs == lang.FUNCTION && cbs(list) }
return next(0), list
}),
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 == lang.FUNCTION && cb(v, i, k, obj)
}))
}
return list
}),
Item: shy("迭代器", function(obj, cb) { var list = []
for (var k in obj) {
var res = typeof cb == lang.FUNCTION? cb(k, obj[k]): k
res != undefined && list.push(res)
}
return list
}),
ItemCB: shy("迭代器", function(meta, cb, can, item) { var list = []
for (var k in meta) { (function(k) {
if (k.indexOf("on") == 0 && typeof meta[k] == lang.FUNCTION) {
if (typeof cb == lang.FUNCTION) {
cb(k, meta[k])
} else {
cb[k] = function(event) { meta[k](event, can, item) }
}
list.push(k)
}
})(k) }
return list
}),
Timer300ms: function(cb) { this.Timer(300, cb) },
Timer300: function(cb) { this.Timer(300, cb) },
Timer3s: function(cb) { this.Timer(3000, cb) },
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 == lang.FUNCTION && cbs(timer, interval): setTimeout(function() { loop(i+1) }, interval.interval||interval[i+1])
}
Timer300ms: function(cb) { this.Timer(300, cb) },
Timer300: function(cb) { this.Timer(300, cb) },
Timer3s: function(cb) { this.Timer(3000, cb) },
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 == lang.FUNCTION && cbs(timer, interval): setTimeout(function() { loop(i+1) }, interval.interval||interval[i+1])
}
interval = typeof interval == lang.OBJECT? interval: [interval]
if (interval.interval == 0) { cb(); return timer }
interval = typeof interval == lang.OBJECT? interval: [interval]
if (interval.interval == 0) { cb(); return timer }
typeof cb == lang.FUNCTION && setTimeout(function() { loop(0) }, interval.interval||interval[0])
return timer
}),
Delay: shy("延时器", function(list, interval, cb, cbs) { list = list || []
list.push(cb); this.Timer(interval, function() {
var cb = list.pop(); list.length = 0
typeof cb == lang.FUNCTION && cb()
}, cbs)
return list
}),
typeof cb == lang.FUNCTION && setTimeout(function() { loop(0) }, interval.interval||interval[0])
return timer
}),
Delay: shy("延时器", function(list, interval, cb, cbs) { list = list || []
list.push(cb); this.Timer(interval, function() {
var cb = list.pop(); list.length = 0
typeof cb == lang.FUNCTION && cb()
}, cbs)
return list
}),
})

View File

@ -1,296 +1,296 @@
Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg = {}
var proto = {_event: event, _can: can,
RunAction: function(event, sub, cmds) { var msg = can.request(event)
if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }
if (cmds && cmds[0] == ctx.ACTION && sub && can.base.isFunc(sub.onaction[cmds[1]])) {
return msg.Option(ice.MSG_HANDLE, ice.TRUE), can.core.CallFunc(sub.onaction[cmds[1]], {event: event, can: sub, msg: msg, button: cmds[1], cmd: cmds[1]}), true
}
return false
},
OptionStatus: function() { return msg.Option(ice.MSG_STATUS) },
OptionProcess: function() { return msg.Option(ice.MSG_PROCESS) },
OptionOrSearch: function(key) { return can.misc.Search(can, key)||msg.Option(key) },
Option: function(key, val) {
if (key == undefined) { return msg && msg.option || [] }
if (can.base.isObject(key)) { can.core.Item(key, msg.Option) }
if (val == undefined) { return msg && msg[key] && msg[key][0] || "" }
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 (can.base.isObject(key)) { can.core.Item(key, msg.Append) }
if (val == undefined) { return msg && msg[key] && msg[key][0] || "" }
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("") || "" },
var proto = {_event: event, _can: can,
RunAction: function(event, sub, cmds) { var msg = can.request(event)
if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }
if (cmds && cmds[0] == ctx.ACTION && sub && can.base.isFunc(sub.onaction[cmds[1]])) {
return msg.Option(ice.MSG_HANDLE, ice.TRUE), can.core.CallFunc(sub.onaction[cmds[1]], {event: event, can: sub, msg: msg, button: cmds[1], cmd: cmds[1]}), true
}
return false
},
OptionStatus: function() { return msg.Option(ice.MSG_STATUS) },
OptionProcess: function() { return msg.Option(ice.MSG_PROCESS) },
OptionOrSearch: function(key) { return can.misc.Search(can, key)||msg.Option(key) },
Option: function(key, val) {
if (key == undefined) { return msg && msg.option || [] }
if (can.base.isObject(key)) { can.core.Item(key, msg.Option) }
if (val == undefined) { return msg && msg[key] && msg[key][0] || "" }
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 (can.base.isObject(key)) { can.core.Item(key, msg.Append) }
if (val == undefined) { return msg && msg[key] && msg[key][0] || "" }
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("") || "" },
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 }
})
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 can.base.isFunc(cb) && (res = cb(one, index, array)) && res != undefined && res || one
})
},
Clear: function(key) { switch (key||ice.MSG_APPEND) {
case ice.MSG_APPEND:
case ice.MSG_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) {
var i = msg.option && msg.option.indexOf(item); if (i > -1) {
msg.option[i] = "", delete(msg[item])
}
res[item] && (msg[item] = (msg[item]||[]).concat(res[item]))
})
res.option && (msg.option = res.option) && res.option.forEach(function(item) {
res[item] && (msg[item] = res[item])
})
res._option && (msg._option = res._option) && res._option.forEach(function(item) {
res[item] && (msg[item] = res[item])
})
return msg
},
Push: function(key, value, detail) {
if (can.base.isObject(key)) {
value = value||can.core.Item(key), can.core.List(value, function(item) {
detail? msg.Push(mdb.KEY, item).Push(mdb.VALUE, key[item]||""):
msg.Push(item, key[item]||"")
})
return msg
}
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 can.base.isFunc(cb) && (res = cb(one, index, array)) && res != undefined && res || one
})
},
Clear: function(key) { switch (key||ice.MSG_APPEND) {
case ice.MSG_APPEND:
case ice.MSG_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) {
var i = msg.option && msg.option.indexOf(item); if (i > -1) {
msg.option[i] = "", delete(msg[item])
}
res[item] && (msg[item] = (msg[item]||[]).concat(res[item]))
})
res.option && (msg.option = res.option) && res.option.forEach(function(item) {
res[item] && (msg[item] = res[item])
})
res._option && (msg._option = res._option) && res._option.forEach(function(item) {
res[item] && (msg[item] = res[item])
})
return msg
},
Push: function(key, value, detail) {
if (can.base.isObject(key)) {
value = value||can.core.Item(key), can.core.List(value, function(item) {
detail? msg.Push(mdb.KEY, item).Push(mdb.VALUE, key[item]||""):
msg.Push(item, key[item]||"")
})
return msg
}
msg.append = can.base.AddUniq(msg.append, key), msg[key] = msg[key] || []
msg[key].push(can.base.isString(value)||can.base.isFunction(value)? value: JSON.stringify(value))
return msg
},
Echo: function(res) { msg.result = msg.result || []
for (var i = 0; i < arguments.length; i++) { msg.result.push(arguments[i]) }
return msg._hand = true, msg
},
};
return can.misc.proto(msg, proto)
},
POST: function(can, msg, url, form, cb) { // _method _accept _upload _progress
var xhr = new XMLHttpRequest(); msg._xhr = xhr
xhr.open(msg._method||"POST", url), xhr.onreadystatechange = function() {
if (xhr.readyState != 4) { return }
msg.append = can.base.AddUniq(msg.append, key), msg[key] = msg[key] || []
msg[key].push(can.base.isString(value)||can.base.isFunction(value)? value: JSON.stringify(value))
return msg
},
Echo: function(res) { msg.result = msg.result || []
for (var i = 0; i < arguments.length; i++) { msg.result.push(arguments[i]) }
return msg._hand = true, msg
},
};
return can.misc.proto(msg, proto)
},
POST: function(can, msg, url, form, cb) { // _method _accept _upload _progress
var xhr = new XMLHttpRequest(); msg._xhr = xhr
xhr.open(msg._method||"POST", url), xhr.onreadystatechange = function() {
if (xhr.readyState != 4) { return }
try { // 解析响应
var res = JSON.parse(xhr.responseText)
} catch (e) {
var res = {result: [xhr.responseText]}
}
if (xhr.status == 200) {
return can.base.isFunc(cb) && cb(msg.Copy(res))
}
can.user.toast(can, res, xhr.status)
}
try { // 解析响应
var res = JSON.parse(xhr.responseText)
} catch (e) {
var res = {result: [xhr.responseText]}
}
if (xhr.status == 200) {
return can.base.isFunc(cb) && cb(msg.Copy(res))
}
can.user.toast(can, res, xhr.status)
}
if (msg._upload) { // 上传文件
var data = new FormData(); can.core.Items(form, function(value, index, key) {
data.append(key, value)
}), data.append(html.UPLOAD, msg._upload), data.append(ice.MSG_UPLOAD, "upload")
if (msg._upload) { // 上传文件
var data = new FormData(); can.core.Items(form, function(value, index, key) {
data.append(key, value)
}), data.append(html.UPLOAD, msg._upload), data.append(ice.MSG_UPLOAD, "upload")
xhr.upload.onprogress = function(event) {
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) { return key+"="+encodeURIComponent(value) }).join("&")
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
}
xhr.upload.onprogress = function(event) {
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) { return key+"="+encodeURIComponent(value) }).join("&")
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded")
}
// 发送请求
xhr.setRequestHeader("Accept", msg._accept||"application/json")
try { xhr.send(data) } catch(e) { can.misc.Log(e) }
},
Run: function(event, can, dataset, cmds, cb) {
var msg = can.request(event||{}), skip = {_handle: true}
var form = {cmds: cmds||msg.cmd}; msg.option && msg.option.forEach(function(item) {
!skip[item] && msg[item] && (form[item] = msg[item])
})
// 发送请求
xhr.setRequestHeader("Accept", msg._accept||"application/json")
try { xhr.send(data) } catch(e) { can.misc.Log(e) }
},
Run: function(event, can, dataset, cmds, cb) {
var msg = can.request(event||{}), skip = {_handle: true}
var form = {cmds: cmds||msg.cmd}; msg.option && msg.option.forEach(function(item) {
!skip[item] && msg[item] && (form[item] = msg[item])
})
can.misc.POST(can, msg, can.base.MergeURL(dataset.names.toLowerCase(),
"_", (msg._can.sup||msg._can)._name, ice.MSG_DAEMON, msg.__daemon||dataset.daemon||""
), form, cb)
},
WSS: function(can, args, cb, onopen, onclose, onerror) { if (can.user.isIE) { return }
var url = location.protocol.replace("http", "ws")+"//"+location.host+"/space/"
if (url.indexOf("chrome") == 0) { url = "ws://localhost:9020/space/" }
can.misc.POST(can, msg, can.base.MergeURL(dataset.names.toLowerCase(),
"_", (msg._can.sup||msg._can)._name, ice.MSG_DAEMON, msg.__daemon||dataset.daemon||""
), form, cb)
},
WSS: function(can, args, cb, onopen, onclose, onerror) { if (can.user.isIE) { return }
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.misc.Log(html.WSS, cli.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.misc.Log(html.WSS, cli.ERROR, args)
can.base.isFunc(onerror)? onerror(socket): socket.close()
var socket = new WebSocket(can.base.MergeURL(url, args))
socket.onclose = function() { can.misc.Log(html.WSS, cli.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.misc.Log(html.WSS, cli.ERROR, args)
can.base.isFunc(onerror)? onerror(socket): socket.close()
}, socket.onopen = function() { can.misc.Log(html.WSS, cli.OPEN, args)
can.base.isFunc(onopen) && onopen(socket)
}
}, socket.onopen = function() { can.misc.Log(html.WSS, cli.OPEN, args)
can.base.isFunc(onopen) && onopen(socket)
}
socket.onmessage = function(event) {
try { // 解析命令
var data = JSON.parse(event.data)
} catch (e) {
var data = {detail: [event.data]}
}
socket.onmessage = function(event) {
try { // 解析命令
var data = JSON.parse(event.data)
} catch (e) {
var data = {detail: [event.data]}
}
var msg = can.request(event); msg.Reply = function() { // 回复命令
msg.result = (msg.result||[]).concat(can.core.List(arguments))
var msg = can.request(event); msg.Reply = function() { // 回复命令
msg.result = (msg.result||[]).concat(can.core.List(arguments))
msg.Option({_handle: true, _source: (msg[ice.MSG_TARGET]||[]).reverse().slice(1).join(ice.PT)||"",_target: (msg[ice.MSG_SOURCE]||[]).reverse().join(".")})
can.misc.Log(html.WSS, ice.MSG_RESULT, msg.result, msg)
msg.Option({_handle: true, _source: (msg[ice.MSG_TARGET]||[]).reverse().slice(1).join(ice.PT)||"",_target: (msg[ice.MSG_SOURCE]||[]).reverse().join(".")})
can.misc.Log(html.WSS, ice.MSG_RESULT, msg.result, msg)
delete(msg._event), delete(msg._can)
socket.send(JSON.stringify(msg))
}, msg.detail = data.detail, msg.Copy(data)
delete(msg._event), delete(msg._can)
socket.send(JSON.stringify(msg))
}, msg.detail = data.detail, msg.Copy(data)
// 执行命令
try {
can.misc.Log(html.WSS, ice.MSG_DETAIL, msg.detail, msg)
can.base.isFunc(cb) && cb(event, msg, msg.detail[0], msg.detail.slice(1))
} catch (e) { // 执行失败
can.misc.Log(e), msg.Reply()
}
}
},
// 执行命令
try {
can.misc.Log(html.WSS, ice.MSG_DETAIL, msg.detail, msg)
can.base.isFunc(cb) && cb(event, msg, msg.detail[0], msg.detail.slice(1))
} catch (e) { // 执行失败
can.misc.Log(e), msg.Reply()
}
}
},
CookieSessid: shy("会话变量", function(can, value, path) {
var name = ice.MSG_SESSID+"_"+location.host.replaceAll(".", "_").replaceAll(":", "_")
return can.misc.Cookie(can, name, value, path)
}),
Cookie: shy("会话变量", function(can, key, value, path) {
function set(k, v) { document.cookie = k+"="+v+";path="+(path||ice.PS) }
CookieSessid: shy("会话变量", function(can, value, path) {
var name = ice.MSG_SESSID+"_"+location.host.replaceAll(".", "_").replaceAll(":", "_")
return can.misc.Cookie(can, name, value, path)
}),
Cookie: shy("会话变量", function(can, key, value, path) {
function set(k, v) { document.cookie = k+"="+v+";path="+(path||ice.PS) }
if (can.base.isObject(key)) {
for (var k in key) { set(k, key[k]) }
key = undefined
}
if (key == undefined) { var cs = {}
document.cookie.split("; ").forEach(function(item) {
var ls = item.split("="); cs[ls[0]] = ls[1]
})
return cs
}
if (can.base.isObject(key)) {
for (var k in key) { set(k, key[k]) }
key = undefined
}
if (key == undefined) { var cs = {}
document.cookie.split("; ").forEach(function(item) {
var ls = item.split("="); cs[ls[0]] = ls[1]
})
return cs
}
value != undefined && set(key, value)
var val = (new RegExp(key+"=([^;]*);?")).exec(document.cookie)
return val && val.length > 0? val[1]: ""
}),
SearchOrConf: function(can, key, def) {
can.base.getValid(can.misc.Search(can, key), can.Conf(key), def)
},
Search: shy("请求参数", function(can, key, value) { var args = {}
if (value == undefined && can.base.isString(key)) {
var ls = location.pathname.split(ice.PS)
if (ls[1] == chat.SHARE) { args[chat.SHARE] = ls[2] }
if (ls[1] == "chat" && ls[2] == ice.POD) { args[ice.POD] = ls[3] }
}
value != undefined && set(key, value)
var val = (new RegExp(key+"=([^;]*);?")).exec(document.cookie)
return val && val.length > 0? val[1]: ""
}),
SearchOrConf: function(can, key, def) {
can.base.getValid(can.misc.Search(can, key), can.Conf(key), def)
},
Search: shy("请求参数", function(can, key, value) { var args = {}
if (value == undefined && can.base.isString(key)) {
var ls = location.pathname.split(ice.PS)
if (ls[1] == chat.SHARE) { args[chat.SHARE] = ls[2] }
if (ls[1] == "chat" && ls[2] == ice.POD) { args[ice.POD] = ls[3] }
}
location.search && location.search.slice(1).split("&").forEach(function(item) { var x = item.split("=")
x[1] != "" && (args[x[0]] = decodeURIComponent(x[1]))
})
location.search && location.search.slice(1).split("&").forEach(function(item) { var x = item.split("=")
x[1] != "" && (args[x[0]] = decodeURIComponent(x[1]))
})
if (can.base.isObject(key)) {
can.core.Item(key, function(key, value) {
if (value != undefined) {args[key] = value}
args[key] == "" && delete(args[key])
})
} else if (key == undefined) {
return args
} else if (value == undefined) {
return args[key]
} else {
args[key] = value, args[key] == "" && delete(args[key])
}
if (can.base.isObject(key)) {
can.core.Item(key, function(key, value) {
if (value != undefined) {args[key] = value}
args[key] == "" && delete(args[key])
})
} else if (key == undefined) {
return args
} else if (value == undefined) {
return args[key]
} else {
args[key] = value, args[key] == "" && delete(args[key])
}
return location.search = can.core.Item(args, function(key, value) {
return key+"="+encodeURIComponent(value)
}).join("&")
}),
MergeURL: shy("地址链接", function(can, objs, clear) {
var path = location.pathname; objs._path && (path = objs._path, delete(objs._path))
objs && objs.pod && (path = "/chat/pod/"+objs.pod, delete(objs.pod))
return can.base.MergeURL(location.origin+path+(clear?"":location.search), objs)
}),
return location.search = can.core.Item(args, function(key, value) {
return key+"="+encodeURIComponent(value)
}).join("&")
}),
MergeURL: shy("地址链接", function(can, objs, clear) {
var path = location.pathname; objs._path && (path = objs._path, delete(objs._path))
objs && objs.pod && (path = "/chat/pod/"+objs.pod, delete(objs.pod))
return can.base.MergeURL(location.origin+path+(clear?"":location.search), objs)
}),
runAction: function(can, msg, cmds, cb, list) {
if (cmds[0] == ctx.ACTION && list[cmds[1]]) { return list[cmds[1]](cmds.slice(2)), true }
if (list[cmds[0]]) { return list[cmds[0]](cmds.slice(1)), true }
},
concat: function(can, to, from) { to = to||[], from = from||[]
if (from[0] == ctx.ACTION && from[1] == ice.RUN && can.onengine.plugin.meta[from[2]]) {
return from
}
if (can.onengine.plugin.meta[from[0]]) {
return from
}
if (from[0] == "_search") { return from }
return to.concat(from)
},
proto: function(sub, sup) {
if (navigator.userAgent.indexOf("MSIE") > -1) {
for (var k in sup) { sub[k] = sub[k]||sup[k] }
} else {
sub.__proto__ = sup
}
return sub
},
runAction: function(can, msg, cmds, cb, list) {
if (cmds[0] == ctx.ACTION && list[cmds[1]]) { return list[cmds[1]](cmds.slice(2)), true }
if (list[cmds[0]]) { return list[cmds[0]](cmds.slice(1)), true }
},
concat: function(can, to, from) { to = to||[], from = from||[]
if (from[0] == ctx.ACTION && from[1] == ice.RUN && can.onengine.plugin.meta[from[2]]) {
return from
}
if (can.onengine.plugin.meta[from[0]]) {
return from
}
if (from[0] == "_search") { return from }
return to.concat(from)
},
proto: function(sub, sup) {
if (navigator.userAgent.indexOf("MSIE") > -1) {
for (var k in sup) { sub[k] = sub[k]||sup[k] }
} else {
sub.__proto__ = sup
}
return sub
},
Log: function() {
var args = [this._time(), this.FileLine(2, 3)]
for (var i in arguments) { args.push(arguments[i]) }
console.log.apply(console, args)
},
Info: 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(ice.NL, this._fileLine().split(ice.NL).slice(2).join(ice.NL))
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(ice.SP)))
},
FileLine: function(depth, length) {
return this.fileLine(depth+1).split(ice.PS).slice(3).slice(-length).join(ice.PS).split(")")[0]
},
fileLine: function(depth) {
return (this._fileLine().split(ice.NL)[1+depth]||"").trim()
},
_fileLine: function() { var obj = {}
Error.captureStackTrace && Error.captureStackTrace(obj, arguments.callee)
return obj.stack || ""
},
_time: function() { var now = new Date()
var hour = now.getHours()
if (hour < 10) { hour = "0"+hour }
var minute = now.getMinutes()
if (minute < 10) { minute = "0"+minute }
var second = now.getSeconds()
if (second < 10) { second = "0"+second }
return hour+":"+minute+":"+second
},
Log: function() {
var args = [this._time(), this.FileLine(2, 3)]
for (var i in arguments) { args.push(arguments[i]) }
console.log.apply(console, args)
},
Info: 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(ice.NL, this._fileLine().split(ice.NL).slice(2).join(ice.NL))
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(ice.SP)))
},
FileLine: function(depth, length) {
return this.fileLine(depth+1).split(ice.PS).slice(3).slice(-length).join(ice.PS).split(")")[0]
},
fileLine: function(depth) {
return (this._fileLine().split(ice.NL)[1+depth]||"").trim()
},
_fileLine: function() { var obj = {}
Error.captureStackTrace && Error.captureStackTrace(obj, arguments.callee)
return obj.stack || ""
},
_time: function() { var now = new Date()
var hour = now.getHours()
if (hour < 10) { hour = "0"+hour }
var minute = now.getMinutes()
if (minute < 10) { minute = "0"+minute }
var second = now.getSeconds()
if (second < 10) { second = "0"+second }
return hour+":"+minute+":"+second
},
})

View File

@ -1,417 +1,417 @@
Volcanos("page", {help: "用户界面", ClassList: {
has: function(can, obj, key) { var list = obj.className? obj.className.split(ice.SP): []
return list.indexOf(key) > -1
},
add: function(can, obj, key) { var list = obj.className? obj.className.split(ice.SP): []
var value = can.base.AddUniq(list, key).join(ice.SP).trim()
return value != obj.className && (obj.className = value), value
},
del: function(can, obj, key) { var list = obj.className? obj.className.split(ice.SP): []
return obj.className = can.core.List(list, function(value) {
return value == key? undefined: value
}).join(ice.SP).trim()
},
set: function(can, obj, key, condition) {
return (condition? this.add(can, obj, key): this.del(can, obj, key)).indexOf(key) > -1
},
neg: function(can, obj, key) {
return (this.has(can, obj, key)? this.del(can, obj, key): this.add(can, obj, key)).indexOf(key) > -1
},
},
SelectArgs: function(can, option, key, cb) {
if (can.base.isUndefined(key)) { var value = {}
can.page.SelectArgs(can, option, "", function(item) {
item.name && item.value && (value[item.name] = item.value)
}); return [value]
}
if (can.base.isObject(key)) {
return can.core.Item(key, function(key, value) { can.page.SelectArgs(can, option, key, value) }), [key]
}
if (!can.base.isFunc(cb)) { var value = cb; cb = function(item) { if (item.type == html.BUTTON) { return }
return item.name && (can.base.isUndefined(value)? item.value: (item.value = value))||""
} }
if (key.indexOf(ice.PT) > -1) { return [""]}
return can.page.Select(can, option, key? "textarea[name="+key+"],"+"input[name="+key+"],"+"select[name="+key+"]": ".args", cb)
},
SelectAll: shy("选择节点", function(can, target, key, cb, interval, cbs) {
can.page.Select(can, target, html.IFRAME, function(item) {
can.page.SelectAll(can, item.contentWindow.document.body, key, cb, interval, cbs)
})
return can.core.List(target && target.querySelectorAll(key), cb, interval, cbs)
}),
Select: shy("选择节点", function(can, target, key, cb, interval, cbs) { if (key == ice.PT) { cb(target); return [] }
return can.core.List(target && target.querySelectorAll(can.page.Keys(key)), cb, interval, cbs)
}),
Modify: shy("修改节点", function(can, target, value) { target = target||{}
target = can.base.isObject(target)? target: document.querySelector(target)
can.base.isString(value)? (target.innerHTML = value): can.core.Item(value, function(key, val) {
!can.base.isObject(val)? (target[key] = val): can.core.Item(val, function(k, v) {
var size = {
"height": true, "max-height": true, "min-height": true,
"width": true, "max-width": true, "min-width": true,
}
if (size[k] && parseInt(v) < 0) { return target[key] && (target[key][k] = "") }
has: function(can, obj, key) { var list = obj.className? obj.className.split(ice.SP): []
return list.indexOf(key) > -1
},
add: function(can, obj, key) { var list = obj.className? obj.className.split(ice.SP): []
var value = can.base.AddUniq(list, key).join(ice.SP).trim()
return value != obj.className && (obj.className = value), value
},
del: function(can, obj, key) { var list = obj.className? obj.className.split(ice.SP): []
return obj.className = can.core.List(list, function(value) {
return value == key? undefined: value
}).join(ice.SP).trim()
},
set: function(can, obj, key, condition) {
return (condition? this.add(can, obj, key): this.del(can, obj, key)).indexOf(key) > -1
},
neg: function(can, obj, key) {
return (this.has(can, obj, key)? this.del(can, obj, key): this.add(can, obj, key)).indexOf(key) > -1
},
},
SelectArgs: function(can, option, key, cb) {
if (can.base.isUndefined(key)) { var value = {}
can.page.SelectArgs(can, option, "", function(item) {
item.name && item.value && (value[item.name] = item.value)
}); return [value]
}
if (can.base.isObject(key)) {
return can.core.Item(key, function(key, value) { can.page.SelectArgs(can, option, key, value) }), [key]
}
if (!can.base.isFunc(cb)) { var value = cb; cb = function(item) { if (item.type == html.BUTTON) { return }
return item.name && (can.base.isUndefined(value)? item.value: (item.value = value))||""
} }
if (key.indexOf(ice.PT) > -1) { return [""]}
return can.page.Select(can, option, key? "textarea[name="+key+"],"+"input[name="+key+"],"+"select[name="+key+"]": ".args", cb)
},
SelectAll: shy("选择节点", function(can, target, key, cb, interval, cbs) {
can.page.Select(can, target, html.IFRAME, function(item) {
can.page.SelectAll(can, item.contentWindow.document.body, key, cb, interval, cbs)
})
return can.core.List(target && target.querySelectorAll(key), cb, interval, cbs)
}),
Select: shy("选择节点", function(can, target, key, cb, interval, cbs) { if (key == ice.PT) { cb(target); return [] }
return can.core.List(target && target.querySelectorAll(can.page.Keys(key)), cb, interval, cbs)
}),
Modify: shy("修改节点", function(can, target, value) { target = target||{}
target = can.base.isObject(target)? target: document.querySelector(target)
can.base.isString(value)? (target.innerHTML = value): can.core.Item(value, function(key, val) {
!can.base.isObject(val)? (target[key] = val): can.core.Item(val, function(k, v) {
var size = {
"height": true, "max-height": true, "min-height": true,
"width": true, "max-width": true, "min-width": true,
}
if (size[k] && parseInt(v) < 0) { return target[key] && (target[key][k] = "") }
var size = {
"margin-top": true, "margin-left": true, "font-size": true,
"left": true, "right": true, "top": true, "bottom": true,
"height": true, "max-height": true, "min-height": true,
"width": true, "max-width": true, "min-width": true,
}
var size = {
"margin-top": true, "margin-left": true, "font-size": true,
"left": true, "right": true, "top": true, "bottom": true,
"height": true, "max-height": true, "min-height": true,
"width": true, "max-width": true, "min-width": true,
}
if (size[k] && v && (can.base.isNumber(v) || v.indexOf && v.indexOf("px") == -1)) {
v += "px"
}
target[key] && (target[key][k] = v)
})
})
return target
}),
Remove: shy("删除节点", function(can, target) {
return target && target.parentNode && target.parentNode.removeChild(target), target
}),
Create: shy("创建节点", function(can, key, value) {
return can.page.Modify(can, document.createElement(key), value)
}),
Append: shy("添加节点", function(can, target, key, value) { value = value||{}
if (can.base.isString(key)) { var res = can.page.Create(can, key, value); return target.appendChild(res), res }
if (size[k] && v && (can.base.isNumber(v) || v.indexOf && v.indexOf("px") == -1)) {
v += "px"
}
target[key] && (target[key][k] = v)
})
})
return target
}),
Remove: shy("删除节点", function(can, target) {
return target && target.parentNode && target.parentNode.removeChild(target), target
}),
Create: shy("创建节点", function(can, key, value) {
return can.page.Modify(can, document.createElement(key), value)
}),
Append: shy("添加节点", function(can, target, key, value) { value = value||{}
if (can.base.isString(key)) { var res = can.page.Create(can, key, value); return target.appendChild(res), res }
can.core.List(key, function(item, index) { if (!item) { return }
if (can.base.isString(item)) { target.innerHTML = item; return }
if (item.nodeName) { target.appendChild(item); return }
can.core.List(key, function(item, index) { if (!item) { return }
if (can.base.isString(item)) { target.innerHTML = item; return }
if (item.nodeName) { target.appendChild(item); return }
// 基本结构: type name data list
var type = item.type||html.DIV, data = item.data||{}
var name = item.name||data.name||""
// 基本结构: type name data list
var type = item.type||html.DIV, data = item.data||{}
var name = item.name||data.name||""
// 数据调整
can.core.Item(item, function(key, value) {
switch (key) {
case mdb.TYPE: break
case mdb.NAME: break
case mdb.DATA: break
case mdb.LIST: break
case html.INNER: data.innerHTML = item.inner; break
case html.CLICK: data.onclick = item.click; break
default: data[key] = item[key]
}
})
// 数据调整
can.core.Item(item, function(key, value) {
switch (key) {
case mdb.TYPE: break
case mdb.NAME: break
case mdb.DATA: break
case mdb.LIST: break
case html.INNER: data.innerHTML = item.inner; break
case html.CLICK: data.onclick = item.click; break
default: data[key] = item[key]
}
})
// 基本类型: view text button select input username password
// 基本类型: img row th td
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]||html.DIV
data.innerHTML = list[2]||data.innerHTML||""
name = name||list[3]||""
// 基本类型: view text button select input username password
// 基本类型: img row th td
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]||html.DIV
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]||html.SPAN
list[2] && can.page.ClassList.add(can, data, list[2])
} else if (item.text) { var list = can.core.List(item.text)
data.innerHTML = list[0]||data.innerHTML||""
type = list[1]||html.SPAN
list[2] && can.page.ClassList.add(can, data, list[2])
} else if (item.button) { var list = can.core.List(item.button)
type = html.BUTTON, name = name||list[0]
data.innerText = can.user.trans(can, list[0]), data.onclick = function(event) {
can.base.isFunction(list[1]) && list[1](event, name)
can.onkeymap.prevent(event)
return true
}
} else if (item.button) { var list = can.core.List(item.button)
type = html.BUTTON, name = name||list[0]
data.innerText = can.user.trans(can, list[0]), data.onclick = function(event) {
can.base.isFunction(list[1]) && list[1](event, name)
can.onkeymap.prevent(event)
return true
}
} else if (item.select) { var list = item.select
type = html.SELECT, data.name = name = name||list[0][0]
data.title = can.user.trans(can, data.title||name)
data.className = data.className||list[0][0]||""
} else if (item.select) { var list = item.select
type = html.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: html.OPTION, value: value, inner: can.user.trans(can, value)}
})
data.onchange = function(event) {
can.base.isFunction(list[1]) && list[1](event, event.target.value, name)
}
item.list = list[0].slice(1).map(function(value) {
return {type: html.OPTION, value: value, inner: can.user.trans(can, value)}
})
data.onchange = function(event) {
can.base.isFunction(list[1]) && list[1](event, event.target.value, name)
}
} else if (item.input) { var list = can.core.List(item.input)
type = html.INPUT, name = name||list[0]||"", data.name = data.name||name
data.className = data.className||data.name
data.autocomplete = "off"
} else if (item.input) { var list = can.core.List(item.input)
type = html.INPUT, name = name||list[0]||"", data.name = data.name||name
data.className = data.className||data.name
data.autocomplete = "off"
data.onfocus = data.onfocus||function(event) {
event.target.setSelectionRange(0, -1)
}
data.onkeydown = function(event) {
can.base.isFunction(list[1]) && list[1](event)
}
data.onkeyup = function(event) {
can.base.isFunction(list[2]) && list[2](event)
}
} else if (item.username) { var list = can.core.List(item.username)
type = html.INPUT, name = name||list[0]||html.USERNAME, data.name = data.name||name
data.className = list[1]||data.className||data.name
data.autocomplete = data.autocomplete||html.USERNAME
data.onfocus = data.onfocus||function(event) {
event.target.setSelectionRange(0, -1)
}
data.onkeydown = function(event) {
can.base.isFunction(list[1]) && list[1](event)
}
data.onkeyup = function(event) {
can.base.isFunction(list[2]) && list[2](event)
}
} else if (item.username) { var list = can.core.List(item.username)
type = html.INPUT, name = name||list[0]||html.USERNAME, data.name = data.name||name
data.className = list[1]||data.className||data.name
data.autocomplete = data.autocomplete||html.USERNAME
} else if (item.password) { var list = can.core.List(item.password)
type = html.INPUT, name = name||list[0]||html.PASSWORD, data.name = data.name||name
data.className = list[1]||data.className||data.name
data.autocomplete = data.autocomplete||"current-password"
data.type = html.PASSWORD
} else if (item.password) { var list = can.core.List(item.password)
type = html.INPUT, name = name||list[0]||html.PASSWORD, data.name = data.name||name
data.className = list[1]||data.className||data.name
data.autocomplete = data.autocomplete||"current-password"
data.type = html.PASSWORD
} else if (item.img) { var list = can.core.List(item.img)
type = html.IMG, data.src = list[0]
} else if (item.img) { var list = can.core.List(item.img)
type = html.IMG, data.src = list[0]
} else if (item.row) { type = html.TR
item.list = item.row.map(function(text) { return {text: [text, item.sub||html.TD]} })
} else if (item.th) { type = html.TR
item.list = item.th.map(function(text) { return {text: [text, html.TH]} })
} else if (item.td) { type = html.TR
item.list = item.td.map(function(text) { return {text: [text, html.TD]} })
}
} else if (item.row) { type = html.TR
item.list = item.row.map(function(text) { return {text: [text, item.sub||html.TD]} })
} else if (item.th) { type = html.TR
item.list = item.th.map(function(text) { return {text: [text, html.TH]} })
} else if (item.td) { type = html.TR
item.list = item.td.map(function(text) { return {text: [text, html.TD]} })
}
// 语言转换
if (type == html.INPUT) { data.type == html.BUTTON && (data.value = can.user.trans(can, data.value))
if (data.type == html.TEXT||data.type == html.PASSWORD||!data.type) { data.autocomplete = data.autocomplete||"off"
data.placeholder = can.user.trans(can, (data.placeholder||data.name||"").split(ice.PT).pop())
data.title = can.user.trans(can, data.title||data.placeholder)
}
}
if (type == html.TEXTAREA) {
data.placeholder = can.user.trans(can, (data.placeholder||data.name||"").split(ice.PT).pop())
}
// 语言转换
if (type == html.INPUT) { data.type == html.BUTTON && (data.value = can.user.trans(can, data.value))
if (data.type == html.TEXT||data.type == html.PASSWORD||!data.type) { data.autocomplete = data.autocomplete||"off"
data.placeholder = can.user.trans(can, (data.placeholder||data.name||"").split(ice.PT).pop())
data.title = can.user.trans(can, data.title||data.placeholder)
}
}
if (type == html.TEXTAREA) {
data.placeholder = can.user.trans(can, (data.placeholder||data.name||"").split(ice.PT).pop())
}
// 创建节点
!data.name && item.name && (data.name = item.name)
var node = can.page.Create(can, type, data)
// 创建节点
!data.name && item.name && (data.name = item.name)
var node = can.page.Create(can, type, data)
// 创建索引
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
// 创建索引
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)
target && target.appendChild && target.appendChild(node)
can.base.isFunc(item._init) && item._init(node)
})
return value
}),
Appends: shy("添加节点", function(can, target, key, value) {
return target.innerHTML = "", can.page.Append(can, target, key, value)
}),
// 递归节点
item.list && can.page.Append(can, node, item.list, value)
target && target.appendChild && target.appendChild(node)
can.base.isFunc(item._init) && item._init(node)
})
return value
}),
Appends: shy("添加节点", function(can, target, key, value) {
return target.innerHTML = "", can.page.Append(can, target, key, value)
}),
AppendTable: shy("添加表格", function(can, msg, target, list, cb) {
if (!msg.append||msg.append.length == 0) {return}
AppendTable: shy("添加表格", function(can, msg, target, list, cb) {
if (!msg.append||msg.append.length == 0) {return}
var table = can.page.Append(can, target, html.TABLE)
can.page.Append(can, table, [{type: html.TR, data: {dataset: {index: -1}}, list:
can.core.List(list, function(key) {
return key[0] == "_"? undefined: {text: [key.trim(), html.TH]}
})
}])
can.page.Append(can, table, can.core.List(msg.Table(), function(line, index, array) {
var _list = can.core.List(list, function(key) { if (key.indexOf("_") == 0) { return }
return cb(can.page.Color(line[key]).trim(), key, index, line, array)
})
return _list.length > 0? {type: html.TR, dataset: {index: index}, list: _list}: undefined
}))
return can.page.OrderTable(can, table)
}),
OrderTable: function(can, table) {
can.page.Select(can, table, html.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, html.TR, function(tr) {
return tr.style.display == html.NONE||can.page.ClassList.has(can, tr, "hide")? null: tr
}).slice(1)
var table = can.page.Append(can, target, html.TABLE)
can.page.Append(can, table, [{type: html.TR, data: {dataset: {index: -1}}, list:
can.core.List(list, function(key) {
return key[0] == "_"? undefined: {text: [key.trim(), html.TH]}
})
}])
can.page.Append(can, table, can.core.List(msg.Table(), function(line, index, array) {
var _list = can.core.List(list, function(key) { if (key.indexOf("_") == 0) { return }
return cb(can.page.Color(line[key]).trim(), key, index, line, array)
})
return _list.length > 0? {type: html.TR, dataset: {index: index}, list: _list}: undefined
}))
return can.page.OrderTable(can, table)
}),
OrderTable: function(can, table) {
can.page.Select(can, table, html.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, html.TR, function(tr) {
return tr.style.display == html.NONE||can.page.ClassList.has(can, tr, "hide")? null: tr
}).slice(1)
index = can.base.isObject(index)? index: [index]
index = can.core.List(index, function(item) { if (item > -1) { return item} })
if (index.length == 0) { return }
index = can.base.isObject(index)? index: [index]
index = can.core.List(index, function(item) { if (item > -1) { return item} })
if (index.length == 0) { return }
var is_time = true, is_number = true
can.core.List(list, function(tr) {
var text = tr.childNodes[index[0]].innerText
is_time = is_time && Date.parse(text) > 0
is_number = is_number && !isNaN(parseInt(text))
})
var is_time = true, is_number = true
can.core.List(list, function(tr) {
var text = tr.childNodes[index[0]].innerText
is_time = is_time && Date.parse(text) > 0
is_number = is_number && !isNaN(parseInt(text))
})
var num_list = can.core.List(list, function(tr) {
var text = tr.childNodes[index[0]].innerText
return is_time? Date.parse(text):
is_number? can.base.ParseSize(text): text
})
function isless(a, b, index) {
if (a.childNodes[index[0]] && b.childNodes[index[0]]) {
if (a.childNodes[index[0]].innerText < b.childNodes[index[0]].innerText) { return true }
if (a.childNodes[index[0]].innerText > b.childNodes[index[0]].innerText) { return false }
}
return index.length > 1 && isless(a, b, index.slice(1))
}
var num_list = can.core.List(list, function(tr) {
var text = tr.childNodes[index[0]].innerText
return is_time? Date.parse(text):
is_number? can.base.ParseSize(text): text
})
function isless(a, b, index) {
if (a.childNodes[index[0]] && b.childNodes[index[0]]) {
if (a.childNodes[index[0]].innerText < b.childNodes[index[0]].innerText) { return true }
if (a.childNodes[index[0]].innerText > b.childNodes[index[0]].innerText) { return false }
}
return index.length > 1 && isless(a, b, index.slice(1))
}
// 选择排序
for (var i = 0; i < num_list.length; i++) { var min = i
for (var j = i+1; j < num_list.length; j++) {
if (num_list[min] == num_list[j] && index.length > 1 && list[index[1]]) {
if (sort_asc? isless(list[min], list[j], index.slice(1)): isless(list[j], list[min], index.slice(1))) {
min = j
}
} else if (sort_asc? num_list[min] < num_list[j]: num_list[j] < num_list[min]) {
min = j
}
}
// 选择排序
for (var i = 0; i < num_list.length; i++) { var min = i
for (var j = i+1; j < num_list.length; j++) {
if (num_list[min] == num_list[j] && index.length > 1 && list[index[1]]) {
if (sort_asc? isless(list[min], list[j], index.slice(1)): isless(list[j], list[min], index.slice(1))) {
min = j
}
} else if (sort_asc? num_list[min] < num_list[j]: num_list[j] < num_list[min]) {
min = j
}
}
if (min != i) {
var temp = num_list[i]; num_list[i] = num_list[min]; num_list[min] = temp
var temp = list[i]; list[i] = list[min]; list[min] = temp
}
if (min != i) {
var temp = num_list[i]; num_list[i] = num_list[min]; num_list[min] = temp
var temp = list[i]; list[i] = list[min]; list[min] = temp
}
var tbody = list[i].parentElement
list[i].parentElement && tbody.removeChild(list[i])
tbody.appendChild(list[i])
}
},
var tbody = list[i].parentElement
list[i].parentElement && tbody.removeChild(list[i])
tbody.appendChild(list[i])
}
},
Cache: function(name, output, data) { if (!name) { return }
var cache = output._cache||{}; output._cache = cache
if (data) { if (output.children.length == 0) { return }
var temp = document.createDocumentFragment()
while (output.childNodes.length > 0) { // 写缓存
var item = output.childNodes[0]
item.parentNode.removeChild(item),
temp.appendChild(item)
}
return cache[name] = {node: temp, data: data}, name
}
output.innerHTML = ""
Cache: function(name, output, data) { if (!name) { return }
var cache = output._cache||{}; output._cache = cache
if (data) { if (output.children.length == 0) { return }
var temp = document.createDocumentFragment()
while (output.childNodes.length > 0) { // 写缓存
var item = output.childNodes[0]
item.parentNode.removeChild(item),
temp.appendChild(item)
}
return cache[name] = {node: temp, data: data}, name
}
output.innerHTML = ""
var list = cache[name]; if (!list) { return }
while (list.node.childNodes.length > 0) { // 读缓存
var item = list.node.childNodes[0]
item.parentNode.removeChild(item)
output.appendChild(item)
}
return delete(cache[name]), list.data
},
Format: function(type) {
switch (type) {
case html.A: return "<a href='"+arguments[1]+"' target='_blank'>"+(arguments[2]||arguments[1])+"</a>"
case html.IMG: return arguments[2]? "<img src='"+arguments[1]+"' height="+arguments[2]+">": "<img src='"+arguments[1]+"'>"
}
},
replace: function(can, text, key, value) {
text = can.base.replaceAll(text, "<", "&lt;", ">", "&gt;", key, value)
return text
},
Color: function(text) { if (typeof text != lang.STRING) { return "" }
if (text.indexOf("http://") == 0 || text.indexOf("https://") == 0 || text.indexOf("ftp://") == 0) {
var ls = text.split(ice.SP);
text = "<a href='"+ls[0]+"' target='_blank'>"+ls[0]+"</a>"+ls.slice(1).join(ice.SP)
}; text = text.replace(/\\n/g, "<br>")
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)
}
return delete(cache[name]), list.data
},
Format: function(type) {
switch (type) {
case html.A: return "<a href='"+arguments[1]+"' target='_blank'>"+(arguments[2]||arguments[1])+"</a>"
case html.IMG: return arguments[2]? "<img src='"+arguments[1]+"' height="+arguments[2]+">": "<img src='"+arguments[1]+"'>"
}
},
replace: function(can, text, key, value) {
text = can.base.replaceAll(text, "<", "&lt;", ">", "&gt;", key, value)
return text
},
Color: function(text) { if (typeof text != lang.STRING) { return "" }
if (text.indexOf("http://") == 0 || text.indexOf("https://") == 0 || text.indexOf("ftp://") == 0) {
var ls = text.split(ice.SP);
text = "<a href='"+ls[0]+"' target='_blank'>"+ls[0]+"</a>"+ls.slice(1).join(ice.SP)
}; text = text.replace(/\\n/g, "<br>")
if (text.indexOf("\033\[") == -1) { return text }
text = text.replace(/\033\[31m/g, "<span style='color:#f00'>")
text = text.replace(/\033\[32m/g, "<span style='color:#0f0'>")
text = text.replace(/\033\[33m/g, "<span style='color:#ff0'>")
text = text.replace(/\033\[34m/g, "<span style='color:#00f'>")
text = text.replace(/\033\[36m/g, "<span style='color:#0ff'>")
text = text.replace(/\033\[34;1m/g, "<span style='color:#00f'>")
text = text.replace(/\033\[37;1m/g, "<span style='color:#fff'>")
text = text.replace(/\033\[1m/g, "<span style='font-weight:bold'>")
text = text.replace(/\033\[0m/g, "</span>")
text = text.replace(/\033\[m/g, "</span>")
return text
},
input: function(can, item, value) {
var input = {type: html.INPUT, name: item.name, data: item, dataset: {}, _init: item._init, style: item.style||{}}
item.value == ice.AUTO && (item.value = "", item.action = ice.AUTO), item.action == ice.AUTO && (input.dataset.action = ice.AUTO)
if (text.indexOf("\033\[") == -1) { return text }
text = text.replace(/\033\[31m/g, "<span style='color:#f00'>")
text = text.replace(/\033\[32m/g, "<span style='color:#0f0'>")
text = text.replace(/\033\[33m/g, "<span style='color:#ff0'>")
text = text.replace(/\033\[34m/g, "<span style='color:#00f'>")
text = text.replace(/\033\[36m/g, "<span style='color:#0ff'>")
text = text.replace(/\033\[34;1m/g, "<span style='color:#00f'>")
text = text.replace(/\033\[37;1m/g, "<span style='color:#fff'>")
text = text.replace(/\033\[1m/g, "<span style='font-weight:bold'>")
text = text.replace(/\033\[0m/g, "</span>")
text = text.replace(/\033\[m/g, "</span>")
return text
},
input: function(can, item, value) {
var input = {type: html.INPUT, name: item.name, data: item, dataset: {}, _init: item._init, style: item.style||{}}
item.value == ice.AUTO && (item.value = "", item.action = ice.AUTO), item.action == ice.AUTO && (input.dataset.action = ice.AUTO)
switch (item.type = item.type||html.TEXT) {
case html.TEXTAREA: input.type = html.TEXTAREA
input.style.height = input.style.height||can.Conf(["feature", html.TEXTAREA, item.name, html.HEIGHT].join(ice.PT))||can.Conf(["feature", html.TEXTAREA, html.HEIGHT].join(ice.PT))
input.style.width = input.style.width||can.Conf(["feature", html.TEXTAREA, item.name, html.WIDTH].join(ice.PT))||can.Conf(["feature", html.TEXTAREA, html.WIDTH].join(ice.PT))
// no break
case html.USERNAME:
case html.PASSWORD:
// no break
case html.TEXT:
item.autocomplete = "off"
item.name = item.name||item.type
item.value = value||item.value||""
item.placeholder = item.placeholder||item.name||item.type
item.title = item.title||item.placeholder||item.name||item.type
item.className || can.page.ClassList.add(can, item, ctx.ARGS)
break
case html.SELECT: input.type = html.SELECT
item.values = can.base.isString(item.values)? can.core.Split(item.values): item.values
if (!item.values && item.value) { item.values = can.core.Split(item.value), item.value = item.values[0] }
switch (item.type = item.type||html.TEXT) {
case html.TEXTAREA: input.type = html.TEXTAREA
input.style.height = input.style.height||can.Conf(["feature", html.TEXTAREA, item.name, html.HEIGHT].join(ice.PT))||can.Conf(["feature", html.TEXTAREA, html.HEIGHT].join(ice.PT))
input.style.width = input.style.width||can.Conf(["feature", html.TEXTAREA, item.name, html.WIDTH].join(ice.PT))||can.Conf(["feature", html.TEXTAREA, html.WIDTH].join(ice.PT))
// no break
case html.USERNAME:
case html.PASSWORD:
// no break
case html.TEXT:
item.autocomplete = "off"
item.name = item.name||item.type
item.value = value||item.value||""
item.placeholder = item.placeholder||item.name||item.type
item.title = item.title||item.placeholder||item.name||item.type
item.className || can.page.ClassList.add(can, item, ctx.ARGS)
break
case html.SELECT: input.type = html.SELECT
item.values = can.base.isString(item.values)? can.core.Split(item.values): item.values
if (!item.values && item.value) { item.values = can.core.Split(item.value), item.value = item.values[0] }
item.value = value||item.value, input.list = item.values.map(function(value) {
return {type: html.OPTION, value: value, inner: value}
}), item.className || can.page.ClassList.add(can, item, ctx.ARGS)
break
case html.BUTTON: item.value = item.value||item.name||"list"; break
case "upfile": item.type = html.FILE; break
case html.UPLOAD: item.type = html.FILE, input.name = html.UPLOAD; break
default:
}
return input
},
item.value = value||item.value, input.list = item.values.map(function(value) {
return {type: html.OPTION, value: value, inner: value}
}), item.className || can.page.ClassList.add(can, item, ctx.ARGS)
break
case html.BUTTON: item.value = item.value||item.name||"list"; break
case "upfile": item.type = html.FILE; break
case html.UPLOAD: item.type = html.FILE, input.name = html.UPLOAD; break
default:
}
return input
},
styleHeight: function(can, target, value) {
can.page.style(can, target, html.HEIGHT, value)
return target.offsetHeight
},
styleWidth: function(can, target, value) {
can.page.style(can, target, html.WIDTH, value)
return target.offsetWidth
},
style: function(can, target, style) { var value = {}
for (var i = 2; i < arguments.length; i += 2) {
if (typeof arguments[i] == lang.OBJECT) {
can.base.Copy(value, arguments[i--])
} else {
value[arguments[i]] = arguments[i+1]
}
}
can.page.Modify(can, target, {style: value})
return value
},
Keys: function() { var list = []
for (var i = 0; i < arguments.length; i++) { var v = arguments[i]
if (typeof v == lang.OBJECT) {
for (var j = 0; j < v.length; j++) {
if (typeof v[j] == lang.OBJECT) {
for (var k = 0; k < v[j].length; k++) {
if (typeof v[j][k] == lang.OBJECT) { v[j][k] = v[j][k].join(ice.PT) }
}
v[j] = v[j].join(ice.GT)
}
}
list.push(v.join(ice.SP))
} else {
list.push(v+"")
}
}
return list.join(ice.FS)
},
css: function(text) {
var styleSheet = document.createElement("style")
styleSheet.type = "text/css", styleSheet.innerText = text
document.head.appendChild(styleSheet)
},
offsetTop: function(item) { var res = 0
while (item) { res += item.offsetTop||0, item = item.parentNode }
return res
},
offsetLeft: function(item) { var res = 0
// if (item.offsetLeft) { return item.offsetLeft }
while (item) { res += item.offsetLeft||0, item = item.parentNode }
return res
},
styleHeight: function(can, target, value) {
can.page.style(can, target, html.HEIGHT, value)
return target.offsetHeight
},
styleWidth: function(can, target, value) {
can.page.style(can, target, html.WIDTH, value)
return target.offsetWidth
},
style: function(can, target, style) { var value = {}
for (var i = 2; i < arguments.length; i += 2) {
if (typeof arguments[i] == lang.OBJECT) {
can.base.Copy(value, arguments[i--])
} else {
value[arguments[i]] = arguments[i+1]
}
}
can.page.Modify(can, target, {style: value})
return value
},
Keys: function() { var list = []
for (var i = 0; i < arguments.length; i++) { var v = arguments[i]
if (typeof v == lang.OBJECT) {
for (var j = 0; j < v.length; j++) {
if (typeof v[j] == lang.OBJECT) {
for (var k = 0; k < v[j].length; k++) {
if (typeof v[j][k] == lang.OBJECT) { v[j][k] = v[j][k].join(ice.PT) }
}
v[j] = v[j].join(ice.GT)
}
}
list.push(v.join(ice.SP))
} else {
list.push(v+"")
}
}
return list.join(ice.FS)
},
css: function(text) {
var styleSheet = document.createElement("style")
styleSheet.type = "text/css", styleSheet.innerText = text
document.head.appendChild(styleSheet)
},
offsetTop: function(item) { var res = 0
while (item) { res += item.offsetTop||0, item = item.parentNode }
return res
},
offsetLeft: function(item) { var res = 0
// if (item.offsetLeft) { return item.offsetLeft }
while (item) { res += item.offsetLeft||0, item = item.parentNode }
return res
},
})

View File

@ -1,346 +1,346 @@
Volcanos("user", {help: "用户操作", agent: {
scanQRCode: function(cb, can) {
can.user.input(event, can, [{type: html.TEXTAREA, name: "text", text: ""}], function(ev, button, data, list, args) {
cb(list[0], can.base.ParseJSON(list[0]))
})
},
getLocation: function(cb) {
navigator.geolocation.getCurrentPosition(function(res) {
cb({latitude: parseInt(res.coords.latitude*100000), longitude: parseInt(res.coords.longitude*100000)})
}, function(some) {
typeof cb == lang.FUNCTION && cb({name: "some"})
} );
},
openLocation: function(msg) {
window.open("https://map.baidu.com/search/"+encodeURIComponent(msg.Option(mdb.TEXT))
+"/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd="+encodeURIComponent(msg.Option(mdb.TEXT)))
},
chooseImage: function(cb) {
typeof cb == lang.FUNCTION && cb([])
},
},
isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1,
isIPhone: navigator.userAgent.indexOf("iPhone") > -1,
isMobile: navigator.userAgent.indexOf("Mobile") > -1,
isMacOSX: navigator.userAgent.indexOf("Mac OS X") > -1,
isWindows: navigator.userAgent.indexOf("Windows") > -1,
isIE: navigator.userAgent.indexOf("MSIE") > -1,
isExtension: location && location.protocol && location.protocol == "chrome-extension:",
isLocalFile: location && location.protocol && location.protocol == "file:",
isLandscape: function() { return window.innerWidth > window.innerHeight },
mod: {
isPod: location && location.pathname && (location.pathname.indexOf("/chat/pod/") == 0),
isDiv: location && location.pathname && (location.pathname.indexOf("/chat/div/") == 0),
isCmd: location && location.pathname && (location.pathname.indexOf("/chat/pod/") == 0 && location.pathname.indexOf("/cmd/") > 0 ||
location.pathname.indexOf("/chat/cmd/") == 0 || location.pathname.indexOf("/help/") == 0),
},
scanQRCode: function(cb, can) {
can.user.input(event, can, [{type: html.TEXTAREA, name: "text", text: ""}], function(ev, button, data, list, args) {
cb(list[0], can.base.ParseJSON(list[0]))
})
},
getLocation: function(cb) {
navigator.geolocation.getCurrentPosition(function(res) {
cb({latitude: parseInt(res.coords.latitude*100000), longitude: parseInt(res.coords.longitude*100000)})
}, function(some) {
typeof cb == lang.FUNCTION && cb({name: "some"})
} );
},
openLocation: function(msg) {
window.open("https://map.baidu.com/search/"+encodeURIComponent(msg.Option(mdb.TEXT))
+"/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd="+encodeURIComponent(msg.Option(mdb.TEXT)))
},
chooseImage: function(cb) {
typeof cb == lang.FUNCTION && cb([])
},
},
isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1,
isIPhone: navigator.userAgent.indexOf("iPhone") > -1,
isMobile: navigator.userAgent.indexOf("Mobile") > -1,
isMacOSX: navigator.userAgent.indexOf("Mac OS X") > -1,
isWindows: navigator.userAgent.indexOf("Windows") > -1,
isIE: navigator.userAgent.indexOf("MSIE") > -1,
isExtension: location && location.protocol && location.protocol == "chrome-extension:",
isLocalFile: location && location.protocol && location.protocol == "file:",
isLandscape: function() { return window.innerWidth > window.innerHeight },
mod: {
isPod: location && location.pathname && (location.pathname.indexOf("/chat/pod/") == 0),
isDiv: location && location.pathname && (location.pathname.indexOf("/chat/div/") == 0),
isCmd: location && location.pathname && (location.pathname.indexOf("/chat/pod/") == 0 && location.pathname.indexOf("/cmd/") > 0 ||
location.pathname.indexOf("/chat/cmd/") == 0 || location.pathname.indexOf("/help/") == 0),
},
alert: function(text) { alert(JSON.stringify(text)) },
confirm: function(text) { return confirm(JSON.stringify(text)) },
prompt: function(tip, def, cb, silent) { (text = silent? def: prompt(tip, def||"")) != undefined && typeof cb == lang.FUNCTION && cb(text); return text },
reload: function(force) { (force || confirm("重新加载页面?")) && location.reload() },
jumps: function(url) { location.href = url },
open: function(url) { window.open(url) },
time: function(can, time, fmt) { var now = can.base.Date(time)
var list = can.user.language(can) == "en"? ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]
return can.base.Time(time, (fmt||"%y-%m-%d %H:%M:%S").replace("%w", list[now.getDay()]))
},
alert: function(text) { alert(JSON.stringify(text)) },
confirm: function(text) { return confirm(JSON.stringify(text)) },
prompt: function(tip, def, cb, silent) { (text = silent? def: prompt(tip, def||"")) != undefined && typeof cb == lang.FUNCTION && cb(text); return text },
reload: function(force) { (force || confirm("重新加载页面?")) && location.reload() },
jumps: function(url) { location.href = url },
open: function(url) { window.open(url) },
time: function(can, time, fmt) { var now = can.base.Date(time)
var list = can.user.language(can) == "en"? ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]
return can.base.Time(time, (fmt||"%y-%m-%d %H:%M:%S").replace("%w", list[now.getDay()]))
},
title: function(text) {
return text && (document.title = text), document.title
},
topic: function(can, name) {
can.user.isMobile && (name += " mobile") && can.user.isLandscape() && (name += " landscape")
can.page.Modify(can, document.body, {className: name})
},
language: function(can) {
return can.misc.Search(can, "language")
},
trans: function(can, text, list) { if (can.base.isObject(text)) {
return can.core.Item(text, function(k, v) { can.core.Value(can._trans, k, v) })
}
title: function(text) {
return text && (document.title = text), document.title
},
topic: function(can, name) {
can.user.isMobile && (name += " mobile") && can.user.isLandscape() && (name += " landscape")
can.page.Modify(can, document.body, {className: name})
},
language: function(can) {
return can.misc.Search(can, "language")
},
trans: function(can, text, list) { if (can.base.isObject(text)) {
return can.core.Item(text, function(k, v) { can.core.Value(can._trans, k, v) })
}
if (can.user.language(can) == "en") { return text }
if (can.base.isFunction(text)) { text = text.name||"" }
return list&&list[text] || can.Conf("trans."+text) || can.Conf("feature._trans."+text) || can._trans&&can._trans[text] || {
"create": "创建", "remove": "删除", "insert": "添加", "delete": "删除", "modify": "编辑",
"inputs": "补全", "prunes": "清理", "export": "导出", "import": "导入",
"list": "查看", "back": "返回", "run": "执行", "done": "完成", "share": "共享",
"edit": "编辑", "save": "保存", "copy": "复制", "show": "显示", "hide": "隐藏",
"project": "项目", "profile": "详情", "actions": "参数",
"plugin": "插件",
if (can.user.language(can) == "en") { return text }
if (can.base.isFunction(text)) { text = text.name||"" }
return list&&list[text] || can.Conf("trans."+text) || can.Conf("feature._trans."+text) || can._trans&&can._trans[text] || {
"create": "创建", "remove": "删除", "insert": "添加", "delete": "删除", "modify": "编辑",
"inputs": "补全", "prunes": "清理", "export": "导出", "import": "导入",
"list": "查看", "back": "返回", "run": "执行", "done": "完成", "share": "共享",
"edit": "编辑", "save": "保存", "copy": "复制", "show": "显示", "hide": "隐藏",
"project": "项目", "profile": "详情", "actions": "参数",
"plugin": "插件",
"open": "打开", "close": "关闭",
"start": "启动", "stop": "停止",
"begin": "开始", "end": "结束",
"clear": "清空", "refresh": "刷新",
"submit": "提交", "cancel": "取消",
"label": "标签", "exec": "执行",
}[text]||text
},
toastProcess: function(can, title) {
return can.user.toast(can, ice.PROCESS, title)
},
toastSuccess: function(can, title) {
return can.user.toast(can, ice.SUCCESS, title)
},
toast: function(can, content, title, duration, progress) {
var meta = can.base.isObject(content)? 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 }
"open": "打开", "close": "关闭",
"start": "启动", "stop": "停止",
"begin": "开始", "end": "结束",
"clear": "清空", "refresh": "刷新",
"submit": "提交", "cancel": "取消",
"label": "标签", "exec": "执行",
}[text]||text
},
toastProcess: function(can, title) {
return can.user.toast(can, ice.PROCESS, title)
},
toastSuccess: function(can, title) {
return can.user.toast(can, ice.SUCCESS, title)
},
toast: function(can, content, title, duration, progress) {
var meta = can.base.isObject(content)? 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: chat.TOAST, style: {
left: (window.innerWidth-width)/2, width: width, bottom: 100,
}, list: [
{text: [meta.title||"", html.DIV, html.TITLE], title: "点击复制", onclick: function(event) {
can.user.copy(event, can, meta.title)
}},
{view: "duration", title: "点击关闭", onclick: function() { action.close() }},
can.base.isObject(meta.content)? meta.content: {text: [meta.content||"执行成功", html.DIV, "content"]},
var ui = can.page.Append(can, document.body, [{view: chat.TOAST, style: {
left: (window.innerWidth-width)/2, width: width, bottom: 100,
}, list: [
{text: [meta.title||"", html.DIV, html.TITLE], title: "点击复制", onclick: function(event) {
can.user.copy(event, can, meta.title)
}},
{view: "duration", title: "点击关闭", onclick: function() { action.close() }},
can.base.isObject(meta.content)? meta.content: {text: [meta.content||"执行成功", html.DIV, "content"]},
{view: chat.ACTION}, meta.progress != undefined && {view: "progress", style: {width: width}, list: [
{view: "current", style: {width: (meta.progress||0)/100*width}},
]},
] }])
{view: chat.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||[""], 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)+ice.PT+(index%10)+"s..." }
}, function() { action.close() }), _target: ui._target, ui: ui,
}); can.onmotion.story.auto(can, ui._target)
var action = can.onappend._action(can, meta.action||[""], 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)+ice.PT+(index%10)+"s..." }
}, function() { action.close() }), _target: ui._target, ui: ui,
}); can.onmotion.story.auto(can, ui._target)
can.onengine.signal(can, chat.ONTOAST, can.request({}, {
title: meta.title, content: meta.content,
time: can.base.Time(), fileline: can.misc.FileLine(2, 2),
}))
return action
},
share: function(can, msg, cmd) {
can.run(msg._event, cmd||[ctx.ACTION, chat.SHARE], function(msg) {
can.user.toast(can, {height: 300, width: 500,
title: msg.Append(mdb.NAME), duration: -1,
content: msg.Append(mdb.TEXT), action: [cli.CLOSE],
}), can.user.copy(msg._event, can, msg.Append(mdb.NAME))
})
},
login: function(can, cb, method) {
var ui = can.user.input({}, can, [
{type: html.USERNAME}, {type: html.PASSWORD},
], function(event, button, data, list) { return {
"登录": function() {
can.run({}, [aaa.LOGIN, data[html.USERNAME], data[html.PASSWORD]], function(msg) {
if (msg.Option(ice.MSG_USERNAME)) {
can.page.Remove(can, ui._target), can.base.isFunc(cb) && cb()
} else {
can.user.toast(can, "用户名或密码错误")
}
})
return true
},
"扫码": function() {
can.misc.WSS(can, {type: html.CHROME, cmd: "pwd"}, 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 == ice.MSG_SESSID) {
return can.misc.CookieSessid(can, arg[0]), msg.Reply(), can.user.reload(true)
}
can.search(event, msg[ice.MSG_DETAIL]||[], function(msg) { msg.Reply() })
})
},
"授权": function() {
can.misc.WSS(can, {type: html.CHROME, cmd: "sso", "user.web": location.href}, function(event, msg, cmd, arg) { if (!msg) { return }
if (cmd == "pwd") {
return location.href = arg[1]
}
if (cmd == ice.MSG_SESSID) {
return can.misc.CookieSessid(can, arg[0]), msg.Reply(), can.user.reload(true)
}
can.search(event, msg[ice.MSG_DETAIL]||[], function(msg) { msg.Reply() })
})
},
"飞书": function() { location.href = "/chat/lark/sso" },
}[button]() }, can.base.Obj(method, ["登录", "扫码", "授权"]))
can.onengine.signal(can, chat.ONTOAST, can.request({}, {
title: meta.title, content: meta.content,
time: can.base.Time(), fileline: can.misc.FileLine(2, 2),
}))
return action
},
share: function(can, msg, cmd) {
can.run(msg._event, cmd||[ctx.ACTION, chat.SHARE], function(msg) {
can.user.toast(can, {height: 300, width: 500,
title: msg.Append(mdb.NAME), duration: -1,
content: msg.Append(mdb.TEXT), action: [cli.CLOSE],
}), can.user.copy(msg._event, can, msg.Append(mdb.NAME))
})
},
login: function(can, cb, method) {
var ui = can.user.input({}, can, [
{type: html.USERNAME}, {type: html.PASSWORD},
], function(event, button, data, list) { return {
"登录": function() {
can.run({}, [aaa.LOGIN, data[html.USERNAME], data[html.PASSWORD]], function(msg) {
if (msg.Option(ice.MSG_USERNAME)) {
can.page.Remove(can, ui._target), can.base.isFunc(cb) && cb()
} else {
can.user.toast(can, "用户名或密码错误")
}
})
return true
},
"扫码": function() {
can.misc.WSS(can, {type: html.CHROME, cmd: "pwd"}, 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 == ice.MSG_SESSID) {
return can.misc.CookieSessid(can, arg[0]), msg.Reply(), can.user.reload(true)
}
can.search(event, msg[ice.MSG_DETAIL]||[], function(msg) { msg.Reply() })
})
},
"授权": function() {
can.misc.WSS(can, {type: html.CHROME, cmd: "sso", "user.web": location.href}, function(event, msg, cmd, arg) { if (!msg) { return }
if (cmd == "pwd") {
return location.href = arg[1]
}
if (cmd == ice.MSG_SESSID) {
return can.misc.CookieSessid(can, arg[0]), msg.Reply(), can.user.reload(true)
}
can.search(event, msg[ice.MSG_DETAIL]||[], function(msg) { msg.Reply() })
})
},
"飞书": function() { location.href = "/chat/lark/sso" },
}[button]() }, can.base.Obj(method, ["登录", "扫码", "授权"]))
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({}, [ctx.ACTION, aaa.LOGOUT], function(msg) {
can.misc.Search(can, chat.SHARE)? can.misc.Search(can, chat.SHARE, ""): can.user.reload(true)
})
} },
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({}, [ctx.ACTION, aaa.LOGOUT], function(msg) {
can.misc.Search(can, chat.SHARE)? can.misc.Search(can, chat.SHARE, ""): can.user.reload(true)
})
} },
toPNG: function(can, name, text, height, width) {
if (text.indexOf("<svg") != 0) {
text = '<svg xmlns="http://www.w3.org/2000/svg">'+text+"</svg>"
}
var img = document.createElement(html.IMG)
img.onload = function() {
var canvas = document.createElement("canvas")
canvas.height = height, canvas.width = width
canvas.getContext("2d").drawImage(img, 0, 0)
toPNG: function(can, name, text, height, width) {
if (text.indexOf("<svg") != 0) {
text = '<svg xmlns="http://www.w3.org/2000/svg">'+text+"</svg>"
}
var img = document.createElement(html.IMG)
img.onload = function() {
var canvas = document.createElement("canvas")
canvas.height = height, canvas.width = width
canvas.getContext("2d").drawImage(img, 0, 0)
var a = document.createElement("a")
a.href = canvas.toDataURL("image/png")
a.download = name, a.click()
}, img.src = "data:image/svg+xml,"+encodeURIComponent(text)
},
copy: function(event, can, text) {
if (navigator.clipboard) { var ok = false
navigator.clipboard.writeText(text).then(function() { ok = true })
if (ok) { return can.user.toastSuccess(can) }
}
var a = document.createElement("a")
a.href = canvas.toDataURL("image/png")
a.download = name, a.click()
}, img.src = "data:image/svg+xml,"+encodeURIComponent(text)
},
copy: function(event, can, text) {
if (navigator.clipboard) { var ok = false
navigator.clipboard.writeText(text).then(function() { ok = true })
if (ok) { return can.user.toastSuccess(can) }
}
var input = can.page.Append(can, event.target.parentNode, [{type: html.TEXTAREA, value: text}]).first
can.onmotion.focus(can, input), document.execCommand("Copy")
can.page.Remove(can, input), can.user.toastSuccess(can)
can.onkeymap.prevent(event)
can.misc.Log("copy", text)
return text
},
carte: function(event, can, meta, list, cb, parent) {
meta = meta||can.ondetail||can.onaction||{}, list = list&&list.length > 0? list: meta.list||[]; if (list.length == 0) { return }
cb = cb||function(event, item, meta) { var cb = meta[item]||meta["_engine"]; can.base.isFunc(cb) && cb(event, can, item) }
var input = can.page.Append(can, event.target.parentNode, [{type: html.TEXTAREA, value: text}]).first
can.onmotion.focus(can, input), document.execCommand("Copy")
can.page.Remove(can, input), can.user.toastSuccess(can)
can.onkeymap.prevent(event)
can.misc.Log("copy", text)
return text
},
carte: function(event, can, meta, list, cb, parent) {
meta = meta||can.ondetail||can.onaction||{}, list = list&&list.length > 0? list: meta.list||[]; if (list.length == 0) { return }
cb = cb||function(event, item, meta) { var cb = meta[item]||meta["_engine"]; can.base.isFunc(cb) && cb(event, can, item) }
var ui = can.page.Append(can, document.body, [{view: chat.CARTE, style: {left: 0, top: 0}, onmouseleave: function(event) {
// can.page.Remove(can, ui._target)
}, list: can.core.List(list, function(item, index) {
return can.base.isString(item)? {view: html.ITEM, list: [{text: can.user.trans(can, item), click: function(event) {
can.user.isMobile && can.page.Remove(can, ui._target)
can.base.isFunc(cb) && cb(event, item, meta, index)
}, onmouseenter: function(event) {
carte._float && can.page.Remove(can, carte._float._target)
} }] }: {view: html.ITEM, list: [{text: can.user.trans(can, item[0])}], onmouseenter: function(event) {
var sub = can.user.carte(event, can, meta, item.slice(1), cb, carte)
carte._float && can.page.Remove(can, carte._float._target), carte._float = sub
can.onlayout.figure(event, can, sub._target, true)
} }
}) }] ); can.onlayout.figure(event, can, ui._target)
var ui = can.page.Append(can, document.body, [{view: chat.CARTE, style: {left: 0, top: 0}, onmouseleave: function(event) {
// can.page.Remove(can, ui._target)
}, list: can.core.List(list, function(item, index) {
return can.base.isString(item)? {view: html.ITEM, list: [{text: can.user.trans(can, item), click: function(event) {
can.user.isMobile && can.page.Remove(can, ui._target)
can.base.isFunc(cb) && cb(event, item, meta, index)
}, onmouseenter: function(event) {
carte._float && can.page.Remove(can, carte._float._target)
} }] }: {view: html.ITEM, list: [{text: can.user.trans(can, item[0])}], onmouseenter: function(event) {
var sub = can.user.carte(event, can, meta, item.slice(1), cb, carte)
carte._float && can.page.Remove(can, carte._float._target), carte._float = sub
can.onlayout.figure(event, can, sub._target, true)
} }
}) }] ); can.onlayout.figure(event, can, ui._target)
var carte = {_target: ui._target, _parent: parent}
null && can.onmotion.float.add(can, chat.CARTE, carte)
ui._target.onmouseover = function(event) {
can.onkeymap.prevent(event)
}
return can.onkeymap.prevent(event), carte
},
carteRight: function(event, can, meta, list, cb, parent) {
var carte = can.user.carte(event, can, meta, list, cb, parent)
can.page.Modify(can, carte._target, {style: {
left: event.clientX-event.offsetX+event.target.offsetWidth-3,
top: carte._target.offsetTop-event.target.offsetHeight+5,
}})
return carte
},
carteClient: function(event, can, meta, list, cb, parent) {
var ui = can.user.carte(event, can, meta, list, cb, parent)
can.page.Modify(can, ui._target, {style: {left: event.clientX, top: event.clientY}})
},
var carte = {_target: ui._target, _parent: parent}
null && can.onmotion.float.add(can, chat.CARTE, carte)
ui._target.onmouseover = function(event) {
can.onkeymap.prevent(event)
}
return can.onkeymap.prevent(event), carte
},
carteRight: function(event, can, meta, list, cb, parent) {
var carte = can.user.carte(event, can, meta, list, cb, parent)
can.page.Modify(can, carte._target, {style: {
left: event.clientX-event.offsetX+event.target.offsetWidth-3,
top: carte._target.offsetTop-event.target.offsetHeight+5,
}})
return carte
},
carteClient: function(event, can, meta, list, cb, parent) {
var ui = can.user.carte(event, can, meta, list, cb, parent)
can.page.Modify(can, ui._target, {style: {left: event.clientX, top: event.clientY}})
},
input: function(event, can, form, cb, button) { if (!form || form.length == 0) { return cb() }
var msg = can.request(event)
var ui = can.page.Append(can, document.body, [{view: [html.INPUT], style: {left: 0, top: 0}, list: [
{view: [chat.OPTION, html.TABLE], list: can.core.List(form, function(item) {
item = can.base.isString(item)? {type: html.TEXT, name: item}: item.length > 0? {type: html.SELECT, name: item[0], values: item.slice(1)}: item
item.type = item.type||(item.values? html.SELECT: item.name == html.TEXT? html.TEXTAREA: html.TEXT)
input: function(event, can, form, cb, button) { if (!form || form.length == 0) { return cb() }
var msg = can.request(event)
var ui = can.page.Append(can, document.body, [{view: [html.INPUT], style: {left: 0, top: 0}, list: [
{view: [chat.OPTION, html.TABLE], list: can.core.List(form, function(item) {
item = can.base.isString(item)? {type: html.TEXT, name: item}: item.length > 0? {type: html.SELECT, name: item[0], values: item.slice(1)}: item
item.type = item.type||(item.values? html.SELECT: item.name == html.TEXT? html.TEXTAREA: html.TEXT)
item._init = function(target) {
item.run = function(event, cmds, cb) {
can.request(event, function() { var value = {_handle: ice.TRUE, action: msg.Option(chat.ACTION)}
can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) {
item.name && item.value && (value[item.name] = item.value)
}); return value
}, msg, can.Option()), can.run(event, cmds, cb, true)
}
item._init = function(target) {
item.run = function(event, cmds, cb) {
can.request(event, function() { var value = {_handle: ice.TRUE, action: msg.Option(chat.ACTION)}
can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) {
item.name && item.value && (value[item.name] = item.value)
}); return value
}, msg, can.Option()), can.run(event, cmds, cb, true)
}
target.value = target.value||(item.name&&(msg.Option(item.name)||can.Option(item.name)))||""
can.onappend.figure(can, item, target)
}
target.value = target.value||(item.name&&(msg.Option(item.name)||can.Option(item.name)))||""
can.onappend.figure(can, item, target)
}
return {type: html.TR, list: [{type: html.TD, list: [{text: item._trans||can.user.trans(can, item.name)||""}]}, {type: html.TD, list: [can.page.input(can, item)]} ]}
})}, {view: chat.ACTION},
]}]);
var layout = can.onlayout.figure(event, can, ui._target)
if (layout.left == undefined) { if (!layout.top) { layout.top = 32 }
layout.left = window.innerWidth/2-ui._target.offsetWidth/2
layout.right = ""
can.page.style(can, ui._target, layout)
}
can.page.ClassList.add(can, ui._target, chat.FLOAT)
return {type: html.TR, list: [{type: html.TD, list: [{text: item._trans||can.user.trans(can, item.name)||""}]}, {type: html.TD, list: [can.page.input(can, item)]} ]}
})}, {view: chat.ACTION},
]}]);
var layout = can.onlayout.figure(event, can, ui._target)
if (layout.left == undefined) { if (!layout.top) { layout.top = 32 }
layout.left = window.innerWidth/2-ui._target.offsetWidth/2
layout.right = ""
can.page.style(can, ui._target, layout)
}
can.page.ClassList.add(can, ui._target, chat.FLOAT)
var action = can.onappend._action(can, button||[html.SUBMIT, html.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, html.OPTION_ARGS, function(item) {
return item.name && item.value && args.push(item.name, item.value), data[item.name] = item.value
})
var msg = can.request(event, {_handle: ice.TRUE})
can.base.isFunc(cb) && !cb(event, button, data, list, args) && action.cancel()
}, _target: ui._target,
})
if (button === true) {
action.submit(event, can, "submit")
return action
}
var action = can.onappend._action(can, button||[html.SUBMIT, html.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, html.OPTION_ARGS, function(item) {
return item.name && item.value && args.push(item.name, item.value), data[item.name] = item.value
})
var msg = can.request(event, {_handle: ice.TRUE})
can.base.isFunc(cb) && !cb(event, button, data, list, args) && action.cancel()
}, _target: ui._target,
})
if (button === true) {
action.submit(event, can, "submit")
return action
}
can.page.Select(can, ui._target, html.INPUT_ARGS, function(item, index) {
index == 0 && can.core.Timer(100, function() { can.onmotion.focus(can, item) })
})
return action
},
select: function(event, can, type, fields, cb, cbs) {
var msg = can.request(event, {fields: fields||"type,name,text"})
can.search(msg._event, ["Search.onimport.select", type, "", ""], function(list) {
can.core.Next(list, cb, cbs||function() {
can.user.toastSuccess(can)
})
})
},
upload: function(event, can) { var begin = new Date()
var ui = can.page.Append(can, document.body, [{view: html.UPLOAD, style: {left: 0, top: 0}, list: [
{view: html.ACTION}, {view: html.OUTPUT, list: [{view: "progress"}]},
{view: html.STATUS, list: [{view: html.SHOW}, {view: "cost"}, {view: "size"}]},
]}]); can.onlayout.figure(event, can, ui._target)
can.page.Select(can, ui._target, html.INPUT_ARGS, function(item, index) {
index == 0 && can.core.Timer(100, function() { can.onmotion.focus(can, item) })
})
return action
},
select: function(event, can, type, fields, cb, cbs) {
var msg = can.request(event, {fields: fields||"type,name,text"})
can.search(msg._event, ["Search.onimport.select", type, "", ""], function(list) {
can.core.Next(list, cb, cbs||function() {
can.user.toastSuccess(can)
})
})
},
upload: function(event, can) { var begin = new Date()
var ui = can.page.Append(can, document.body, [{view: html.UPLOAD, style: {left: 0, top: 0}, list: [
{view: html.ACTION}, {view: html.OUTPUT, list: [{view: "progress"}]},
{view: html.STATUS, list: [{view: html.SHOW}, {view: "cost"}, {view: "size"}]},
]}]); can.onlayout.figure(event, can, ui._target)
var action = can.onappend._action(can, [
{type: html.UPLOAD, onchange: function(event) {
action.show(event, 0, event.target.files[0].size, 0)
}}, cli.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.onappend._action(can, [
{type: html.UPLOAD, onchange: function(event) {
action.show(event, 0, event.target.files[0].size, 0)
}}, cli.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 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(), {_handle: "true"})
msg._upload = upload[0].files[0], msg._progress = action.show
can.run(event, [ctx.ACTION, html.UPLOAD], function(msg) {
can.user.toastSuccess(can), can.Update(), action.close()
}, true)
},
show: function (event, value, total, loaded) { now = new Date()
value == 0 && action.begin(event)
can.run(event, [ctx.ACTION, html.UPLOAD], function(msg) {
can.user.toastSuccess(can), can.Update(), action.close()
}, true)
},
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)+ice.PS+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()
ui.show.innerHTML = value+"%"
ui.cost.innerHTML = can.base.Duration(now - begin)
ui.size.innerHTML = can.base.Size(loaded)+ice.PS+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: html.A, href: path, download: name||path.split(ice.PS).pop()}]).first
a.click(), can.page.Remove(can, a)
},
downloads: function(can, text, name) { can.user.download(can, URL.createObjectURL(new Blob([text])), name) },
camera: function(can, msg, cb) {
navigator.getUserMedia({video: true}, cb, function(error) {
can.misc.Log(error)
})
},
return action
},
download: function(can, path, name) {
var a = can.page.Append(can, document.body, [{type: html.A, href: path, download: name||path.split(ice.PS).pop()}]).first
a.click(), can.page.Remove(can, a)
},
downloads: function(can, text, name) { can.user.download(can, URL.createObjectURL(new Blob([text])), name) },
camera: function(can, msg, cb) {
navigator.getUserMedia({video: true}, cb, function(error) {
can.misc.Log(error)
})
},
})

View File

@ -235,9 +235,9 @@ body.white table.content tr:hover { background-color:green; }
body.white fieldset.Action fieldset.plugin legend:hover { background-color:#6ee4e4; }
body.print fieldset.River>div.output div.item.select { background-color:white; border:solid 2px red; }
body.mobile select { font-size:1.6rem; height:1.6em; }
body.mobile select { font-size:1.4rem; height:1.4em; margin-top:3px; }
body.mobile legend { font-size:2rem; }
body.mobile input { font-size:1.6rem; }
body.mobile input { font-size:1.2rem; }
body.mobile input[type=text] { margin-top:5px; height:1.2em; }
body.mobile fieldset.Header.head { width:-webkit-fill-available; }
body.mobile fieldset.Header.head { background-color:#000000b8; font-size:2rem; height:2em; position:fixed; top:0; }

View File

@ -1,119 +1,118 @@
Volcanos({name: "chat", panels: [
{name: "Header", help: "标题栏", pos: chat.HEAD, state: ["time", "usernick", "avatar"]},
{name: "River", help: "群聊组", pos: chat.LEFT, action: ["create", "refresh"]},
{name: "Action", help: "工作台", pos: chat.MAIN},
{name: "Footer", help: "状态条", pos: chat.FOOT, state: ["ncmd"]},
{name: "Search", help: "搜索框", pos: chat.AUTO},
], main: {name: "Header", list: ["/publish/order.js"]}, river: {
serivce: {name: "运营群", storm: {
wx: {name: "公众号 wx", list: [
{name: "微信公众号", help: "wx", index: "web.wiki.word", args: ["usr/icebergs/misc/wx/wx.shy"]},
]},
mp: {name: "小程序 mp", list: [
{name: "微信小程序", help: "mp", index: "web.wiki.word", args: ["usr/icebergs/misc/mp/mp.shy"]},
]},
lark: {name: "机器人 lark", list: [
{name: "飞书机器人", help: "lark", index: "web.wiki.word", args: ["usr/icebergs/misc/lark/lark.shy"]},
]},
}},
product: {name: "产品群", storm: {
office: {name: "办公 office", list: [
{name: "feel", help: "影音媒体", index: "web.wiki.feel"},
{name: "draw", help: "思维导图", index: "web.wiki.draw"},
{name: "data", help: "数据表格", index: "web.wiki.data"},
{name: "plan", help: "计划任务", index: "web.team.plan"},
{name: "think", help: "智库", index: "web.wiki.word", args: ["usr/learning/"]},
{name: "index", help: "索引", index: "web.wiki.word", args: ["usr/learning/index.shy"]},
{name: "context", help: "编程", index: "web.wiki.word", args: ["src/main.shy"]},
]},
english: {name: "英汉 english", list: [
{name: "english", help: "英汉", index: "web.wiki.alpha.alpha", args: ["word", "hi"]},
{name: "chinese", help: "汉英", index: "web.wiki.alpha.alpha", args: ["line", "你好"]},
{name: "wubi", help: "五笔", index: "web.code.input.wubi", args: ["word", "wqvb"]},
{name: "wubi", help: "五笔", index: "web.code.input.wubi", args: ["line", "你好"]},
]},
learning: {name: "学习 learning", list: [
{name: "golang", help: "编程", index: "web.wiki.word", args: ["usr/golang-story/src/main.shy"]},
{name: "tmux", help: "粘贴", index: "web.code.tmux.text"},
{name: "study", help: "学习", index: "web.wiki.word", args: ["usr/learning/study.shy"]},
]},
chrome: {name: "爬虫 chrome", list: [
{name: "feel", help: "网页爬虫", index: "web.wiki.feel", args: ["spide/"], feature: {
display: "/plugin/local/wiki/feel.js",
height: 200, limit: 3,
}},
{name: "cached", help: "爬虫缓存", index: "web.code.chrome.cache", args: []},
{name: "spided", help: "网页爬虫", index: "web.code.chrome.spide", args: location && location.protocol && location.protocol=="chrome-extension:"? ["1", "", "spide"]: ["1"]},
{name: "modify", help: "编辑页面", index: "web.code.chrome.modify", args: []},
]},
}},
project: {name: "研发群", storm: {
studio: {name: "研发 studio", list: [
{name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/", "main.go"], _action: ["autogen", "compile", "binpack"]},
{name: "repos", help: "代码库", index: "web.code.git.status"},
{name: "plan", help: "任务表", index: "web.team.plan"},
{name: "ctx", help: "上下文", index: "web.wiki.word", args: ["src/main.shy"]},
]},
web: {name: "网页 web", list: [
{name: "HTML5", help: "浏览器", index: "web.wiki.word", args: ["usr/icebergs/misc/chrome/chrome.shy"]},
]},
cli: {name: "命令 cli", list: [
{name: "bash", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/bash/bash.shy"]},
{name: "git", help: "代码库", index: "web.wiki.word", args: ["usr/icebergs/misc/git/git.shy"]},
{name: "vim", help: "编辑器", index: "web.wiki.word", args: ["usr/icebergs/misc/vim/vim.shy"]},
{name: "tmux", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/tmux/tmux.shy"]},
]},
linux: {name: "系统 linux", list: [
{name: "idc", help: "平台", index: "web.wiki.word", args: ["usr/linux-story/idc/idc.shy"]},
{name: "iso", help: "系统", index: "web.wiki.word", args: ["usr/linux-story/iso/iso.shy"]},
{name: "iot", help: "设备", index: "web.wiki.word", args: ["usr/linux-story/iot/iot.shy"]},
{name: "cli", help: "命令", index: "web.wiki.word", args: ["usr/linux-story/cli/cli.shy"]},
{name: "linux", help: "系统", index: "web.wiki.word", args: ["usr/linux-story/src/main.shy"]},
]},
nginx: {name: "代理 nginx", list: [
{name: "nginx", help: "代理", index: "web.wiki.word", args: ["usr/nginx-story/src/main.shy"]},
]},
context: {name: "编程 context", list: [
{name: "golang", help: "编程", index: "web.wiki.word", args: ["usr/golang-story/src/main.shy"]},
]},
redis: {name: "缓存 redis", list: [
{name: "redis", help: "缓存", index: "web.wiki.word", args: ["usr/redis-story/src/main.shy"]},
{name: "kafka", help: "队列", index: "web.wiki.word", args: ["usr/redis-story/src/kafka/kafka.shy"]},
]},
mysql: {name: "存储 mysql", list: [
{name: "mysql", help: "数据存储", index: "web.wiki.word", args: ["usr/mysql-story/src/main.shy"]},
{name: "clickhouse", help: "数据存储", index: "web.wiki.word", args: ["usr/mysql-story/src/clickhouse/clickhouse.shy"]},
]},
}},
profile: {name: "测试群", storm: {
website: {name: "定制 website", index: [
"web.chat.website",
"web.chat.div",
"web.code.vimer",
"web.dream",
]},
release: {name: "发布 release", index: [
"web.code.publish", "web.code.compile", "web.code.autogen", "web.code.git.server",
]},
research: {name: "测试 research", index: [
"web.code.favor", "web.code.bench", "web.code.pprof",
"web.code.case",
]},
}},
operate: {name: "运维群", storm: {
aaa: {name: "权限 aaa", index: [
"user", "totp", "sess", "role",
]},
web: {name: "应用 web", index: [
"serve", "space", "dream", "route",
"share", "spide", "cache", "story",
]},
cli: {name: "系统 cli", index: [
"qrcode", "daemon", "system", "runtime",
]},
nfs: {name: "文件 nfs", index: [
"cat", "dir", "tail", "trash",
]},
}},
},
})
{name: "Header", help: "标题栏", pos: chat.HEAD, state: ["time", "usernick", "avatar"]},
{name: "River", help: "群聊组", pos: chat.LEFT, action: ["create", "refresh"]},
{name: "Action", help: "工作台", pos: chat.MAIN},
{name: "Footer", help: "状态条", pos: chat.FOOT, state: ["ncmd"]},
{name: "Search", help: "搜索框", pos: chat.AUTO},
], main: {name: "Header", list: ["/publish/order.js"]}, river: {
serivce: {name: "运营群", storm: {
wx: {name: "公众号 wx", list: [
{name: "微信公众号", help: "wx", index: "web.wiki.word", args: ["usr/icebergs/misc/wx/wx.shy"]},
]},
mp: {name: "小程序 mp", list: [
{name: "微信小程序", help: "mp", index: "web.wiki.word", args: ["usr/icebergs/misc/mp/mp.shy"]},
]},
lark: {name: "机器人 lark", list: [
{name: "飞书机器人", help: "lark", index: "web.wiki.word", args: ["usr/icebergs/misc/lark/lark.shy"]},
]},
}},
product: {name: "产品群", storm: {
office: {name: "办公 office", list: [
{name: "feel", help: "影音媒体", index: "web.wiki.feel"},
{name: "draw", help: "思维导图", index: "web.wiki.draw"},
{name: "data", help: "数据表格", index: "web.wiki.data"},
{name: "plan", help: "计划任务", index: "web.team.plan"},
{name: "think", help: "智库", index: "web.wiki.word", args: ["usr/learning/"]},
{name: "index", help: "索引", index: "web.wiki.word", args: ["usr/learning/index.shy"]},
{name: "context", help: "编程", index: "web.wiki.word", args: ["src/main.shy"]},
]},
english: {name: "英汉 english", list: [
{name: "english", help: "英汉", index: "web.wiki.alpha.alpha", args: ["word", "hi"]},
{name: "chinese", help: "汉英", index: "web.wiki.alpha.alpha", args: ["line", "你好"]},
{name: "wubi", help: "五笔", index: "web.code.input.wubi", args: ["word", "wqvb"]},
{name: "wubi", help: "五笔", index: "web.code.input.wubi", args: ["line", "你好"]},
]},
learning: {name: "学习 learning", list: [
{name: "golang", help: "编程", index: "web.wiki.word", args: ["usr/golang-story/src/main.shy"]},
{name: "tmux", help: "粘贴", index: "web.code.tmux.text"},
{name: "study", help: "学习", index: "web.wiki.word", args: ["usr/learning/study.shy"]},
]},
chrome: {name: "爬虫 chrome", list: [
{name: "feel", help: "网页爬虫", index: "web.wiki.feel", args: ["spide/"], feature: {
display: "/plugin/local/wiki/feel.js",
height: 200, limit: 3,
}},
{name: "cached", help: "爬虫缓存", index: "web.code.chrome.cache", args: []},
{name: "spided", help: "网页爬虫", index: "web.code.chrome.spide", args: location && location.protocol && location.protocol=="chrome-extension:"? ["1", "", "spide"]: ["1"]},
{name: "modify", help: "编辑页面", index: "web.code.chrome.modify", args: []},
]},
}},
project: {name: "研发群", storm: {
studio: {name: "研发 studio", list: [
{name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/", "main.go"], _action: ["autogen", "compile", "binpack"]},
{name: "repos", help: "代码库", index: "web.code.git.status"},
{name: "plan", help: "任务表", index: "web.team.plan"},
{name: "ctx", help: "上下文", index: "web.wiki.word", args: ["src/main.shy"]},
]},
web: {name: "网页 web", list: [
{name: "HTML5", help: "浏览器", index: "web.wiki.word", args: ["usr/icebergs/misc/chrome/chrome.shy"]},
]},
cli: {name: "命令 cli", list: [
{name: "bash", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/bash/bash.shy"]},
{name: "git", help: "代码库", index: "web.wiki.word", args: ["usr/icebergs/misc/git/git.shy"]},
{name: "vim", help: "编辑器", index: "web.wiki.word", args: ["usr/icebergs/misc/vim/vim.shy"]},
{name: "tmux", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/tmux/tmux.shy"]},
]},
linux: {name: "系统 linux", list: [
{name: "idc", help: "平台", index: "web.wiki.word", args: ["usr/linux-story/idc/idc.shy"]},
{name: "iso", help: "系统", index: "web.wiki.word", args: ["usr/linux-story/iso/iso.shy"]},
{name: "iot", help: "设备", index: "web.wiki.word", args: ["usr/linux-story/iot/iot.shy"]},
{name: "cli", help: "命令", index: "web.wiki.word", args: ["usr/linux-story/cli/cli.shy"]},
{name: "linux", help: "系统", index: "web.wiki.word", args: ["usr/linux-story/src/main.shy"]},
]},
nginx: {name: "代理 nginx", list: [
{name: "nginx", help: "代理", index: "web.wiki.word", args: ["usr/nginx-story/src/main.shy"]},
]},
context: {name: "编程 context", list: [
{name: "golang", help: "编程", index: "web.wiki.word", args: ["usr/golang-story/src/main.shy"]},
]},
redis: {name: "缓存 redis", list: [
{name: "redis", help: "缓存", index: "web.wiki.word", args: ["usr/redis-story/src/main.shy"]},
{name: "kafka", help: "队列", index: "web.wiki.word", args: ["usr/redis-story/src/kafka/kafka.shy"]},
]},
mysql: {name: "存储 mysql", list: [
{name: "mysql", help: "数据存储", index: "web.wiki.word", args: ["usr/mysql-story/src/main.shy"]},
{name: "clickhouse", help: "数据存储", index: "web.wiki.word", args: ["usr/mysql-story/src/clickhouse/clickhouse.shy"]},
]},
}},
profile: {name: "测试群", storm: {
website: {name: "定制 website", index: [
"web.chat.website",
"web.chat.div",
"web.code.vimer",
"web.dream",
]},
release: {name: "发布 release", index: [
"web.code.publish", "web.code.compile", "web.code.autogen", "web.code.git.server",
]},
research: {name: "测试 research", index: [
"web.code.favor", "web.code.bench", "web.code.pprof",
"web.code.case",
]},
}},
operate: {name: "运维群", storm: {
aaa: {name: "权限 aaa", index: [
"user", "totp", "sess", "role",
]},
web: {name: "应用 web", index: [
"serve", "space", "dream", "route",
"share", "spide", "cache", "story",
]},
cli: {name: "系统 cli", index: [
"qrcode", "daemon", "system", "runtime",
]},
nfs: {name: "文件 nfs", index: [
"cat", "dir", "tail", "trash",
]},
}},
}})

View File

@ -1,250 +1,249 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) {
var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM)
can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) {
item.height = can.Conf(html.HEIGHT)-can.Conf(html.MARGIN_Y)
item.width = can.Conf(html.WIDTH)-can.Conf(html.MARGIN_X)
item.feature = can.base.Obj(item.feature||item.meta)
item.inputs = can.base.Obj(item.inputs||item.list)
var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM)
can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) {
item.height = can.Conf(html.HEIGHT)-can.Conf(html.MARGIN_Y)
item.width = can.Conf(html.WIDTH)-can.Conf(html.MARGIN_X)
item.feature = can.base.Obj(item.feature||item.meta)
item.inputs = can.base.Obj(item.inputs||item.list)
can.onappend.plugin(can, item, function(sub, meta, skip) {
can.onimport._plugin(can, river, storm, sub, meta), skip || next()
})
}, function() { can.onimport._menu(can, msg), can.onkeymap._init(can)
can.onaction.onstorm_select(can, msg, river, storm)
})
},
_plugin: function(can, river, storm, sub, meta) { sub._target._meta = meta
sub.run = function(event, cmds, cb) { var msg = sub.request(event)
return can.run(event, can.misc.concat(can, [river, storm, meta.id||meta.index], cmds), function(msg) {
can.base.isFunc(cb) && cb(msg)
})
}, can._plugins = can.misc.concat(can, can._plugins, [sub])
can.onappend.plugin(can, item, function(sub, meta, skip) {
can.onimport._plugin(can, river, storm, sub, meta), skip || next()
})
}, function() { can.onimport._menu(can, msg), can.onkeymap._init(can)
can.onaction.onstorm_select(can, msg, river, storm)
})
},
_plugin: function(can, river, storm, sub, meta) { sub._target._meta = meta
sub.run = function(event, cmds, cb) { var msg = sub.request(event)
return can.run(event, can.misc.concat(can, [river, storm, meta.id||meta.index], cmds), function(msg) {
can.base.isFunc(cb) && cb(msg)
})
}, can._plugins = can.misc.concat(can, can._plugins, [sub])
meta.id && (sub._option.dataset = sub._option.dataset||{}, sub._option.dataset.id = meta.id)
meta.id && (sub._option.dataset = sub._option.dataset||{}, sub._option.dataset.id = meta.id)
can.page.Modify(can, sub._output, {style: kit.Dict(html.MAX_WIDTH, meta.width)})
can.page.Append(can, can._action, [{view: [chat.TABS, html.DIV, meta.name], onclick: function(event) {
can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, sub._target)
can.onmotion.select(can, can._action, chat.DIV_TABS, event.target)
}, onmouseenter: sub._legend.onmouseenter}])
},
_menu: function(can, msg) { if (can.user.mod.isPod||can.user.isMobile) { return }
can.setHeaderMenu(can.base.Obj(msg.Option(chat.MENUS), can.Conf(chat.MENUS)||can.onaction._menus), function(event, button, list) {
can.core.CallFunc([can.onaction, list[0]], [can, button])
})
},
can.page.Modify(can, sub._output, {style: kit.Dict(html.MAX_WIDTH, meta.width)})
can.page.Append(can, can._action, [{view: [chat.TABS, html.DIV, meta.name], onclick: function(event) {
can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, sub._target)
can.onmotion.select(can, can._action, chat.DIV_TABS, event.target)
}, onmouseenter: sub._legend.onmouseenter}])
},
_menu: function(can, msg) { if (can.user.mod.isPod||can.user.isMobile) { return }
can.setHeaderMenu(can.base.Obj(msg.Option(chat.MENUS), can.Conf(chat.MENUS)||can.onaction._menus), function(event, button, list) {
can.core.CallFunc([can.onaction, list[0]], [can, button])
})
},
_share: function(can, share) { share && can.run({}, ["_share", share], function(msg) {
can.user.title(msg.OptionOrSearch(chat.TITLE))
can.setHeader(chat.TOPIC, msg.OptionOrSearch(chat.TOPIC))
can.page.Select(can, document.body, html.FIELDSET_PANEL, function(item) {
item != can._target && can.onmotion.hidden(can, item)
})
_share: function(can, share) { share && can.run({}, ["_share", share], function(msg) {
can.user.title(msg.OptionOrSearch(chat.TITLE))
can.setHeader(chat.TOPIC, msg.OptionOrSearch(chat.TOPIC))
// can.page.Select(can, document.body, html.FIELDSET_PANEL, function(item) {
// item != can._target && can.onmotion.hidden(can, item)
// })
can.Conf(html.MARGIN_X, 0, html.MARGIN_Y, 2*html.ACTION_HEIGHT)
can.page.ClassList.add(can, can._target, ice.CMD)
can.onlayout._init(can)
can.Conf(html.MARGIN_X, 0, html.MARGIN_Y, 2*html.ACTION_HEIGHT)
// can.page.ClassList.add(can, can._target, ice.CMD)
can.onlayout._init(can)
can.Conf(chat.RIVER, "_share", chat.STORM, share)
can.onimport._init(can, msg)
}) },
_cmd: function(can, item, next) {
can.base.Copy(item, {
height: can.Conf(html.HEIGHT)-can.Conf(html.MARGIN_Y),
width: can.Conf(html.WIDTH)-can.Conf(html.MARGIN_X),
opts: can.misc.Search(can),
})
can.onappend.plugin(can, item, function(sub, meta, skip) {
can.user.title(meta.name), skip || next()
})
},
can.Conf(chat.RIVER, "_share", chat.STORM, share)
can.onimport._init(can, msg)
}) },
_cmd: function(can, item, next) {
can.base.Copy(item, {
height: can.Conf(html.HEIGHT)-can.Conf(html.MARGIN_Y),
width: can.Conf(html.WIDTH)-can.Conf(html.MARGIN_X),
opts: can.misc.Search(can),
})
can.onappend.plugin(can, item, function(sub, meta, skip) {
can.user.title(meta.name), skip || next()
})
},
})
Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, page, msg, can, cmds, cb) {
var storm = can.core.Value(can._root, can.core.Keys(chat.RIVER, cmds[0], chat.STORM, cmds[1]))
if (!storm || cmds.length != 2) { return false }
var storm = can.core.Value(can._root, can.core.Keys(chat.RIVER, cmds[0], chat.STORM, cmds[1]))
if (!storm || cmds.length != 2) { return false }
if (storm.index) { // 命令索引
can.run(event, [ctx.ACTION, ctx.COMMAND].concat(storm.index), cb)
} else { // 命令列表
can.core.List(storm.list, function(value) {
msg.Push(mdb.NAME, value.name||"")
msg.Push(mdb.HELP, value.help||"")
msg.Push(ctx.INPUTS, JSON.stringify(value.inputs))
msg.Push(ctx.FEATURE, JSON.stringify(value.feature))
msg.Push(ctx.INDEX, value.index||"")
msg.Push(ctx.ARGS, value.args||"[]")
msg.Push(ice.MSG_ACTION, value._action||"")
}), can.base.isFunc(cb) && cb(msg)
}
return true
},
})
if (storm.index) { // 命令索引
can.run(event, [ctx.ACTION, ctx.COMMAND].concat(storm.index), cb)
} else { // 命令列表
can.core.List(storm.list, function(value) {
msg.Push(mdb.NAME, value.name||"")
msg.Push(mdb.HELP, value.help||"")
msg.Push(ctx.INPUTS, JSON.stringify(value.inputs))
msg.Push(ctx.FEATURE, JSON.stringify(value.feature))
msg.Push(ctx.INDEX, value.index||"")
msg.Push(ctx.ARGS, value.args||"[]")
msg.Push(ice.MSG_ACTION, value._action||"")
}), can.base.isFunc(cb) && cb(msg)
}
return true
}})
Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, cb, target) {
can.Conf(html.MARGIN_Y, 4*html.PLUGIN_MARGIN+2*html.ACTION_HEIGHT+html.ACTION_MARGIN)
can.Conf(html.MARGIN_X, 4*html.PLUGIN_MARGIN)
target.ontouchstart = function(event) {
can.onengine.signal(can, "onaction_touch", can.request(event))
}, can.base.isFunc(cb) && cb()
},
_menus: [
[chat.LAYOUT, "auto", "flow", "grid", "tabs", "free", "page", "toimage"],
[ice.HELP, "tutor", "manual", "service", "devops", "refer"],
],
_trans: {
"layout": "布局",
"auto": "默认布局",
"flow": "流动布局",
"grid": "网格布局",
"tabs": "标签布局",
"free": "自由布局",
"page": "网页布局",
"toimage": "生成图片",
can.Conf(html.MARGIN_Y, 4*html.PLUGIN_MARGIN+2*html.ACTION_HEIGHT+html.ACTION_MARGIN)
can.Conf(html.MARGIN_X, 4*html.PLUGIN_MARGIN)
target.ontouchstart = function(event) {
can.onengine.signal(can, "onaction_touch", can.request(event))
}, can.base.isFunc(cb) && cb()
},
_menus: [
[chat.LAYOUT, "auto", "flow", "grid", "tabs", "free", "page", "toimage"],
[ice.HELP, "tutor", "manual", "service", "devops", "refer"],
],
_trans: {
"layout": "布局",
"auto": "默认布局",
"flow": "流动布局",
"grid": "网格布局",
"tabs": "标签布局",
"free": "自由布局",
"page": "网页布局",
"toimage": "生成图片",
"help": "帮助",
"tutor": "入门简介",
"manual": "使用手册",
"service": "服务手册",
"devops": "编程手册",
"refer": "参考手册",
},
onmain: function(can) {
can.onimport._share(can, can.misc.Search(can, web.SHARE))
},
onlogin: function(can) { if (!can.user.mod.isCmd) { return }
can.Conf(html.MARGIN_X, 0, html.MARGIN_Y, 2*html.ACTION_HEIGHT)
can.page.ClassList.add(can, can._target, ice.CMD)
can.onlayout._init(can)
"help": "帮助",
"tutor": "入门简介",
"manual": "使用手册",
"service": "服务手册",
"devops": "编程手册",
"refer": "参考手册",
},
onmain: function(can) {
can.onimport._share(can, can.misc.Search(can, web.SHARE))
},
onlogin: function(can) { if (!can.user.mod.isCmd) { return }
can.Conf(html.MARGIN_X, 0, html.MARGIN_Y, 2*html.ACTION_HEIGHT)
can.page.ClassList.add(can, can._target, ice.CMD)
can.onlayout._init(can)
can._names = location.pathname
can.Conf(chat.TOOL)? can.core.Next(can.Conf(chat.TOOL), function(item, next) {
can.onimport._cmd(can, item, next)
can._names = location.pathname
can.Conf(chat.TOOL)? can.core.Next(can.Conf(chat.TOOL), function(item, next) {
can.onimport._cmd(can, item, next)
}): can.run(can.request()._event, [ctx.ACTION, ctx.COMMAND], function(msg) {
can.core.Next(msg.Table(), function(item, next) {
can.onimport._cmd(can, item, next)
})
})
},
onstorm_select: function(can, msg, river, storm) { can.onlayout._init(can)
if (can.onmotion.cache(can, function() {
var key = can.core.Keys(can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm))
return key
}, can._action, can._output)) {
var conf = can.core.Value(can._root, can.core.Keys(chat.RIVER, river, chat.STORM, storm))||{}
can.onaction.layout(can, conf.layout||can.misc.SearchOrConf(can, chat.LAYOUT)||"auto", true)
return
}
}): can.run(can.request()._event, [ctx.ACTION, ctx.COMMAND], function(msg) {
can.core.Next(msg.Table(), function(item, next) {
can.onimport._cmd(can, item, next)
})
})
},
onstorm_select: function(can, msg, river, storm) { can.onlayout._init(can)
if (can.onmotion.cache(can, function() {
var key = can.core.Keys(can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm))
return key
}, can._action, can._output)) {
var conf = can.core.Value(can._root, can.core.Keys(chat.RIVER, river, chat.STORM, storm))||{}
can.onaction.layout(can, conf.layout||can.misc.SearchOrConf(can, chat.LAYOUT)||"auto", true)
return
}
can.run({}, [river, storm], function(msg) { if (msg.Length() > 0) { return can.onimport._init(can, msg) }
can.onengine.signal(can, "onaction_notool", can.request({}, {river: river, storm: storm}))
})
},
onsearch: function(can, msg, word) {
if (word[0] == mdb.FOREACH || word[0] == mdb.PLUGIN) { can.onexport.plugin(can, msg, word) }
},
onsize: function(can, msg, height, width) { can.Conf({height: height, width: width}) },
can.run({}, [river, storm], function(msg) { if (msg.Length() > 0) { return can.onimport._init(can, msg) }
can.onengine.signal(can, "onaction_notool", can.request({}, {river: river, storm: storm}))
})
},
onsearch: function(can, msg, word) {
if (word[0] == mdb.FOREACH || word[0] == mdb.PLUGIN) { can.onexport.plugin(can, msg, word) }
},
onsize: function(can, msg, height, width) { can.Conf({height: height, width: width}) },
help: function(can, button) { can.user.open("/help/"+button+".shy") },
layout: function(can, button, slient) {
if (button == "toimage") {
can.onmotion.toimage(event, can, document.title, can._output)
return
}
can.page.ClassList.del(can, can._target, can.Conf(chat.LAYOUT))
can.page.ClassList.add(can, can._target, can.Conf(chat.LAYOUT, button))
help: function(can, button) { can.user.open("/help/"+button+".shy") },
layout: function(can, button, slient) {
if (button == "toimage") {
can.onmotion.toimage(event, can, document.title, can._output)
return
}
can.page.ClassList.del(can, can._target, can.Conf(chat.LAYOUT))
can.page.ClassList.add(can, can._target, can.Conf(chat.LAYOUT, button))
if (button == "tabs") {
can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, 0)
can.onmotion.select(can, can._action, chat.DIV_TABS, 0)
} else if (button == "free") {
can.page.Select(can, can._target, [[html.DIV_OUTPUT, html.FIELDSET_PLUGIN]], function(item, index) {
can.page.Modify(can, item, {style: {left: 40*index, top: 40*index}})
can.onmotion.move(can, item, {left: 40*index, top: 40*index})
})
} else if (button == "grid") {
can.user.input(event, can, [{name: "m", value: 2}, {name: "n", value: 2}], function(event, button, data, list, args) {
can.getActionSize(function(height, width) { var m = parseInt(data.m)||2, n = parseInt(data.n)||2
can.page.css(can.base.replaceAll(chat.ACTION_LAYOUT_FMT, "_width", (width-(4*m+1)*html.PLUGIN_MARGIN)/m+"px", "_height", (height-(4*n+1)*html.PLUGIN_MARGIN)/n+"px"))
})
}, true)
}
can.onlayout._init(can)
},
if (button == "tabs") {
can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, 0)
can.onmotion.select(can, can._action, chat.DIV_TABS, 0)
} else if (button == "free") {
can.page.Select(can, can._target, [[html.DIV_OUTPUT, html.FIELDSET_PLUGIN]], function(item, index) {
can.page.Modify(can, item, {style: {left: 40*index, top: 40*index}})
can.onmotion.move(can, item, {left: 40*index, top: 40*index})
})
} else if (button == "grid") {
can.user.input(event, can, [{name: "m", value: 2}, {name: "n", value: 2}], function(event, button, data, list, args) {
can.getActionSize(function(height, width) { var m = parseInt(data.m)||2, n = parseInt(data.n)||2
can.page.css(can.base.replaceAll(chat.ACTION_LAYOUT_FMT, "_width", (width-(4*m+1)*html.PLUGIN_MARGIN)/m+"px", "_height", (height-(4*n+1)*html.PLUGIN_MARGIN)/n+"px"))
})
}, true)
}
can.onlayout._init(can)
},
})
Volcanos("onkeymap", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) {
can.onkeymap._build(can), can.onengine.listen(can, "onkeydown", function(msg, model) {
can._keylist = can.onkeymap._parse(msg._event, can, model, can._keylist||[], can._output)
})
},
_mode: {
normal: {
j: function(event, can, target) { target.scrollBy(0, event.ctrlKey? 300: 30) },
k: function(event, can, target) { target.scrollBy(0, event.ctrlKey? -300: -30) },
can.onkeymap._build(can), can.onengine.listen(can, "onkeydown", function(msg, model) {
can._keylist = can.onkeymap._parse(msg._event, can, model, can._keylist||[], can._output)
})
},
_mode: {
normal: {
j: function(event, can, target) { target.scrollBy(0, event.ctrlKey? 300: 30) },
k: function(event, can, target) { target.scrollBy(0, event.ctrlKey? -300: -30) },
b: function(event, can, target) { can.search(event, ["Header.onaction.black"]) },
w: function(event, can, target) { can.search(event, ["Header.onaction.white"]) },
b: function(event, can, target) { can.search(event, ["Header.onaction.black"]) },
w: function(event, can, target) { can.search(event, ["Header.onaction.white"]) },
g: function(event, can, target) { can.search(event, ["River.ondetail.创建群组"]) },
s: function(event, can, target) { can.search(event, ["River.ondetail.添加应用"]) },
t: function(event, can, target) { can.search(event, ["River.ondetail.添加工具"]) },
g: function(event, can, target) { can.search(event, ["River.ondetail.创建群组"]) },
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.onengine.signal(can, "onsearchfocus")
},
":": function(event, can, target) {
can.onengine.signal(can, "oncommandfocus")
},
enter: function(event, can, target) { can.misc.Log("enter") },
escape: function(event, can, target) {
can.page.Select(can, document.body, html.FIELDSET_AUTO, function(item) {
can.onmotion.hidden(can, item)
})
can.page.Select(can, document.body, can.page.Keys(html.FIELDSET_FLOAT, html.DIV_FLOAT), function(item) {
can.page.Remove(can, item)
})
},
},
}, _engine: {},
" ": function(event, can, target) {
can.onengine.signal(can, "onsearchfocus")
},
":": function(event, can, target) {
can.onengine.signal(can, "oncommandfocus")
},
enter: function(event, can, target) { can.misc.Log("enter") },
escape: function(event, can, target) {
can.page.Select(can, document.body, html.FIELDSET_AUTO, function(item) {
can.onmotion.hidden(can, item)
})
can.page.Select(can, document.body, can.page.Keys(html.FIELDSET_FLOAT, html.DIV_FLOAT), function(item) {
can.page.Remove(can, item)
})
},
},
}, _engine: {},
})
Volcanos("onexport", {help: "导出数据", list: [],
args: function(can, cb, target) {
can.core.Next(can.page.Select(can, target, [[html.FIELDSET_PLUGIN, html.FORM_OPTION]]), function(item, next, index, array) {
item.dataset.args = JSON.stringify(can.page.Select(can, item, html.OPTION_ARGS, function(item) { return item.value||"" }))
cb(item, next, index, array)
})
},
size: function(can, msg) {
msg.Option(html.TOP, can._target.offsetTop)
msg.Option(html.LEFT, can._target.offsetLeft)
msg.Option(html.WIDTH, can._target.offsetWidth)
msg.Option(html.HEIGHT, can._target.offsetHeight-can._action.offsetHeight)
msg.Option(html.SCROLL, can.user.isMobile? can._target.parentNode.parentNode.scrollTop: can._output.scrollTop)
msg.Option(html.MARGIN_X, can.Conf(html.MARGIN_X))
msg.Option(html.MARGIN_Y, can.Conf(html.MARGIN_Y))
},
layout: function(can, msg) { return can.Conf(chat.LAYOUT) },
plugin: function(can, msg, word) { var fields = can.core.Split(msg.Option(ice.MSG_FIELDS))
can.page.Select(can, can._output, [[html.FIELDSET_PLUGIN, html.LEGEND]], function(item) {
if (item.innerHTML.indexOf(word[1]) == -1) { return }
args: function(can, cb, target) {
can.core.Next(can.page.Select(can, target, [[html.FIELDSET_PLUGIN, html.FORM_OPTION]]), function(item, next, index, array) {
item.dataset.args = JSON.stringify(can.page.Select(can, item, html.OPTION_ARGS, function(item) { return item.value||"" }))
cb(item, next, index, array)
})
},
size: function(can, msg) {
msg.Option(html.TOP, can._target.offsetTop)
msg.Option(html.LEFT, can._target.offsetLeft)
msg.Option(html.WIDTH, can._target.offsetWidth)
msg.Option(html.HEIGHT, can._target.offsetHeight-can._action.offsetHeight)
msg.Option(html.SCROLL, can.user.isMobile? can._target.parentNode.parentNode.scrollTop: can._output.scrollTop)
msg.Option(html.MARGIN_X, can.Conf(html.MARGIN_X))
msg.Option(html.MARGIN_Y, can.Conf(html.MARGIN_Y))
},
layout: function(can, msg) { return can.Conf(chat.LAYOUT) },
plugin: function(can, msg, word) { var fields = can.core.Split(msg.Option(ice.MSG_FIELDS))
can.page.Select(can, can._output, [[html.FIELDSET_PLUGIN, html.LEGEND]], function(item) {
if (item.innerHTML.indexOf(word[1]) == -1) { return }
var meta = item.parentNode._meta
var list = can.page.Select(can, item.nextSibling, html.OPTION_ARGS, function(item) { return item.value||"" })
var meta = item.parentNode._meta
var list = can.page.Select(can, item.nextSibling, html.OPTION_ARGS, function(item) { return item.value||"" })
var data = {ctx: "web.chat", cmd: ctx.ACTION,
type: mdb.PLUGIN, name: item.innerHTML, text: shy("跳转", function(event) {
var input = can.page.Select(can, item.parentNode, html.INPUT_ARGS)[0]
input && input.focus()
}), argument: JSON.stringify(list),
}
if (meta.index) {
data.context = "", data.command = meta.index
} else if (meta.cmd) {
data.context = meta.ctx, data.command = meta.cmd
} else {
return
}
msg.Push(data, fields)
})
},
var data = {ctx: "web.chat", cmd: ctx.ACTION,
type: mdb.PLUGIN, name: item.innerHTML, text: shy("跳转", function(event) {
var input = can.page.Select(can, item.parentNode, html.INPUT_ARGS)[0]
input && input.focus()
}), argument: JSON.stringify(list),
}
if (meta.index) {
data.context = "", data.command = meta.index
} else if (meta.cmd) {
data.context = meta.ctx, data.command = meta.cmd
} else {
return
}
msg.Push(data, fields)
})
},
})

View File

@ -1,96 +1,96 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onmotion.clear(can)
can.onimport._title(can, msg, target)
can.onimport._state(can, msg, target)
can.onimport._toast(can, msg, target)
can.onimport._cli(can, msg, target)
can.base.isFunc(cb) && cb(msg)
},
_title: function(can, msg, target) {
!can.user.isMobile && can.core.List(msg.result, function(item) {
can.page.Append(can, target, [{view: [chat.TITLE, html.DIV, item], title: "联系站长"}])
})
},
_state: function(can, msg, target) {
can.core.List(can.base.Obj(msg.Option(chat.STATE)||can.Conf(chat.STATE), ["ncmd"]), function(item) {
can.page.Append(can, target, [{view: [can.base.join([chat.STATE, item]), html.DIV, can.Conf(item)], list: [
{text: [item, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [can.Conf(item)||"", html.SPAN, item]},
], onclick: function(event) {
can.show = can.show? (can.page.Remove(can, can.show), null): can.onaction._cmd(can)
can.page.Modify(can, can.show, {style: {left: "", top: "", right: 0, bottom: can.onexport.height(can)}})
}}])
})
},
_toast: function(can, msg, target) {
can.toast = can.page.Append(can, target, [{view: chat.TOAST, onclick: function(event) {
can.show = can.show? (can.page.Remove(can, can.show), null): can.onappend.float(can, can._toast).first
can.page.Modify(can, can.show, {style: {left: "", top: "", right: 0, bottom: can.onexport.height(can)}})
}}]).first
},
_cli: function(can, msg, target) {
can.onappend.input(can, {type: html.TEXT, name: "cmd", onkeydown: function(event) {
can.onkeymap.input(event, can); if (event.key != lang.ENTER) { return }
switch (event.target.value) {
case cli.CLEAR: can.cli && can.cli.close(); break
case cli.CLOSE: can.cli && can.cli.close(); break
default:
can.run(event, [ice.RUN].concat(can.core.Split(event.target.value, ice.SP)), function(msg) {
can.cli && can.cli.close()
can.cli = can.onappend.float(can, msg, function(value, key, index, line, list) {
can.onmotion.clear(can)
can.onimport._title(can, msg, target)
can.onimport._state(can, msg, target)
can.onimport._toast(can, msg, target)
can.onimport._cli(can, msg, target)
can.base.isFunc(cb) && cb(msg)
},
_title: function(can, msg, target) {
!can.user.isMobile && can.core.List(msg.result, function(item) {
can.page.Append(can, target, [{view: [chat.TITLE, html.DIV, item], title: "联系站长"}])
})
},
_state: function(can, msg, target) {
can.core.List(can.base.Obj(msg.Option(chat.STATE)||can.Conf(chat.STATE), ["ncmd"]), function(item) {
can.page.Append(can, target, [{view: [can.base.join([chat.STATE, item]), html.DIV, can.Conf(item)], list: [
{text: [item, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [can.Conf(item)||"", html.SPAN, item]},
], onclick: function(event) {
can.show = can.show? (can.page.Remove(can, can.show), null): can.onaction._cmd(can)
can.page.Modify(can, can.show, {style: {left: "", top: "", right: 0, bottom: can.onexport.height(can)}})
}}])
})
},
_toast: function(can, msg, target) {
can.toast = can.page.Append(can, target, [{view: chat.TOAST, onclick: function(event) {
can.show = can.show? (can.page.Remove(can, can.show), null): can.onappend.float(can, can._toast).first
can.page.Modify(can, can.show, {style: {left: "", top: "", right: 0, bottom: can.onexport.height(can)}})
}}]).first
},
_cli: function(can, msg, target) {
can.onappend.input(can, {type: html.TEXT, name: "cmd", onkeydown: function(event) {
can.onkeymap.input(event, can); if (event.key != lang.ENTER) { return }
switch (event.target.value) {
case cli.CLEAR: can.cli && can.cli.close(); break
case cli.CLOSE: can.cli && can.cli.close(); break
default:
can.run(event, [ice.RUN].concat(can.core.Split(event.target.value, ice.SP)), function(msg) {
can.cli && can.cli.close()
can.cli = can.onappend.float(can, msg, function(value, key, index, line, list) {
}), can.page.Modify(can, can.cli.first, {style: {bottom: can.onexport.height(can), top: ""}})
})
}
}}, "", target, "title cmd")
},
}), can.page.Modify(can, can.cli.first, {style: {bottom: can.onexport.height(can), top: ""}})
})
}
}}, "", target, "title cmd")
},
toast: function(can, msg, title, content, fileline, time) { can._toast = can._toast||can.request()
can.page.Modify(can, can.toast, [time.split(ice.SP).pop(), title, content].join(ice.SP))
can._toast.Push({time: time, fileline: fileline, title: title, content: content})
},
ncmd: function(can, msg, _follow, _cmds) { var NCMD = "ncmd"; can._cmds = can._cmds||can.request()
can._cmds.Push({time: can.base.Time(), follow: _follow, cmds: _cmds})
can.page.Select(can, can._output, can.core.Keys(html.SPAN, NCMD), function(item) {
item.innerHTML = can.Conf(NCMD, parseInt(can.Conf(NCMD)||"0")+1+"")+""
})
},
toast: function(can, msg, title, content, fileline, time) { can._toast = can._toast||can.request()
can.page.Modify(can, can.toast, [time.split(ice.SP).pop(), title, content].join(ice.SP))
can._toast.Push({time: time, fileline: fileline, title: title, content: content})
},
ncmd: function(can, msg, _follow, _cmds) { var NCMD = "ncmd"; can._cmds = can._cmds||can.request()
can._cmds.Push({time: can.base.Time(), follow: _follow, cmds: _cmds})
can.page.Select(can, can._output, can.core.Keys(html.SPAN, NCMD), function(item) {
item.innerHTML = can.Conf(NCMD, parseInt(can.Conf(NCMD)||"0")+1+"")+""
})
},
})
Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, cb, target) {
can.base.isFunc(cb) && cb()
},
onlogin: function(can, msg) { can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) }) },
ontoast: function(can, msg) { can.core.CallFunc(can.onimport.toast, {can: can, msg: msg}) },
onremote: function(can, msg) { can.core.CallFunc(can.onimport.ncmd, {can: can, msg: msg}) },
oncommandfocus: function(can) {
can.page.Select(can, can._output, "div.cmd input", function(target) { target.focus() })
},
can.base.isFunc(cb) && cb()
},
onlogin: function(can, msg) { can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) }) },
ontoast: function(can, msg) { can.core.CallFunc(can.onimport.toast, {can: can, msg: msg}) },
onremote: function(can, msg) { can.core.CallFunc(can.onimport.ncmd, {can: can, msg: msg}) },
oncommandfocus: function(can) {
can.page.Select(can, can._output, "div.cmd input", function(target) { target.focus() })
},
_cmd: function(can) {
return can.onappend.float(can, can._cmds, function(value, key, index, line, list) {
var cmds = can.base.Obj(line.cmds); switch (line.follow) {
case "chat.Action": cmds = cmds.slice(2); break
case "chat.Footer": cmds = cmds.slice(2); break
}
switch (cmds[0]) {
case "web.wiki.word": cmds = cmds.slice(5); break
}
_cmd: function(can) {
return can.onappend.float(can, can._cmds, function(value, key, index, line, list) {
var cmds = can.base.Obj(line.cmds); switch (line.follow) {
case "chat.Action": cmds = cmds.slice(2); break
case "chat.Footer": cmds = cmds.slice(2); break
}
switch (cmds[0]) {
case "web.wiki.word": cmds = cmds.slice(5); break
}
can.get("Action", "size", function(msg, top, left, width, height) {
can.onappend.plugin(can, {index: cmds[0], args: cmds.slice(1), height: height-100, width: width}, function(sub) {
sub.run = function(event, cmd, cb) {
can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, cmds[0]], cmd), cb)
}
can.get("Action", "size", function(msg, top, left, width, height) {
can.onappend.plugin(can, {index: cmds[0], args: cmds.slice(1), height: height-100, width: width}, function(sub) {
sub.run = function(event, cmd, cb) {
can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, cmds[0]], cmd), cb)
}
can.page.Modify(can, sub._target, {style: {top: top+100, left: left}})
can.page.Modify(can, sub._legend, {style: {display: html.BLOCK}})
can.page.Modify(can, sub._output, {style: {"max-width": width}})
can.page.ClassList.add(can, sub._target, chat.FLOAT)
}, document.body)
})
}).first
},
can.page.Modify(can, sub._target, {style: {top: top+100, left: left}})
can.page.Modify(can, sub._legend, {style: {display: html.BLOCK}})
can.page.Modify(can, sub._output, {style: {"max-width": width}})
can.page.ClassList.add(can, sub._target, chat.FLOAT)
}, document.body)
})
}).first
},
})
Volcanos("onexport", {help: "导出数据", list: [],
height: function(can) { return can._target.offsetHeight },
height: function(can) { return can._target.offsetHeight },
})

View File

@ -1,235 +1,235 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, cb, target) {
can.Conf(aaa.USERNICK, msg.Option(aaa.USERNICK)||msg.Option(ice.MSG_USERNAME)||can.Conf(aaa.USERNICK))
can.Conf(aaa.USERNICK, msg.Option(aaa.USERNICK)||msg.Option(ice.MSG_USERNAME)||can.Conf(aaa.USERNICK))
can.onmotion.clear(can)
can.onimport._agent(can, msg, target)
can.onimport._grant(can, msg, target)
can.onimport._title(can, msg, target)
can.onimport._state(can, msg, target)
can.onimport._search(can, msg, target)
can.onimport._background(can, msg, target)
can.onimport._avatar(can, msg, target)
can.onimport._menus(can, msg, target)
can.base.isFunc(cb) && cb(msg)
},
_agent: function(can, msg, target) {
if (can.user.mod.isPod) {
can.onaction.River(can)
can.onaction.Footer(can)
} else if (can.user.isMobile) {
can.onaction.River(can)
can.onaction.Footer(can)
} else if (can.user.isExtension) {
can.onaction.River(can)
}
can.run({}, [chat.AGENT], function(msg) { if (!msg.Option(ssh.SCRIPT)) { return }
can.require(can.base.Obj(msg.Option(ssh.SCRIPT)), function(can) { can.onaction.source(can, msg) })
})
},
_grant: function(can, msg, target) {
if (can.misc.Search(can, chat.GRANT)) {
if (can.user.confirm(chat.GRANT+ice.SP+can.misc.Search(can, chat.GRANT))) {
can.run(event, [ctx.ACTION, chat.GRANT, web.SPACE, can.misc.Search(can, chat.GRANT)])
}
can.misc.Search(can, chat.GRANT, "")
}
},
_title: function(can, msg, target) {
can.user.title(can.misc.Search(can, chat.TITLE)||can.misc.Search(can, ice.POD))
!can.user.isMobile && can.core.List(can.base.getValid(msg.result, can.Conf(chat.TITLE)||["shylinux.com/x/contexts"]), function(item) {
can.page.Append(can, target, [{view: [chat.TITLE, html.DIV, item], title: "返回主页", onclick: function(event) {
can.onaction.title(event, can)
}, onmouseenter: function(event) { var list = msg.Table()
can.user.carte(event, can, {}, can.core.List(list, function(item) { return item.name }), function(event, item, meta, index) {
event.shiftKey? can.user.open(list[index].path): can.user.jumps(list[index].path)
})
}}])
})
},
_state: function(can, msg, target) {
can.core.List(can.base.Obj(msg.Option(chat.STATE)||can.Conf(chat.STATE), [mdb.TIME, aaa.USERNICK]), function(item) {
if (item == aaa.AVATAR ) { if (can.user.isLocalFile) { return }
can.page.Append(can, target, [{view: can.base.join([chat.STATE, item]), list: [{img: ice.SP}], onmouseenter: function(event) {
can.onaction.carte(event, can, [can.page.Format(html.IMG, "/share/local/avatar", 160)])
}}]); return
}
can.onmotion.clear(can)
can.onimport._agent(can, msg, target)
can.onimport._grant(can, msg, target)
can.onimport._title(can, msg, target)
can.onimport._state(can, msg, target)
can.onimport._search(can, msg, target)
can.onimport._background(can, msg, target)
can.onimport._avatar(can, msg, target)
can.onimport._menus(can, msg, target)
can.base.isFunc(cb) && cb(msg)
},
_agent: function(can, msg, target) {
if (can.user.mod.isPod) {
can.onaction.River(can)
can.onaction.Footer(can)
} else if (can.user.isMobile) {
can.onaction.River(can)
can.onaction.Footer(can)
} else if (can.user.isExtension) {
can.onaction.River(can)
}
can.run({}, [chat.AGENT], function(msg) { if (!msg.Option(ssh.SCRIPT)) { return }
can.require(can.base.Obj(msg.Option(ssh.SCRIPT)), function(can) { can.onaction.source(can, msg) })
})
},
_grant: function(can, msg, target) {
if (can.misc.Search(can, chat.GRANT)) {
if (can.user.confirm(chat.GRANT+ice.SP+can.misc.Search(can, chat.GRANT))) {
can.run(event, [ctx.ACTION, chat.GRANT, web.SPACE, can.misc.Search(can, chat.GRANT)])
}
can.misc.Search(can, chat.GRANT, "")
}
},
_title: function(can, msg, target) {
can.user.title(can.misc.Search(can, chat.TITLE)||can.misc.Search(can, ice.POD))
!can.user.isMobile && can.core.List(can.base.getValid(msg.result, can.Conf(chat.TITLE)||["shylinux.com/x/contexts"]), function(item) {
can.page.Append(can, target, [{view: [chat.TITLE, html.DIV, item], title: "返回主页", onclick: function(event) {
can.onaction.title(event, can)
}, onmouseenter: function(event) { var list = msg.Table()
can.user.carte(event, can, {}, can.core.List(list, function(item) { return item.name }), function(event, item, meta, index) {
event.shiftKey? can.user.open(list[index].path): can.user.jumps(list[index].path)
})
}}])
})
},
_state: function(can, msg, target) {
can.core.List(can.base.Obj(msg.Option(chat.STATE)||can.Conf(chat.STATE), [mdb.TIME, aaa.USERNICK]), function(item) {
if (item == aaa.AVATAR ) { if (can.user.isLocalFile) { return }
can.page.Append(can, target, [{view: can.base.join([chat.STATE, item]), list: [{img: ice.SP}], onmouseenter: function(event) {
can.onaction.carte(event, can, [can.page.Format(html.IMG, "/share/local/avatar", 160)])
}}]); return
}
can.page.Append(can, target, [{view: [can.base.join([chat.STATE, item]), html.DIV, (can.Conf(item)||"").slice(0, 10)], onmouseenter: function(event) {
can.core.CallFunc([can.onaction, item], [event, can, item])
}, _init: function(target) { item == mdb.TIME && can.onimport._time(can, target) }}])
})
},
_search: function(can, msg, target) {
var ui = can.onappend.input(can, {type: html.TEXT, name: mdb.SEARCH, onkeydown: function(event) {
can.onkeymap.input(event, can); switch (event.key) {
case lang.ENTER: can.onengine.signal(can, "onopensearch", can.request(event, {type: "*", word: event.target.value}))
}
}}, "", target, "title search").parentNode
can.user.isMobile && can.page.Modify(can, ui, {style: {float: html.RIGHT}})
},
_background: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return }
msg.Option(aaa.BACKGROUND) && can.onlayout.background(can, "/share/local/background", document.body)
},
_avatar: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return }
// can.page.Modify(can, "div.state.avatar>img", {src: "/share/local/avatar/"})
msg.Option(aaa.AVATAR) && can.page.Modify(can, "div.state.avatar>img", {src: "/share/local/avatar"})
},
_menus: function(can, msg, target) {
can.setHeaderMenu(can.user.mod.isPod||can.user.isMobile||can.user.isExtension? [chat.RIVER]:
can.base.Obj(msg.Option(chat.MENUS)||can.Conf(chat.MENUS), can.onaction._menus), function(event, button) {
can.core.CallFunc(can.onaction[button]||function(event, can) {
can.run(event, [button], function(msg) { can.user.toast(can, "执行成功", can.user.trans(can, button)) })
}, {event: event, can: can, button: button})
})
},
can.page.Append(can, target, [{view: [can.base.join([chat.STATE, item]), html.DIV, (can.Conf(item)||"").slice(0, 10)], onmouseenter: function(event) {
can.core.CallFunc([can.onaction, item], [event, can, item])
}, _init: function(target) { item == mdb.TIME && can.onimport._time(can, target) }}])
})
},
_search: function(can, msg, target) {
var ui = can.onappend.input(can, {type: html.TEXT, name: mdb.SEARCH, onkeydown: function(event) {
can.onkeymap.input(event, can); switch (event.key) {
case lang.ENTER: can.onengine.signal(can, "onopensearch", can.request(event, {type: "*", word: event.target.value}))
}
}}, "", target, "title search").parentNode
can.user.isMobile && can.page.Modify(can, ui, {style: {float: html.RIGHT}})
},
_background: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return }
msg.Option(aaa.BACKGROUND) && can.onlayout.background(can, "/share/local/background", document.body)
},
_avatar: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return }
// can.page.Modify(can, "div.state.avatar>img", {src: "/share/local/avatar/"})
msg.Option(aaa.AVATAR) && can.page.Modify(can, "div.state.avatar>img", {src: "/share/local/avatar"})
},
_menus: function(can, msg, target) {
can.setHeaderMenu(can.user.mod.isPod||can.user.isMobile||can.user.isExtension? [chat.RIVER]:
can.base.Obj(msg.Option(chat.MENUS)||can.Conf(chat.MENUS), can.onaction._menus), function(event, button) {
can.core.CallFunc(can.onaction[button]||function(event, can) {
can.run(event, [button], function(msg) { can.user.toast(can, "执行成功", can.user.trans(can, button)) })
}, {event: event, can: can, button: button})
})
},
_time: function(can, target) {
can.core.Timer({interval: 500}, function() { can.onimport.time(can, target) })
can.onappend.figure(can, {action: "date", style: {"min-width": 306}}, target, function(sub) {
can.get("Action", "size", function(msg, top) {
can.page.Modify(can, sub._target, {style: {top: top, right: 0, left: null}})
})
}), target.onmouseenter = target.click
},
time: function(can, target) { can.onlayout.topic(can)
target.innerHTML = can.user.time(can, null, "%w %H:%M:%S")
},
topic: function(can, topic) { can.onlayout.topic(can, can._topic = topic) },
background: function(event, can, url) { if (can.user.isExtension || can.user.isLocalFile) { return }
can.run(event, [ctx.ACTION, aaa.BACKGROUND, url], function(msg) { can.onimport._background(can, msg) })
},
avatar: function(event, can, url) { if (can.user.isExtension || can.user.isLocalFile) { return }
can.run(event, [ctx.ACTION, aaa.AVATAR, url], function(msg) { can.onimport._avatar(can, msg) })
},
menu: function(can, cmds, cb, trans) {
return can.page.Append(can, can._output, [{type: cmds[0], list: can.core.List(cmds.slice(1), function(item) {
if (can.base.isString(item)) {
return {view: [html.MENU, html.DIV, can.user.trans(can, item, trans)], onclick: function(event) {
can.base.isFunc(cb) && cb(event, item, cmds)
}}
_time: function(can, target) {
can.core.Timer({interval: 500}, function() { can.onimport.time(can, target) })
can.onappend.figure(can, {action: "date", style: {"min-width": 306}}, target, function(sub) {
can.get("Action", "size", function(msg, top) {
can.page.Modify(can, sub._target, {style: {top: top, right: 0, left: null}})
})
}), target.onmouseenter = target.click
},
time: function(can, target) { can.onlayout.topic(can)
target.innerHTML = can.user.time(can, null, "%w %H:%M:%S")
},
topic: function(can, topic) { can.onlayout.topic(can, can._topic = topic) },
background: function(event, can, url) { if (can.user.isExtension || can.user.isLocalFile) { return }
can.run(event, [ctx.ACTION, aaa.BACKGROUND, url], function(msg) { can.onimport._background(can, msg) })
},
avatar: function(event, can, url) { if (can.user.isExtension || can.user.isLocalFile) { return }
can.run(event, [ctx.ACTION, aaa.AVATAR, url], function(msg) { can.onimport._avatar(can, msg) })
},
menu: function(can, cmds, cb, trans) {
return can.page.Append(can, can._output, [{type: cmds[0], list: can.core.List(cmds.slice(1), function(item) {
if (can.base.isString(item)) {
return {view: [html.MENU, html.DIV, can.user.trans(can, item, trans)], onclick: function(event) {
can.base.isFunc(cb) && cb(event, item, cmds)
}}
} else if (can.base.isArray(item)) {
var list = can.core.List(item, function(value, index) { return can.user.trans(can, value, trans) })
return {view: [html.MENU, html.DIV, can.user.trans(can, list[0], trans)], onmouseenter: function(event) {
can.onaction.carte(event, can, list.slice(1), function(event, button, meta, index) {
can.base.isFunc(cb) && cb(event, item[index+1], item)
}, trans)
}}
} else if (can.base.isArray(item)) {
var list = can.core.List(item, function(value, index) { return can.user.trans(can, value, trans) })
return {view: [html.MENU, html.DIV, can.user.trans(can, list[0], trans)], onmouseenter: function(event) {
can.onaction.carte(event, can, list.slice(1), function(event, button, meta, index) {
can.base.isFunc(cb) && cb(event, item[index+1], item)
}, trans)
}}
} else if (can.base.isObject(item)) {
return item
}
}) }]).first
},
} else if (can.base.isObject(item)) {
return item
}
}) }]).first
},
})
Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, cb, target) {
can.base.isFunc(cb) && cb()
},
_menus: [["setting", chat.BLACK, chat.WHITE, chat.PRINT, "webpack", "devpack", "toimage"]],
_trans: {
"river": "菜单",
"search": "搜索",
"create": "创建",
"share": "共享",
can.base.isFunc(cb) && cb()
},
_menus: [["setting", chat.BLACK, chat.WHITE, chat.PRINT, "webpack", "devpack", "toimage"]],
_trans: {
"river": "菜单",
"search": "搜索",
"create": "创建",
"share": "共享",
"setting": "设置",
"black": "黑色主题",
"white": "白色主题",
"print": "打印主题",
"toimage": "生成图片",
"setting": "设置",
"black": "黑色主题",
"white": "白色主题",
"print": "打印主题",
"toimage": "生成图片",
"shareuser": "共享用户",
"setnick": "设置昵称",
"language": "语言地区",
"chinese": "中文",
"clear": "清除背景",
},
onmain: function(can, msg) {
function init() { can.run({}, [], function(msg) {
can.base.Copy(can.onaction._trans, can.base.Obj(msg.Option(chat.TRANS), {}))
can.onimport._init(can, msg, function(msg) { can.onengine.signal(can, chat.ONLOGIN, msg) }, can._output)
"shareuser": "共享用户",
"setnick": "设置昵称",
"language": "语言地区",
"chinese": "中文",
"clear": "清除背景",
},
onmain: function(can, msg) {
function init() { can.run({}, [], function(msg) {
can.base.Copy(can.onaction._trans, can.base.Obj(msg.Option(chat.TRANS), {}))
can.onimport._init(can, msg, function(msg) { can.onengine.signal(can, chat.ONLOGIN, msg) }, can._output)
can.search({}, ["River.onmotion.toggle"])
}) }; can.search({}, ["River.onmotion.hidden"])
if (can.misc.Search(can, ice.MSG_SESSID)) {
can.misc.CookieSessid(can, can.misc.Search(can, ice.MSG_SESSID))
return can.misc.Search(can, ice.MSG_SESSID, "")
}
can.search({}, ["River.onmotion.toggle"])
}) }; can.search({}, ["River.onmotion.hidden"])
if (can.misc.Search(can, ice.MSG_SESSID)) {
can.misc.CookieSessid(can, can.misc.Search(can, ice.MSG_SESSID))
return can.misc.Search(can, ice.MSG_SESSID, "")
}
// 登录检查
can.user.isLocalFile? init(): can.run({}, [chat.CHECK], function(msg) {
can.Conf(aaa.USERNICK, msg.Option(ice.MSG_USERNICK)||msg.Option(ice.MSG_USERNAME))? init():
msg.Option(chat.SSO)? can.user.jumps(msg.Option(chat.SSO)):
can.user.login(can, init, msg.Option(aaa.LOGIN))
})
},
onstorm_select: function(can, msg, river, storm) { can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm) },
onsearchfocus: function(can) {
can.page.Select(can, can._output, "div.search input", function(target) { target.focus() })
},
// 登录检查
can.user.isLocalFile? init(): can.run({}, [chat.CHECK], function(msg) {
can.Conf(aaa.USERNICK, msg.Option(ice.MSG_USERNICK)||msg.Option(ice.MSG_USERNAME))? init():
msg.Option(chat.SSO)? can.user.jumps(msg.Option(chat.SSO)):
can.user.login(can, init, msg.Option(aaa.LOGIN))
})
},
onstorm_select: function(can, msg, river, storm) { can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm) },
onsearchfocus: function(can) {
can.page.Select(can, can._output, "div.search input", function(target) { target.focus() })
},
title: function(event, can) {
var args = {}; can.core.List([chat.TITLE, chat.TOPIC, chat.LAYOUT], function(key) {
var value = can.misc.Search(can, key); value && (args[key] = value)
})
can.user.jumps(can.misc.MergeURL(can, args, true))
},
river: function(event, can) { can.onaction.River(can) },
title: function(event, can) {
var args = {}; can.core.List([chat.TITLE, chat.TOPIC, chat.LAYOUT], function(key) {
var value = can.misc.Search(can, key); value && (args[key] = value)
})
can.user.jumps(can.misc.MergeURL(can, args, true))
},
river: function(event, can) { can.onaction.River(can) },
black: function(event, can, button) { can.onlayout.topic(can, button), can.onlayout._init(can) },
white: function(event, can, button) { can.onlayout.topic(can, button), can.onlayout._init(can) },
print: function(event, can, button) { can.onlayout.topic(can, can.base.join([chat.WHITE, button]))
can.set("River", html.HEIGHT, -1), can.set("Action", html.HEIGHT, -1)
},
webpack: function(event, can) {
can.user.input(event, can, [{name: mdb.NAME, value: can.user.title()}], function(ev, button, meta, list) {
can.core.Item(Volcanos.meta.pack, function(key, msg) {
can.core.List(["_event", "_can", "_xhr", ice.MSG_SESSID, ""], function(key) { delete(msg[key]) })
})
var msg = can.request(event, {
name: meta.name, content: JSON.stringify(Volcanos.meta.pack),
river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM),
})
black: function(event, can, button) { can.onlayout.topic(can, button), can.onlayout._init(can) },
white: function(event, can, button) { can.onlayout.topic(can, button), can.onlayout._init(can) },
print: function(event, can, button) { can.onlayout.topic(can, can.base.join([chat.WHITE, button]))
can.set("River", html.HEIGHT, -1), can.set("Action", html.HEIGHT, -1)
},
webpack: function(event, can) {
can.user.input(event, can, [{name: mdb.NAME, value: can.user.title()}], function(ev, button, meta, list) {
can.core.Item(Volcanos.meta.pack, function(key, msg) {
can.core.List(["_event", "_can", "_xhr", ice.MSG_SESSID, ""], function(key) { delete(msg[key]) })
})
var msg = can.request(event, {
name: meta.name, content: JSON.stringify(Volcanos.meta.pack),
river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM),
})
var toast = can.user.toast(can, "打包中...", code.WEBPACK, 1000000)
can.run(event, [code.WEBPACK], function(msg) {
toast.close(), can.user.toast(can, "打包成功", code.WEBPACK)
can.user.download(can, "/share/local/"+msg.Result(), name+".html")
})
})
},
toimage: function(event, can, button) { can.onmotion.toimage(event, can, document.title, document.body) },
var toast = can.user.toast(can, "打包中...", code.WEBPACK, 1000000)
can.run(event, [code.WEBPACK], function(msg) {
toast.close(), can.user.toast(can, "打包成功", code.WEBPACK)
can.user.download(can, "/share/local/"+msg.Result(), name+".html")
})
})
},
toimage: function(event, can, button) { can.onmotion.toimage(event, can, document.title, document.body) },
carte: function(event, can, list, cb, trans) { can.user.carte(event, can, can.onaction, list, cb) },
share: function(event, can, args) {
can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE].concat(args||[],
[chat.RIVER, can.Conf(chat.RIVER), chat.STORM, can.Conf(chat.STORM)]))
},
carte: function(event, can, list, cb, trans) { can.user.carte(event, can, can.onaction, list, cb) },
share: function(event, can, args) {
can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE].concat(args||[],
[chat.RIVER, can.Conf(chat.RIVER), chat.STORM, can.Conf(chat.STORM)]))
},
usernick: function(event, can) {
can.onaction.carte(event, can, ["shareuser", "setnick", [aaa.LANGUAGE, aaa.CHINESE, aaa.ENGLISH], cli.CLEAR, aaa.LOGOUT])
},
shareuser: function(event, can) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE, mdb.TYPE, aaa.LOGIN]) },
setnick: function(event, can) {
var ui = can.user.input(event, can, [{name: aaa.USERNICK, value: can.Conf(aaa.USERNICK)}], function(ev, button, data, list, args) {
can.run(event, [aaa.USERNICK, list[0]], function(msg) {
can.page.Select(can, can._output, can.core.Keys(html.DIV, aaa.USERNICK), function(item) {
can.page.Modify(can, item, can.Conf(aaa.USERNICK, list[0]))
}), can.user.toastSuccess(can)
}, true)
})
can.user.isMobile && can.page.Modify(can, ui._target, {style: {top: 40, right: 0, left: ""}})
},
chinese: function(event, can) { can.misc.Search(can, aaa.LANGUAGE, "zh") },
english: function(event, can) { can.misc.Search(can, aaa.LANGUAGE, "en") },
clear: function(event, can) { can.onimport.background(event, can, ""), can.onimport.avatar(event, can, ""), can.user.reload(true) },
logout: function(event, can) { can.user.logout(can) },
usernick: function(event, can) {
can.onaction.carte(event, can, ["shareuser", "setnick", [aaa.LANGUAGE, aaa.CHINESE, aaa.ENGLISH], cli.CLEAR, aaa.LOGOUT])
},
shareuser: function(event, can) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE, mdb.TYPE, aaa.LOGIN]) },
setnick: function(event, can) {
var ui = can.user.input(event, can, [{name: aaa.USERNICK, value: can.Conf(aaa.USERNICK)}], function(ev, button, data, list, args) {
can.run(event, [aaa.USERNICK, list[0]], function(msg) {
can.page.Select(can, can._output, can.core.Keys(html.DIV, aaa.USERNICK), function(item) {
can.page.Modify(can, item, can.Conf(aaa.USERNICK, list[0]))
}), can.user.toastSuccess(can)
}, true)
})
can.user.isMobile && can.page.Modify(can, ui._target, {style: {top: 40, right: 0, left: ""}})
},
chinese: function(event, can) { can.misc.Search(can, aaa.LANGUAGE, "zh") },
english: function(event, can) { can.misc.Search(can, aaa.LANGUAGE, "en") },
clear: function(event, can) { can.onimport.background(event, can, ""), can.onimport.avatar(event, can, ""), can.user.reload(true) },
logout: function(event, can) { can.user.logout(can) },
River: function(can) { can.search({}, ["River.onmotion.toggle"]) },
Footer: function(can) { can.search({}, ["Footer.onmotion.toggle"]) },
River: function(can) { can.search({}, ["River.onmotion.toggle"]) },
Footer: function(can) { can.search({}, ["Footer.onmotion.toggle"]) },
})
Volcanos("onexport", {help: "导出数据", list: [],
height: function(can) { return can._target.offsetHeight },
topic: function(can) { return can._topic },
height: function(can) { return can._target.offsetHeight },
topic: function(can) { return can._topic },
})

View File

@ -1,284 +1,283 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
if (msg.Option(ice.MSG_RIVER) == "_share") { return can.onmotion.hidden(can) }
can.onmotion.clear(can), can.river_list = {}, can.storm_list = {}
if (msg.Option(ice.MSG_RIVER) == "_share") { return can.onmotion.hidden(can) }
can.onmotion.clear(can), can.river_list = {}, can.storm_list = {}
can.onimport._main(can, msg), can.onimport._menu(can, msg)
var select; can.page.Append(can, can._output, msg.Table(function(item, index) {
return can.onimport._river(can, item, function(target) {
(index == 0 || item.hash == can._main_river) && (select = target)
})
})), select && select.click()
},
_main: function(can, msg) { can._main_river = "project", can._main_storm = "studio"
if (can.user.isExtension) { var args = Volcanos.meta.args
can._main_river = args.river||"product", can._main_storm = args.storm||"chrome"
}
if (can.user.isMobile) { can._main_river = "product", can._main_storm = "office" }
if (can.user.isWeiXin) { can._main_river = "service", can._main_storm = "wx" }
can.onimport._main(can, msg), can.onimport._menu(can, msg)
var select; can.page.Append(can, can._output, msg.Table(function(item, index) {
return can.onimport._river(can, item, function(target) {
(index == 0 || item.hash == can._main_river) && (select = target)
})
})), select && select.click()
},
_main: function(can, msg) { can._main_river = "project", can._main_storm = "studio"
if (can.user.isExtension) { var args = Volcanos.meta.args
can._main_river = args.river||"product", can._main_storm = args.storm||"chrome"
}
if (can.user.isMobile) { can._main_river = "product", can._main_storm = "office" }
if (can.user.isWeiXin) { can._main_river = "service", can._main_storm = "wx" }
can._main_title = can.misc.Search(can, chat.TITLE)||msg.Option(ice.MSG_TITLE)||Volcanos.meta.args.title||can.misc.Search(can, ice.POD)||can._main_title
can._main_river = can.misc.Search(can, chat.RIVER)||msg.Option(ice.MSG_RIVER)||Volcanos.meta.args.river||can._main_river
can._main_storm = can.misc.Search(can, chat.STORM)||msg.Option(ice.MSG_STORM)||Volcanos.meta.args.storm||can._main_storm
},
_menu: function(can, msg) { if (can.user.mod.isPod) { return }
can.setHeaderMenu(can.base.Obj(msg.Option(chat.MENUS), can.Conf(chat.MENUS)||can.ondetail._menus), function(event, button) {
can.core.CallFunc([can.ondetail, button], [event, can, button, can.Conf(chat.RIVER), can.Conf(chat.STORM)])
})
},
_carte: function(can, list, river, storm) { if (can.user.isMobile) { return }
if (can.core.Value(can._root, can.core.Keys(chat.RIVER, river))) { return }
can._main_title = can.misc.Search(can, chat.TITLE)||msg.Option(ice.MSG_TITLE)||Volcanos.meta.args.title||can.misc.Search(can, ice.POD)||can._main_title
can._main_river = can.misc.Search(can, chat.RIVER)||msg.Option(ice.MSG_RIVER)||Volcanos.meta.args.river||can._main_river
can._main_storm = can.misc.Search(can, chat.STORM)||msg.Option(ice.MSG_STORM)||Volcanos.meta.args.storm||can._main_storm
},
_menu: function(can, msg) { if (can.user.mod.isPod) { return }
can.setHeaderMenu(can.base.Obj(msg.Option(chat.MENUS), can.Conf(chat.MENUS)||can.ondetail._menus), function(event, button) {
can.core.CallFunc([can.ondetail, button], [event, can, button, can.Conf(chat.RIVER), can.Conf(chat.STORM)])
})
},
_carte: function(can, list, river, storm) { if (can.user.isMobile) { return }
if (can.core.Value(can._root, can.core.Keys(chat.RIVER, river))) { return }
can.onaction.carte(event, can, list, function(event, button, module) {
module[button](event, can, button, river, storm)
})
},
_river: function(can, meta, cb) {
return {text: [meta.name, html.DIV, html.ITEM], onclick: function(event) {
can.onaction.storm(event, can, meta.hash)
can.onaction.carte(event, can, list, function(event, button, module) {
module[button](event, can, button, river, storm)
})
},
_river: function(can, meta, cb) {
return {text: [meta.name, html.DIV, html.ITEM], onclick: function(event) {
can.onaction.storm(event, can, meta.hash)
}, onmouseenter: function(event) {
can.onimport._carte(can, can.ondetail.list, meta.hash)
}, onmouseenter: function(event) {
can.onimport._carte(can, can.ondetail.list, meta.hash)
}, _init: function(target) { cb(target)
can.river_list[meta.hash] = target
}}
},
_storm: function(can, meta, river) {
return {text: [meta.name, html.DIV, html.ITEM], onclick: function(event) {
can.onaction.action(event, can, river, meta.hash)
can.user.title(can._main_title||meta.name)
}, _init: function(target) { cb(target)
can.river_list[meta.hash] = target
}}
},
_storm: function(can, meta, river) {
return {text: [meta.name, html.DIV, html.ITEM], onclick: function(event) {
can.onaction.action(event, can, river, meta.hash)
can.user.title(can._main_title||meta.name)
}, onmouseenter: function(event) {
can.onimport._carte(can, can.ondetail.sublist, river, meta.hash)
}, onmouseenter: function(event) {
can.onimport._carte(can, can.ondetail.sublist, river, meta.hash)
}, _init: function(target) {
can.storm_list[can.core.Keys(river, meta.hash)] = target
}}
},
}, _init: function(target) {
can.storm_list[can.core.Keys(river, meta.hash)] = target
}}
},
})
Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, can, msg, panel, cmds, cb) {
var list = can._root.river
cmds.length == 0 && can.core.Item(list, function(key, value) {
if (can.core.Item(value.storm).length == 0) { return }
msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name}) // 群组列表
}); if (cmds.length != 1 && cmds[1] != chat.STORM) { return false }
var list = can._root.river
cmds.length == 0 && can.core.Item(list, function(key, value) {
if (can.core.Item(value.storm).length == 0) { return }
msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name}) // 群组列表
}); if (cmds.length != 1 && cmds[1] != chat.STORM) { return false }
var river = list[cmds[0]]; if (!river) { return false }
can.core.Item(river.storm, function(key, value) {
msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name}) // 应用列表
}), can.base.isFunc(cb) && cb(msg); return true
},
})
var river = list[cmds[0]]; if (!river) { return false }
can.core.Item(river.storm, function(key, value) {
msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name}) // 应用列表
}), can.base.isFunc(cb) && cb(msg); return true
}})
Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, cb, target) {
can.onengine.plugin(can, "info", shy("信息", {}, ["text", "list", "back"], function(msg, cmds) {
msg.Echo(JSON.stringify(can))
}))
can.onengine.plugin(can, "log", shy("日志", {}, ["text", "list", "back"], function(msg, cmds) {
console.log(cmds[0])
msg.Option(ice.MSG_DISPLAY, "/plugin/story/pie.js")
}))
can.onengine.plugin(can, "pie", shy("比例图", {}, ["list", "back"], function(msg, cmds) {
msg.Option(ice.MSG_DISPLAY, "/plugin/story/pie.js")
msg.Push("value", 200)
msg.Push("value", 300)
msg.Push("value", 400)
}))
can.base.isFunc(cb) && cb()
},
onlogin: function(can, msg) {
can.onappend._action(can, can.Conf(ctx.ACTION)||can.onaction.list)
can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) })
},
onsearch: function(can, msg, word) {
if (word[0] == "*" || word[0] == chat.STORM) { can.onexport.storm(can, msg, word) }
},
onstorm_select: function(can, msg, river, storm) { var args = {river: river, storm: storm}
if (can.user.isExtension) { localStorage.setItem(ctx.ARGS, JSON.stringify(args)) }
},
onaction_touch: function(can, msg) {
can.onmotion.float.del(can, chat.CARTE)
can.user.isMobile && can.onmotion.hidden(can)
},
onaction_notool: function(can, msg, river, storm) {
can.ondetail["添加工具"](msg._event, can, "添加工具", river, storm)
},
can.onengine.plugin(can, "info", shy("信息", {}, ["text", "list", "back"], function(msg, cmds) {
msg.Echo(JSON.stringify(can))
}))
can.onengine.plugin(can, "log", shy("日志", {}, ["text", "list", "back"], function(msg, cmds) {
console.log(cmds[0])
msg.Option(ice.MSG_DISPLAY, "/plugin/story/pie.js")
}))
can.onengine.plugin(can, "pie", shy("比例图", {}, ["list", "back"], function(msg, cmds) {
msg.Option(ice.MSG_DISPLAY, "/plugin/story/pie.js")
msg.Push("value", 200)
msg.Push("value", 300)
msg.Push("value", 400)
}))
can.base.isFunc(cb) && cb()
},
onlogin: function(can, msg) {
can.onappend._action(can, can.Conf(ctx.ACTION)||can.onaction.list)
can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) })
},
onsearch: function(can, msg, word) {
if (word[0] == "*" || word[0] == chat.STORM) { can.onexport.storm(can, msg, word) }
},
onstorm_select: function(can, msg, river, storm) { var args = {river: river, storm: storm}
if (can.user.isExtension) { localStorage.setItem(ctx.ARGS, JSON.stringify(args)) }
},
onaction_touch: function(can, msg) {
can.onmotion.float.del(can, chat.CARTE)
can.user.isMobile && can.onmotion.hidden(can)
},
onaction_notool: function(can, msg, river, storm) {
can.ondetail["添加工具"](msg._event, can, "添加工具", river, storm)
},
carte: function(event, can, list, cb) {
can.user.carteRight(event, can, can.ondetail, list, cb)
},
storm: function(event, can, river) { can.sublist = can.sublist||{}
can.onmotion.select(can, can._output, "div.item", can.river_list[river])
var list = can.sublist[river]; if (list) { return can.onmotion.toggle(can, list) }
carte: function(event, can, list, cb) {
can.user.carteRight(event, can, can.ondetail, list, cb)
},
storm: function(event, can, river) { can.sublist = can.sublist||{}
can.onmotion.select(can, can._output, "div.item", can.river_list[river])
var list = can.sublist[river]; if (list) { return can.onmotion.toggle(can, list) }
can.run({}, [river, chat.STORM], function(msg) {
var select = 0; list = can.page.Append(can, can._output, [{view: html.LIST, list: msg.Table(function(item, index) {
river == can._main_river && item.hash == can._main_storm && (select = index)
return can.onimport._storm(can, item, river)
}) }]).first, list.children.length > 0 && list.children[select].click()
can.run({}, [river, chat.STORM], function(msg) {
var select = 0; list = can.page.Append(can, can._output, [{view: html.LIST, list: msg.Table(function(item, index) {
river == can._main_river && item.hash == can._main_storm && (select = index)
return can.onimport._storm(can, item, river)
}) }]).first, list.children.length > 0 && list.children[select].click()
event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling)
can.sublist[river] = list
})
},
action: function(event, can, river, storm) {
can.page.Modify(can, can.sublist[river], {style: {display: html.BLOCK}})
can.onmotion.select(can, can._output, "div.item", can.river_list[river])
can.onmotion.select(can, can._output, "div.list div.item", can.storm_list[can.core.Keys(river, storm)])
event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling)
can.sublist[river] = list
})
},
action: function(event, can, river, storm) {
can.page.Modify(can, can.sublist[river], {style: {display: html.BLOCK}})
can.onmotion.select(can, can._output, "div.item", can.river_list[river])
can.onmotion.select(can, can._output, "div.list div.item", can.storm_list[can.core.Keys(river, storm)])
can.onengine.signal(can, "onstorm_select", can.request(event, {
river: can.Conf(chat.RIVER, river), storm: can.Conf(chat.STORM, storm),
}))
},
can.onengine.signal(can, "onstorm_select", can.request(event, {
river: can.Conf(chat.RIVER, river), storm: can.Conf(chat.STORM, storm),
}))
},
create: function(event, can) {
can.user.trans(can, {"public": "公开群", "protected": "内部群", "private": "私有群"})
can.user.input(event, can, [
{name: mdb.TYPE, values: [chat.PUBLIC, chat.PROTECTED, chat.PRIVATE], _trans: "类型"},
{name: mdb.NAME, value: "hi", _trans: "群名"}, {name: mdb.TEXT, value: "hello", _trans: "简介"},
], function(event, button, meta, list, args) {
can.run(event, [ctx.ACTION, mdb.CREATE].concat(args), function(msg) {
can.misc.Search(can, {river: msg.Result()})
})
})
},
refresh: function(event, can) {
var args = {river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM),
topic: can.getHeader(chat.TOPIC), layout: can.getAction(chat.LAYOUT),
}
if (can.user.isExtension) { localStorage.setItem(ctx.ARGS, JSON.stringify(args)) }
can.misc.Search(can, args)
},
create: function(event, can) {
can.user.trans(can, {"public": "公开群", "protected": "内部群", "private": "私有群"})
can.user.input(event, can, [
{name: mdb.TYPE, values: [chat.PUBLIC, chat.PROTECTED, chat.PRIVATE], _trans: "类型"},
{name: mdb.NAME, value: "hi", _trans: "群名"}, {name: mdb.TEXT, value: "hello", _trans: "简介"},
], function(event, button, meta, list, args) {
can.run(event, [ctx.ACTION, mdb.CREATE].concat(args), function(msg) {
can.misc.Search(can, {river: msg.Result()})
})
})
},
refresh: function(event, can) {
var args = {river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM),
topic: can.getHeader(chat.TOPIC), layout: can.getAction(chat.LAYOUT),
}
if (can.user.isExtension) { localStorage.setItem(ctx.ARGS, JSON.stringify(args)) }
can.misc.Search(can, args)
},
})
Volcanos("ondetail", {help: "菜单交互",
list: ["共享群组", "添加应用", "添加设备", "添加用户", "重命名群组", "删除群组"],
sublist: ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"],
_menus: [
["create", "创建群组", "添加应用", "添加工具", "添加设备", "创建空间"],
["share", "共享群组", "共享应用", "共享工具", "共享主机", "访问空间"],
],
list: ["共享群组", "添加应用", "添加设备", "添加用户", "重命名群组", "删除群组"],
sublist: ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"],
_menus: [
["create", "创建群组", "添加应用", "添加工具", "添加设备", "创建空间"],
["share", "共享群组", "共享应用", "共享工具", "共享主机", "访问空间"],
],
"创建群组": function(event, can) { can.onaction.create(event, can) },
"共享群组": function(event, can, button, river) {
can.onmotion.share(event, can, [{name: chat.TITLE, value: river}], [mdb.TYPE, chat.RIVER])
},
"添加应用": function(event, can, button, river) { can.ondetail.create(event, can, button, river) },
"共享应用": function(event, can, button, river, storm) {
can.onmotion.share(event, can, [{name: chat.TITLE, value: storm}], [mdb.TYPE, chat.STORM])
},
"添加工具": function(event, can, button, river, storm) {
can.user.select(event, can, ctx.COMMAND, "context,command", function(item, next) {
can.run({}, [river, chat.STORM, ctx.ACTION, mdb.INSERT, mdb.HASH, storm].concat([ice.POD, "", ice.CTX, item[0], ice.CMD, item[1]]), function(msg) {
next()
})
}, function() {
can.misc.Search(can, {river: river, storm: storm})
})
},
"共享工具": function(event, can, button, river, storm) {
can.user.select(event, can, mdb.PLUGIN, "name,context,command,argument", function(item, next) {
can.user.share(can, can.request(event), [river, ctx.ACTION, chat.SHARE, mdb.TYPE, chat.FIELD,
mdb.NAME, item[2], mdb.TEXT, item[3], chat.TITLE, item[0], chat.RIVER, river, chat.STORM, storm,
])
})
},
"创建群组": function(event, can) { can.onaction.create(event, can) },
"共享群组": function(event, can, button, river) {
can.onmotion.share(event, can, [{name: chat.TITLE, value: river}], [mdb.TYPE, chat.RIVER])
},
"添加应用": function(event, can, button, river) { can.ondetail.create(event, can, button, river) },
"共享应用": function(event, can, button, river, storm) {
can.onmotion.share(event, can, [{name: chat.TITLE, value: storm}], [mdb.TYPE, chat.STORM])
},
"添加工具": function(event, can, button, river, storm) {
can.user.select(event, can, ctx.COMMAND, "context,command", function(item, next) {
can.run({}, [river, chat.STORM, ctx.ACTION, mdb.INSERT, mdb.HASH, storm].concat([ice.POD, "", ice.CTX, item[0], ice.CMD, item[1]]), function(msg) {
next()
})
}, function() {
can.misc.Search(can, {river: river, storm: storm})
})
},
"共享工具": function(event, can, button, river, storm) {
can.user.select(event, can, mdb.PLUGIN, "name,context,command,argument", function(item, next) {
can.user.share(can, can.request(event), [river, ctx.ACTION, chat.SHARE, mdb.TYPE, chat.FIELD,
mdb.NAME, item[2], mdb.TEXT, item[3], chat.TITLE, item[0], chat.RIVER, river, chat.STORM, storm,
])
})
},
"添加设备": function(event, can, button, river) {
can.user.select(event, can, web.SPACE, "type,name,text", function(item, next) {
can.run({}, [river, chat.NODE, ctx.ACTION, mdb.INSERT, mdb.TYPE, item[0], mdb.NAME, item[1]], function(msg) {
next()
})
})
},
"共享主机": function(event, can, button, river, storm) {
can.run(event, [ctx.ACTION, aaa.INVITE], function(msg) {
can.user.toast(can, {
title: "共享主机", duration: -1, width: -300,
content: msg.Result(), action: [cli.CLOSE],
})
})
},
"创建空间": function(event, can, button, river, storm) { can.request(event, {action: button})
can.user.input(event, can, [{name: "name", value: "hi"}, {name: "repos"}, {name: "template"}], function(event, button, data, list, args) {
can.run(event, [ctx.ACTION, cli.START].concat(args, chat.RIVER, river), function(msg) {
var link = can.misc.MergeURL(can, {_path: "/chat/pod/"+can.core.Keys(can.misc.Search(can, ice.POD), msg.Option(mdb.NAME))})
can.user.toast(can, link), can.user.open(link)
})
})
},
"访问空间": function(event, can, button, river, storm) {
can.user.select({river: river}, can, web.SPACE, "time,type,name,text")
},
"添加设备": function(event, can, button, river) {
can.user.select(event, can, web.SPACE, "type,name,text", function(item, next) {
can.run({}, [river, chat.NODE, ctx.ACTION, mdb.INSERT, mdb.TYPE, item[0], mdb.NAME, item[1]], function(msg) {
next()
})
})
},
"共享主机": function(event, can, button, river, storm) {
can.run(event, [ctx.ACTION, aaa.INVITE], function(msg) {
can.user.toast(can, {
title: "共享主机", duration: -1, width: -300,
content: msg.Result(), action: [cli.CLOSE],
})
})
},
"创建空间": function(event, can, button, river, storm) { can.request(event, {action: button})
can.user.input(event, can, [{name: "name", value: "hi"}, {name: "repos"}, {name: "template"}], function(event, button, data, list, args) {
can.run(event, [ctx.ACTION, cli.START].concat(args, chat.RIVER, river), function(msg) {
var link = can.misc.MergeURL(can, {_path: "/chat/pod/"+can.core.Keys(can.misc.Search(can, ice.POD), msg.Option(mdb.NAME))})
can.user.toast(can, link), can.user.open(link)
})
})
},
"访问空间": function(event, can, button, river, storm) {
can.user.select({river: river}, can, web.SPACE, "time,type,name,text")
},
"添加用户": function(event, can, button, river) {
can.user.select(event, can, chat.USER, "usernick,username", function(item, next) {
can.run({}, [river, chat.USER, ctx.ACTION, mdb.INSERT, aaa.USERNAME, item[0]], function(msg) {
next()
})
})
},
"重命名群组": function(event, can, button, river) {
can.user.input(event, can, [mdb.NAME], function(event, button, meta, list) {
can.run(can.request(event, {hash: river})._event, [ctx.ACTION, mdb.MODIFY, mdb.NAME, meta.name], function(msg) {
can.misc.Search(can, {river: river})
})
})
},
"删除群组": function(event, can, button, river) {
can.run(can.request(event, {hash: river})._event, [ctx.ACTION, mdb.REMOVE], function(msg) { can.misc.Search(can, {}) })
},
"添加用户": function(event, can, button, river) {
can.user.select(event, can, chat.USER, "usernick,username", function(item, next) {
can.run({}, [river, chat.USER, ctx.ACTION, mdb.INSERT, aaa.USERNAME, item[0]], function(msg) {
next()
})
})
},
"重命名群组": function(event, can, button, river) {
can.user.input(event, can, [mdb.NAME], function(event, button, meta, list) {
can.run(can.request(event, {hash: river})._event, [ctx.ACTION, mdb.MODIFY, mdb.NAME, meta.name], function(msg) {
can.misc.Search(can, {river: river})
})
})
},
"删除群组": function(event, can, button, river) {
can.run(can.request(event, {hash: river})._event, [ctx.ACTION, mdb.REMOVE], function(msg) { can.misc.Search(can, {}) })
},
"保存参数": function(event, can, button, river, storm) {
can.getAction(ctx.ARGS, function(item, next, index, array) { var msg = can.request({}, {hash: storm, id: item.dataset.id})
var toast = can.user.toast(can, (index+1)+ice.PS+array.length, button, 10000, (index+1)*100/array.length)
can.run(msg._event, [river, chat.STORM, ctx.ACTION, mdb.MODIFY, ice.ARG, item.dataset.args], function(msg) {
can.core.Timer(200, function() {
toast.close(), next(), index == array.length-1 && can.user.toastSuccess(can, button)
})
})
})
},
"重命名应用": function(event, can, button, river, storm) {
can.user.input(event, can, [mdb.NAME], function(ev, button, meta, list, args) {
can.run(can.request(event, {hash: storm})._event, [river, chat.STORM, ctx.ACTION, mdb.MODIFY].concat(args), function(msg) {
can.misc.Search(can, {river: river, storm: storm})
})
})
},
"删除应用": function(event, can, button, river, storm) {
can.run(can.request(event, {hash: storm})._event, [river, chat.STORM, ctx.ACTION, mdb.REMOVE], function(msg) {
can.misc.Search(can, {river: river})
})
},
"保存参数": function(event, can, button, river, storm) {
can.getAction(ctx.ARGS, function(item, next, index, array) { var msg = can.request({}, {hash: storm, id: item.dataset.id})
var toast = can.user.toast(can, (index+1)+ice.PS+array.length, button, 10000, (index+1)*100/array.length)
can.run(msg._event, [river, chat.STORM, ctx.ACTION, mdb.MODIFY, ice.ARG, item.dataset.args], function(msg) {
can.core.Timer(200, function() {
toast.close(), next(), index == array.length-1 && can.user.toastSuccess(can, button)
})
})
})
},
"重命名应用": function(event, can, button, river, storm) {
can.user.input(event, can, [mdb.NAME], function(ev, button, meta, list, args) {
can.run(can.request(event, {hash: storm})._event, [river, chat.STORM, ctx.ACTION, mdb.MODIFY].concat(args), function(msg) {
can.misc.Search(can, {river: river, storm: storm})
})
})
},
"删除应用": function(event, can, button, river, storm) {
can.run(can.request(event, {hash: storm})._event, [river, chat.STORM, ctx.ACTION, mdb.REMOVE], function(msg) {
can.misc.Search(can, {river: river})
})
},
create: function(event, can, button, river) {
can.user.trans(can, {"public": "公开应用", "protected": "群组应用", "private": "个人应用"})
can.user.input(event, can, [
{name: mdb.TYPE, values: [chat.PUBLIC, chat.PROTECTED, chat.PRIVATE], _trans: "类型"},
{name: mdb.NAME, value: "hi", _trans: "名称"}, {name: mdb.TEXT, value: "hello", _trans: "简介"},
], function(event, button, meta, list, args) {
can.run({}, [river, chat.STORM, ctx.ACTION, mdb.CREATE].concat(args), function(msg) {
can.misc.Search(can, {river: river, storm: msg.Result()})
})
})
},
create: function(event, can, button, river) {
can.user.trans(can, {"public": "公开应用", "protected": "群组应用", "private": "个人应用"})
can.user.input(event, can, [
{name: mdb.TYPE, values: [chat.PUBLIC, chat.PROTECTED, chat.PRIVATE], _trans: "类型"},
{name: mdb.NAME, value: "hi", _trans: "名称"}, {name: mdb.TEXT, value: "hello", _trans: "简介"},
], function(event, button, meta, list, args) {
can.run({}, [river, chat.STORM, ctx.ACTION, mdb.CREATE].concat(args), function(msg) {
can.misc.Search(can, {river: river, storm: msg.Result()})
})
})
},
})
Volcanos("onexport", {help: "导出数据", list: [],
width: function(can) { return can._target.offsetWidth },
storm: function(can, msg, word) {
var fields = (msg.Option(ice.MSG_FIELDS)||"ctx,cmd,type,name,text").split(",")
can.core.Item(can._root.river, function(river, value) {
can.core.Item(value.storm, function(storm, item) {
if (word[1] != "" && word[1] != storm && word[1] != item.name) { return }
width: function(can) { return can._target.offsetWidth },
storm: function(can, msg, word) {
var fields = (msg.Option(ice.MSG_FIELDS)||"ctx,cmd,type,name,text").split(",")
can.core.Item(can._root.river, function(river, value) {
can.core.Item(value.storm, function(storm, item) {
if (word[1] != "" && word[1] != storm && word[1] != item.name) { return }
var data = {ctx: "web.chat", cmd: chat.STORM,
type: river, name: storm, text: shy("跳转", function(event) {
can.onaction.action(event, can, river, storm)
}),
}; can.core.List(fields, function(key) { msg.Push(key, data[key]||"") })
})
})
},
var data = {ctx: "web.chat", cmd: chat.STORM,
type: river, name: storm, text: shy("跳转", function(event) {
can.onaction.action(event, can, river, storm)
}),
}; can.core.List(fields, function(key) { msg.Push(key, data[key]||"") })
})
})
},
})

View File

@ -1,117 +1,118 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.list = msg.Table(), can.onmotion.clear(can, can.ui.content)
var table = can.onappend.table(can, msg, function(value, key, index, line, array) { can.Status(mdb.TOTAL, index+1)
return {text: [key == mdb.TEXT && can.base.isFunc(line.text) && line.text.help || value, html.TD], onclick: function(event) {
can.onaction[can.type == "*"||event.ctrlKey? chat.PLUGIN: mdb.SELECT](event, can, index)
}}
}, can.ui.content, can.core.List((msg.Option("sort")||"ctx,cmd,type,name,text").split(ice.FS), function(item) {
return list.indexOf(item)
})); table && can.page.Modify(can, can.ui.display, {style: {width: table.offsetWidth}})
can.list = msg.Table(), can.onmotion.clear(can, can.ui.content)
var table = can.onappend.table(can, msg, function(value, key, index, line, array) { can.Status(mdb.TOTAL, index+1)
return {text: [key == mdb.TEXT && can.base.isFunc(line.text) && line.text.help || value, html.TD], onclick: function(event) {
can.onaction[can.type == "*"||event.ctrlKey? chat.PLUGIN: mdb.SELECT](event, can, index)
}}
}, can.ui.content, can.core.List((msg.Option("sort")||"ctx,cmd,type,name,text").split(ice.FS), function(item) {
return list.indexOf(item)
})); table && can.page.Modify(can, can.ui.display, {style: {width: table.offsetWidth}})
can.onappend._status(can, can.base.Obj(msg.Option("_status"), []).concat({name: "selected", value: "0"}))
can.getActionSize(function(msg, height) {
can.page.Modify(can, can.ui.profile, kit.Dict(html.MAX_HEIGHT, height-(table&&table.offsetHeight||0)))
})
msg.Length() == 1 && can.page.Select(can, table, html.TD)[0].click()
},
_word: function(can, msg, cmds, fields) { can.type = cmds[0]
var cb = can.onaction[cmds[1]]; if (cb) { cb({}, can); return }
can.onappend._status(can, can.base.Obj(msg.Option("_status"), []).concat({name: "selected", value: "0"}))
can.getActionSize(function(msg, height) {
can.page.Modify(can, can.ui.profile, kit.Dict(html.MAX_HEIGHT, height-(table&&table.offsetHeight||0)))
})
msg.Length() == 1 && can.page.Select(can, table, html.TD)[0].click()
},
_word: function(can, msg, cmds, fields) { can.type = cmds[0]
var cb = can.onaction[cmds[1]]; if (cb) { cb({}, can); return }
var res = can.request({}, {
word: cmds, fields: fields.join(ice.FS), sort: msg.Option("sort"),
river: msg.Option(chat.RIVER), index: msg.Option("index"),
})
var res = can.request({}, {
word: cmds, fields: fields.join(ice.FS), sort: msg.Option("sort"),
river: msg.Option(chat.RIVER), index: msg.Option("index"),
})
can.onengine.signal(can, chat.ONSEARCH, res)
can.run(res._event, cmds, function(res) { can.onimport._init(can, res, fields) })
can.onmotion.show(can), can.onmotion.focus(can, can.ui.word)
},
can.onengine.signal(can, chat.ONSEARCH, res)
can.run(res._event, cmds, function(res) { can.onimport._init(can, res, fields) })
can.onmotion.show(can), can.onmotion.focus(can, can.ui.word)
},
select: function(can, msg, cmds, cb) { can.ui.word.value = cmds[1]
var fields = (cmds[2]||msg.Option(ice.MSG_FIELDS)||"ctx,cmd,type,name,text").split(ice.FS)
can.page.Appends(can, can.ui.display, [{th: fields}]), can.cb = function() {
can.base.isFunc(cb) && cb(can.onexport.select(can)), can.onmotion.hide(can)
}
select: function(can, msg, cmds, cb) { can.ui.word.value = cmds[1]
var fields = (cmds[2]||msg.Option(ice.MSG_FIELDS)||"ctx,cmd,type,name,text").split(ice.FS)
can.page.Appends(can, can.ui.display, [{th: fields}]), can.cb = function() {
can.base.isFunc(cb) && cb(can.onexport.select(can)), can.onmotion.hide(can)
}
can.input = function(event, word) { cmds[1] = word||cmds[1]
can.onimport._word(can, msg, cmds, fields)
}, can.onimport._word(can, msg, cmds, fields)
can.input = function(event, word) { cmds[1] = word||cmds[1]
can.onimport._word(can, msg, cmds, fields)
}, can.onimport._word(can, msg, cmds, fields)
can.getActionSize(function(msg, top, left, width, height) {
can.page.Modify(can, can._target, {style: {top: top, left: left}})
can.page.Modify(can, can._output, {style: kit.Dict(html.MAX_HEIGHT, height-71, html.MAX_WIDTH, width)})
})
},
can.getActionSize(function(msg, top, left, width, height) {
can.page.Modify(can, can._target, {style: {top: top, left: left}})
can.page.Modify(can, can._output, {style: kit.Dict(html.MAX_HEIGHT, height-71, html.MAX_WIDTH, width)})
})
},
})
Volcanos("onaction", {help: "交互操作", list: [cli.CLEAR, cli.CLOSE, cli.DONE], _init: function(can, cb, target) {
can.base.isFunc(cb) && cb()
},
onlogin: function(can, msg) {
can.onappend._action(can, can.Conf(html.ACTION)||can.onaction.list)
can.ui = can.page.Append(can, can._output, [
{input: ["word", function(event) { can.onkeymap.input(event, can)
if (event.key == lang.ESCAPE) { can.onmotion.hide(can) }
can.onmotion.hidden(can, can._target)
can.base.isFunc(cb) && cb()
},
onlogin: function(can, msg) {
can.onappend._action(can, can.Conf(html.ACTION)||can.onaction.list)
can.ui = can.page.Append(can, can._output, [
{input: ["word", function(event) { can.onkeymap.input(event, can)
if (event.key == lang.ESCAPE) { can.onmotion.hide(can) }
if (event.key == lang.ENTER) { can.onkeymap.prevent(event)
if (event.shiftKey) { var first = can.page.Select(can, can.ui.content, html.TR)[1]
return can.onaction[can.type == "*"? chat.PLUGIN: html.SELECT](event, can, first.dataset.index)
}
if (event.ctrlKey) { return can.onaction[cli.DONE](event, can) }
can.input(event, event.target.value)
}
can.page.Select(can, can.ui.content, html.TR, function(tr, index) {
if (index == 0) { return }
var has = false; can.page.Select(can, tr, html.TD, function(td) {
has = has || td.innerText.indexOf(event.target.value) > -1
})
can.page.ClassList.set(can, tr, html.HIDDEN, !has)
})
}]},
{view: chat.CONTENT}, {view: html.STATUS}, {view: [chat.DISPLAY, html.TABLE]},{view: chat.PROFILE},
]), can.page.ClassList.add(can, can.ui.display, chat.CONTENT)
},
onopensearch: function(can, msg, type, word) { can.onimport.select(can, msg, [type||"*", word||""]) },
if (event.key == lang.ENTER) { can.onkeymap.prevent(event)
if (event.shiftKey) { var first = can.page.Select(can, can.ui.content, html.TR)[1]
return can.onaction[can.type == "*"? chat.PLUGIN: html.SELECT](event, can, first.dataset.index)
}
if (event.ctrlKey) { return can.onaction[cli.DONE](event, can) }
can.input(event, event.target.value)
}
can.page.Select(can, can.ui.content, html.TR, function(tr, index) {
if (index == 0) { return }
var has = false; can.page.Select(can, tr, html.TD, function(td) {
has = has || td.innerText.indexOf(event.target.value) > -1
})
can.page.ClassList.set(can, tr, html.HIDDEN, !has)
})
}]},
{view: chat.CONTENT}, {view: html.STATUS}, {view: [chat.DISPLAY, html.TABLE]},{view: chat.PROFILE},
]), can.page.ClassList.add(can, can.ui.display, chat.CONTENT)
},
onopensearch: function(can, msg, type, word) { can.onimport.select(can, msg, [type||"*", word||""]) },
clear: function(event, can) { can.onmotion.clear(can, can.ui.profile) },
done: function(event, can) { can.base.isFunc(can.cb) && can.cb() },
close: function(event, can) { can.onmotion.hide(can) },
clear: function(event, can) { can.onmotion.clear(can, can.ui.profile) },
done: function(event, can) { can.base.isFunc(can.cb) && can.cb() },
close: function(event, can) { can.onmotion.hide(can) },
select: function(event, can, index) { var line = can.list[index]
if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) }
select: function(event, can, index) { var line = can.list[index]
if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) }
if (line.ctx == "web.chat" && line.cmd == "/search") {
return can.onimport.select(can, msg, [line.type, line.name, line.text], can.cb)
}
if (line.ctx == "web.chat" && line.cmd == "/search") {
return can.onimport.select(can, msg, [line.type, line.name, line.text], can.cb)
}
var fields = can.page.Select(can, can.ui.display, html.TH, function(item) { return item.innerText })
can.page.Append(can, can.ui.display, [{td: can.core.List(fields, function(item) {
return line[item]
}), data: {index: index}, onclick: function(event) { can.page.Remove(can, event.target.parentNode)
can.Status("selected", can.page.Select(can, can.ui.display, html.TR).length-1)
}}]), can.Status("selected", can.page.Select(can, can.ui.display, html.TR).length-1)
},
var fields = can.page.Select(can, can.ui.display, html.TH, function(item) { return item.innerText })
can.page.Append(can, can.ui.display, [{td: can.core.List(fields, function(item) {
return line[item]
}), data: {index: index}, onclick: function(event) { can.page.Remove(can, event.target.parentNode)
can.Status("selected", can.page.Select(can, can.ui.display, html.TR).length-1)
}}]), can.Status("selected", can.page.Select(can, can.ui.display, html.TR).length-1)
},
plugin: function(event, can, index) { var line = can.list[index]
if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) }
plugin: function(event, can, index) { var line = can.list[index]
if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) }
var cmd = line.cmd == ctx.COMMAND? can.core.Keys(line.type, line.name.split(ice.SP)[0]): can.core.Keys(line.ctx, line.cmd)
can.onappend.plugin(can, {type: chat.PLUGIN, index: cmd||msg.Option(mdb.INDEX)}, function(sub, meta) {
can.getActionSize(function(msg, height, width) { height -= can.ui.content.offsetHeight+204
can.page.Modify(can, sub._output, {style: kit.Dict(html.MAX_HEIGHT, height-26, html.MAX_WIDTH, width-40)})
sub.Conf(html.HEIGHT, height+28), sub.Conf(html.WIDTH, width-60)
})
var cmd = line.cmd == ctx.COMMAND? can.core.Keys(line.type, line.name.split(ice.SP)[0]): can.core.Keys(line.ctx, line.cmd)
can.onappend.plugin(can, {type: chat.PLUGIN, index: cmd||msg.Option(mdb.INDEX)}, function(sub, meta) {
can.getActionSize(function(msg, height, width) { height -= can.ui.content.offsetHeight+204
can.page.Modify(can, sub._output, {style: kit.Dict(html.MAX_HEIGHT, height-26, html.MAX_WIDTH, width-40)})
sub.Conf(html.HEIGHT, height+28), sub.Conf(html.WIDTH, width-60)
})
sub.run = function(event, cmds, cb) { var msg = can.request(event)
can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true)
}
}, can.ui.profile)
},
sub.run = function(event, cmds, cb) { var msg = can.request(event)
can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true)
}
}, can.ui.profile)
},
})
Volcanos("onexport", {help: "导出数据", list: [],
select: function(can) {
return can.page.Select(can, can.ui.display, html.TR, function(tr) {
return can.page.Select(can, tr, html.TD, function(td) { return td.innerHTML })
}).slice(1)
},
select: function(can) {
return can.page.Select(can, can.ui.display, html.TR, function(tr) {
return can.page.Select(can, tr, html.TD, function(td) { return td.innerHTML })
}).slice(1)
},
})

View File

@ -1,37 +1,36 @@
Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, list, cb, target) {
can.base.isFunc(cb) && cb(); switch (meta.type) {
case html.SELECT: meta.value && (target.value = meta.value); break
case html.BUTTON: meta.action == ice.AUTO && target.click(); break
}
},
can.base.isFunc(cb) && cb(); switch (meta.type) {
case html.SELECT: meta.value && (target.value = meta.value); break
case html.BUTTON: meta.action == ice.AUTO && target.click(); break
}
},
run: function(event, can) {
var title = can.sup._name+ice.SP+can.sup.Input([], true)
var toast = can.user.toast(can, "执行中...", title, -1)
can.run(event, [], function() { toast.close(), can.user.toastSuccess(can) })
},
list: function(event, can) { can.run(event) },
back: function(event, can) { can.sup.onimport._back(can.sup) },
refresh: function(event, can) { can.run(event) },
run: function(event, can) {
var title = can.sup._name+ice.SP+can.sup.Input([], true)
var toast = can.user.toast(can, "执行中...", title, -1)
can.run(event, [], function() { toast.close(), can.user.toastSuccess(can) })
},
list: function(event, can) { can.run(event) },
back: function(event, can) { can.sup.onimport._back(can.sup) },
refresh: function(event, can) { can.run(event) },
onclick: function(event, can) {
if (can.Conf(mdb.TYPE) == html.BUTTON) { can.run(event, [ctx.ACTION, can.Conf(mdb.NAME)].concat(can.sup.Input())) }
},
onchange: function(event, can) {
if (can.Conf(mdb.TYPE) == html.SELECT) { can.run(event) }
},
onkeydown: function(event, can) { can.onkeymap.input(event, can, event.target)
if (can.Conf(mdb.TYPE) == html.TEXTAREA) { if (!event.ctrlKey) { return } }
if (event.key == lang.ENTER) {
can.run(event), can.onmotion.focus(can, event.target)
can.onkeymap.prevent(event)
} if (!event.ctrlKey) { return }
onclick: function(event, can) {
if (can.Conf(mdb.TYPE) == html.BUTTON) { can.run(event, [ctx.ACTION, can.Conf(mdb.NAME)].concat(can.sup.Input())) }
},
onchange: function(event, can) {
if (can.Conf(mdb.TYPE) == html.SELECT) { can.run(event) }
},
onkeydown: function(event, can) { can.onkeymap.input(event, can, event.target)
if (can.Conf(mdb.TYPE) == html.TEXTAREA) { if (!event.ctrlKey) { return } }
if (event.key == lang.ENTER) {
can.run(event), can.onmotion.focus(can, event.target)
can.onkeymap.prevent(event)
} if (!event.ctrlKey) { return }
switch (event.key) {
case "b": can.CloneInput(); break
case "m": can.CloneField(); break
default: return
} can.onkeymap.prevent(event)
},
switch (event.key) {
case "b": can.CloneInput(); break
case "m": can.CloneField(); break
default: return
} can.onkeymap.prevent(event)
},
})

View File

@ -1,60 +1,60 @@
Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(event, can, meta, cb, target) { cb(function(can, cbs) {
function set(now) { target.value = can.user.time(can, now), can.close(), meta && meta.action == ice.AUTO && can.run({}) }
function set(now) { target.value = can.user.time(can, now), can.close(), meta && meta.action == ice.AUTO && can.run({}) }
// 添加控件
var now = target.value? new Date(target.value): new Date()
can.onmotion.clear(can, can._action), can.onappend._action(can, [cli.CLOSE,
["hour"].concat(can.core.List(24)), ["minute"].concat(can.core.List(0, 60, 5)), ["second"].concat(can.core.List(0, 60, 5)),
"今天", "", "上一月", ["year"].concat(can.core.List(now.getFullYear() - 10, now.getFullYear() + 10)),
["month"].concat(can.core.List(1, 13)), "下一月",
], can._action, { close: function(event) { can.close() },
"hour": function(event, can, key, value) { now.setHours(parseInt(value)||0), show(now) },
"minute": function(event, can, key, value) { now.setMinutes(parseInt(value)||0), show(now) },
"second": function(event, can, key, value) { now.setSeconds(parseInt(value)||0), show(now) },
"今天": function(event) { now = new Date(), set(show(now)) },
// 添加控件
var now = target.value? new Date(target.value): new Date()
can.onmotion.clear(can, can._action), can.onappend._action(can, [cli.CLOSE,
["hour"].concat(can.core.List(24)), ["minute"].concat(can.core.List(0, 60, 5)), ["second"].concat(can.core.List(0, 60, 5)),
"今天", "", "上一月", ["year"].concat(can.core.List(now.getFullYear() - 10, now.getFullYear() + 10)),
["month"].concat(can.core.List(1, 13)), "下一月",
], can._action, { close: function(event) { can.close() },
"hour": function(event, can, key, value) { now.setHours(parseInt(value)||0), show(now) },
"minute": function(event, can, key, value) { now.setMinutes(parseInt(value)||0), show(now) },
"second": function(event, can, key, value) { now.setSeconds(parseInt(value)||0), show(now) },
"今天": function(event) { now = new Date(), set(show(now)) },
"上一月": function(event) { now.setMonth(now.getMonth()-1), show(now) },
"year": function(event, can, key, value) { now.setFullYear(parseInt(value)), show(now) },
"month": function(event, can, key, value) { now.setMonth(parseInt(value)-1), show(now) },
"下一月": function(event) { now.setMonth(now.getMonth()+1), show(now) },
"上一月": function(event) { now.setMonth(now.getMonth()-1), show(now) },
"year": function(event, can, key, value) { now.setFullYear(parseInt(value)), show(now) },
"month": function(event, can, key, value) { now.setMonth(parseInt(value)-1), show(now) },
"下一月": function(event) { now.setMonth(now.getMonth()+1), show(now) },
"随机": function(event) { now.setDate((Math.random() * 100 - 50) + now.getDate()), show(now) },
"前一年": function(event) { now.setFullYear(now.getFullYear()-1), show(now) },
"后一年": function(event) { now.setFullYear(now.getFullYear()+1), show(now) },
})
"随机": function(event) { now.setDate((Math.random() * 100 - 50) + now.getDate()), show(now) },
"前一年": function(event) { now.setFullYear(now.getFullYear()-1), show(now) },
"后一年": function(event) { now.setFullYear(now.getFullYear()+1), show(now) },
})
can.onmotion.clear(can, can._status)
can._table = can.page.Appends(can, can._output, [{view: [chat.CONTENT, html.TABLE]}]).first
var today = new Date(); function show(now) {
// 设置控件
can.Action("year", now.getFullYear())
can.Action("month", now.getMonth()+1)
can.Action("hour", now.getHours())
can.Action("minute", parseInt(now.getMinutes()/5)*5)
can.Action("second", parseInt(now.getSeconds()/5)*5)
can.onmotion.clear(can, can._status)
can._table = can.page.Appends(can, can._output, [{view: [chat.CONTENT, html.TABLE]}]).first
var today = new Date(); function show(now) {
// 设置控件
can.Action("year", now.getFullYear())
can.Action("month", now.getMonth()+1)
can.Action("hour", now.getHours())
can.Action("minute", parseInt(now.getMinutes()/5)*5)
can.Action("second", parseInt(now.getSeconds()/5)*5)
// 设置组件
can.page.Appends(can, can._table, [{th: ["日", "一", "二", "三", "四", "五", "六"]}])
var tr; function add(day, type) { if (day.getDay() == 0) { tr = can.page.Append(can, can._table, [{type: html.TR}]).last }
can.page.Append(can, tr, [{text: [day.getDate(), html.TD, can.base.Time(today, "%y-%m-%d") == can.base.Time(day, "%y-%m-%d")? html.SELECT: type],
dataset: {date: day.getTime()}, onclick: function(event) {
set(now = new Date(parseInt(event.target.dataset.date)))
},
}])
}
// 设置组件
can.page.Appends(can, can._table, [{th: ["日", "一", "二", "三", "四", "五", "六"]}])
var tr; function add(day, type) { if (day.getDay() == 0) { tr = can.page.Append(can, can._table, [{type: html.TR}]).last }
can.page.Append(can, tr, [{text: [day.getDate(), html.TD, can.base.Time(today, "%y-%m-%d") == can.base.Time(day, "%y-%m-%d")? html.SELECT: type],
dataset: {date: day.getTime()}, onclick: function(event) {
set(now = new Date(parseInt(event.target.dataset.date)))
},
}])
}
// 时间区间
var one = new Date(now); one.setDate(1)
var end = new Date(now); end.setMonth(now.getMonth()+1), end.setDate(1)
var head = new Date(one); head.setDate(one.getDate()-one.getDay())
var tail = new Date(end); tail.setDate(end.getDate()+7-end.getDay())
// 时间区间
var one = new Date(now); one.setDate(1)
var end = new Date(now); end.setMonth(now.getMonth()+1), end.setDate(1)
var head = new Date(one); head.setDate(one.getDate()-one.getDay())
var tail = new Date(end); tail.setDate(end.getDate()+7-end.getDay())
// 时间序列
for (var day = new Date(head); day < one; day.setDate(day.getDate()+1)) { add(day, mdb.PREV) }
for (var day = new Date(one); day < end; day.setDate(day.getDate()+1)) { add(day, mdb.MAIN) }
for (var day = new Date(end); end.getDay() != 0 && day < tail; day.setDate(day.getDate()+1)) { add(day, mdb.NEXT) }
// 时间序列
for (var day = new Date(head); day < one; day.setDate(day.getDate()+1)) { add(day, mdb.PREV) }
for (var day = new Date(one); day < end; day.setDate(day.getDate()+1)) { add(day, mdb.MAIN) }
for (var day = new Date(end); end.getDay() != 0 && day < tail; day.setDate(day.getDate()+1)) { add(day, mdb.NEXT) }
return now
} show(now), can.onlayout.figure(event, can), can.base.isFunc(cbs) && cbs(can)
return now
} show(now), can.onlayout.figure(event, can), can.base.isFunc(cbs) && cbs(can)
})}} }, [""])

View File

@ -1,53 +1,53 @@
Volcanos("onfigure", {help: "控件详情", list: [], key: {
_init: function(can, msg, target) { var call = arguments.callee
can.onmotion.clear(can), can.onappend.table(can, msg, function(value, key, index, line) {
return {text: [value, html.TD], onclick: function(event) { target.value = line[key]
if (msg.Option(ice.MSG_PROCESS) != ice.PROCESS_AGAIN) { return can.close() }
can.run(event, [ctx.ACTION, mdb.INPUTS, can.Conf(mdb.NAME), target.value], function(msg) {
call(can, msg, target)
})
}}
})
},
_show: function(can, meta, cbs, target) {
can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) {
if (msg.Length() == 0) { return can.close() }
target._can && target._can.close(), target._can = can
can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length())
target._msg = msg, can.base.isFunc(cbs) && cbs(can)
})
_init: function(can, msg, target) { var call = arguments.callee
can.onmotion.clear(can), can.onappend.table(can, msg, function(value, key, index, line) {
return {text: [value, html.TD], onclick: function(event) { target.value = line[key]
if (msg.Option(ice.MSG_PROCESS) != ice.PROCESS_AGAIN) { return can.close() }
can.run(event, [ctx.ACTION, mdb.INPUTS, can.Conf(mdb.NAME), target.value], function(msg) {
call(can, msg, target)
})
}}
})
},
_show: function(can, meta, cbs, target) {
can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) {
if (msg.Length() == 0) { return can.close() }
target._can && target._can.close(), target._can = can
can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length())
target._msg = msg, can.base.isFunc(cbs) && cbs(can)
})
},
onfocus: function(event, can, meta, cb, target) { if (target._figure) { return } target._figure = {}; cb(function(can, cbs) {
target._figure = can.onlayout.figure(event, can, can._target, false, {top: can.page.offsetTop(target)+target.offsetHeight, left: can.page.offsetLeft(target)})
can.onfigure.key._show(can, meta, cbs, target)
can.onmotion.focus(can, target)
}) },
onblur: function(event, can, meta, cb, target) { delete(target._figure), target._can && target._can.close() },
onclick: function(event, can, meta, cb, target) { if (target._figure) { target._figure = can.onlayout.figure(event, can, can.core.Value(target, "_can._target")||{}); return } target._figure = {}; cb(function(can, cbs) {
target._figure = can.onlayout.figure(event, can)
can.onfigure.key._show(can, meta, cbs, target)
}) },
onkeydown: function(event, can, meta, cb, target, last) {
if (target._figure && target._can) { can = target._can
switch (event.key) { case lang.ENTER: can.close(); return }
can.onmotion.selectTableInput(event, can, target, function() {
can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) {
can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length())
target._msg = msg
})
})
}
switch (event.key) {
case lang.ESCAPE: event.target.blur(); return
case lang.TAB:
if (event.target.tagName == "TEXTAREA") {
can.onkeymap.insertText(event.target, "\t")
can.onkeymap.prevent(event)
return
}
}
can.base.isFunc(last) && last(event, can)
},
},
onfocus: function(event, can, meta, cb, target) { if (target._figure) { return } target._figure = {}; cb(function(can, cbs) {
target._figure = can.onlayout.figure(event, can, can._target, false, {top: can.page.offsetTop(target)+target.offsetHeight, left: can.page.offsetLeft(target)})
can.onfigure.key._show(can, meta, cbs, target)
can.onmotion.focus(can, target)
}) },
onblur: function(event, can, meta, cb, target) { delete(target._figure), target._can && target._can.close() },
onclick: function(event, can, meta, cb, target) { if (target._figure) { target._figure = can.onlayout.figure(event, can, can.core.Value(target, "_can._target")||{}); return } target._figure = {}; cb(function(can, cbs) {
target._figure = can.onlayout.figure(event, can)
can.onfigure.key._show(can, meta, cbs, target)
}) },
onkeydown: function(event, can, meta, cb, target, last) {
if (target._figure && target._can) { can = target._can
switch (event.key) { case lang.ENTER: can.close(); return }
can.onmotion.selectTableInput(event, can, target, function() {
can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) {
can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length())
target._msg = msg
})
})
}
switch (event.key) {
case lang.ESCAPE: event.target.blur(); return
case lang.TAB:
if (event.target.tagName == "TEXTAREA") {
can.onkeymap.insertText(event.target, "\t")
can.onkeymap.prevent(event)
return
}
}
can.base.isFunc(last) && last(event, can)
},
}})

View File

@ -1,9 +1,9 @@
Volcanos("onfigure", {help: "控件详情", list: [], province: {onclick: function(event, can, meta, cb, target) { cb(function(can, cbs) {
can.require(["/require/shylinux.com/x/echarts/echarts.js", "/require/shylinux.com/x/echarts/china.js"], function() {
var china_chart = echarts.init(can.page.Append(can, can._output, [{type: html.DIV, style: {width: 600, height: 400}}]).first)
china_chart.setOption({geo: {map: 'china'}}), china_chart.on(html.CLICK, function (params) {
target.value = params.name, can.close()
}), can.Status(mdb.TOTAL, 34), can.onlayout.figure(event, can), can.base.isFunc(cbs) && cbs(can)
})
can.require(["/require/shylinux.com/x/echarts/echarts.js", "/require/shylinux.com/x/echarts/china.js"], function() {
var china_chart = echarts.init(can.page.Append(can, can._output, [{type: html.DIV, style: {width: 600, height: 400}}]).first)
china_chart.setOption({geo: {map: 'china'}}), china_chart.on(html.CLICK, function (params) {
target.value = params.name, can.close()
}), can.Status(mdb.TOTAL, 34), can.onlayout.figure(event, can), can.base.isFunc(cbs) && cbs(can)
})
}) }}, })

View File

@ -1,95 +1,95 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
var meta = {}; msg.Table(function(value) { meta[value.key] = value.value })
can._meta = can.base.Obj(meta.text, {meta: {name: meta.name||"hi"}, list: []})
can.base.isFunc(cb) && cb(msg)
var meta = {}; msg.Table(function(value) { meta[value.key] = value.value })
can._meta = can.base.Obj(meta.text, {meta: {name: meta.name||"hi"}, list: []})
can.base.isFunc(cb) && cb(msg)
can.ui = can.page.Appends(can, target, [{view: [chat.LAYOUT, html.TABLE], list: [{type: html.TR, list: [
{type: html.TD, list: [{view: chat.PROJECT}]},
{type: html.TD, list: [{view: chat.DISPLAY}]},
{type: html.TD, list: [{view: chat.PROFILE}]},
]}] }]), can.ui.project._fieldset = can.ui.display
can.ui = can.page.Appends(can, target, [{view: [chat.LAYOUT, html.TABLE], list: [{type: html.TR, list: [
{type: html.TD, list: [{view: chat.PROJECT}]},
{type: html.TD, list: [{view: chat.DISPLAY}]},
{type: html.TD, list: [{view: chat.PROFILE}]},
]}] }]), can.ui.project._fieldset = can.ui.display
can.onimport._item(can, can._meta, can.ui.project, can.onimport._size(can)).click()
},
_size: function(can) {
var width = can.Conf(html.WIDTH)-260, height = can.Conf(html.HEIGHT)-100
if (can.Conf("auto.cmd")) {
width = can.Conf(html.WIDTH), height = can.Conf(html.HEIGHT)
can.onmotion.hidden(can, can.ui.project)
can.onmotion.hidden(can, can.ui.profile)
can.onmotion.hidden(can, can._option)
can.onmotion.hidden(can, can._action)
}
if (can.user.mod.isCmd || can.user.mod.isDiv) {
width = window.innerWidth, height = window.innerHeight
can.page.Modify(can, can._output, {style: {width: width, height: height}})
}
return width
},
_item: function(can, node, target, width) { width = width||node.meta.width
var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, node.meta.name||"hi"]}, {view: [html.LIST]}])
ui.list._fieldset = can.onimport._plugin(can, node.meta, target._fieldset, width)
can.onimport._item(can, can._meta, can.ui.project, can.onimport._size(can)).click()
},
_size: function(can) {
var width = can.Conf(html.WIDTH)-260, height = can.Conf(html.HEIGHT)-100
if (can.Conf("auto.cmd")) {
width = can.Conf(html.WIDTH), height = can.Conf(html.HEIGHT)
can.onmotion.hidden(can, can.ui.project)
can.onmotion.hidden(can, can.ui.profile)
can.onmotion.hidden(can, can._option)
can.onmotion.hidden(can, can._action)
}
if (can.user.mod.isCmd || can.user.mod.isDiv) {
width = window.innerWidth, height = window.innerHeight
can.page.Modify(can, can._output, {style: {width: width, height: height}})
}
return width
},
_item: function(can, node, target, width) { width = width||node.meta.width
var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, node.meta.name||"hi"]}, {view: [html.LIST]}])
ui.list._fieldset = can.onimport._plugin(can, node.meta, target._fieldset, width)
var msg = can.request({}); msg.Push(node.meta, "", true)
ui.item.onclick = function(event) {
can.onmotion.select(can, can.ui.project, "div.item", ui.item)
can.current = ui.item, can.onmotion.clear(can, can.ui.profile)
can.onappend.table(can, msg, function(value, key, index, line, array) {
return {text: [value, html.TD], ondblclick: function(event) {
key == "value" && can.onmotion.modifys(can, event.target, function(event, value, old) {
node.meta[line.key] = value
})
}}
}, can.ui.profile)
}
var msg = can.request({}); msg.Push(node.meta, "", true)
ui.item.onclick = function(event) {
can.onmotion.select(can, can.ui.project, "div.item", ui.item)
can.current = ui.item, can.onmotion.clear(can, can.ui.profile)
can.onappend.table(can, msg, function(value, key, index, line, array) {
return {text: [value, html.TD], ondblclick: function(event) {
key == "value" && can.onmotion.modifys(can, event.target, function(event, value, old) {
node.meta[line.key] = value
})
}}
}, can.ui.profile)
}
ui.item._add = function(data) {
if (node.meta.style == html.SPAN) { width = width * node.list.length }
node.list.push(data)
if (node.meta.style == html.SPAN) { width = width / node.list.length }
can.onmotion.clear(can, ui.list), can.onmotion.clear(can, ui.list._fieldset)
can.core.List(node.list, function(node) { can.onimport._item(can, node, ui.list, width) })
}
if (node.meta.style == html.SPAN) { width = width / node.list.length }
can.core.List(node.list, function(node) { can.onimport._item(can, node, ui.list, width) })
return ui.item
},
_plugin: function(can, meta, target, width) {
var size = {width: width, height: meta.height}
var field = can.onappend.field(can, chat.LAYOUT, {}, target).fieldset
can.page.ClassList.add(can, field, meta.style)
can.page.Modify(can, field, {style: size})
ui.item._add = function(data) {
if (node.meta.style == html.SPAN) { width = width * node.list.length }
node.list.push(data)
if (node.meta.style == html.SPAN) { width = width / node.list.length }
can.onmotion.clear(can, ui.list), can.onmotion.clear(can, ui.list._fieldset)
can.core.List(node.list, function(node) { can.onimport._item(can, node, ui.list, width) })
}
if (node.meta.style == html.SPAN) { width = width / node.list.length }
can.core.List(node.list, function(node) { can.onimport._item(can, node, ui.list, width) })
return ui.item
},
_plugin: function(can, meta, target, width) {
var size = {width: width, height: meta.height}
var field = can.onappend.field(can, chat.LAYOUT, {}, target).fieldset
can.page.ClassList.add(can, field, meta.style)
can.page.Modify(can, field, {style: size})
meta.index && can.run(event, [ctx.ACTION, ctx.COMMAND, meta.index], function(msg) {
can.onappend._init(can, can.base.Copy({
feature: can.base.Obj(msg.Append("meta")),
inputs: can.base.Obj(msg.Append("list")),
args: meta.args,
name: meta.name,
}, size), ["/plugin/state.js"], function(sub) {
can.page.Modify(can, sub._output, {style: size})
sub.run = function(event, cmds, cb) {
can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true)
}
}, target, field)
}, true)
return field
},
meta.index && can.run(event, [ctx.ACTION, ctx.COMMAND, meta.index], function(msg) {
can.onappend._init(can, can.base.Copy({
feature: can.base.Obj(msg.Append("meta")),
inputs: can.base.Obj(msg.Append("list")),
args: meta.args,
name: meta.name,
}, size), ["/plugin/state.js"], function(sub) {
can.page.Modify(can, sub._output, {style: size})
sub.run = function(event, cmds, cb) {
can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true)
}
}, target, field)
}, true)
return field
},
}, ["/plugin/local/chat/div.css"])
Volcanos("onaction", {help: "操作数据", list: [],
"添加": function(event, can) {
can.user.input(event, can, [mdb.NAME, ctx.INDEX, ctx.ARGS, ctx.STYLE, html.HEIGHT, html.WIDTH], function(event, button, data, list, args) {
can.current._add({meta: data, list: []})
})
},
"保存": function(event, can) { var msg = can.request(event, can.Option())
can.run(event, [mdb.MODIFY, mdb.TEXT, JSON.stringify(can._meta)], function(msg) {
can.user.toastSuccess(can)
}, true)
},
"预览": function(event, can) {
can.onmotion.share(event, can, [], [mdb.LINK, can.misc.MergeURL(can, {_path: "/chat/div/"+can.Option("hash")})])
},
"添加": function(event, can) {
can.user.input(event, can, [mdb.NAME, ctx.INDEX, ctx.ARGS, ctx.STYLE, html.HEIGHT, html.WIDTH], function(event, button, data, list, args) {
can.current._add({meta: data, list: []})
})
},
"保存": function(event, can) { var msg = can.request(event, can.Option())
can.run(event, [mdb.MODIFY, mdb.TEXT, JSON.stringify(can._meta)], function(msg) {
can.user.toastSuccess(can)
}, true)
},
"预览": function(event, can) {
can.onmotion.share(event, can, [], [mdb.LINK, can.misc.MergeURL(can, {_path: "/chat/div/"+can.Option("hash")})])
},
})
Volcanos("onexport", {help: "导出数据", list: []})

View File

@ -1,36 +1,35 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.ui = can.onlayout.display(can, target)
can.ui.canvas = can.page.Append(can, can.ui.display, [{type: "canvas", width: 320, height: 240, style: {display: "none"}}]).first
can.ui = can.onlayout.display(can, target)
can.ui.canvas = can.page.Append(can, can.ui.display, [{type: "canvas", width: 320, height: 240, style: {display: "none"}}]).first
can.onappend.table(can, msg, function(value, key, index, line, array) {
return {text: [value, "td"], onclick: function(event) {
can.sup.onaction.change(event, can.sup, key, value, function(msg) {
can.run(event)
})
}}
}, can.ui.content)
can.onappend.table(can, msg, function(value, key, index, line, array) {
return {text: [value, "td"], onclick: function(event) {
can.sup.onaction.change(event, can.sup, key, value, function(msg) {
can.run(event)
})
}}
}, can.ui.content)
can.onappend.board(can, msg.Result(), can.ui.display)
can.base.isFunc(cb) && cb(msg)
},
can.onappend.board(can, msg.Result(), can.ui.display)
can.base.isFunc(cb) && cb(msg)
},
})
Volcanos("onaction", {help: "操作数据", list: [], _init: function(can, msg, list, cb, target) {
},
},
open: function(event, can) {
navigator.getUserMedia({video: {width: 320, height: 240}}, function(stream) {
var video = can.page.Append(can, can.ui.content, "video")
video.srcObject = stream, video.play()
can.ui.video = video
}, function(error) {
can.misc.Log("open camera", error)
})
},
snapshot: function(event, can) {
can.ui.canvas.getContext("2d").drawImage(can.ui.video, 0, 0)
can.page.Append(can, can.ui.display, [{type: "img", src: can.ui.canvas.toDataURL('image/webp')}])
},
open: function(event, can) {
navigator.getUserMedia({video: {width: 320, height: 240}}, function(stream) {
var video = can.page.Append(can, can.ui.content, "video")
video.srcObject = stream, video.play()
can.ui.video = video
}, function(error) {
can.misc.Log("open camera", error)
})
},
snapshot: function(event, can) {
can.ui.canvas.getContext("2d").drawImage(can.ui.video, 0, 0)
can.page.Append(can, can.ui.display, [{type: "img", src: can.ui.canvas.toDataURL('image/webp')}])
},
})
Volcanos("onexport", {help: "导出数据", list: [],
})

View File

@ -1,34 +1,34 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onmotion.clear(can)
can.from = can.onimport._plugin(can, nfs.DIR, html.LEFT, "from", "to")
can.to = can.onimport._plugin(can, nfs.DIR, html.RIGHT, "to", "from")
can.onimport._plugin(can, nfs.TRASH, html.LEFT, "from")
can.onimport._plugin(can, nfs.TRASH, html.RIGHT, "to")
},
_plugin: function(can, index, pos, from, to) {
return can.onappend.plugin(can, {type: chat.STORY, index: index}, function(sub) {
can.page.Modify(can, sub._target, {style: {float: pos, clear: pos}})
sub.Conf(html.WIDTH, can.Conf(html.WIDTH)/2)
sub._legend.innerHTML = can.Option(from)+ice.SP+index
can.page.Modify(can, sub._output, {style: {"max-width": can.Conf(html.WIDTH)/2}})
can.onmotion.clear(can)
can.from = can.onimport._plugin(can, nfs.DIR, html.LEFT, "from", "to")
can.to = can.onimport._plugin(can, nfs.DIR, html.RIGHT, "to", "from")
can.onimport._plugin(can, nfs.TRASH, html.LEFT, "from")
can.onimport._plugin(can, nfs.TRASH, html.RIGHT, "to")
},
_plugin: function(can, index, pos, from, to) {
return can.onappend.plugin(can, {type: chat.STORY, index: index}, function(sub) {
can.page.Modify(can, sub._target, {style: {float: pos, clear: pos}})
sub.Conf(html.WIDTH, can.Conf(html.WIDTH)/2)
sub._legend.innerHTML = can.Option(from)+ice.SP+index
can.page.Modify(can, sub._output, {style: {"max-width": can.Conf(html.WIDTH)/2}})
sub.run = function(event, cmds, cb) {
if (can.onaction[cmds[1]]) { return can.onaction[cmds[1]](can, from, to, event, cmds, cb) }
sub.run = function(event, cmds, cb) {
if (can.onaction[cmds[1]]) { return can.onaction[cmds[1]](can, from, to, event, cmds, cb) }
var msg = sub.request(event, {_pod: can.Option(from)})
can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, index], cmds), cb, true)
}
})
},
var msg = sub.request(event, {_pod: can.Option(from)})
can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, index], cmds), cb, true)
}
})
},
})
Volcanos("onaction", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
},
send: function(can, from, to, event, cmds, cb) { var _from = can[from], _to = can[to]
var path = can.request(event).Option(nfs.PATH)
var msg = can.request(event, {_handle: ice.TRUE,
from: can.Option(from), from_path: path,
to: can.Option(to), to_path: _to.Option(nfs.PATH)+path.split(ice.PS).pop(),
})
can.run(event, cmds, function() { _to.Update() }, true)
},
},
send: function(can, from, to, event, cmds, cb) { var _from = can[from], _to = can[to]
var path = can.request(event).Option(nfs.PATH)
var msg = can.request(event, {_handle: ice.TRUE,
from: can.Option(from), from_path: path,
to: can.Option(to), to_path: _to.Option(nfs.PATH)+path.split(ice.PS).pop(),
})
can.run(event, cmds, function() { _to.Update() }, true)
},
})

View File

@ -1,28 +1,28 @@
Volcanos("onaction", {source: function(can, msg) {
can.require(["https://res.wx.qq.com/open/js/jweixin-1.6.0.js"], function(can) {
wx.config({debug: msg.Option("debug") == ice.TRUE,
appId: msg.Option("appid"), signature: msg.Option("signature"),
nonceStr: msg.Option("noncestr"), timestamp: msg.Option("timestamp"),
can.require(["https://res.wx.qq.com/open/js/jweixin-1.6.0.js"], function(can) {
wx.config({debug: msg.Option("debug") == ice.TRUE,
appId: msg.Option("appid"), signature: msg.Option("signature"),
nonceStr: msg.Option("noncestr"), timestamp: msg.Option("timestamp"),
jsApiList: can.core.Item({
scanQRCode: function(cb) { wx.scanQRCode({needResult: cb? 1: 0, scanType: ["qrCode","barCode"], success: function (res) {
can.base.isFunc(cb) && cb(res.resultStr, can.base.ParseJSON(res.resultStr))
} }) },
getLocation: function(cb) { wx.getLocation({type: "gcj02", success: function (res) {
can.base.isFunc(cb) && cb({type: "gcj02", name: "当前位置", text: "当前位置", latitude: parseInt(res.latitude*100000), longitude: parseInt(res.longitude*100000) })
} }) },
openLocation: function(msg) { wx.openLocation({
latitude: parseInt(msg.Option("latitude"))/100000,
longitude: parseInt(msg.Option("longitude"))/100000,
name: msg.Option(mdb.NAME), address: msg.Option(mdb.TEXT),
scale: msg.Option("scale")||14, infoUrl: msg.Option(mdb.LINK),
}) },
chooseImage: function(cb, count) { wx.chooseImage({count: count||9, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success: function (res) {
can.base.isFunc(cb) && cb(res.localIds)
} }) },
}, function(key, value) { return can.user.agent[key] = value, key }),
})
wx.error(function(err) { can.user.toast(err, "wx load") })
wx.ready(function() { can.misc.Log("ready") })
})
jsApiList: can.core.Item({
scanQRCode: function(cb) { wx.scanQRCode({needResult: cb? 1: 0, scanType: ["qrCode","barCode"], success: function (res) {
can.base.isFunc(cb) && cb(res.resultStr, can.base.ParseJSON(res.resultStr))
} }) },
getLocation: function(cb) { wx.getLocation({type: "gcj02", success: function (res) {
can.base.isFunc(cb) && cb({type: "gcj02", name: "当前位置", text: "当前位置", latitude: parseInt(res.latitude*100000), longitude: parseInt(res.longitude*100000) })
} }) },
openLocation: function(msg) { wx.openLocation({
latitude: parseInt(msg.Option("latitude"))/100000,
longitude: parseInt(msg.Option("longitude"))/100000,
name: msg.Option(mdb.NAME), address: msg.Option(mdb.TEXT),
scale: msg.Option("scale")||14, infoUrl: msg.Option(mdb.LINK),
}) },
chooseImage: function(cb, count) { wx.chooseImage({count: count||9, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success: function (res) {
can.base.isFunc(cb) && cb(res.localIds)
} }) },
}, function(key, value) { return can.user.agent[key] = value, key }),
})
wx.error(function(err) { can.user.toast(err, "wx load") })
wx.ready(function() { can.misc.Log("ready") })
})
}})

View File

@ -1,482 +1,482 @@
Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target) {
can.onengine.plugin(can, "can.code.inner.plugin", shy("插件", {}, [{type: "button", name: "list", action: "auto"}, "back"], function(msg, cmds) {
msg.Echo("can.code.inner.plugin")
msg.result = msg.result.concat(cmds||[])
}))
can.onengine.plugin(can, "can.code.inner.plugin", shy("插件", {}, [{type: "button", name: "list", action: "auto"}, "back"], function(msg, cmds) {
msg.Echo("can.code.inner.plugin")
msg.result = msg.result.concat(cmds||[])
}))
var paths = can.core.Split(can.Option(nfs.PATH), ice.FS); can.Option(nfs.PATH, paths[0])
var files = can.core.Split(can.Option(nfs.FILE), ice.FS); can.Option(nfs.FILE, files[0])
can.tabview = can.tabview||{}, can.tabview[can.onexport.keys(can)] = msg
can.history = can.history||[], can.toolkit = {}, can.extentions = {}, can.profile_size = {}
var paths = can.core.Split(can.Option(nfs.PATH), ice.FS); can.Option(nfs.PATH, paths[0])
var files = can.core.Split(can.Option(nfs.FILE), ice.FS); can.Option(nfs.FILE, files[0])
can.tabview = can.tabview||{}, can.tabview[can.onexport.keys(can)] = msg
can.history = can.history||[], can.toolkit = {}, can.extentions = {}, can.profile_size = {}
can.onmotion.clear(can), can.onlayout.profile(can)
can.onimport._project(can, can.ui.project)
can.onimport._profile(can, can.ui.profile)
can.onimport._display(can, can.ui.display)
can.base.isFunc(cb) && cb(msg)
can.onmotion.clear(can), can.onlayout.profile(can)
can.onimport._project(can, can.ui.project)
can.onimport._profile(can, can.ui.profile)
can.onimport._display(can, can.ui.display)
can.base.isFunc(cb) && cb(msg)
can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE))
can.onimport.project(can, paths, function() {
can.onimport._toolkit(can, can.ui.toolkit), can.onimport._session(can, msg), can.onimport._keydown(can)
can.onmotion.delay(can, function() {
can.core.Next(files.slice(1), function(file, next) {
can.onimport.tabview(can, can.Option(nfs.PATH), file, can.Option(nfs.LINE), next)
}, function() { can.onimport.tabview(can, paths[0], files[0]) })
})
})
},
_project: function(can, target) {
target._toggle = function(event) { can.onmotion.toggle(can, target), can.onimport.layout(can) }
},
_profile: function(can, target) {
var ui = can.page.Append(can, target, [{view: html.ACTION}, {view: html.OUTPUT}]); can.ui.profile_output = ui.output
var action = can.onappend._action(can, [cli.SHOW, cli.CLEAR, mdb.PLUGIN, cli.CLOSE, "size"], ui.action, kit.Dict(
cli.SHOW, function(event) { can.onaction["展示"](event, can) },
cli.CLEAR, function(event) { can.onmotion.clear(can, ui.output) },
cli.CLOSE, function(event) { can.onmotion.hidden(can, target), can.onimport.layout(can) },
"size", function(event) {
can.user.input(event, can, ["size"], function(event, button, data) {
can.profile_size[can.onexport.keys(can)] = can.ConfWidth()*parseInt(data.size)/100
can.onaction["展示"](event, can)
})
},
mdb.PLUGIN, function(event) {
can.user.input(event, can, [ctx.INDEX], function(event, button, data) {
can.onimport.plugin(can, data, ui.output)
})
},
))
target._toggle = function(event, show) { action[show? cli.SHOW: cli.CLOSE](event) }
},
_display: function(can, target) {
var ui = can.page.Append(can, target, [{view: html.ACTION}, {view: html.OUTPUT}, {}]); can.ui.display_output = ui.output
var action = can.onappend._action(can, [cli.EXEC, cli.CLEAR, mdb.PLUGIN, cli.CLOSE], ui.action, kit.Dict(
cli.EXEC, function(event) { can.onaction["执行"](event, can) },
cli.CLEAR, function(event) { can.onmotion.clear(can, ui.output) },
cli.CLOSE, function(event) { can.onmotion.hidden(can, target), can.onimport.layout(can) },
mdb.PLUGIN, function(event) {
can.user.input(event, can, [ctx.INDEX], function(event, button, data) {
can.onimport.plugin(can, data, ui.output)
})
},
))
target._toggle = function(event, show) { action[show? cli.EXEC: cli.CLOSE](event) }
},
_toolkit: function(can, target) {
can.ui.toolkit = can.onappend.field(can, "toolkit", {}, can._output)
},
_session: function(can, msg) { can.onimport.sess(can, "", function() { can.onimport.sess(can, {
plug: can.core.Split(msg.OptionOrSearch("plug")).reverse(),
exts: can.core.Split(msg.OptionOrSearch("exts")).reverse(),
tabs: can.core.Split(msg.OptionOrSearch("tabs")),
}) }) },
_keydown: function(can) { can.onkeymap._build(can)
can.user.mod.isCmd && can.onengine.listen(can, chat.ONKEYDOWN, function(event) {
can._key_list = can.onkeymap._parse(event, can, "plugin", can._key_list, can.ui.content)
})
},
can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE))
can.onimport.project(can, paths, function() {
can.onimport._toolkit(can, can.ui.toolkit), can.onimport._session(can, msg), can.onimport._keydown(can)
can.onmotion.delay(can, function() {
can.core.Next(files.slice(1), function(file, next) {
can.onimport.tabview(can, can.Option(nfs.PATH), file, can.Option(nfs.LINE), next)
}, function() { can.onimport.tabview(can, paths[0], files[0]) })
})
})
},
_project: function(can, target) {
target._toggle = function(event) { can.onmotion.toggle(can, target), can.onimport.layout(can) }
},
_profile: function(can, target) {
var ui = can.page.Append(can, target, [{view: html.ACTION}, {view: html.OUTPUT}]); can.ui.profile_output = ui.output
var action = can.onappend._action(can, [cli.SHOW, cli.CLEAR, mdb.PLUGIN, cli.CLOSE, "size"], ui.action, kit.Dict(
cli.SHOW, function(event) { can.onaction["展示"](event, can) },
cli.CLEAR, function(event) { can.onmotion.clear(can, ui.output) },
cli.CLOSE, function(event) { can.onmotion.hidden(can, target), can.onimport.layout(can) },
"size", function(event) {
can.user.input(event, can, ["size"], function(event, button, data) {
can.profile_size[can.onexport.keys(can)] = can.ConfWidth()*parseInt(data.size)/100
can.onaction["展示"](event, can)
})
},
mdb.PLUGIN, function(event) {
can.user.input(event, can, [ctx.INDEX], function(event, button, data) {
can.onimport.plugin(can, data, ui.output)
})
},
))
target._toggle = function(event, show) { action[show? cli.SHOW: cli.CLOSE](event) }
},
_display: function(can, target) {
var ui = can.page.Append(can, target, [{view: html.ACTION}, {view: html.OUTPUT}, {}]); can.ui.display_output = ui.output
var action = can.onappend._action(can, [cli.EXEC, cli.CLEAR, mdb.PLUGIN, cli.CLOSE], ui.action, kit.Dict(
cli.EXEC, function(event) { can.onaction["执行"](event, can) },
cli.CLEAR, function(event) { can.onmotion.clear(can, ui.output) },
cli.CLOSE, function(event) { can.onmotion.hidden(can, target), can.onimport.layout(can) },
mdb.PLUGIN, function(event) {
can.user.input(event, can, [ctx.INDEX], function(event, button, data) {
can.onimport.plugin(can, data, ui.output)
})
},
))
target._toggle = function(event, show) { action[show? cli.EXEC: cli.CLOSE](event) }
},
_toolkit: function(can, target) {
can.ui.toolkit = can.onappend.field(can, "toolkit", {}, can._output)
},
_session: function(can, msg) { can.onimport.sess(can, "", function() { can.onimport.sess(can, {
plug: can.core.Split(msg.OptionOrSearch("plug")).reverse(),
exts: can.core.Split(msg.OptionOrSearch("exts")).reverse(),
tabs: can.core.Split(msg.OptionOrSearch("tabs")),
}) }) },
_keydown: function(can) { can.onkeymap._build(can)
can.user.mod.isCmd && can.onengine.listen(can, chat.ONKEYDOWN, function(event) {
can._key_list = can.onkeymap._parse(event, can, "plugin", can._key_list, can.ui.content)
})
},
project: function(can, path, cb) { can.onmotion.clear(can, can.ui.project)
can.core.Next(path, function(path, next, index, array) {
var list = can.ui.project; if (array.length > 1) {
var ui = can.page.Append(can, can.ui.project, [{view: [html.ITEM, html.DIV, path], onclick: function(event) {
can.onmotion.toggle(can, ui.list)
}}, {view: html.LIST}]); list = ui.list
if (index > 0) { ui.item.click() }
}
can.run(can.request({}, {dir_root: path, dir_deep: true})._event, [ice.PWD], function(msg) {
can.onappend.tree(can, can._file = msg.Table(), nfs.PATH, ice.PS, function(event, item) {
can.onimport.tabview(can, path, item.path)
}, list), can.onimport.layout(can), can.Status("文件数", msg.Length()), next()
}, true)
}, function() {
can.base.isFunc(cb) && cb()
})
},
tabview: function(can, path, file, line, cb, skip, skip2) { var key = can.onexport.keys(can, file, path)
if (!skip && can.tabview[key]) { can.user.mod.isCmd && can.user.title(path+file)
can._msg && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.tabview[key]
can.Option({path: path, file: file, line: line||can._msg.Option(nfs.LINE)||1})
return can._msg.Option(can.Option()), can.onsyntax._init(can, can._msg, cb, skip2)
}
project: function(can, path, cb) { can.onmotion.clear(can, can.ui.project)
can.core.Next(path, function(path, next, index, array) {
var list = can.ui.project; if (array.length > 1) {
var ui = can.page.Append(can, can.ui.project, [{view: [html.ITEM, html.DIV, path], onclick: function(event) {
can.onmotion.toggle(can, ui.list)
}}, {view: html.LIST}]); list = ui.list
if (index > 0) { ui.item.click() }
}
can.run(can.request({}, {dir_root: path, dir_deep: true})._event, [ice.PWD], function(msg) {
can.onappend.tree(can, can._file = msg.Table(), nfs.PATH, ice.PS, function(event, item) {
can.onimport.tabview(can, path, item.path)
}, list), can.onimport.layout(can), can.Status("文件数", msg.Length()), next()
}, true)
}, function() {
can.base.isFunc(cb) && cb()
})
},
tabview: function(can, path, file, line, cb, skip, skip2) { var key = can.onexport.keys(can, file, path)
if (!skip && can.tabview[key]) { can.user.mod.isCmd && can.user.title(path+file)
can._msg && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.tabview[key]
can.Option({path: path, file: file, line: line||can._msg.Option(nfs.LINE)||1})
return can._msg.Option(can.Option()), can.onsyntax._init(can, can._msg, cb, skip2)
}
function show(msg) { can.tabview[key] = msg
var skip2 = skip
msg._tab = can.onappend.tabs(can, [{name: file.split(ice.PS).pop(), text: file}], function(event, meta) {
can.onimport.tabview(can, path, file, "", cb, false, skip2), cb = null, skip2 = false
}, function(item) { delete(can.tabview[key]) })
}
function show(msg) { can.tabview[key] = msg
var skip2 = skip
msg._tab = can.onappend.tabs(can, [{name: file.split(ice.PS).pop(), text: file}], function(event, meta) {
can.onimport.tabview(can, path, file, "", cb, false, skip2), cb = null, skip2 = false
}, function(item) { delete(can.tabview[key]) })
}
can.Option({path: path, file: file, line: line||1})
line == ctx.INDEX? show(can.request({}, {index: file, line: line})): can.run({}, [path, file], show, true)
},
profile: function(can, msg) {
var width = can.profile_size[can.onexport.keys(can)]||(can.ConfWidth()-can.ui.project.offsetWidth)/2
msg && can.onimport.process(can, msg, can.ui.profile_output, width-32)
can.onmotion.hidden(can, can.ui.profile, true), can.onimport.layout(can)
},
display: function(can, msg) {
msg && can.onimport.process(can, msg, can.ui.display_output, can.ConfWidth())
can.page.style(can, can.ui.display_output, html.MAX_HEIGHT, can.ConfHeight()/4)
can.onmotion.hidden(can, can.ui.display, true), can.onimport.layout(can)
},
toolkit: function(can, meta, cb) {
meta.opts = meta.opts||{repos: can.base.trimSuffix(can.base.trimPrefix(can.Option(nfs.PATH), "usr/"), ice.PS) }
can.onimport.plugin(can, meta, can.ui.toolkit.output, function(sub) {
sub.ConfHeight(can.ConfHeight()-4*html.ACTION_HEIGHT), sub.ConfWidth(can.ConfWidth())
sub.page.style(sub, sub._output, html.MAX_HEIGHT, sub.ConfHeight())
sub.page.style(sub, sub._output, html.MAX_WIDTH, sub.ConfWidth())
sub.select = function() { return sub._legend.click(), sub }
can.Option({path: path, file: file, line: line||1})
line == ctx.INDEX? show(can.request({}, {index: file, line: line})): can.run({}, [path, file], show, true)
},
profile: function(can, msg) {
var width = can.profile_size[can.onexport.keys(can)]||(can.ConfWidth()-can.ui.project.offsetWidth)/2
msg && can.onimport.process(can, msg, can.ui.profile_output, width-32)
can.onmotion.hidden(can, can.ui.profile, true), can.onimport.layout(can)
},
display: function(can, msg) {
msg && can.onimport.process(can, msg, can.ui.display_output, can.ConfWidth())
can.page.style(can, can.ui.display_output, html.MAX_HEIGHT, can.ConfHeight()/4)
can.onmotion.hidden(can, can.ui.display, true), can.onimport.layout(can)
},
toolkit: function(can, meta, cb) {
meta.opts = meta.opts||{repos: can.base.trimSuffix(can.base.trimPrefix(can.Option(nfs.PATH), "usr/"), ice.PS) }
can.onimport.plugin(can, meta, can.ui.toolkit.output, function(sub) {
sub.ConfHeight(can.ConfHeight()-4*html.ACTION_HEIGHT), sub.ConfWidth(can.ConfWidth())
sub.page.style(sub, sub._output, html.MAX_HEIGHT, sub.ConfHeight())
sub.page.style(sub, sub._output, html.MAX_WIDTH, sub.ConfWidth())
sub.select = function() { return sub._legend.click(), sub }
var status = can.user.mod.isCmd? can._status: can.ui.toolkit.status
status.appendChild(sub._legend), sub._legend.onclick = function(event) {
if (can.page.Select(can, status, ice.PT+html.SELECT)[0] == event.target) {
can.page.ClassList.del(can, event.target, html.SELECT)
can.page.ClassList.del(can, sub._target, html.SELECT)
return
}
can.onmotion.select(can, status, html.LEGEND, event.target)
can.onmotion.select(can, can.ui.toolkit.output, html.FIELDSET, sub._target)
can.onmotion.focus(can, can.page.Select(can, sub._option, html.OPTION_ARGS)[0])
}, can.base.isFunc(cb) && cb(sub)
})
},
process: function(can, msg, target, width) {
can.user.toastSuccess(can)
can.onmotion.clear(can, target)
if (msg.Option("_process") == "_field") {
msg.Table(function(meta) { meta.display = msg.Option("_display")
// delete(Volcanos.meta.cache[meta.display])
can.onimport.plugin(can, meta, target, function(sub) {
can.onmotion.focus(can, can.page.Select(can, sub._option, html.OPTION_ARGS)[0])
width && sub.ConfWidth(width)
})
})
} else {
can.onappend.table(can, msg, null, target)
can.onappend.board(can, msg.Result(), target)
}
},
plugin: function(can, meta, target, cb) {
can.onappend.plugin(can, meta, function(sub) {
sub.run = function(event, cmds, cb) {
can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true)
}, can.base.isFunc(cb) && cb(sub)
}, target)
},
layout: function(can) { var height = can.ConfHeight(), width = can.ConfWidth()
can.page.style(can, can.ui.content, can.user.mod.isCmd? html.HEIGHT: html.MAX_HEIGHT, height)
if (can.ui.project.style.display != html.NONE) {
can.page.styleHeight(can, can.ui.project, can.ui.content.offsetHeight)
}
if (can.user.mod.isCmd) {
can.page.styleHeight(can, can.ui.content, (can.ui.project.offsetHeight||height)-can.ui.display.offsetHeight)
}
var status = can.user.mod.isCmd? can._status: can.ui.toolkit.status
status.appendChild(sub._legend), sub._legend.onclick = function(event) {
if (can.page.Select(can, status, ice.PT+html.SELECT)[0] == event.target) {
can.page.ClassList.del(can, event.target, html.SELECT)
can.page.ClassList.del(can, sub._target, html.SELECT)
return
}
can.onmotion.select(can, status, html.LEGEND, event.target)
can.onmotion.select(can, can.ui.toolkit.output, html.FIELDSET, sub._target)
can.onmotion.focus(can, can.page.Select(can, sub._option, html.OPTION_ARGS)[0])
}, can.base.isFunc(cb) && cb(sub)
})
},
process: function(can, msg, target, width) {
can.user.toastSuccess(can)
can.onmotion.clear(can, target)
if (msg.Option("_process") == "_field") {
msg.Table(function(meta) { meta.display = msg.Option("_display")
// delete(Volcanos.meta.cache[meta.display])
can.onimport.plugin(can, meta, target, function(sub) {
can.onmotion.focus(can, can.page.Select(can, sub._option, html.OPTION_ARGS)[0])
width && sub.ConfWidth(width)
})
})
} else {
can.onappend.table(can, msg, null, target)
can.onappend.board(can, msg.Result(), target)
}
},
plugin: function(can, meta, target, cb) {
can.onappend.plugin(can, meta, function(sub) {
sub.run = function(event, cmds, cb) {
can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true)
}, can.base.isFunc(cb) && cb(sub)
}, target)
},
layout: function(can) { var height = can.ConfHeight(), width = can.ConfWidth()
can.page.style(can, can.ui.content, can.user.mod.isCmd? html.HEIGHT: html.MAX_HEIGHT, height)
if (can.ui.project.style.display != html.NONE) {
can.page.styleHeight(can, can.ui.project, can.ui.content.offsetHeight)
}
if (can.user.mod.isCmd) {
can.page.styleHeight(can, can.ui.content, (can.ui.project.offsetHeight||height)-can.ui.display.offsetHeight)
}
can.page.styleWidth(can, can.ui.profile_output, can.profile_size[can.onexport.keys(can)]||(width-can.ui.project.offsetWidth)/2)
can.page.styleWidth(can, can.ui.content, width-can.ui.project.offsetWidth-can.ui.profile.offsetWidth-26)
can.page.styleWidth(can, can.ui.profile_output, can.profile_size[can.onexport.keys(can)]||(width-can.ui.project.offsetWidth)/2)
can.page.styleWidth(can, can.ui.content, width-can.ui.project.offsetWidth-can.ui.profile.offsetWidth-26)
if (can.page.ClassList.has(can, can._fields, "full")) {
can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight)
} else {
can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight-html.ACTION_HEIGHT)
}
can.page.Select(can, can.ui.profile_output, html.IFRAME, function(item) {
can.page.style(can, item,
html.HEIGHT, can.ui.profile_output.offsetHeight-4,
html.WIDTH, can.ui.profile_output.offsetWidth-5,
"margin-left", "-10px", "margin-top", "-10px",
"position", "absolute",
"border", "0",
)
})
},
exts: function(can, url, cb) {
can.require([url], function() {}, function(can, name, sub) { sub._init(can, can.base.ParseURL(sub._path), function(sub) {
can.extentions[url.split("?")[0]] = sub, can.base.isFunc(cb) && cb(sub)
}) })
},
sess: function(can, sess, cb) { sess = sess||can.base.Obj(localStorage.getItem("web.code.inner.sess"), {})
can.core.Next(sess.plug, function(item, next) { can.onimport.toolkit(can, {index: item}, function(sub) { can.toolkit[item] = sub, next() }) }, function() {
can.core.Next(sess.exts, function(item, next) { can.onimport.exts(can, item, next) }, function() {
can.core.Next(sess.tabs, function(item, next) { var ls = item.split(ice.DF); can.onimport.tabview(can, ls[0], ls[1], ls[2], next) }, cb)
})
})
},
if (can.page.ClassList.has(can, can._fields, "full")) {
can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight)
} else {
can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight-html.ACTION_HEIGHT)
}
can.page.Select(can, can.ui.profile_output, html.IFRAME, function(item) {
can.page.style(can, item,
html.HEIGHT, can.ui.profile_output.offsetHeight-4,
html.WIDTH, can.ui.profile_output.offsetWidth-5,
"margin-left", "-10px", "margin-top", "-10px",
"position", "absolute",
"border", "0",
)
})
},
exts: function(can, url, cb) {
can.require([url], function() {}, function(can, name, sub) { sub._init(can, can.base.ParseURL(sub._path), function(sub) {
can.extentions[url.split("?")[0]] = sub, can.base.isFunc(cb) && cb(sub)
}) })
},
sess: function(can, sess, cb) { sess = sess||can.base.Obj(localStorage.getItem("web.code.inner.sess"), {})
can.core.Next(sess.plug, function(item, next) { can.onimport.toolkit(can, {index: item}, function(sub) { can.toolkit[item] = sub, next() }) }, function() {
can.core.Next(sess.exts, function(item, next) { can.onimport.exts(can, item, next) }, function() {
can.core.Next(sess.tabs, function(item, next) { var ls = item.split(ice.DF); can.onimport.tabview(can, ls[0], ls[1], ls[2], next) }, cb)
})
})
},
}, [""])
Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], _init: function(can, msg, cb, skip) {
if (can.onmotion.cache(can, function(cache_data) {
can.file && (cache_data[can.file] = {current: can.current, max: can.max,
profile_display: can.ui.profile.style.display, display_display: can.ui.display.style.display,
})
can.file = can.base.Path(msg.Option(nfs.PATH), msg.Option(nfs.FILE))
can.parse = can.base.Ext(can.file), can.Status("模式", "plugin")
if (can.onmotion.cache(can, function(cache_data) {
can.file && (cache_data[can.file] = {current: can.current, max: can.max,
profile_display: can.ui.profile.style.display, display_display: can.ui.display.style.display,
})
can.file = can.base.Path(msg.Option(nfs.PATH), msg.Option(nfs.FILE))
can.parse = can.base.Ext(can.file), can.Status("模式", "plugin")
var p = cache_data[can.file]; p && (can.current = p.current, can.max = p.max)
can.page.Modify(can, can.ui.profile, {style: {display: p? p.profile_display: html.NONE}})
can.page.Modify(can, can.ui.display, {style: {display: p? p.display_display: html.NONE}})
can.onmotion.select(can, can._action, chat.DIV_TABS, msg._tab)
can.onmotion.delay(can, function() { can.onimport.layout(can)
msg.Option(ctx.INDEX) && can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0])
})
return can.file
}, can.ui.content, can.ui.profile_output, can.ui.display_output) && !skip) {
return can.onaction.selectLine(null, can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb()
}
var p = cache_data[can.file]; p && (can.current = p.current, can.max = p.max)
can.page.Modify(can, can.ui.profile, {style: {display: p? p.profile_display: html.NONE}})
can.page.Modify(can, can.ui.display, {style: {display: p? p.display_display: html.NONE}})
can.onmotion.select(can, can._action, chat.DIV_TABS, msg._tab)
can.onmotion.delay(can, function() { can.onimport.layout(can)
msg.Option(ctx.INDEX) && can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0])
})
return can.file
}, can.ui.content, can.ui.profile_output, can.ui.display_output) && !skip) {
return can.onaction.selectLine(null, can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb()
}
if (msg.Option(ctx.INDEX)) {
can.onimport.plugin(can, {index: msg.Option(ctx.INDEX)}, can.ui.content, function(sub) {
can.onmotion.delay(can, function() {
can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0])
}), can.base.isFunc(cb) && cb()
})
return
}
can.onmotion.clear(can, can.ui.content)
if (msg.Option(ctx.INDEX)) {
can.onimport.plugin(can, {index: msg.Option(ctx.INDEX)}, can.ui.content, function(sub) {
can.onmotion.delay(can, function() {
can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0])
}), can.base.isFunc(cb) && cb()
})
return
}
can.onmotion.clear(can, can.ui.content)
function init(p) { can.max = 0, can.core.List(can.ls = msg.Result().split(ice.NL), function(item) {
can.onaction.appendLine(can, item)
}), can.onaction.selectLine(null, can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb() }
function init(p) { can.max = 0, can.core.List(can.ls = msg.Result().split(ice.NL), function(item) {
can.onaction.appendLine(can, item)
}), can.onaction.selectLine(null, can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb() }
var p = can.onsyntax[can.parse]; !p? can.run({}, [ctx.ACTION, mdb.PLUGIN, can.parse, msg.Option(nfs.FILE), msg.Option(nfs.PATH)], function(msg) {
init(p = can.onsyntax[can.parse] = can.base.Obj(msg.Result()))
}, true): init(p)
},
_parse: function(can, line) { if (line.indexOf("<html") == 0) { return line }
line = can.page.replace(can, line||"")
var p = can.onsyntax[can.parse]; !p? can.run({}, [ctx.ACTION, mdb.PLUGIN, can.parse, msg.Option(nfs.FILE), msg.Option(nfs.PATH)], function(msg) {
init(p = can.onsyntax[can.parse] = can.base.Obj(msg.Result()))
}, true): init(p)
},
_parse: function(can, line) { if (line.indexOf("<html") == 0) { return line }
line = can.page.replace(can, line||"")
function wrap(type, str) { return type? '<span class="'+type+'">'+str+'</span>': str }
var p = can.onsyntax[can.parse]; if (!p) { return line } p = can.onsyntax[p.link]||p, p.split = p.split||{}
p.keyword && (line = can.core.List(can.core.Split(line, p.split.space||ice.SP, p.split.operator||"{[(|)]}", {detail: true}), function(item, index, array) {
item = can.base.isObject(item)? item: {text: item}
var text = item.text; var type = item.keyword||p.keyword[text]
function wrap(type, str) { return type? '<span class="'+type+'">'+str+'</span>': str }
var p = can.onsyntax[can.parse]; if (!p) { return line } p = can.onsyntax[p.link]||p, p.split = p.split||{}
p.keyword && (line = can.core.List(can.core.Split(line, p.split.space||ice.SP, p.split.operator||"{[(|)]}", {detail: true}), function(item, index, array) {
item = can.base.isObject(item)? item: {text: item}
var text = item.text; var type = item.keyword||p.keyword[text]
switch (item.type) { case html.SPACE: return text
case lang.STRING: return wrap(lang.STRING, item.left+text+item.right)
default: return wrap(type, text)
}
}).join(""))
switch (item.type) { case html.SPACE: return text
case lang.STRING: return wrap(lang.STRING, item.left+text+item.right)
default: return wrap(type, text)
}
}).join(""))
p.prefix && can.core.Item(p.prefix, function(pre, type) {
if (can.base.beginWith(line, pre)) {
line = wrap(type, line)
} else {
var ls = line.split(pre); if (ls.length > 1) {
line = ls[0] + wrap(type, pre + ls[1])
}
}
})
p.suffix && can.core.Item(p.suffix, function(end, type) {
if (can.base.endWith(line, end)) { line = wrap(type, line) }
})
return line
},
p.prefix && can.core.Item(p.prefix, function(pre, type) {
if (can.base.beginWith(line, pre)) {
line = wrap(type, line)
} else {
var ls = line.split(pre); if (ls.length > 1) {
line = ls[0] + wrap(type, pre + ls[1])
}
}
})
p.suffix && can.core.Item(p.suffix, function(end, type) {
if (can.base.endWith(line, end)) { line = wrap(type, line) }
})
return line
},
})
Volcanos("onkeymap", {help: "导入数据", _init: function(can, msg, cb, target) {
},
_plugin: function(event, can) {},
_normal: function(event, can) {},
_insert: function(event, can) {},
_mode: {
plugin: {
Escape: function(event, can) { can.onaction["清屏"](event, can) },
g: function(event, can) { can.onaction["搜索"](event, can) },
f: function(event, can) { can.onaction["打开"](event, can) },
t: function(event, can) { can.onaction["添加"](event, can) },
p: function(event, can) { can.onaction["插件"](event, can) },
e: function(event, can) { can.onaction["扩展"](event, can) },
},
_plugin: function(event, can) {},
_normal: function(event, can) {},
_insert: function(event, can) {},
_mode: {
plugin: {
Escape: function(event, can) { can.onaction["清屏"](event, can) },
g: function(event, can) { can.onaction["搜索"](event, can) },
f: function(event, can) { can.onaction["打开"](event, can) },
t: function(event, can) { can.onaction["添加"](event, can) },
p: function(event, can) { can.onaction["插件"](event, can) },
e: function(event, can) { can.onaction["扩展"](event, can) },
q: function(event, can) { can.onaction["全屏"](event, can) },
r: function(event, can) { can.onaction["执行"](event, can) },
v: function(event, can) { can.onaction["展示"](event, can) },
s: function(event, can) { can.onaction["保存"](event, can) },
q: function(event, can) { can.onaction["全屏"](event, can) },
r: function(event, can) { can.onaction["执行"](event, can) },
v: function(event, can) { can.onaction["展示"](event, can) },
s: function(event, can) { can.onaction["保存"](event, can) },
j: function(event, can) { can.current.scroll(1) },
k: function(event, can) { can.current.scroll(-1) },
J: function(event, can) { can.current.scroll(can.current.window()-3) },
K: function(event, can) { can.current.scroll(-can.current.window()+3) },
j: function(event, can) { can.current.scroll(1) },
k: function(event, can) { can.current.scroll(-1) },
J: function(event, can) { can.current.scroll(can.current.window()-3) },
K: function(event, can) { can.current.scroll(-can.current.window()+3) },
i: function(event, can) { can.onkeymap._insert(event, can) },
n: function(event, can) { can.onkeymap._normal(event, can) },
":": function(event, can) { can.onimport.toolkit(can, {index: "cli.system"}, function(sub) { can.toolkit["cli.system"] = sub.select() }) },
},
}, _engine: {},
i: function(event, can) { can.onkeymap._insert(event, can) },
n: function(event, can) { can.onkeymap._normal(event, can) },
":": function(event, can) { can.onimport.toolkit(can, {index: "cli.system"}, function(sub) { can.toolkit["cli.system"] = sub.select() }) },
},
}, _engine: {},
})
Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加", "插件", "扩展", "刷新"],
"刷新": function(event, can) {
can.onimport.tabview(can, "src/", "main.go", "", function() {}, skip)
},
"搜索": function(event, can) {
can.user.input(event, can, [mdb.NAME, [ctx.ACTION, nfs.TAGS, nfs.GREP, cli.MAKE]], function(event, button, data) {
can.ui.search.Update({}, [ctx.ACTION, data.action, data.name])
})
},
"打开": function(event, can) {
can.user.input(event, can, [nfs.FILE], function(event, button, data) {
can.onimport.tabview(can, can.Option(nfs.PATH), data.file)
})
},
"添加": function(event, can) {
can.user.input(event, can, [ctx.INDEX], function(event, button, data) {
can.onimport.tabview(can, can.Option(nfs.PATH), data.index, ctx.INDEX)
})
},
"插件": function(event, can) {
can.user.input(event, can, [ctx.INDEX], function(event, button, data) {
var sub = can.toolkit[data.index]; if (sub) { sub.select(); return }
can.onimport.toolkit(can, data, function(sub) { can.toolkit[data.index] = sub.select() })
})
},
"扩展": function(event, can) {
can.user.input(event, can, ["url"], function(event, button, data) {
var sub = can.extentions[data.url]; if (sub) { sub.select(); return }
can.onimport.exts(can, data.url, function(sub) { can.extentions[data.url] = sub.select() })
})
},
"保存": function(event, can) { can.onexport.sess(can), can.user.toastSuccess(can) },
"项目": function(event, can) { can.onmotion.toggle(can, can.ui.project), can.onimport.layout(can) },
"工具": function(event, can) { can.onmotion.toggle(can, can.ui.toolkit.fieldset) },
"执行": function(event, can) { can.onimport.display(can), can.request(event, {_toast: "执行中..."})
can.run(event, [ctx.ACTION, mdb.ENGINE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) {
can.onimport.display(can, msg)
}, true)
},
"展示": function(event, can) { can.onimport.profile(can), can.request(event, {_toast: "渲染中..."})
if (can.Option(nfs.FILE).indexOf("website/") == 0) {
can.profile_size[can.onexport.keys(can)] = can.profile_size[can.onexport.keys(can)] || can.ConfWidth()*parseInt(70)/100
}
can.run(event, [ctx.ACTION, mdb.RENDER, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) {
can.onimport.profile(can, msg)
}, true)
},
"清屏": function(event, can) {
if (can.page.Select(can, document.body, ".input.float", function(item) {
return can.page.Remove(can, item)
}).length > 0) { return }
"刷新": function(event, can) {
can.onimport.tabview(can, "src/", "main.go", "", function() {}, skip)
},
"搜索": function(event, can) {
can.user.input(event, can, [mdb.NAME, [ctx.ACTION, nfs.TAGS, nfs.GREP, cli.MAKE]], function(event, button, data) {
can.ui.search.Update({}, [ctx.ACTION, data.action, data.name])
})
},
"打开": function(event, can) {
can.user.input(event, can, [nfs.FILE], function(event, button, data) {
can.onimport.tabview(can, can.Option(nfs.PATH), data.file)
})
},
"添加": function(event, can) {
can.user.input(event, can, [ctx.INDEX], function(event, button, data) {
can.onimport.tabview(can, can.Option(nfs.PATH), data.index, ctx.INDEX)
})
},
"插件": function(event, can) {
can.user.input(event, can, [ctx.INDEX], function(event, button, data) {
var sub = can.toolkit[data.index]; if (sub) { sub.select(); return }
can.onimport.toolkit(can, data, function(sub) { can.toolkit[data.index] = sub.select() })
})
},
"扩展": function(event, can) {
can.user.input(event, can, ["url"], function(event, button, data) {
var sub = can.extentions[data.url]; if (sub) { sub.select(); return }
can.onimport.exts(can, data.url, function(sub) { can.extentions[data.url] = sub.select() })
})
},
"保存": function(event, can) { can.onexport.sess(can), can.user.toastSuccess(can) },
"项目": function(event, can) { can.onmotion.toggle(can, can.ui.project), can.onimport.layout(can) },
"工具": function(event, can) { can.onmotion.toggle(can, can.ui.toolkit.fieldset) },
"执行": function(event, can) { can.onimport.display(can), can.request(event, {_toast: "执行中..."})
can.run(event, [ctx.ACTION, mdb.ENGINE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) {
can.onimport.display(can, msg)
}, true)
},
"展示": function(event, can) { can.onimport.profile(can), can.request(event, {_toast: "渲染中..."})
if (can.Option(nfs.FILE).indexOf("website/") == 0) {
can.profile_size[can.onexport.keys(can)] = can.profile_size[can.onexport.keys(can)] || can.ConfWidth()*parseInt(70)/100
}
can.run(event, [ctx.ACTION, mdb.RENDER, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) {
can.onimport.profile(can, msg)
}, true)
},
"清屏": function(event, can) {
if (can.page.Select(can, document.body, ".input.float", function(item) {
return can.page.Remove(can, item)
}).length > 0) { return }
if (can.page.Select(can, can.ui.toolkit.status, "legend.select", function(item) {
return item.click(), item
}).length > 0) { return }
if (can.page.Select(can, can._status, "legend.select", function(item) {
return item.click(), item
}).length > 0) { return }
if (can.page.Select(can, can.ui.toolkit.status, "legend.select", function(item) {
return item.click(), item
}).length > 0) { return }
if (can.page.Select(can, can._status, "legend.select", function(item) {
return item.click(), item
}).length > 0) { return }
if (can.ui.profile.style.display == "") {
can.onmotion.hidden(can, can.ui.profile)
} else if (can.ui.display.style.display == "") {
can.onmotion.hidden(can, can.ui.display)
} else if (can.ui.project.style.display == "") {
can.onmotion.hidden(can, can.ui.project)
} else {
can.onaction["全屏"](event, can)
}
can.onimport.layout(can)
},
"全屏": function(event, can) {
if (can.page.ClassList.neg(can, can._fields, "full")) {
can.onmotion.hidden(can, can.ui.project)
can.ConfHeight(window.innerHeight)
} else {
can.onmotion.hidden(can, can.ui.project, true)
can.ConfHeight(window.innerHeight-2*html.ACTION_HEIGHT)
}
can.onimport.layout(can)
},
back: function(event, can) { can.history.pop(); var last = can.history.pop()
last && can.onimport.tabview(can, last.path, last.file, last.line)
can.Status("跳转数", can.history.length)
},
if (can.ui.profile.style.display == "") {
can.onmotion.hidden(can, can.ui.profile)
} else if (can.ui.display.style.display == "") {
can.onmotion.hidden(can, can.ui.display)
} else if (can.ui.project.style.display == "") {
can.onmotion.hidden(can, can.ui.project)
} else {
can.onaction["全屏"](event, can)
}
can.onimport.layout(can)
},
"全屏": function(event, can) {
if (can.page.ClassList.neg(can, can._fields, "full")) {
can.onmotion.hidden(can, can.ui.project)
can.ConfHeight(window.innerHeight)
} else {
can.onmotion.hidden(can, can.ui.project, true)
can.ConfHeight(window.innerHeight-2*html.ACTION_HEIGHT)
}
can.onimport.layout(can)
},
back: function(event, can) { can.history.pop(); var last = can.history.pop()
last && can.onimport.tabview(can, last.path, last.file, last.line)
can.Status("跳转数", can.history.length)
},
scrollLine: function(can, count) { var size = 20; can.current.scroll(count*size) },
appendLine: function(can, value) {
var ui = can.page.Append(can, can.ui.content, [{type: html.TR, list: [
{view: ["line unselectable", html.TD, ++can.max], onclick: function(event) {
can.onaction.selectLine(event, can, ui.tr)
}, ondblclick: function(event) {
can.onaction.favorLine(can, ui.text.innerText)
}},
scrollLine: function(can, count) { var size = 20; can.current.scroll(count*size) },
appendLine: function(can, value) {
var ui = can.page.Append(can, can.ui.content, [{type: html.TR, list: [
{view: ["line unselectable", html.TD, ++can.max], onclick: function(event) {
can.onaction.selectLine(event, can, ui.tr)
}, ondblclick: function(event) {
can.onaction.favorLine(can, ui.text.innerText)
}},
{view: [html.TEXT, html.TD], list: [can.onsyntax._parse(can, value)], onclick: function(event) {
can.onaction.selectLine(event, can, ui.tr)
{view: [html.TEXT, html.TD], list: [can.onsyntax._parse(can, value)], onclick: function(event) {
can.onaction.selectLine(event, can, ui.tr)
}, ondblclick: function(event) {
var s = document.getSelection().toString(), str = ui.text.innerText
var begin = str.indexOf(s), end = begin+s.length
}, ondblclick: function(event) {
var s = document.getSelection().toString(), str = ui.text.innerText
var begin = str.indexOf(s), end = begin+s.length
for (var i = begin; i >= 0; i--) {
if (str[i].match(/[a-zA-Z0-9_.]/)) { s = str.slice(i, end) } else { break }
}
for (var i = begin; i >= 0; i--) {
if (str[i].match(/[a-zA-Z0-9_.]/)) { s = str.slice(i, end) } else { break }
}
if (s.indexOf("kit.") == 0) { s = s.replace("kit.", "toolkits.") }
if (s.indexOf(".") == 0) { s = s.slice(1) }
can.onaction.searchLine(event, can, s)
}}
]}]); return ui.tr
},
selectLine: function(event, can, line) { if (!line) { return parseInt(can.core.Value(can.page.Select(can, can.ui.content, [[[html.TR, html.SELECT], [html.TD, "line"]]])[0], "innerText")) }
can.page.Select(can, can.ui.content, html.TR, function(item, index, array) { if (line < 0 || line > array.length) { return }
if (!can.page.ClassList.set(can, item, html.SELECT, item == line || index+1 == line)) { return }
line = item, can.Status(kit.Dict("文件名", can.file, "解析器", can.parse, "当前行", can.onexport.position(can, can.Option(nfs.LINE, index+1))))
})
if (s.indexOf("kit.") == 0) { s = s.replace("kit.", "toolkits.") }
if (s.indexOf(".") == 0) { s = s.slice(1) }
can.onaction.searchLine(event, can, s)
}}
]}]); return ui.tr
},
selectLine: function(event, can, line) { if (!line) { return parseInt(can.core.Value(can.page.Select(can, can.ui.content, [[[html.TR, html.SELECT], [html.TD, "line"]]])[0], "innerText")) }
can.page.Select(can, can.ui.content, html.TR, function(item, index, array) { if (line < 0 || line > array.length) { return }
if (!can.page.ClassList.set(can, item, html.SELECT, item == line || index+1 == line)) { return }
line = item, can.Status(kit.Dict("文件名", can.file, "解析器", can.parse, "当前行", can.onexport.position(can, can.Option(nfs.LINE, index+1))))
})
can.base.isObject(line) && can.page.Select(can, line, "td.text", function(item) {
can.current = {
window: function() { return parseInt(can.ui.content.offsetHeight/can.current.line.offsetHeight) },
scroll: function(count) { if (count) { can.ui.content.scrollTop += count*can.current.line.offsetHeight }
return parseInt((can.current.line.offsetTop-can.ui.content.scrollTop)/can.current.line.offsetHeight)
},
can.base.isObject(line) && can.page.Select(can, line, "td.text", function(item) {
can.current = {
window: function() { return parseInt(can.ui.content.offsetHeight/can.current.line.offsetHeight) },
scroll: function(count) { if (count) { can.ui.content.scrollTop += count*can.current.line.offsetHeight }
return parseInt((can.current.line.offsetTop-can.ui.content.scrollTop)/can.current.line.offsetHeight)
},
prev: function() { return line.previousSibling },
next: function() { return line.nextSibling },
line: line, text: function(text) {
return text != undefined && can.onaction.modifyLine(can, line, text), item.innerText
},
}
prev: function() { return line.previousSibling },
next: function() { return line.nextSibling },
line: line, text: function(text) {
return text != undefined && can.onaction.modifyLine(can, line, text), item.innerText
},
}
if (!event) {
var scroll = can.current.scroll(); if (scroll < 5) { can.current.scroll(scroll-5) } else {
var window = can.current.window(); if (scroll > window/2) { can.current.scroll(scroll-window/2) }
}
} else {
var scroll = can.current.scroll(); if (scroll < 3) { can.current.scroll(scroll-3) } else {
var window = can.current.window(); if (scroll > window-4) { can.current.scroll(scroll-window+4) }
}
}
if (!event) {
var scroll = can.current.scroll(); if (scroll < 5) { can.current.scroll(scroll-5) } else {
var window = can.current.window(); if (scroll > window/2) { can.current.scroll(scroll-window/2) }
}
} else {
var scroll = can.current.scroll(); if (scroll < 3) { can.current.scroll(scroll-3) } else {
var window = can.current.window(); if (scroll > window-4) { can.current.scroll(scroll-window+4) }
}
}
var push = {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()}
can.base.Eq({path: push.path, file: push.file, line: push.line}, can.history[can.history.length-1]) || can.history.push(push)
can.Status("跳转数", can.history.length)
can.onaction._selectLine(event, can)
})
},
_selectLine: function(event, can) { },
searchLine: function(event, can, value) { if (!can.ui.search) { return }
can.ui.search.Update(event, [ctx.ACTION, nfs.TAGS, value.trim()])
},
favorLine: function(can, value) {
can.user.input(event, can, [{name: "zone", value: "hi"}, {name: "name", value: "hello"}], function(event, button, data) {
can.run(event, [ctx.ACTION, code.FAVOR, ctx.ACTION, mdb.INSERT, mdb.ZONE, data.zone||"",
mdb.TYPE, can.parse, mdb.NAME, data.name||"", mdb.TEXT, (value||"").trimRight(),
nfs.PATH, can.Option(nfs.PATH), nfs.FILE, can.Option(nfs.FILE), nfs.LINE, can.Option(nfs.LINE),
], function(msg) { can.user.toastSuccess(can) }, true)
})
},
var push = {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()}
can.base.Eq({path: push.path, file: push.file, line: push.line}, can.history[can.history.length-1]) || can.history.push(push)
can.Status("跳转数", can.history.length)
can.onaction._selectLine(event, can)
})
},
_selectLine: function(event, can) { },
searchLine: function(event, can, value) { if (!can.ui.search) { return }
can.ui.search.Update(event, [ctx.ACTION, nfs.TAGS, value.trim()])
},
favorLine: function(can, value) {
can.user.input(event, can, [{name: "zone", value: "hi"}, {name: "name", value: "hello"}], function(event, button, data) {
can.run(event, [ctx.ACTION, code.FAVOR, ctx.ACTION, mdb.INSERT, mdb.ZONE, data.zone||"",
mdb.TYPE, can.parse, mdb.NAME, data.name||"", mdb.TEXT, (value||"").trimRight(),
nfs.PATH, can.Option(nfs.PATH), nfs.FILE, can.Option(nfs.FILE), nfs.LINE, can.Option(nfs.LINE),
], function(msg) { can.user.toastSuccess(can) }, true)
})
},
})
Volcanos("onexport", {help: "导出数据", list: ["文件数", "解析器", "文件名", "当前行", "跳转数", "标签数"],
sess: function(can) {
localStorage.setItem("web.code.inner.sess", JSON.stringify({
"tabs": can.onexport.tabs(can), "plug": can.onexport.plug(can), "exts": can.onexport.exts(can),
}))
},
keys: function(can, file, path) { return (path||can.Option(nfs.PATH))+":"+(file||can.Option(nfs.FILE)) },
tabs: function(can) { return can.core.Item(can.tabview, function(key, msg) { return key+ice.DF+msg.Option(nfs.LINE) }) },
plug: function(can) { return can.core.Item(can.toolkit) },
exts: function(can) { return can.core.Item(can.plugins) },
position: function(can, index, total) { total = total||can.max
return (parseInt(index))+ice.PS+parseInt(total)+" = "+parseInt((index)*100/total)+"%"
},
content: function(can) {
return can.page.Select(can, can.ui.content, "td.text", function(item) { return item.innerText }).join(ice.NL)+ice.NL
},
sess: function(can) {
localStorage.setItem("web.code.inner.sess", JSON.stringify({
"tabs": can.onexport.tabs(can), "plug": can.onexport.plug(can), "exts": can.onexport.exts(can),
}))
},
keys: function(can, file, path) { return (path||can.Option(nfs.PATH))+":"+(file||can.Option(nfs.FILE)) },
tabs: function(can) { return can.core.Item(can.tabview, function(key, msg) { return key+ice.DF+msg.Option(nfs.LINE) }) },
plug: function(can) { return can.core.Item(can.toolkit) },
exts: function(can) { return can.core.Item(can.plugins) },
position: function(can, index, total) { total = total||can.max
return (parseInt(index))+ice.PS+parseInt(total)+" = "+parseInt((index)*100/total)+"%"
},
content: function(can) {
return can.page.Select(can, can.ui.content, "td.text", function(item) { return item.innerText }).join(ice.NL)+ice.NL
},
})

View File

@ -1,31 +1,31 @@
Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) {
can.onimport.toolkit(can, {index: "web.code.favor"}, function(sub) {
sub.run = function(event, cmds, cb) { var msg = can.request(event)
if (can.misc.runAction(can, msg, cmds, cb, kit.Dict(
code.INNER, function(cmds) {
can.onimport.tabview(can, msg.Option(nfs.PATH), msg.Option(nfs.FILE), msg.Option(nfs.LINE))
},
))) { return }
can.onimport.toolkit(can, {index: "web.code.favor"}, function(sub) {
sub.run = function(event, cmds, cb) { var msg = can.request(event)
if (can.misc.runAction(can, msg, cmds, cb, kit.Dict(
code.INNER, function(cmds) {
can.onimport.tabview(can, msg.Option(nfs.PATH), msg.Option(nfs.FILE), msg.Option(nfs.LINE))
},
))) { return }
can.run(event, can.misc.concat(can, [ctx.ACTION, code.FAVOR], cmds), function(msg) { var sub = msg._can
sub.onmotion.clear(sub), sub.onappend.table(sub, msg, function(value, key, index, line) {
if (msg.append.length == 2 && msg.append[0] == mdb.KEY && msg.append[1] == mdb.VALUE) {
if (key == mdb.VALUE) { key = line.key }
}
if (key != ctx.ACTION) { value = sub.page.replace(sub, value, ice.PWD, "") }
can.run(event, can.misc.concat(can, [ctx.ACTION, code.FAVOR], cmds), function(msg) { var sub = msg._can
sub.onmotion.clear(sub), sub.onappend.table(sub, msg, function(value, key, index, line) {
if (msg.append.length == 2 && msg.append[0] == mdb.KEY && msg.append[1] == mdb.VALUE) {
if (key == mdb.VALUE) { key = line.key }
}
if (key != ctx.ACTION) { value = sub.page.replace(sub, value, ice.PWD, "") }
return {text: ["", html.TD], list: [{text: [value, html.DIV]}], onclick: function(event) { var target = event.target
if ([mdb.ZONE, mdb.ID].indexOf(key) > -1) { return sub.onaction.change(event, sub, key, value) }
return {text: ["", html.TD], list: [{text: [value, html.DIV]}], onclick: function(event) { var target = event.target
if ([mdb.ZONE, mdb.ID].indexOf(key) > -1) { return sub.onaction.change(event, sub, key, value) }
if (target.tagName == "INPUT" && target.type == html.BUTTON) { var msg = sub.request(event, line, sub.Option())
return sub.run(event, [ctx.ACTION, target.name], function(msg) { sub.run() }, true)
}
if (target.tagName == "INPUT" && target.type == html.BUTTON) { var msg = sub.request(event, line, sub.Option())
return sub.run(event, [ctx.ACTION, target.name], function(msg) { sub.run() }, true)
}
line.line && can.onimport.tabview(can, line.path, line.file.replace(ice.PWD, ""), parseInt(line.line))
}}
}, sub._output), sub.onappend._status(sub, msg.Option(ice.MSG_STATUS)), can.Status("标签数", msg.Length())
}, true)
}, can.base.isFunc(cb) && cb(sub)
})
line.line && can.onimport.tabview(can, line.path, line.file.replace(ice.PWD, ""), parseInt(line.line))
}}
}, sub._output), sub.onappend._status(sub, msg.Option(ice.MSG_STATUS)), can.Status("标签数", msg.Length())
}, true)
}, can.base.isFunc(cb) && cb(sub)
})
}})

View File

@ -1,59 +1,59 @@
Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { var history = []; const SEARCH = "can.code.inner.search"
function show(msg, word) { if (!msg) { return } history.push(msg); var sub = msg._can; sub.Option("word", word||msg._word)
!sub.page.ClassList.has(sub, sub._legend, "select") && can.ui.search.select()
sub.onmotion.clear(sub), sub.onappend.table(sub, msg, function(value, key, index, line) {
return {text: ["", html.TD], list: [{text: [can.page.replace(can, value, ice.PWD, ""), html.DIV]}], onclick: function(event) {
line.line && can.onimport.tabview(can, can.Option(nfs.PATH), line.file.replace(ice.PWD, ""), parseInt(line.line))
}}
}, sub._output), sub.onappend.board(sub, msg.Result()), sub.onappend._status(sub, msg.Option(ice.MSG_STATUS)), can.Status("标签数", msg.Length())
}
can.onengine.plugin(can, SEARCH, shy("搜索", {}, [
{type: html.TEXT, name: "word", value: cli.MAIN, onkeydown: function(event, can) {
can.onmotion.selectTable(event, can.sup, event.target, function(tr) {
can.page.Select(can, tr, html.TD, function(td, index) { index == 0 && td.click() })
tr.scrollIntoView(), can._output.scrollTop -= 60
})
if (event.key == lang.ENTER) { can.sup.Update(event, [ctx.ACTION, event.ctrlKey? nfs.GREP: nfs.TAGS, can.sup.Option("word")]) }
if (event.key == lang.ESCAPE) { event.target.blur() }
}},
{type: html.TEXT, name: "filter", value: "", onkeydown: function(event, can) {
can.onmotion.selectTableInput(event, can.sup, event.target)
if (event.key == lang.ENTER) { can.sup.Update(event, [ctx.ACTION, event.ctrlKey? nfs.GREP: nfs.TAGS, can.sup.Option("word")]) }
if (event.key == lang.ESCAPE) { event.target.blur() }
}},
{type: html.BUTTON, name: nfs.TAGS},
{type: html.BUTTON, name: nfs.GREP},
{type: html.BUTTON, name: cli.MAKE},
{type: html.BUTTON, name: "history"},
{type: html.BUTTON, name: "last", _trans: "返回"},
], function(msg, cmds, cb) { if (can.misc.runAction(can, msg, cmds, cb, kit.Dict(
"history", function(cmds) {
can.core.List(can.history, function(item) {
msg.Push(nfs.FILE, item.file)
msg.Push(nfs.LINE, item.line)
msg.Push(mdb.TEXT, item.text)
})
show(msg)
},
nfs.TAGS, function(cmds) { msg.Option(kit.Dict(ice.MSG_HANDLE, ice.TRUE, ice.MSG_FIELDS, "file,line,text"))
can.run(msg._event, [ctx.ACTION, mdb.SEARCH, can.parse, cmds[0], can.Option(nfs.PATH)], function(msg) { var sub = msg._can
can.page.style(can, sub._output, html.MAX_HEIGHT, can.ConfHeight()/4), show(msg, msg._word = cmds[0])
can.page.ClassList.has(sub, sub._target, html.SELECT) || sub._legend.click()
can.onmotion.focus(can, msg._can._inputs["word"]._target)
}, true)
},
nfs.GREP, function(cmds) { msg.Option(kit.Dict(ice.MSG_HANDLE, ice.TRUE, ice.MSG_FIELDS, "file,line,text", nfs.PATH, can.Option(nfs.PATH)))
can.run(msg._event, [ctx.ACTION, nfs.GREP, cmds[0]], function(msg) { var sub = msg._can
can.page.style(can, sub._output, html.MAX_HEIGHT, can.ConfHeight()/4), show(msg, msg._word = cmds[0])
can.page.ClassList.has(sub, sub._target, html.SELECT) || sub._legend.click()
can.onmotion.focus(can, msg._can._inputs["word"]._target)
}, true)
},
"last", function(cmds) { history.pop(), show(history.pop()) },
))) { return } can.run(msg._event, cmds, function(msg) { show(msg) }, true) }))
can.onimport.toolkit(can, {index: SEARCH}, function(sub) {
can.ui.search = sub, can.base.isFunc(cb) && cb(sub)
can.ui.search._show = show
})
function show(msg, word) { if (!msg) { return } history.push(msg); var sub = msg._can; sub.Option("word", word||msg._word)
!sub.page.ClassList.has(sub, sub._legend, "select") && can.ui.search.select()
sub.onmotion.clear(sub), sub.onappend.table(sub, msg, function(value, key, index, line) {
return {text: ["", html.TD], list: [{text: [can.page.replace(can, value, ice.PWD, ""), html.DIV]}], onclick: function(event) {
line.line && can.onimport.tabview(can, can.Option(nfs.PATH), line.file.replace(ice.PWD, ""), parseInt(line.line))
}}
}, sub._output), sub.onappend.board(sub, msg.Result()), sub.onappend._status(sub, msg.Option(ice.MSG_STATUS)), can.Status("标签数", msg.Length())
}
can.onengine.plugin(can, SEARCH, shy("搜索", {}, [
{type: html.TEXT, name: "word", value: cli.MAIN, onkeydown: function(event, can) {
can.onmotion.selectTable(event, can.sup, event.target, function(tr) {
can.page.Select(can, tr, html.TD, function(td, index) { index == 0 && td.click() })
tr.scrollIntoView(), can._output.scrollTop -= 60
})
if (event.key == lang.ENTER) { can.sup.Update(event, [ctx.ACTION, event.ctrlKey? nfs.GREP: nfs.TAGS, can.sup.Option("word")]) }
if (event.key == lang.ESCAPE) { event.target.blur() }
}},
{type: html.TEXT, name: "filter", value: "", onkeydown: function(event, can) {
can.onmotion.selectTableInput(event, can.sup, event.target)
if (event.key == lang.ENTER) { can.sup.Update(event, [ctx.ACTION, event.ctrlKey? nfs.GREP: nfs.TAGS, can.sup.Option("word")]) }
if (event.key == lang.ESCAPE) { event.target.blur() }
}},
{type: html.BUTTON, name: nfs.TAGS},
{type: html.BUTTON, name: nfs.GREP},
{type: html.BUTTON, name: cli.MAKE},
{type: html.BUTTON, name: "history"},
{type: html.BUTTON, name: "last", _trans: "返回"},
], function(msg, cmds, cb) { if (can.misc.runAction(can, msg, cmds, cb, kit.Dict(
"history", function(cmds) {
can.core.List(can.history, function(item) {
msg.Push(nfs.FILE, item.file)
msg.Push(nfs.LINE, item.line)
msg.Push(mdb.TEXT, item.text)
})
show(msg)
},
nfs.TAGS, function(cmds) { msg.Option(kit.Dict(ice.MSG_HANDLE, ice.TRUE, ice.MSG_FIELDS, "file,line,text"))
can.run(msg._event, [ctx.ACTION, mdb.SEARCH, can.parse, cmds[0], can.Option(nfs.PATH)], function(msg) { var sub = msg._can
can.page.style(can, sub._output, html.MAX_HEIGHT, can.ConfHeight()/4), show(msg, msg._word = cmds[0])
can.page.ClassList.has(sub, sub._target, html.SELECT) || sub._legend.click()
can.onmotion.focus(can, msg._can._inputs["word"]._target)
}, true)
},
nfs.GREP, function(cmds) { msg.Option(kit.Dict(ice.MSG_HANDLE, ice.TRUE, ice.MSG_FIELDS, "file,line,text", nfs.PATH, can.Option(nfs.PATH)))
can.run(msg._event, [ctx.ACTION, nfs.GREP, cmds[0]], function(msg) { var sub = msg._can
can.page.style(can, sub._output, html.MAX_HEIGHT, can.ConfHeight()/4), show(msg, msg._word = cmds[0])
can.page.ClassList.has(sub, sub._target, html.SELECT) || sub._legend.click()
can.onmotion.focus(can, msg._can._inputs["word"]._target)
}, true)
},
"last", function(cmds) { history.pop(), show(history.pop()) },
))) { return } can.run(msg._event, cmds, function(msg) { show(msg) }, true) }))
can.onimport.toolkit(can, {index: SEARCH}, function(sub) {
can.ui.search = sub, can.base.isFunc(cb) && cb(sub)
can.ui.search._show = show
})
}})

View File

@ -1,22 +1,22 @@
Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { var SESS = "web.code.sess"
can.onimport.toolkit(can, {index: SESS}, function(sub) {
sub.run = function(event, cmds, cb) { var msg = can.request(event)
if (can.misc.runAction(can, msg, cmds, cb, kit.Dict(
nfs.SAVE, function(cmds) {
can.run(event, [ctx.ACTION, ice.RUN, SESS].concat([ctx.ACTION, mdb.CREATE,
"tool", JSON.stringify(can.onexport.tool(can)),
"tabs", JSON.stringify(can.onexport.tabs(can)),
]), cb, true)
},
nfs.LOAD, function(cmds) {
can.onimport.sess(can, {
tool: JSON.parse(msg.Option("tool")),
tabs: JSON.parse(msg.Option("tabs")),
})
},
))) { return }
can.run(event, [ctx.ACTION, ice.RUN, SESS].concat(cmds), cb, true)
}, can.base.isFunc(cb) && cb(sub)
})
can.onimport.toolkit(can, {index: SESS}, function(sub) {
sub.run = function(event, cmds, cb) { var msg = can.request(event)
if (can.misc.runAction(can, msg, cmds, cb, kit.Dict(
nfs.SAVE, function(cmds) {
can.run(event, [ctx.ACTION, ice.RUN, SESS].concat([ctx.ACTION, mdb.CREATE,
"tool", JSON.stringify(can.onexport.tool(can)),
"tabs", JSON.stringify(can.onexport.tabs(can)),
]), cb, true)
},
nfs.LOAD, function(cmds) {
can.onimport.sess(can, {
tool: JSON.parse(msg.Option("tool")),
tabs: JSON.parse(msg.Option("tabs")),
})
},
))) { return }
can.run(event, [ctx.ACTION, ice.RUN, SESS].concat(cmds), cb, true)
}, can.base.isFunc(cb) && cb(sub)
})
}})

View File

@ -1,25 +1,25 @@
Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) {
can.onimport.toolkit(can, {index: "web.code.template"}, function(sub) {
sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option())
if (can.misc.runAction(can, msg, cmds, cb, kit.Dict(
nfs.DEFS, function(cmds) {
can.user.input(event, can, can.base.Obj(msg.Option("args")||"[]"), function(ev, button, data, list, args) {
var msg = can.request(event); can.core.Item(data, function(key, value) { msg.Option(key, value) })
can.run(event, [ctx.ACTION, ice.RUN, "web.code.template", nfs.DEFS].concat(cmds), function(msg) {
can.base.isFunc(cb) && cb(msg)
can.onimport.project(can, can.Option(nfs.PATH))
can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option("main"), "", function() {
can.onimport.tabview(can, can.Option(nfs.PATH), cmds[1], 1, function() {})
}, true)
}, true)
})
},
))) { return }
can.run(event, [ctx.ACTION, ice.RUN, "web.code.template"].concat(cmds), function(msg) {
can.base.isFunc(cb) && cb(msg)
}, true)
}, can.base.isFunc(cb) && cb(sub)
})
can.onimport.toolkit(can, {index: "web.code.template"}, function(sub) {
sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option())
if (can.misc.runAction(can, msg, cmds, cb, kit.Dict(
nfs.DEFS, function(cmds) {
can.user.input(event, can, can.base.Obj(msg.Option("args")||"[]"), function(ev, button, data, list, args) {
var msg = can.request(event); can.core.Item(data, function(key, value) { msg.Option(key, value) })
can.run(event, [ctx.ACTION, ice.RUN, "web.code.template", nfs.DEFS].concat(cmds), function(msg) {
can.base.isFunc(cb) && cb(msg)
can.onimport.project(can, can.Option(nfs.PATH))
can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option("main"), "", function() {
can.onimport.tabview(can, can.Option(nfs.PATH), cmds[1], 1, function() {})
}, true)
}, true)
})
},
))) { return }
can.run(event, [ctx.ACTION, ice.RUN, "web.code.template"].concat(cmds), function(msg) {
can.base.isFunc(cb) && cb(msg)
}, true)
}, can.base.isFunc(cb) && cb(sub)
})
}})

View File

@ -1,31 +1,31 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onmotion.clear(can)
if (msg.Option("content")) {
can.onappend.plugin(can, {index: "web.code.vimer", style: "full"}, function(sub) {
sub.run = function(event, cmds, cb) { var res = can.request(event)
if (cmds[1] == "plugin") {
can.run(event, can.misc.concat(can, ["action", "vimer"], cmds), cb, true)
return
}
if (cmds[1] == "main.go") { res.Echo(msg.Option("content"))
can.core.Timer(100, function() { can.sub && can.sub.onaction["项目"]({}, can.sub) })
}
cb(res), can.sub = can.core.Value(sub, "_outputs.-1")
}
}, can._output)
return
}
can.onappend.table(can, msg)
can.onappend.board(can, msg)
},
can.onmotion.clear(can)
if (msg.Option("content")) {
can.onappend.plugin(can, {index: "web.code.vimer", style: "full"}, function(sub) {
sub.run = function(event, cmds, cb) { var res = can.request(event)
if (cmds[1] == "plugin") {
can.run(event, can.misc.concat(can, ["action", "vimer"], cmds), cb, true)
return
}
if (cmds[1] == "main.go") { res.Echo(msg.Option("content"))
can.core.Timer(100, function() { can.sub && can.sub.onaction["项目"]({}, can.sub) })
}
cb(res), can.sub = can.core.Value(sub, "_outputs.-1")
}
}, can._output)
return
}
can.onappend.table(can, msg)
can.onappend.board(can, msg)
},
})
Volcanos("onaction", {help: "操作数据", list: [], _init: function(can, msg, list, cb, target) {
},
run: function(event, can, msg) {
can.run(event, [ctx.ACTION, ice.RUN, "go", "hi.go", can.sub.onexport.content(can.sub)], function(msg) {
can.onappend.board(can, msg)
}, true)
},
},
run: function(event, can, msg) {
can.run(event, [ctx.ACTION, ice.RUN, "go", "hi.go", can.sub.onexport.content(can.sub)], function(msg) {
can.onappend.board(can, msg)
}, true)
},
})
Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) {
}})

View File

@ -1,196 +1,196 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, cb, target) {
can.require(["inner.js"], function(can) { can.onimport.inner_init(can, msg, function() {
can.onkeymap._build(can), can.onimport._input(can), can.onkeymap._plugin({}, can), can.base.isFunc(cb) && cb(msg)
}, target) }, function(can, name, sub) { name == chat.ONIMPORT && (can.onimport.inner_init = sub._init)
if (name == chat.ONKEYMAP) {
can.base.Copy(can.onkeymap._mode, sub._mode)
can.core.Item(can.onkeymap._mode.normal, function(k, v) {
if (!sub._mode.plugin[k]) { sub._mode.plugin[k] = v }
})
can.core.Item(sub._mode.plugin, function(k, v) {
if (!can.onkeymap._mode.normal[k]) { can.onkeymap._mode.normal[k] = v }
})
}
})
},
_input: function(can) {
can.ui.current = can.page.Append(can, can.ui.content.parentNode, [
{view: ["current", html.INPUT], onkeydown: function(event) { if (event.metaKey) { return }
can.misc.Debug("key", event.key)
can._keylist = can.onkeymap._parse(event, can, can.mode+(event.ctrlKey? "_ctrl": ""), can._keylist, can.ui.current)
can.mode == "insert" && can.core.Timer(10, function() { can.current.text(can.ui.current.value) })
can.mode == "normal" && can.Status("按键", can._keylist.join(""))
can.mode == "normal" && can.onkeymap.prevent(event)
}, onclick: function(event) { can.onkeymap._insert(event, can) },
ondblclick: function(event) { var target = event.target
can.onaction.searchLine(event, can, target.value.slice(target.selectionStart, target.selectionEnd))
},
},
]).first
},
can.require(["inner.js"], function(can) { can.onimport.inner_init(can, msg, function() {
can.onkeymap._build(can), can.onimport._input(can), can.onkeymap._plugin({}, can), can.base.isFunc(cb) && cb(msg)
}, target) }, function(can, name, sub) { name == chat.ONIMPORT && (can.onimport.inner_init = sub._init)
if (name == chat.ONKEYMAP) {
can.base.Copy(can.onkeymap._mode, sub._mode)
can.core.Item(can.onkeymap._mode.normal, function(k, v) {
if (!sub._mode.plugin[k]) { sub._mode.plugin[k] = v }
})
can.core.Item(sub._mode.plugin, function(k, v) {
if (!can.onkeymap._mode.normal[k]) { can.onkeymap._mode.normal[k] = v }
})
}
})
},
_input: function(can) {
can.ui.current = can.page.Append(can, can.ui.content.parentNode, [
{view: ["current", html.INPUT], onkeydown: function(event) { if (event.metaKey) { return }
can.misc.Debug("key", event.key)
can._keylist = can.onkeymap._parse(event, can, can.mode+(event.ctrlKey? "_ctrl": ""), can._keylist, can.ui.current)
can.mode == "insert" && can.core.Timer(10, function() { can.current.text(can.ui.current.value) })
can.mode == "normal" && can.Status("按键", can._keylist.join(""))
can.mode == "normal" && can.onkeymap.prevent(event)
}, onclick: function(event) { can.onkeymap._insert(event, can) },
ondblclick: function(event) { var target = event.target
can.onaction.searchLine(event, can, target.value.slice(target.selectionStart, target.selectionEnd))
},
},
]).first
},
}, [""])
Volcanos("onkeymap", {help: "键盘交互", list: [],
_model: function(can, value) { can.Status("模式", can.mode = value)
return can.page.Modify(can, can.ui.current, {className: "current"+ice.SP+can.mode}), value
},
_plugin: function(event, can) { can.onkeymap._model(can, "plugin")
can.ui.current.blur()
},
_normal: function(event, can) { can.onkeymap._model(can, "normal")
can.ui.current.focus(), can.ui.content.scrollLeft -= 10000
},
_insert: function(event, can) { can.onkeymap._model(can, "insert")
can.ui.current.focus(), can.ui.content.scrollLeft -= 10000
can.onkeymap.prevent(event)
},
_model: function(can, value) { can.Status("模式", can.mode = value)
return can.page.Modify(can, can.ui.current, {className: "current"+ice.SP+can.mode}), value
},
_plugin: function(event, can) { can.onkeymap._model(can, "plugin")
can.ui.current.blur()
},
_normal: function(event, can) { can.onkeymap._model(can, "normal")
can.ui.current.focus(), can.ui.content.scrollLeft -= 10000
},
_insert: function(event, can) { can.onkeymap._model(can, "insert")
can.ui.current.focus(), can.ui.content.scrollLeft -= 10000
can.onkeymap.prevent(event)
},
_mode: {
normal_ctrl: {
f: function(event, can, target, count) {
var line = can.onaction.selectLine(event, can)+can.current.window()-3-can.current.scroll()
return can.current.scroll(line), can.onaction.selectLine(event, can, line), true
},
b: function(event, can, target, count) {
var line = can.onaction.selectLine(event, can)-can.current.window()+3
return can.current.scroll(line), can.onaction.selectLine(event, can, line), true
},
},
normal: {
escape: function(event, can) { can.onkeymap._plugin(event, can) },
ArrowLeft: function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) },
ArrowRight: function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) },
ArrowDown: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) },
ArrowUp: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) },
_mode: {
normal_ctrl: {
f: function(event, can, target, count) {
var line = can.onaction.selectLine(event, can)+can.current.window()-3-can.current.scroll()
return can.current.scroll(line), can.onaction.selectLine(event, can, line), true
},
b: function(event, can, target, count) {
var line = can.onaction.selectLine(event, can)-can.current.window()+3
return can.current.scroll(line), can.onaction.selectLine(event, can, line), true
},
},
normal: {
escape: function(event, can) { can.onkeymap._plugin(event, can) },
ArrowLeft: function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) },
ArrowRight: function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) },
ArrowDown: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) },
ArrowUp: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) },
H: function(event, can, target) { can.onkeymap.cursorMove(can, target, 0, 0) },
h: function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) },
l: function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) },
L: function(event, can, target) { can.onkeymap.cursorMove(can, target, 0, -1) },
j: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) },
k: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) },
H: function(event, can, target) { can.onkeymap.cursorMove(can, target, 0, 0) },
h: function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) },
l: function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) },
L: function(event, can, target) { can.onkeymap.cursorMove(can, target, 0, -1) },
j: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) },
k: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) },
gg: function(event, can, target, count) { return can.onaction.selectLine(event, can, count), true },
G: function(event, can, target, count) { return can.onaction.selectLine(event, can, count = count>1? count: can.max), true },
zt: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-(count>1? count: 3)), true },
zz: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-(count = count>1? count: can.current.window()/2)), true },
zb: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-can.current.window()+(count>1? count: 5)), true },
gg: function(event, can, target, count) { return can.onaction.selectLine(event, can, count), true },
G: function(event, can, target, count) { return can.onaction.selectLine(event, can, count = count>1? count: can.max), true },
zt: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-(count>1? count: 3)), true },
zz: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-(count = count>1? count: can.current.window()/2)), true },
zb: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-can.current.window()+(count>1? count: 5)), true },
i: function(event, can) { can.onkeymap._insert(event, can) },
I: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 0, 0) },
a: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 1) },
A: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 0, -1) },
o: function(event, can) { can.onkeymap._insert(event, can), can.onaction.selectLine(event, can, can.onaction.insertLine(can, "", can.current.next())) },
O: function(event, can) { can.onkeymap._insert(event, can), can.onaction.selectLine(event, can, can.onaction.insertLine(can, "", can.current.line)) },
i: function(event, can) { can.onkeymap._insert(event, can) },
I: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 0, 0) },
a: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 1) },
A: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 0, -1) },
o: function(event, can) { can.onkeymap._insert(event, can), can.onaction.selectLine(event, can, can.onaction.insertLine(can, "", can.current.next())) },
O: function(event, can) { can.onkeymap._insert(event, can), can.onaction.selectLine(event, can, can.onaction.insertLine(can, "", can.current.line)) },
yy: function(event, can, target, count) { can._last_text = can.current.text() },
dd: function(event, can, target, count) { can._last_text = can.current.text(), can.onaction.selectLine(event, can, can.onaction.deleteLine(can, can.current.line)) },
p: function(event, can) { can.onaction.insertLine(can, can._last_text, can.current.next()) },
P: function(event, can) { can.onaction.insertLine(can, can._last_text, can.current.line) },
yy: function(event, can, target, count) { can._last_text = can.current.text() },
dd: function(event, can, target, count) { can._last_text = can.current.text(), can.onaction.selectLine(event, can, can.onaction.deleteLine(can, can.current.line)) },
p: function(event, can) { can.onaction.insertLine(can, can._last_text, can.current.next()) },
P: function(event, can) { can.onaction.insertLine(can, can._last_text, can.current.line) },
s: function(event, can) { can.onaction.save(event, can) },
m: function(event, can) { can.onaction.autogen(event, can, "autogen") },
c: function(event, can) { can.onaction.compile(event, can, "compile") },
},
insert: {
jk: function(event, can, target) { can.onkeymap._normal(event, can),
can.onkeymap.deleteText(target, target.selectionStart-1, 1)
can.current.text(can.ui.current.value)
},
Escape: function(event, can) { can.onkeymap._normal(event, can) },
Tab: function(event, can) {
can.onkeymap.insertText(can.ui.current, "\t")
can.onkeymap.prevent(event)
},
s: function(event, can) { can.onaction.save(event, can) },
m: function(event, can) { can.onaction.autogen(event, can, "autogen") },
c: function(event, can) { can.onaction.compile(event, can, "compile") },
},
insert: {
jk: function(event, can, target) { can.onkeymap._normal(event, can),
can.onkeymap.deleteText(target, target.selectionStart-1, 1)
can.current.text(can.ui.current.value)
},
Escape: function(event, can) { can.onkeymap._normal(event, can) },
Tab: function(event, can) {
can.onkeymap.insertText(can.ui.current, "\t")
can.onkeymap.prevent(event)
},
Enter: function(event, can, target) {
var line = can.onaction.insertLine(can, can.onkeymap.deleteText(target, target.selectionEnd), can.current.next())
can.current.text(can.ui.current.value), can.onaction.selectLine(event, can, line)
},
Backspace: function(event, can, target) {
if (target.selectionStart > 0) { return }
if (!can.current.prev()) { return }
can.onkeymap.prevent(event)
Enter: function(event, can, target) {
var line = can.onaction.insertLine(can, can.onkeymap.deleteText(target, target.selectionEnd), can.current.next())
can.current.text(can.ui.current.value), can.onaction.selectLine(event, can, line)
},
Backspace: function(event, can, target) {
if (target.selectionStart > 0) { return }
if (!can.current.prev()) { return }
can.onkeymap.prevent(event)
var rest = can.current.text()
can.onaction.selectLine(event, can, can.current.prev())
can.onaction.deleteLine(can, can.current.next())
var pos = can.current.text().length
var rest = can.current.text()
can.onaction.selectLine(event, can, can.current.prev())
can.onaction.deleteLine(can, can.current.next())
var pos = can.current.text().length
can.ui.current.value = can.current.text()+rest
can.onkeymap.cursorMove(can, can.ui.current, 0, pos)
},
ArrowUp: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) },
ArrowDown: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) },
},
}, _engine: {},
can.ui.current.value = can.current.text()+rest
can.onkeymap.cursorMove(can, can.ui.current, 0, pos)
},
ArrowUp: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) },
ArrowDown: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) },
},
}, _engine: {},
})
Volcanos("onaction", {help: "控件交互", list: ["加载", nfs.SAVE, "autogen", "compile", "binpack", "刷新"],
"刷新": function(event, can) {
can.onimport.tabview(can, "src/", "main.go", "", function() {}, true)
},
"加载": function(event, can) {
var file = "/share/local/"+can.Option(nfs.PATH)+can.Option(nfs.FILE)
delete(Volcanos.meta.cache[file])
var script = `\n_can_name = "`+file+`"\n`+
can.onexport.content(can)+
`\n_can_name = ""\nconsole.log("once")`
eval(script)
},
save: function(event, can) { var msg = can.request(event, {content: can.onexport.content(can)})
can.run(event, [ctx.ACTION, nfs.SAVE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) {
can.user.toastSuccess(can)
}, true)
},
autogen: function(event, can, button) { var meta = can.Conf(), msg = can.request(event, {_handle: ice.TRUE})
can.user.input(event, can, meta.feature[button], function(ev, btn, data, list, args) {
can.run(event, [ctx.ACTION, button].concat(args), function(msg) {
can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option(nfs.FILE))
can.onimport.project(can, can.Option(nfs.PATH))
}, true)
})
},
compile: function(event, can, button) { var msg = can.ui.search.request(event, {_handle: ice.TRUE, _toast: "编译中..."})
can.run(event, [ctx.ACTION, button], function(msg) {
if (msg.Length() == 0) { var toast = can.user.toast(can, "重启中...", "", -1)
can.core.Timer(5000, function() { toast.close(), can.onaction["展示"]({}, can) })
} else {
can.ui.search._show(msg)
}
}, true)
},
"刷新": function(event, can) {
can.onimport.tabview(can, "src/", "main.go", "", function() {}, true)
},
"加载": function(event, can) {
var file = "/share/local/"+can.Option(nfs.PATH)+can.Option(nfs.FILE)
delete(Volcanos.meta.cache[file])
var script = `\n_can_name = "`+file+`"\n`+
can.onexport.content(can)+
`\n_can_name = ""\nconsole.log("once")`
eval(script)
},
save: function(event, can) { var msg = can.request(event, {content: can.onexport.content(can)})
can.run(event, [ctx.ACTION, nfs.SAVE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) {
can.user.toastSuccess(can)
}, true)
},
autogen: function(event, can, button) { var meta = can.Conf(), msg = can.request(event, {_handle: ice.TRUE})
can.user.input(event, can, meta.feature[button], function(ev, btn, data, list, args) {
can.run(event, [ctx.ACTION, button].concat(args), function(msg) {
can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option(nfs.FILE))
can.onimport.project(can, can.Option(nfs.PATH))
}, true)
})
},
compile: function(event, can, button) { var msg = can.ui.search.request(event, {_handle: ice.TRUE, _toast: "编译中..."})
can.run(event, [ctx.ACTION, button], function(msg) {
if (msg.Length() == 0) { var toast = can.user.toast(can, "重启中...", "", -1)
can.core.Timer(5000, function() { toast.close(), can.onaction["展示"]({}, can) })
} else {
can.ui.search._show(msg)
}
}, true)
},
_selectLine: function(event, can) {
can.page.Select(can, can.current.line, "td.text", function(td) { can.current.line.appendChild(can.ui.current)
can.page.Modify(can, can.ui.current, {style: kit.Dict(html.LEFT, td.offsetLeft-1, html.WIDTH,td.offsetWidth-12), value: td.innerText})
if (event) { if (can.mode == "plugin") { can.onkeymap._insert(event, can) }
can.ui.current.focus(), can.onkeymap.cursorMove(can, can.ui.current, 0, (event.offsetX)/13-1)
can.ui.content.scrollLeft -= 10000
}
})
},
rerankLine: function(can, value) { can.max = 0
can.page.Select(can, can.ui.content, html.TR, function(item, index) {
can.max++, can.page.Select(can, item, "td.line", function(item) { item.innerText = index+1 })
})
},
insertLine: function(can, value, before) {
var line = can.onaction.appendLine(can, value)
before && can.ui.content.insertBefore(line, before)
return can.onaction.rerankLine(can), line
},
deleteLine: function(can, line) {
var next = line.nextSibling||line.previousSibling
can.page.Remove(can, line), can.onaction.rerankLine(can)
return next
},
modifyLine: function(can, line, value) {
can.page.Select(can, can.ui.content, html.TR, function(item, index) {
if (item != line && index+1 != line) { return }
can.page.Select(can, item, "td.text", function(item) {
can.page.Appends(can, item, [can.onsyntax._parse(can, value)])
})
})
},
_selectLine: function(event, can) {
can.page.Select(can, can.current.line, "td.text", function(td) { can.current.line.appendChild(can.ui.current)
can.page.Modify(can, can.ui.current, {style: kit.Dict(html.LEFT, td.offsetLeft-1, html.WIDTH,td.offsetWidth-12), value: td.innerText})
if (event) { if (can.mode == "plugin") { can.onkeymap._insert(event, can) }
can.ui.current.focus(), can.onkeymap.cursorMove(can, can.ui.current, 0, (event.offsetX)/13-1)
can.ui.content.scrollLeft -= 10000
}
})
},
rerankLine: function(can, value) { can.max = 0
can.page.Select(can, can.ui.content, html.TR, function(item, index) {
can.max++, can.page.Select(can, item, "td.line", function(item) { item.innerText = index+1 })
})
},
insertLine: function(can, value, before) {
var line = can.onaction.appendLine(can, value)
before && can.ui.content.insertBefore(line, before)
return can.onaction.rerankLine(can), line
},
deleteLine: function(can, line) {
var next = line.nextSibling||line.previousSibling
can.page.Remove(can, line), can.onaction.rerankLine(can)
return next
},
modifyLine: function(can, line, value) {
can.page.Select(can, can.ui.content, html.TR, function(item, index) {
if (item != line && index+1 != line) { return }
can.page.Select(can, item, "td.text", function(item) {
can.page.Appends(can, item, [can.onsyntax._parse(can, value)])
})
})
},
})
Volcanos("onexport", {help: "导出数据", list: ["文件数", "模式", "按键", "解析器", "文件名", "当前行", "跳转数"]})

View File

@ -1,199 +1,199 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onmotion.clear(can, target)
can.ui = can.onlayout.profile(can)
can.onmotion.hidden(can, can._action)
can.onimport[can.Option("scale")||"week"](can, msg)
can.page.Modify(can, can.ui.project, {style: {"max-height": can.ui.content.offsetHeight}})
can.page.Modify(can, can.ui.profile, {style: {"max-height": can.ui.content.offsetHeight}})
can.page.Modify(can, can.ui.profile, {style: {display: "block"}})
can.base.isFunc(cb) && cb(msg)
},
_content: function(can, msg, head, list, key, get, set) {
var hash = {}; msg.Table(function(value, index) {
var k = key(can.base.Date(value.begin_time)); hash[k] = (hash[k]||[]).concat([value])
})
can.onmotion.clear(can, target)
can.ui = can.onlayout.profile(can)
can.onmotion.hidden(can, can._action)
can.onimport[can.Option("scale")||"week"](can, msg)
can.page.Modify(can, can.ui.project, {style: {"max-height": can.ui.content.offsetHeight}})
can.page.Modify(can, can.ui.profile, {style: {"max-height": can.ui.content.offsetHeight}})
can.page.Modify(can, can.ui.profile, {style: {display: "block"}})
can.base.isFunc(cb) && cb(msg)
},
_content: function(can, msg, head, list, key, get, set) {
var hash = {}; msg.Table(function(value, index) {
var k = key(can.base.Date(value.begin_time)); hash[k] = (hash[k]||[]).concat([value])
})
can.sup.task && (can.sup.task._target = null)
var begin_time = can.base.Date(can.Option("begin_time"))
can.page.Append(can, can.ui.content, [{view: [chat.CONTENT, html.TABLE], list: can.core.List(list, function(hour, row) {
return {type: html.TR, list: can.core.List(head, function(week, col) {
if (row == 0) { return {text: [week, html.TH]} }
if (col == 0) { return {text: [hour, html.TD]} }
return can.onimport._task(can, msg, get(begin_time, col, row, hash), set(begin_time, col, row))
})}
}) }])
can.core.Timer(10, function() { if (!can.sup.task) { return }
var target = can.sup.task._target||can.task._target
can.sup.task = null, target.click()
can.Status("count", msg.Length())
})
},
_task: function(can, msg, list, time) { return {text: ["", html.TD],
ondblclick: function(event) {
can.onaction.insertTask(event, can, time+can.base.Time(null, "%y-%m-%d %H:%M:%S").slice(time.length))
},
ondrop: function(event) { event.preventDefault()
can.drop(event, event.target, time)
},
ondragover: function(event) { event.preventDefault()
can.page.Select(can, can.ui.content, html.TD, function(item) {
can.page.ClassList[event.target == item? "add": "del"](can, item, "over")
})
},
list: can.core.List(list, function(task) { return can.base.isString(task)? {text: [task, html.DIV, "date"]}:
{text: [can.onexport[can.Action("view")||"text"](can, task), html.DIV, can.onexport.style(can, task)],
ondragstart: function(event) { var target = event.target; can.drop = function(event, td, time) { td.append(target)
can.onaction.modifyTask(event, can, task, "begin_time", time+task.begin_time.slice(time.length), task.begin_time)
} }, draggable: time != undefined,
can.sup.task && (can.sup.task._target = null)
var begin_time = can.base.Date(can.Option("begin_time"))
can.page.Append(can, can.ui.content, [{view: [chat.CONTENT, html.TABLE], list: can.core.List(list, function(hour, row) {
return {type: html.TR, list: can.core.List(head, function(week, col) {
if (row == 0) { return {text: [week, html.TH]} }
if (col == 0) { return {text: [hour, html.TD]} }
return can.onimport._task(can, msg, get(begin_time, col, row, hash), set(begin_time, col, row))
})}
}) }])
can.core.Timer(10, function() { if (!can.sup.task) { return }
var target = can.sup.task._target||can.task._target
can.sup.task = null, target.click()
can.Status("count", msg.Length())
})
},
_task: function(can, msg, list, time) { return {text: ["", html.TD],
ondblclick: function(event) {
can.onaction.insertTask(event, can, time+can.base.Time(null, "%y-%m-%d %H:%M:%S").slice(time.length))
},
ondrop: function(event) { event.preventDefault()
can.drop(event, event.target, time)
},
ondragover: function(event) { event.preventDefault()
can.page.Select(can, can.ui.content, html.TD, function(item) {
can.page.ClassList[event.target == item? "add": "del"](can, item, "over")
})
},
list: can.core.List(list, function(task) { return can.base.isString(task)? {text: [task, html.DIV, "date"]}:
{text: [can.onexport[can.Action("view")||"text"](can, task), html.DIV, can.onexport.style(can, task)],
ondragstart: function(event) { var target = event.target; can.drop = function(event, td, time) { td.append(target)
can.onaction.modifyTask(event, can, task, "begin_time", time+task.begin_time.slice(time.length), task.begin_time)
} }, draggable: time != undefined,
title: can.onexport.title(can, task), _init: function(target) {
var item = can.onappend.item(can, html.ITEM, {nick: task.name+":"+task.text}, function() {
can.core.Timer(10, function() { can.onmotion.select(can, can.ui.content, html.TD, target.parentNode) })
can.onimport._profile(can, task)
}, function() {
title: can.onexport.title(can, task), _init: function(target) {
var item = can.onappend.item(can, html.ITEM, {nick: task.name+":"+task.text}, function() {
can.core.Timer(10, function() { can.onmotion.select(can, can.ui.content, html.TD, target.parentNode) })
can.onimport._profile(can, task)
}, function() {
}, can.ui.project); task._target = target, can.task = can.task||task, can.sup.task = can.sup.task||task
can.sup.task.zone == task.zone && can.sup.task.id == task.id && (can.sup.task._target = target)
target.onclick = function(event) { item.click() }
},
}
}),
} },
_profile: function(can, task) {
if (can.sup.task && can.sup.task.pod == task.pod && can.sup.task.id == task.id) { return }
if (can.onmotion.cache(can, function() { return can.sup.task = task, can.Status(task), [task.pod, task.zone, task.id].join(ice.PT) }, can.ui.profile, can.ui.display)) { return }
}, can.ui.project); task._target = target, can.task = can.task||task, can.sup.task = can.sup.task||task
can.sup.task.zone == task.zone && can.sup.task.id == task.id && (can.sup.task._target = target)
target.onclick = function(event) { item.click() }
},
}
}),
} },
_profile: function(can, task) {
if (can.sup.task && can.sup.task.pod == task.pod && can.sup.task.id == task.id) { return }
if (can.onmotion.cache(can, function() { return can.sup.task = task, can.Status(task), [task.pod, task.zone, task.id].join(ice.PT) }, can.ui.profile, can.ui.display)) { return }
task.extra && can.core.Item(can.base.Obj(task.extra), function(key, value) { task["extra."+key] = value }), delete(task.extra)
var table = can.page.Appends(can, can.ui.profile, [{view: [chat.CONTENT, html.TABLE], list: [{th: ["key", "value"]}]}]).first
can.core.Item(task, function(key, value) { key != "_target" && can.page.Append(can, table, [{
td: [key, key == "pod" && value != ""? can.page.Format("a", can.misc.MergeURL(can, {pod: value}), value): value],
onclick: function(event) { if (event.target.type == "button") { var msg = can.request(event, can.sup.task)
can.run(event, [ctx.ACTION, event.target.name], function(msg) { can.Update() }, true)
} },
ondblclick: function(event) { can.onmotion.modify(can, event.target, function(ev, value, old) {
can.onaction.modifyTask(event, can, task, key, value)
}, {name: key, action: key.indexOf("time") > 0? "date": "key"}) },
}]) }), can.onimport._display(can, task)
},
_display: function(can, task) { if (!task["extra.cmd"]) { return }
can.onappend.plugin(can, {type: chat.STORY, ctx: task["extra.ctx"], cmd: task["extra.cmd"], arg: task["extra.arg"]}, function(sub, meta) {
sub.run = function(event, cmds, cb) { var msg = can.request(event, kit.Dict("task.pod", task["pod"], "task.zone", task.zone, "task.id", task.id))
can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, task[mdb.ZONE], task[mdb.ID]], cmds), cb, true)
}
}, can.ui.display)
can.page.Modify(can, can.ui.display, {style: {display: html.BLOCK}})
},
task.extra && can.core.Item(can.base.Obj(task.extra), function(key, value) { task["extra."+key] = value }), delete(task.extra)
var table = can.page.Appends(can, can.ui.profile, [{view: [chat.CONTENT, html.TABLE], list: [{th: ["key", "value"]}]}]).first
can.core.Item(task, function(key, value) { key != "_target" && can.page.Append(can, table, [{
td: [key, key == "pod" && value != ""? can.page.Format("a", can.misc.MergeURL(can, {pod: value}), value): value],
onclick: function(event) { if (event.target.type == "button") { var msg = can.request(event, can.sup.task)
can.run(event, [ctx.ACTION, event.target.name], function(msg) { can.Update() }, true)
} },
ondblclick: function(event) { can.onmotion.modify(can, event.target, function(ev, value, old) {
can.onaction.modifyTask(event, can, task, key, value)
}, {name: key, action: key.indexOf("time") > 0? "date": "key"}) },
}]) }), can.onimport._display(can, task)
},
_display: function(can, task) { if (!task["extra.cmd"]) { return }
can.onappend.plugin(can, {type: chat.STORY, ctx: task["extra.ctx"], cmd: task["extra.cmd"], arg: task["extra.arg"]}, function(sub, meta) {
sub.run = function(event, cmds, cb) { var msg = can.request(event, kit.Dict("task.pod", task["pod"], "task.zone", task.zone, "task.id", task.id))
can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, task[mdb.ZONE], task[mdb.ID]], cmds), cb, true)
}
}, can.ui.display)
can.page.Modify(can, can.ui.display, {style: {display: html.BLOCK}})
},
day: function(can, msg) {
var head = ["hour", "task"]
var list = [0]; for (var i = 7; i < 24; i++) { list.push(can.base.Number(i, 2)) }
day: function(can, msg) {
var head = ["hour", "task"]
var list = [0]; for (var i = 7; i < 24; i++) { list.push(can.base.Number(i, 2)) }
function key(time) { return can.base.Number(time.getHours(), 2) }
function get(begin_time, col, row, hash) { return hash[list[row]] }
function set(begin_time, col, row) { return can.base.Time(begin_time, "%y-%m-%d ")+list[row] }
function key(time) { return can.base.Number(time.getHours(), 2) }
function get(begin_time, col, row, hash) { return hash[list[row]] }
function set(begin_time, col, row) { return can.base.Time(begin_time, "%y-%m-%d ")+list[row] }
can.onimport._content(can, msg, head, list, key, get, set)
},
week: function(can, msg) {
var head = ["hour"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"])
var list = [0]; for (var i = 7; i < 24; i++) { list.push(can.base.Number(i, 2)) }
can.onimport._content(can, msg, head, list, key, get, set)
},
week: function(can, msg) {
var head = ["hour"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"])
var list = [0]; for (var i = 7; i < 24; i++) { list.push(can.base.Number(i, 2)) }
function key(time) { return time.getDay()+" "+can.base.Number(time.getHours(), 2) }
function get(begin_time, col, row, hash) { return hash[col-1+" "+list[row]] }
function set(begin_time, col, row) { return can.base.Time(can.base.TimeAdd(begin_time, -begin_time.getDay()+col-1), "%y-%m-%d ")+list[row] }
function key(time) { return time.getDay()+" "+can.base.Number(time.getHours(), 2) }
function get(begin_time, col, row, hash) { return hash[col-1+" "+list[row]] }
function set(begin_time, col, row) { return can.base.Time(can.base.TimeAdd(begin_time, -begin_time.getDay()+col-1), "%y-%m-%d ")+list[row] }
can.onimport._content(can, msg, head, list, key, get, set)
},
month: function(can, msg) {
var head = ["order"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"])
var list = [0]; for (var i = 1; i < 6; i++) { list.push(i) }
can.onimport._content(can, msg, head, list, key, get, set)
},
month: function(can, msg) {
var head = ["order"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"])
var list = [0]; for (var i = 1; i < 6; i++) { list.push(i) }
function key(time) { return can.base.Time(time, "%y-%m-%d") }
function get(begin_time, col, row, hash) {
var begin = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1))
var last = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)-begin.getDay())
var day = can.base.TimeAdd(last, (row-1)*7+col)
return [day.getDate()+""].concat(hash[key(day)]||[])
}
function set(begin_time, col, row) {
var begin = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1))
var last = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)-begin.getDay())
var day = can.base.TimeAdd(last, (row-1)*7+col)
return key(day)
}
function key(time) { return can.base.Time(time, "%y-%m-%d") }
function get(begin_time, col, row, hash) {
var begin = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1))
var last = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)-begin.getDay())
var day = can.base.TimeAdd(last, (row-1)*7+col)
return [day.getDate()+""].concat(hash[key(day)]||[])
}
function set(begin_time, col, row) {
var begin = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1))
var last = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)-begin.getDay())
var day = can.base.TimeAdd(last, (row-1)*7+col)
return key(day)
}
can.onimport._content(can, msg, head, list, key, get, set)
},
year: function(can, msg) {
var head = ["month"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"]);
var list = [0]; for (var i = 1; i < 13; i++) { list.push(i) }
can.onimport._content(can, msg, head, list, key, get, set)
},
year: function(can, msg) {
var head = ["month"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"]);
var list = [0]; for (var i = 1; i < 13; i++) { list.push(i) }
function key(time) { return can.base.Time(time, "%y-%m ")+time.getDay() }
function get(begin_time, col, row, hash) { return hash[begin_time.getFullYear()+"-"+can.base.Number(row, 2)+" "+(col-1)] }
function set(begin_time, col, row) { return begin_time.getFullYear()+"-"+can.base.Number(list[row], 2) }
function key(time) { return can.base.Time(time, "%y-%m ")+time.getDay() }
function get(begin_time, col, row, hash) { return hash[begin_time.getFullYear()+"-"+can.base.Number(row, 2)+" "+(col-1)] }
function set(begin_time, col, row) { return begin_time.getFullYear()+"-"+can.base.Number(list[row], 2) }
can.onimport._content(can, msg, head, list, key, get, set)
},
long: function(can, msg) {
var begin_time = can.base.Date(can.base.Time(can.Option("begin_time"), "%y-%m-%d %H:%M:%S"))
var begin = begin_time.getFullYear() - 5
can.onimport._content(can, msg, head, list, key, get, set)
},
long: function(can, msg) {
var begin_time = can.base.Date(can.base.Time(can.Option("begin_time"), "%y-%m-%d %H:%M:%S"))
var begin = begin_time.getFullYear() - 5
var head = ["month"]; for (var i = 0; i < 10; i++) { head.push(begin+i) }
var list = [0]; for (var i = 1; i < 13; i++) { list.push(i) }
var head = ["month"]; for (var i = 0; i < 10; i++) { head.push(begin+i) }
var list = [0]; for (var i = 1; i < 13; i++) { list.push(i) }
function key(time) { return can.base.Time(time, "%y-%m") }
function get(begin_time, col, row, hash) { return hash[begin+col-1+"-"+can.base.Number(row, 2)] }
function set(begin_time, col, row) { return begin+col-1+"-"+can.base.Number(row, 2) }
function key(time) { return can.base.Time(time, "%y-%m") }
function get(begin_time, col, row, hash) { return hash[begin+col-1+"-"+can.base.Number(row, 2)] }
function set(begin_time, col, row) { return begin+col-1+"-"+can.base.Number(row, 2) }
can.onimport._content(can, msg, head, list, key, get, set)
},
can.onimport._content(can, msg, head, list, key, get, set)
},
}, [""])
Volcanos("onaction", {help: "组件交互", list: [
["level", "all", "l1", "l2", "l3", "l4", "l5"],
["status", "all", "prepare", "process", "cancel", "finish"],
["score", "all", "s1", "s2", "s3", "s4", "s5"],
["view", "", "name", "text", "level", "score"],
],
insertTask: function(event, can, time) { var msg = can.sup.request(event, {begin_time: time})
can.user.input(event, can, can.Conf("feature.insert"), function(event, button, data, list) {
can.run(event, can.base.Simple(ctx.ACTION, mdb.INSERT, data, "begin_time", time), true)
})
},
modifyTask: function(event, can, task, key, value) { var msg = can.request(event, task)
can.run(event, [ctx.ACTION, mdb.MODIFY, key, value, task[key]])
},
["level", "all", "l1", "l2", "l3", "l4", "l5"],
["status", "all", "prepare", "process", "cancel", "finish"],
["score", "all", "s1", "s2", "s3", "s4", "s5"],
["view", "", "name", "text", "level", "score"],
],
insertTask: function(event, can, time) { var msg = can.sup.request(event, {begin_time: time})
can.user.input(event, can, can.Conf("feature.insert"), function(event, button, data, list) {
can.run(event, can.base.Simple(ctx.ACTION, mdb.INSERT, data, "begin_time", time), true)
})
},
modifyTask: function(event, can, task, key, value) { var msg = can.request(event, task)
can.run(event, [ctx.ACTION, mdb.MODIFY, key, value, task[key]])
},
_filter: function(event, can, key, value) { var count = 0
if (value == "all") {
can.page.Select(can, can.ui.content, "div.item", function(item) {
can.page.ClassList.del(can, item, "hide"), count++
})
} else {
can.page.Select(can, can.ui.content, "div.item", function(item) {
can.page.ClassList.add(can, item, "hide")
})
can.page.Select(can, can.ui.content, "div."+value, function(item) {
can.page.ClassList.del(can, item, "hide"), count++
})
}
can.Action(key, value), can.Status("count", count)
},
level: function(event, can, key, value) { can.onaction._filter(event, can, key, value) },
status: function(event, can, key, value) { can.onaction._filter(event, can, key, value) },
score: function(event, can, key, value) { can.onaction._filter(event, can, key, value) },
view: function(event, can, key, value) {
can.Action(key, value)
can.onmotion.clear(can, can.ui.project)
can.onmotion.clear(can, can.ui.content)
can.onimport[can.Option("scale")](can, can._msg)
},
_filter: function(event, can, key, value) { var count = 0
if (value == "all") {
can.page.Select(can, can.ui.content, "div.item", function(item) {
can.page.ClassList.del(can, item, "hide"), count++
})
} else {
can.page.Select(can, can.ui.content, "div.item", function(item) {
can.page.ClassList.add(can, item, "hide")
})
can.page.Select(can, can.ui.content, "div."+value, function(item) {
can.page.ClassList.del(can, item, "hide"), count++
})
}
can.Action(key, value), can.Status("count", count)
},
level: function(event, can, key, value) { can.onaction._filter(event, can, key, value) },
status: function(event, can, key, value) { can.onaction._filter(event, can, key, value) },
score: function(event, can, key, value) { can.onaction._filter(event, can, key, value) },
view: function(event, can, key, value) {
can.Action(key, value)
can.onmotion.clear(can, can.ui.project)
can.onmotion.clear(can, can.ui.content)
can.onimport[can.Option("scale")](can, can._msg)
},
})
Volcanos("onexport", {help: "导出数据", list: ["count", "begin_time", "zone", "id", "type", "name", "text"],
name: function(can, task) { return task.name },
text: function(can, task) { return task.name+": "+(task.text||"") },
level: function(can, task) { return "l-"+(task.level||3)+": "+(task.name||"") },
score: function(can, task) { return "s-"+(task.level||3)+": "+(task.name||"") },
title: function(can, task) { return task.zone+": "+(task.type||"") },
style: function(can, task) { return ["item", task.status, "id"+task.id, "l"+(task.level||""), "s"+(task.score||"")].join(" ") },
name: function(can, task) { return task.name },
text: function(can, task) { return task.name+": "+(task.text||"") },
level: function(can, task) { return "l-"+(task.level||3)+": "+(task.name||"") },
score: function(can, task) { return "s-"+(task.level||3)+": "+(task.name||"") },
title: function(can, task) { return task.zone+": "+(task.type||"") },
style: function(can, task) { return ["item", task.status, "id"+task.id, "l"+(task.level||""), "s"+(task.score||"")].join(" ") },
})

View File

@ -1,143 +1,143 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb) {
can.ui = can.onlayout.display(can)
can.base.isFunc(cb) && cb(msg)
can.ui = can.onlayout.display(can)
can.base.isFunc(cb) && cb(msg)
can.table = can.onappend.table(can, msg, function(value, key, index, line) {
return {text: [value, "td"], oncontextmenu: function(event) {
can.user.carte(event, can, can.ondetail, can.ondetail.list, function(ev, cmd, meta) {
var cb = meta[cmd]; cb && cb(event, can, cmd, value, key, index, line)
})
}, ondblclick: function(event) {
can.page.Modify(can, event.target, {contenteditable: true})
}, onclick: function(event) {
if (key == "path") { can.run(event, [can.Option("path", value)]) }
}}
}, can.ui.content)
can.table = can.onappend.table(can, msg, function(value, key, index, line) {
return {text: [value, "td"], oncontextmenu: function(event) {
can.user.carte(event, can, can.ondetail, can.ondetail.list, function(ev, cmd, meta) {
var cb = meta[cmd]; cb && cb(event, can, cmd, value, key, index, line)
})
}, ondblclick: function(event) {
can.page.Modify(can, event.target, {contenteditable: true})
}, onclick: function(event) {
if (key == "path") { can.run(event, [can.Option("path", value)]) }
}}
}, can.ui.content)
can.onexport.list = msg.append
can.onaction._compute(event, can)
},
can.onexport.list = msg.append
can.onaction._compute(event, can)
},
})
Volcanos("onfigure", {help: "组件菜单", list: [],
"求和": function(event, can, res, td, index) {
res[index] = parseInt(td.innerText) + (res[index]||0);
},
"最大": function(event, can, res, td, index) {
var n = parseInt(td.innerText);
n > (res[index]||-10000) && (res[index] = n);
},
"最小": function(event, can, res, td, index) {
var n = parseInt(td.innerText);
n < (res[index]||10000) && (res[index] = n);
},
"平均": function(event, can, res, td, ncol, cols, rows, nrow) {
res[ncol] = parseInt(td.innerText) + (res[ncol]||0);
if (nrow == rows.length - 1) {
res[ncol] = res[ncol] / nrow
}
},
"求和": function(event, can, res, td, index) {
res[index] = parseInt(td.innerText) + (res[index]||0);
},
"最大": function(event, can, res, td, index) {
var n = parseInt(td.innerText);
n > (res[index]||-10000) && (res[index] = n);
},
"最小": function(event, can, res, td, index) {
var n = parseInt(td.innerText);
n < (res[index]||10000) && (res[index] = n);
},
"平均": function(event, can, res, td, ncol, cols, rows, nrow) {
res[ncol] = parseInt(td.innerText) + (res[ncol]||0);
if (nrow == rows.length - 1) {
res[ncol] = res[ncol] / nrow
}
},
})
Volcanos("onaction", {help: "组件菜单", list: ["保存", ["mode", "全选", "块选", "反选", "多选", "拖动", "编辑"], ["some", "求和", "最大", "最小", "平均"]],
_compute: function(event, can) {
var mul = "tr" + (can.Action("mode") == "全选"? "": ".select")
var method = can.onfigure[can.Action("some")], res = {}
_compute: function(event, can) {
var mul = "tr" + (can.Action("mode") == "全选"? "": ".select")
var method = can.onfigure[can.Action("some")], res = {}
can.page.Select(can, can.ui.content, mul, function(tr, nrow, rows) {
(mul != "tr" || nrow > 0) && can.page.Select(can, tr, "td", function(td, ncol, cols) {
method && method(event, can, res, td, ncol, cols, rows, nrow)
})
})
can.page.Select(can, can.ui.content, mul, function(tr, nrow, rows) {
(mul != "tr" || nrow > 0) && can.page.Select(can, tr, "td", function(td, ncol, cols) {
method && method(event, can, res, td, ncol, cols, rows, nrow)
})
})
can.core.Item(res, function(key, value) {
can.Status(can._msg.append[key], value||"")
})
},
can.core.Item(res, function(key, value) {
can.Status(can._msg.append[key], value||"")
})
},
"保存": function(event, can, cmd) {
can.run(event, [ctx.ACTION, cmd, can.Option("path"), can.onexport.file(can)], function(msg) {
can.user.toastSuccess(can)
}, true)
},
some: function(event, can, cmd) {
can.onaction._compute(event, can)
},
"保存": function(event, can, cmd) {
can.run(event, [ctx.ACTION, cmd, can.Option("path"), can.onexport.file(can)], function(msg) {
can.user.toastSuccess(can)
}, true)
},
some: function(event, can, cmd) {
can.onaction._compute(event, can)
},
"全选": function(event, can, cmd) {
cmd && can.Action("mode", cmd)
can.page.Select(can, can.ui.content, "tr", function(item) {
can.page.ClassList.del(can, item, "over")
can.page.ClassList.del(can, item, "select")
item.setAttribute("contenteditable", false)
item.setAttribute("draggable", false)
item.onmouseenter = null
item.onclick = null
})
can.onaction._compute(event, can)
},
"块选": function(event, can, cmd) {
cmd && can.Action("mode", cmd)
can.page.Select(can, can.ui.content, "tr", function(item) {
item.onmouseenter = function() {
can.page.ClassList.add(can, item, "select")
can.onaction._compute(event, can)
}
})
},
"反选": function(event, can, cmd) {
cmd && can.Action("mode", cmd)
can.page.Select(can, can.ui.content, "tr", function(item) {
item.onmouseenter = function() {
can.page.ClassList.del(can, item, "select")
can.onaction._compute(event, can)
}
})
},
"多选": function(event, can, cmd) {
cmd && can.Action("mode", cmd)
can.page.Select(can, can.ui.content, "tr", function(item) {
item.onclick = function() {
can.page.ClassList.neg(can, item, "select")
can.onaction._compute(event, can)
}
})
},
"拖动": function(event, can, cmd) {
can.onaction["全选"](event, can, cmd)
can.page.Select(can, can.ui.content, "tr", function(item) {
item.setAttribute("draggable", true)
item.ondragstart = function(event) { can.drag = item }
item.ondragover = function(event) { event.preventDefault(), can.page.ClassList.add(can, item, "over")}
item.ondragleave = function(event) { can.page.ClassList.del(can, item, "over") }
item.ondrop = function(event) { event.preventDefault()
can.page.Select(can, can.ui.content, "table", function(table) {
table.insertBefore(can.drag, item)
})
}
})
},
"编辑": function(event, can, cmd) {
cmd && can.Action("mode", cmd)
can.page.Select(can, can.ui.content, "tr", function(item) {
item.setAttribute("contenteditable", true)
})
},
"全选": function(event, can, cmd) {
cmd && can.Action("mode", cmd)
can.page.Select(can, can.ui.content, "tr", function(item) {
can.page.ClassList.del(can, item, "over")
can.page.ClassList.del(can, item, "select")
item.setAttribute("contenteditable", false)
item.setAttribute("draggable", false)
item.onmouseenter = null
item.onclick = null
})
can.onaction._compute(event, can)
},
"块选": function(event, can, cmd) {
cmd && can.Action("mode", cmd)
can.page.Select(can, can.ui.content, "tr", function(item) {
item.onmouseenter = function() {
can.page.ClassList.add(can, item, "select")
can.onaction._compute(event, can)
}
})
},
"反选": function(event, can, cmd) {
cmd && can.Action("mode", cmd)
can.page.Select(can, can.ui.content, "tr", function(item) {
item.onmouseenter = function() {
can.page.ClassList.del(can, item, "select")
can.onaction._compute(event, can)
}
})
},
"多选": function(event, can, cmd) {
cmd && can.Action("mode", cmd)
can.page.Select(can, can.ui.content, "tr", function(item) {
item.onclick = function() {
can.page.ClassList.neg(can, item, "select")
can.onaction._compute(event, can)
}
})
},
"拖动": function(event, can, cmd) {
can.onaction["全选"](event, can, cmd)
can.page.Select(can, can.ui.content, "tr", function(item) {
item.setAttribute("draggable", true)
item.ondragstart = function(event) { can.drag = item }
item.ondragover = function(event) { event.preventDefault(), can.page.ClassList.add(can, item, "over")}
item.ondragleave = function(event) { can.page.ClassList.del(can, item, "over") }
item.ondrop = function(event) { event.preventDefault()
can.page.Select(can, can.ui.content, "table", function(table) {
table.insertBefore(can.drag, item)
})
}
})
},
"编辑": function(event, can, cmd) {
cmd && can.Action("mode", cmd)
can.page.Select(can, can.ui.content, "tr", function(item) {
item.setAttribute("contenteditable", true)
})
},
})
Volcanos("ondetail", {help: "组件详情", list: ["复制", "删除"],
"复制": function(event, can, cmd, value, key, index, line) {
var end = can.page.Append(can, can.table, [{type: "tr", list: can.core.List(can._msg.append, function(key) {
return {text: [line[key], "td"]}
})}]).tr
can.table.insertBefore(end, event.target.parentNode)
},
"删除": function(event, can, cmd) {
can.page.Remove(can, event.target.parentNode)
},
"复制": function(event, can, cmd, value, key, index, line) {
var end = can.page.Append(can, can.table, [{type: "tr", list: can.core.List(can._msg.append, function(key) {
return {text: [line[key], "td"]}
})}]).tr
can.table.insertBefore(end, event.target.parentNode)
},
"删除": function(event, can, cmd) {
can.page.Remove(can, event.target.parentNode)
},
})
Volcanos("onexport", {help: "导出数据", list: [],
file: function(can) {
return can.page.Select(can, can.ui.content, "tr", function(tr) {
return can.page.Select(can, tr, "th,td", function(td) {return td.innerHTML}).join(",")
}).join("\n")
},
file: function(can) {
return can.page.Select(can, can.ui.content, "tr", function(tr) {
return can.page.Select(can, tr, "th,td", function(td) {return td.innerHTML}).join(",")
}).join("\n")
},
})

File diff suppressed because it is too large Load Diff

View File

@ -1,125 +1,125 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.path = can.request(), can.list = [], msg.Table(function(value) {
value.path.lastIndexOf(ice.PS)==value.path.length-1? can.path.Push(value): can.list.push(value)
})
can.path = can.request(), can.list = [], msg.Table(function(value) {
value.path.lastIndexOf(ice.PS)==value.path.length-1? can.path.Push(value): can.list.push(value)
})
can.base.isFunc(cb) && cb(msg)
can.ui = can.onlayout.display(can, target)
can.onappend.table(can, can.path, null, can.ui.content)
can.dir_root = msg.Option("dir_root")
can.base.isFunc(cb) && cb(msg)
can.ui = can.onlayout.display(can, target)
can.onappend.table(can, can.path, null, can.ui.content)
can.dir_root = msg.Option("dir_root")
can.Action("height", msg.Option("height")||"100")
can.Action("limit", msg.Option("limit")||"6")
can.Action("rate", msg.Option("rate")||"1")
can.onmotion.hidden(can, can._action)
can.Action("height", msg.Option("height")||"100")
can.Action("limit", msg.Option("limit")||"6")
can.Action("rate", msg.Option("rate")||"1")
can.onmotion.hidden(can, can._action)
can.begin = msg.Option("begin")||"0"
can.onimport.page(can, can.list)
},
_file: function(can, path, index) { var p = location.href.indexOf("http") == 0? "": "http://localhost:9020"
return path.indexOf("http") == 0? path: p+can.base.Path("/share/local", can.dir_root||"", path)
},
file: function(can, path, index) { path = can.onimport._file(can, path, index)
var cb = can.onfigure[can.base.Ext(path)]; can.Status("file", path)
can.base.isFunc(cb) && can.page.Append(can, can.ui.display, [cb(can, path, index)])
},
page: function(can, list, begin, limit) { can.onmotion.clear(can, can.ui.display)
begin = parseInt(begin||can.begin), limit = parseInt(limit||can.Action("limit"))
for (var i = begin; i < begin+limit; i++) { list && list[i] && can.onimport.file(can, list[i].path, i) }
can.Status({begin: begin, limit: limit, total: can.list.length})
},
can.begin = msg.Option("begin")||"0"
can.onimport.page(can, can.list)
},
_file: function(can, path, index) { var p = location.href.indexOf("http") == 0? "": "http://localhost:9020"
return path.indexOf("http") == 0? path: p+can.base.Path("/share/local", can.dir_root||"", path)
},
file: function(can, path, index) { path = can.onimport._file(can, path, index)
var cb = can.onfigure[can.base.Ext(path)]; can.Status("file", path)
can.base.isFunc(cb) && can.page.Append(can, can.ui.display, [cb(can, path, index)])
},
page: function(can, list, begin, limit) { can.onmotion.clear(can, can.ui.display)
begin = parseInt(begin||can.begin), limit = parseInt(limit||can.Action("limit"))
for (var i = begin; i < begin+limit; i++) { list && list[i] && can.onimport.file(can, list[i].path, i) }
can.Status({begin: begin, limit: limit, total: can.list.length})
},
}, ["/plugin/local/wiki/feel.css"])
Volcanos("onfigure", {help: "组件菜单", list: [],
png: function(can, path, index) { return can.onfigure.image(can, path, index) },
jpg: function(can, path, index) { return can.onfigure.image(can, path, index) },
jpeg: function(can, path, index) { return can.onfigure.image(can, path, index) },
image: function(can, path, index) { return {img: path, height: can.Action("height"), onclick: function(event) {
can.ondetail._init(can, index)
}, _init: function(target) { can.Status("file", path) },
onmouseover: function(event) { can.Status("file", path) },
} },
png: function(can, path, index) { return can.onfigure.image(can, path, index) },
jpg: function(can, path, index) { return can.onfigure.image(can, path, index) },
jpeg: function(can, path, index) { return can.onfigure.image(can, path, index) },
image: function(can, path, index) { return {img: path, height: can.Action("height"), onclick: function(event) {
can.ondetail._init(can, index)
}, _init: function(target) { can.Status("file", path) },
onmouseover: function(event) { can.Status("file", path) },
} },
video: function(can, path) { var auto = can.user.isMobile&&can.Action("limit")!="1"? false: true, loop = true, total = 0; function cb(event) { }
return {type: "video", style: {height: parseInt(can.Action("height"))}, className: "preview",
data: {src: path, controls: "controls", autoplay: auto, loop: loop, playbackRate: parseFloat(can.Action("rate"))},
oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb,
onmouseover: function(event) { can.Status("file", path) },
onloadedmetadata: function(event) { total = event.timeStamp
event.target.currentTime = can._msg.currentTime || 0
}, onloadeddata: cb, ontimeupdate: function(event) {
can.Status("file") == path && can.Status("position", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration))
},
}
},
mp4: function(can, path) { return can.onfigure.video(can, path) },
m4v: function(can, path) { return can.onfigure.video(can, path) },
mov: function(can, path) { return can.onfigure.video(can, path) },
video: function(can, path) { var auto = can.user.isMobile&&can.Action("limit")!="1"? false: true, loop = true, total = 0; function cb(event) { }
return {type: "video", style: {height: parseInt(can.Action("height"))}, className: "preview",
data: {src: path, controls: "controls", autoplay: auto, loop: loop, playbackRate: parseFloat(can.Action("rate"))},
oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb,
onmouseover: function(event) { can.Status("file", path) },
onloadedmetadata: function(event) { total = event.timeStamp
event.target.currentTime = can._msg.currentTime || 0
}, onloadeddata: cb, ontimeupdate: function(event) {
can.Status("file") == path && can.Status("position", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration))
},
}
},
mp4: function(can, path) { return can.onfigure.video(can, path) },
m4v: function(can, path) { return can.onfigure.video(can, path) },
mov: function(can, path) { return can.onfigure.video(can, path) },
})
Volcanos("onaction", {help: "组件菜单", list: [
["height", 100, 200, 400, 600, 800],
["limit", 1, 3, 6, 9, 12, 15, 20, 30],
["rate", 0.1, 0.2, 0.5, 1, 2, 3, 5, 10],
],
"上一页": function(event, can, key, value) {
can.begin > 0 && (can.begin -= parseInt(can.Action("limit")), can.onimport.page(can, can.list))
},
"下一页": function(event, can, key, value) {
can.begin + parseInt(can.Action("limit")) < can.list.length && (can.begin += parseInt(can.Action("limit")), can.onimport.page(can, can.list))
},
["height", 100, 200, 400, 600, 800],
["limit", 1, 3, 6, 9, 12, 15, 20, 30],
["rate", 0.1, 0.2, 0.5, 1, 2, 3, 5, 10],
],
"上一页": function(event, can, key, value) {
can.begin > 0 && (can.begin -= parseInt(can.Action("limit")), can.onimport.page(can, can.list))
},
"下一页": function(event, can, key, value) {
can.begin + parseInt(can.Action("limit")) < can.list.length && (can.begin += parseInt(can.Action("limit")), can.onimport.page(can, can.list))
},
"height": function(event, can, key, value) {
can.Action("height", value), can.onimport.page(can, can.list)
},
"limit": function(event, can, key, value) {
can.Action("limit", value), can.onimport.page(can, can.list)
},
"rate": function(event, can, key, value) {
can.Action("rate", value), can.onimport.page(can, can.list)
},
"height": function(event, can, key, value) {
can.Action("height", value), can.onimport.page(can, can.list)
},
"limit": function(event, can, key, value) {
can.Action("limit", value), can.onimport.page(can, can.list)
},
"rate": function(event, can, key, value) {
can.Action("rate", value), can.onimport.page(can, can.list)
},
chooseImage: function(event, can) { var msg = can.request(event)
can.user.agent.chooseImage(function(list) { can.core.List(list, function(item) {
can.page.Append(can, can._output, [{img: item, height: 200}])
}) })
},
chooseImage: function(event, can) { var msg = can.request(event)
can.user.agent.chooseImage(function(list) { can.core.List(list, function(item) {
can.page.Append(can, can._output, [{img: item, height: 200}])
}) })
},
})
Volcanos("ondetail", {help: "组件菜单", list: ["关闭", "下载", "删除", "上一个", "下一个", "设置头像", "设置背景", "复制链接"], _init: function(can, index) {
can.onappend._init(can, {type: "story feel float"}, [], function(sub) { can.sub = sub
sub.run = function(event, cmds, cb) { return can.run(event, cmds, cb, true) }
can.onappend._init(can, {type: "story feel float"}, [], function(sub) { can.sub = sub
sub.run = function(event, cmds, cb) { return can.run(event, cmds, cb, true) }
sub.search({}, ["Action.onexport.size"], function(msg, left, top, width, height) {
sub.page.Modify(sub, sub._target, {style: {left: left, top: top}})
sub.page.Modify(sub, sub._output, {style: {"max-width": width, "max-height": height}})
sub.onappend._action(can, can.ondetail.list, sub._action, can.ondetail)
sub.search({}, ["Action.onexport.size"], function(msg, left, top, width, height) {
sub.page.Modify(sub, sub._target, {style: {left: left, top: top}})
sub.page.Modify(sub, sub._output, {style: {"max-width": width, "max-height": height}})
sub.onappend._action(can, can.ondetail.list, sub._action, can.ondetail)
can.order = index, can.show = function(order) {
path = can.onimport._file(can, can.list[order].path)
sub.page.Appends(sub, sub._output, [{img: path, style: {"max-width": width-40, "max-height": height-55}}])
sub.Status("begin", order+1+ice.PS+can.list.length), sub.Status("file", path)
}, can.show(can.order)
})
}, document.body)
},
"关闭": function(event, can) { can.page.Remove(can, can.sub._target) },
"下载": function(event, can) { can.user.download(can, path = can.onimport._file(can, can.list[can.order].path)) },
"删除": function(event, can) {
can.run(event, [ctx.ACTION, mdb.REMOVE, can.Status("file")], function(msg) { can.user.toast(can, "删除成功") }, true)
},
"上一个": function(event, can) { can.order > 0? can.show(--can.order): can.user.toast(can, "已经是第一张啦!") },
"下一个": function(event, can) { can.order < can.list.length-1? can.show(++can.order): can.user.toast(can, "已经是最后一张啦!") },
"设置头像": function(event, can) { var msg = can.request(event, {url: can.onimport._file(can, can.list[can.order].path)})
can.search(event, ["Header.onimport.avatar"], null, true)
},
"设置背景": function(event, can) { var msg = can.request(event, {url: can.onimport._file(can, can.list[can.order].path)})
can.search(event, ["Header.onimport.background"], null, true)
},
"复制链接": function(event, can) {
can.user.copy(event, can, can.misc.MergeURL(can, {_path: can.onimport._file(can, can.list[can.order].path)}, true))
},
can.order = index, can.show = function(order) {
path = can.onimport._file(can, can.list[order].path)
sub.page.Appends(sub, sub._output, [{img: path, style: {"max-width": width-40, "max-height": height-55}}])
sub.Status("begin", order+1+ice.PS+can.list.length), sub.Status("file", path)
}, can.show(can.order)
})
}, document.body)
},
"关闭": function(event, can) { can.page.Remove(can, can.sub._target) },
"下载": function(event, can) { can.user.download(can, path = can.onimport._file(can, can.list[can.order].path)) },
"删除": function(event, can) {
can.run(event, [ctx.ACTION, mdb.REMOVE, can.Status("file")], function(msg) { can.user.toast(can, "删除成功") }, true)
},
"上一个": function(event, can) { can.order > 0? can.show(--can.order): can.user.toast(can, "已经是第一张啦!") },
"下一个": function(event, can) { can.order < can.list.length-1? can.show(++can.order): can.user.toast(can, "已经是最后一张啦!") },
"设置头像": function(event, can) { var msg = can.request(event, {url: can.onimport._file(can, can.list[can.order].path)})
can.search(event, ["Header.onimport.avatar"], null, true)
},
"设置背景": function(event, can) { var msg = can.request(event, {url: can.onimport._file(can, can.list[can.order].path)})
can.search(event, ["Header.onimport.background"], null, true)
},
"复制链接": function(event, can) {
can.user.copy(event, can, can.misc.MergeURL(can, {_path: can.onimport._file(can, can.list[can.order].path)}, true))
},
})
Volcanos("onexport", {help: "导出数据", list: ["begin", "limit", "total", "position", "file"],
position: function(can, index, total) { total = total || can.max
return parseInt((index+1)*100/total)+"%"+" = "+(parseInt(index)+1)+ice.PS+parseInt(total)
},
position: function(can, index, total) { total = total || can.max
return parseInt((index+1)*100/total)+"%"+" = "+(parseInt(index)+1)+ice.PS+parseInt(total)
},
})

View File

@ -1,189 +1,189 @@
Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target) {
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
if (msg.Length() > 0) { return can.onappend.table(can, msg) }
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
if (msg.Length() > 0) { return can.onappend.table(can, msg) }
can.page.Modify(can, target, msg.Result())
can.page.Select(can, target, wiki.ITEM, function(item) { var data = item.dataset||{}
can.core.CallFunc([can.onimport, data.type], [can, data, item])
can.page.Modify(can, item, {style: can.base.Obj(data.style)})
})
},
navmenu: function(can, data, target) { var nav = can.sup._navmenu
nav = nav||can.page.Append(can, can._fields, [{view: wiki.NAVMENU}]).first
can.onmotion.clear(can, nav), can._fields.insertBefore(nav, can._output)
can.page.Modify(can, target, msg.Result())
can.page.Select(can, target, wiki.ITEM, function(item) { var data = item.dataset||{}
can.core.CallFunc([can.onimport, data.type], [can, data, item])
can.page.Modify(can, item, {style: can.base.Obj(data.style)})
})
},
navmenu: function(can, data, target) { var nav = can.sup._navmenu
nav = nav||can.page.Append(can, can._fields, [{view: wiki.NAVMENU}]).first
can.onmotion.clear(can, nav), can._fields.insertBefore(nav, can._output)
can.onappend.list(can, can.base.Obj(data.data), function(event, item) {
var link = item.meta.link, list = can.core.Split(item.meta.link)
if (can.core.Value(can, list[0])) { return can.core.CallFunc([can, list[0]], list.slice(1)) }
if (!link || link == can.Option(nfs.PATH)) { return false }
can.onappend.list(can, can.base.Obj(data.data), function(event, item) {
var link = item.meta.link, list = can.core.Split(item.meta.link)
if (can.core.Value(can, list[0])) { return can.core.CallFunc([can, list[0]], list.slice(1)) }
if (!link || link == can.Option(nfs.PATH)) { return false }
if (can.onmotion.cache(can, function() { can.user.mod.isCmd && can.user.title(item.meta.name); return can.Option(nfs.PATH, link) })) { return }
return can.sup.Update(event, [link])
}, nav), can.sup._navmenu = nav
if (can.onmotion.cache(can, function() { can.user.mod.isCmd && can.user.title(item.meta.name); return can.Option(nfs.PATH, link) })) { return }
return can.sup.Update(event, [link])
}, nav), can.sup._navmenu = nav
can.getActionSize(function(msg) {
can.page.style(can, nav, html.HEIGHT, can.Conf(html.HEIGHT)+(can.user.mod.isCmd? msg.Option(html.MARGIN_Y): 0))
can.Conf(html.WIDTH, can.Conf(html.WIDTH)-nav.offsetWidth-(can.user.mod.isCmd? 10: 20))
can.page.Modify(can, can._output, {style: kit.Dict(
html.HEIGHT, can.sup._navmenu.offsetHeight, html.MAX_WIDTH, can.Conf(html.WIDTH),
html.FLOAT, html.LEFT, html.CLEAR, html.NONE
)})
})
},
premenu: function(can, data, target) {
can.page.Select(can, can._output, can.page.Keys(wiki.H2, wiki.H3), function(item) {
can.page.Append(can, target, [{text: [item.innerHTML, html.LI, item.tagName], onclick: function() {
item.scrollIntoView()
}}]), item.onclick = function(event) { target.scrollIntoView() }
})
},
title: function(can, data, target) {
can.user.mod.isCmd && target.tagName == "H1" && can.user.title(data.text)
},
spark: function(can, data, target) {
if (data[mdb.NAME] == html.INNER) { return can.onmotion.copy(can, target) }
can.page.Select(can, target, html.A, function(item) { can.onmotion.link(can, item) })
can.page.Select(can, target, html.SPAN, function(item) { can.onmotion.copy(can, item) })
},
chart: function(can, data, target) {
target.oncontextmenu = function(event) {
can.user.carteClient(event, can, kit.Dict(mdb.EXPORT, function(event, can, button) {
can.user.toPNG(can, can.user.prompt("please input file name", "hi")+".png", target.outerHTML,
parseInt(target.getAttribute(html.HEIGHT))||200, parseInt(target.getAttribute(html.WIDTH))||200)
}), [mdb.EXPORT])
}
},
table: function(can, data, target) {
can.page.OrderTable(can, target), can.page.ClassList.add(can, target, chat.CONTENT)
can.page.Select(can, target, html.TD, function(item) { can.onmotion.copy(can, item) })
},
field: function(can, data, target, width) { var item = can.base.Obj(data.meta)
can.onappend._init(can, item, [chat.PLUGIN_STATE_JS], function(sub) {
sub.run = function(event, cmds, cb, silent) {
can.run(event, can.misc.concat(can, [ctx.ACTION, chat.STORY, data.type, data.name, data.text], cmds), cb, true)
}
sub.Conf(html.HEIGHT, can.Conf(html.HEIGHT))
sub.Conf(html.WIDTH, item.width = (width||can.Conf(html.WIDTH))-20)
can.getActionSize(function(msg) {
can.page.style(can, nav, html.HEIGHT, can.Conf(html.HEIGHT)+(can.user.mod.isCmd? msg.Option(html.MARGIN_Y): 0))
can.Conf(html.WIDTH, can.Conf(html.WIDTH)-nav.offsetWidth-(can.user.mod.isCmd? 10: 20))
can.page.Modify(can, can._output, {style: kit.Dict(
html.HEIGHT, can.sup._navmenu.offsetHeight, html.MAX_WIDTH, can.Conf(html.WIDTH),
html.FLOAT, html.LEFT, html.CLEAR, html.NONE
)})
})
},
premenu: function(can, data, target) {
can.page.Select(can, can._output, can.page.Keys(wiki.H2, wiki.H3), function(item) {
can.page.Append(can, target, [{text: [item.innerHTML, html.LI, item.tagName], onclick: function() {
item.scrollIntoView()
}}]), item.onclick = function(event) { target.scrollIntoView() }
})
},
title: function(can, data, target) {
can.user.mod.isCmd && target.tagName == "H1" && can.user.title(data.text)
},
spark: function(can, data, target) {
if (data[mdb.NAME] == html.INNER) { return can.onmotion.copy(can, target) }
can.page.Select(can, target, html.A, function(item) { can.onmotion.link(can, item) })
can.page.Select(can, target, html.SPAN, function(item) { can.onmotion.copy(can, item) })
},
chart: function(can, data, target) {
target.oncontextmenu = function(event) {
can.user.carteClient(event, can, kit.Dict(mdb.EXPORT, function(event, can, button) {
can.user.toPNG(can, can.user.prompt("please input file name", "hi")+".png", target.outerHTML,
parseInt(target.getAttribute(html.HEIGHT))||200, parseInt(target.getAttribute(html.WIDTH))||200)
}), [mdb.EXPORT])
}
},
table: function(can, data, target) {
can.page.OrderTable(can, target), can.page.ClassList.add(can, target, chat.CONTENT)
can.page.Select(can, target, html.TD, function(item) { can.onmotion.copy(can, item) })
},
field: function(can, data, target, width) { var item = can.base.Obj(data.meta)
can.onappend._init(can, item, [chat.PLUGIN_STATE_JS], function(sub) {
sub.run = function(event, cmds, cb, silent) {
can.run(event, can.misc.concat(can, [ctx.ACTION, chat.STORY, data.type, data.name, data.text], cmds), cb, true)
}
sub.Conf(html.HEIGHT, can.Conf(html.HEIGHT))
sub.Conf(html.WIDTH, item.width = (width||can.Conf(html.WIDTH))-20)
can.core.Value(item, "auto.cmd") && can.core.Timer300ms(function() {
var msg = sub.request({}, can.core.Value(item, "opts")); msg.Option(ice.MSG_HANDLE, ice.TRUE)
sub.Update(msg._event, [ctx.ACTION, can.core.Value(item, "auto.cmd")])
})
}, can._output, target)
},
iframe: function(can, data, target) { var meta = can.base.Obj(data.meta)
can.page.Modify(can, target, {width: can.Conf(html.WIDTH)-200})
},
can.core.Value(item, "auto.cmd") && can.core.Timer300ms(function() {
var msg = sub.request({}, can.core.Value(item, "opts")); msg.Option(ice.MSG_HANDLE, ice.TRUE)
sub.Update(msg._event, [ctx.ACTION, can.core.Value(item, "auto.cmd")])
})
}, can._output, target)
},
iframe: function(can, data, target) { var meta = can.base.Obj(data.meta)
can.page.Modify(can, target, {width: can.Conf(html.WIDTH)-200})
},
}, [""])
Volcanos("onkeymap", {help: "键盘交互", list: [],
_mode: {
normal: {
"n": function(event, can) { can.ondetail.next(can.sub) },
"j": function(event, can) { can.ondetail.next(can.sub) },
"ArrowRight": function(event, can) { can.ondetail.next(can.sub) },
"ArrowLeft": function(event, can) { can.ondetail.prev(can.sub) },
"k": function(event, can) { can.ondetail.prev(can.sub) },
"p": function(event, can) { can.ondetail.prev(can.sub) },
_mode: {
normal: {
"n": function(event, can) { can.ondetail.next(can.sub) },
"j": function(event, can) { can.ondetail.next(can.sub) },
"ArrowRight": function(event, can) { can.ondetail.next(can.sub) },
"ArrowLeft": function(event, can) { can.ondetail.prev(can.sub) },
"k": function(event, can) { can.ondetail.prev(can.sub) },
"p": function(event, can) { can.ondetail.prev(can.sub) },
"q": function(event, can) { can.ondetail["结束"](event, can.sub) },
"h": function(event, can) { can.ondetail["隐藏"](event, can.sub) },
},
}, _engine: {},
"q": function(event, can) { can.ondetail["结束"](event, can.sub) },
"h": function(event, can) { can.ondetail["隐藏"](event, can.sub) },
},
}, _engine: {},
})
Volcanos("onaction", {help: "控件交互", list: [],
play: function(event, can) { var list = [], current = []
can.page.Select(can, can._output, wiki.ITEM, function(item) {
switch (item.tagName) {
case "H1":
case "H2":
case "H3":
list.push(current = [])
break
}
current.push(item)
})
play: function(event, can) { var list = [], current = []
can.page.Select(can, can._output, wiki.ITEM, function(item) {
switch (item.tagName) {
case "H1":
case "H2":
case "H3":
list.push(current = [])
break
}
current.push(item)
})
can.onappend._init(can, {type: "story word float"}, [], function(sub) {
sub.run = can.run, sub.sup = can, can.sub = sub, can.onappend._action(sub, [
["布局", "开讲", "快闪", "网格"], "大纲", "首页", "上一页",
["菜单"].concat(can.core.List(list, function(page) { return page[0].innerHTML })),
"下一页", "隐藏", "结束",
], sub._action, can.ondetail)
can.onappend._init(can, {type: "story word float"}, [], function(sub) {
sub.run = can.run, sub.sup = can, can.sub = sub, can.onappend._action(sub, [
["布局", "开讲", "快闪", "网格"], "大纲", "首页", "上一页",
["菜单"].concat(can.core.List(list, function(page) { return page[0].innerHTML })),
"下一页", "隐藏", "结束",
], sub._action, can.ondetail)
can.onengine.signal(can, "keymap.focus", can.request(event, {cb: function(event) {
can.keylist = can.onkeymap._parse(event, can, "normal", can.keylist)
}})), can.onkeymap._build(can)
can.onengine.signal(can, "keymap.focus", can.request(event, {cb: function(event) {
can.keylist = can.onkeymap._parse(event, can, "normal", can.keylist)
}})), can.onkeymap._build(can)
sub.page.style(sub, sub._target, html.BACKGROUND, document.body.style.background)
sub.page.style(sub, sub._output, html.HEIGHT, window.innerHeight-4*html.PLUGIN_MARGIN-2*html.ACTION_HEIGHT)
sub.page.style(sub, sub._output, html.WIDTH, window.innerWidth-4*html.PLUGIN_MARGIN)
sub.page.style(sub, sub._target, html.BACKGROUND, document.body.style.background)
sub.page.style(sub, sub._output, html.HEIGHT, window.innerHeight-4*html.PLUGIN_MARGIN-2*html.ACTION_HEIGHT)
sub.page.style(sub, sub._output, html.WIDTH, window.innerWidth-4*html.PLUGIN_MARGIN)
sub.ui = sub.page.Append(sub, sub._output, [{view: chat.PROJECT}, {view: chat.CONTENT}])
can.core.List(sub.list = list, function(page, index) {
can.onappend.item(can, html.ITEM, {name: page[0].innerHTML}, function(event) {
can.ondetail.show(sub, index)
}, function(event) {}, sub.ui.project)
sub.ui = sub.page.Append(sub, sub._output, [{view: chat.PROJECT}, {view: chat.CONTENT}])
can.core.List(sub.list = list, function(page, index) {
can.onappend.item(can, html.ITEM, {name: page[0].innerHTML}, function(event) {
can.ondetail.show(sub, index)
}, function(event) {}, sub.ui.project)
sub.page.Append(sub, sub.ui.content, [{view: "page"+(index==0? " first": ""), list: can.core.List(page, function(item) { var data = item.dataset||{}
switch (data.type) {
case wiki.PREMENU: item = item.cloneNode(false); break
case chat.FIELD: item = can.onappend.field(can, chat.STORY, can.base.Obj(data.meta), sub.ui.content).first; break
default: item = item.cloneNode(true)
}
return can.core.CallFunc([can.onimport, data.type], [sub, data, item, window.innerWidth-4*html.PLUGIN_MARGIN]), item
}), }])
}), can.onmotion.hidden(can, sub.ui.project), can.ondetail.show(sub, 0)
sub.page.Append(sub, sub.ui.content, [{view: "page"+(index==0? " first": ""), list: can.core.List(page, function(item) { var data = item.dataset||{}
switch (data.type) {
case wiki.PREMENU: item = item.cloneNode(false); break
case chat.FIELD: item = can.onappend.field(can, chat.STORY, can.base.Obj(data.meta), sub.ui.content).first; break
default: item = item.cloneNode(true)
}
return can.core.CallFunc([can.onimport, data.type], [sub, data, item, window.innerWidth-4*html.PLUGIN_MARGIN]), item
}), }])
}), can.onmotion.hidden(can, sub.ui.project), can.ondetail.show(sub, 0)
sub.onappend._status(sub, [mdb.PAGE, cli.FROM, cli.COST]), sub.Status(cli.FROM, can.base.Time())
var from = new Date(); can.core.Timer({interval: 100}, function() { var now = new Date()
sub.Status(cli.COST, can.base.Duration(now-from))
})
}, document.body)
},
sub.onappend._status(sub, [mdb.PAGE, cli.FROM, cli.COST]), sub.Status(cli.FROM, can.base.Time())
var from = new Date(); can.core.Timer({interval: 100}, function() { var now = new Date()
sub.Status(cli.COST, can.base.Duration(now-from))
})
}, document.body)
},
})
Volcanos("ondetail", {help: "交互操作", list: ["删除"], _init: function(can, msg, list, cb, target) {
},
show: function(sub, which) { sub.page.Modify(sub, sub.ui.content, {className: chat.CONTENT})
sub.page.Select(sub, sub.ui.content, wiki.DIV_PAGE, function(page, index) {
if (index == which || page == which) {
sub.page.Select(sub, page, sub.page.Keys(html.H1, html.H2, html.H3), function(item) { sub.Action("菜单", item.innerHTML) })
sub.onmotion.select(sub, sub.ui.project, html.DIV_ITEM, index)
sub.Status(mdb.PAGE, index+1+ice.PS+sub.list.length)
sub.page.ClassList.add(sub, page, html.SHOW)
} else {
sub.page.ClassList.del(sub, page, html.SHOW)
}
})
},
next: function(sub) {
sub.page.Select(sub, sub.ui.content, sub.core.Keys(wiki.DIV_PAGE, ice.SHOW), function(page) {
page.nextSibling? sub.sup.ondetail.show(sub, page.nextSibling): sub.user.toast(sub, cli.END)
})
},
prev: function(sub) {
sub.page.Select(sub, sub.ui.content, sub.core.Keys(wiki.DIV_PAGE, ice.SHOW), function(page) {
page.previousSibling? sub.sup.ondetail.show(sub, page.previousSibling): sub.user.toast(sub, cli.END)
})
},
flash: function(sub) {
sub.core.Next(sub.page.Select(sub, sub.ui.content, wiki.DIV_PAGE), function(page, next) {
sub.sup.ondetail.show(sub, page), sub.core.Timer(500, function() { next() })
})
},
grid: function(sub) { sub.page.Modify(sub, sub.ui.content, {className: "content grid"}) },
},
show: function(sub, which) { sub.page.Modify(sub, sub.ui.content, {className: chat.CONTENT})
sub.page.Select(sub, sub.ui.content, wiki.DIV_PAGE, function(page, index) {
if (index == which || page == which) {
sub.page.Select(sub, page, sub.page.Keys(html.H1, html.H2, html.H3), function(item) { sub.Action("菜单", item.innerHTML) })
sub.onmotion.select(sub, sub.ui.project, html.DIV_ITEM, index)
sub.Status(mdb.PAGE, index+1+ice.PS+sub.list.length)
sub.page.ClassList.add(sub, page, html.SHOW)
} else {
sub.page.ClassList.del(sub, page, html.SHOW)
}
})
},
next: function(sub) {
sub.page.Select(sub, sub.ui.content, sub.core.Keys(wiki.DIV_PAGE, ice.SHOW), function(page) {
page.nextSibling? sub.sup.ondetail.show(sub, page.nextSibling): sub.user.toast(sub, cli.END)
})
},
prev: function(sub) {
sub.page.Select(sub, sub.ui.content, sub.core.Keys(wiki.DIV_PAGE, ice.SHOW), function(page) {
page.previousSibling? sub.sup.ondetail.show(sub, page.previousSibling): sub.user.toast(sub, cli.END)
})
},
flash: function(sub) {
sub.core.Next(sub.page.Select(sub, sub.ui.content, wiki.DIV_PAGE), function(page, next) {
sub.sup.ondetail.show(sub, page), sub.core.Timer(500, function() { next() })
})
},
grid: function(sub) { sub.page.Modify(sub, sub.ui.content, {className: "content grid"}) },
"开讲": function(event, can) { can.sup.ondetail.show(can, 0) },
"快闪": function(event, can) { can.sup.ondetail.flash(can) },
"网格": function(event, can) { can.sup.ondetail.grid(can) },
"开讲": function(event, can) { can.sup.ondetail.show(can, 0) },
"快闪": function(event, can) { can.sup.ondetail.flash(can) },
"网格": function(event, can) { can.sup.ondetail.grid(can) },
"大纲": function(event, can) { can.onmotion.toggle(can, can.ui.project) },
"首页": function(event, can) { can.sup.ondetail.show(can, 0) },
"上一页": function(event, can) { can.sup.ondetail.prev(can, can.ui.content) },
"菜单": function(event, can) { can.sup.ondetail.show(can, event.target.selectedIndex) },
"下一页": function(event, can) { can.sup.ondetail.next(can, can.ui.content) },
"隐藏": function(event, can) { can.onmotion.toggle(can, can._output) },
"结束": function(event, can) { can.page.Remove(can, can._target) },
"删除": function(event, sub) { sub.page.Remove(sub, sub._target) },
"大纲": function(event, can) { can.onmotion.toggle(can, can.ui.project) },
"首页": function(event, can) { can.sup.ondetail.show(can, 0) },
"上一页": function(event, can) { can.sup.ondetail.prev(can, can.ui.content) },
"菜单": function(event, can) { can.sup.ondetail.show(can, event.target.selectedIndex) },
"下一页": function(event, can) { can.sup.ondetail.next(can, can.ui.content) },
"隐藏": function(event, can) { can.onmotion.toggle(can, can._output) },
"结束": function(event, can) { can.page.Remove(can, can._target) },
"删除": function(event, sub) { sub.page.Remove(sub, sub._target) },
})

View File

@ -1,227 +1,227 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, list, cb, target) {},
_process: function(can, msg) {
msg.OptionStatus() && can.onmotion.clear(can, can._status) && can.onappend._status(can, can.base.Obj(msg.OptionStatus()))
return can.core.CallFunc([can.onimport, msg.OptionProcess()], [can, msg])
},
_process: function(can, msg) {
msg.OptionStatus() && can.onmotion.clear(can, can._status) && can.onappend._status(can, can.base.Obj(msg.OptionStatus()))
return can.core.CallFunc([can.onimport, msg.OptionProcess()], [can, msg])
},
_location: function(can, msg) { location.href = msg._arg[0] },
_rewrite: function(can, msg) {
for (var i = 0; i < msg._arg.length; i += 2) {
can.Option(msg._arg[i], msg._arg[i+1])
}
can.Update()
return true
},
_refresh: function(can, msg) {
can.core.Timer(parseInt(msg.Option("_delay")||"500"), function() {
var sub = can.request({}, {_count: parseInt(msg.Option("_count"))-1})
can.Update()
})
return true
},
_display: function(can, msg) {
Volcanos("some", {}, [msg.Option(ice.MSG_DISPLAY)].concat(Volcanos.meta.libs, Volcanos.meta.volcano), function(sub) {
sub.Conf(can.Conf()), sub.run = can.run
sub._option = can._option, sub._action = can._action
sub.onimport._init(sub, msg, [], function() {}, can._output)
})
return true
},
_field: function(can, msg) {
msg.Table(function(item) { can.onappend._plugin(can, item, {arg: can.base.Obj(item[ice.ARG], [])}, function(sub, meta) {
var opt = can.base.Obj(item[ice.OPT], [])
sub.Conf(html.HEIGHT, can.Conf(html.HEIGHT))
sub.Conf(html.WIDTH, can.Conf(html.WIDTH))
sub.run = function(event, cmds, cb, silent) {
var res = can.request(event, can.Option())
for (var i = 0; i < opt.length; i += 2) { res.Option(opt[i], opt[i+1]) }
can.run(event, (msg[ice.MSG_PREFIX]||[]).concat(cmds), cb, true)
}
}) })
return true
},
_inner: function(can, msg) {
can.onappend.table(can, msg)
can.onappend.board(can, msg)
can.onmotion.story.auto(can)
can.page.Modify(can, can._output, {style: {display: html.BLOCK}})
return true
},
_location: function(can, msg) { location.href = msg._arg[0] },
_rewrite: function(can, msg) {
for (var i = 0; i < msg._arg.length; i += 2) {
can.Option(msg._arg[i], msg._arg[i+1])
}
can.Update()
return true
},
_refresh: function(can, msg) {
can.core.Timer(parseInt(msg.Option("_delay")||"500"), function() {
var sub = can.request({}, {_count: parseInt(msg.Option("_count"))-1})
can.Update()
})
return true
},
_display: function(can, msg) {
Volcanos("some", {}, [msg.Option(ice.MSG_DISPLAY)].concat(Volcanos.meta.libs, Volcanos.meta.volcano), function(sub) {
sub.Conf(can.Conf()), sub.run = can.run
sub._option = can._option, sub._action = can._action
sub.onimport._init(sub, msg, [], function() {}, can._output)
})
return true
},
_field: function(can, msg) {
msg.Table(function(item) { can.onappend._plugin(can, item, {arg: can.base.Obj(item[ice.ARG], [])}, function(sub, meta) {
var opt = can.base.Obj(item[ice.OPT], [])
sub.Conf(html.HEIGHT, can.Conf(html.HEIGHT))
sub.Conf(html.WIDTH, can.Conf(html.WIDTH))
sub.run = function(event, cmds, cb, silent) {
var res = can.request(event, can.Option())
for (var i = 0; i < opt.length; i += 2) { res.Option(opt[i], opt[i+1]) }
can.run(event, (msg[ice.MSG_PREFIX]||[]).concat(cmds), cb, true)
}
}) })
return true
},
_inner: function(can, msg) {
can.onappend.table(can, msg)
can.onappend.board(can, msg)
can.onmotion.story.auto(can)
can.page.Modify(can, can._output, {style: {display: html.BLOCK}})
return true
},
_open: function(can, msg) { can.user.open(msg.Option("_arg")); return true },
_hold: function(can, msg) { return true },
_back: function(can) {
can._history.pop(); for (var his = can._history.pop(); his; his = can._history.pop()) {
if (his[0] == ctx.ACTION) { continue }
can.page.SelectArgs(can, can._option, "", function(item, index) { item.value = his[index]||"" }), can.Update()
break
}
!his && can.Update()
return true
},
_open: function(can, msg) { can.user.open(msg.Option("_arg")); return true },
_hold: function(can, msg) { return true },
_back: function(can) {
can._history.pop(); for (var his = can._history.pop(); his; his = can._history.pop()) {
if (his[0] == ctx.ACTION) { continue }
can.page.SelectArgs(can, can._option, "", function(item, index) { item.value = his[index]||"" }), can.Update()
break
}
!his && can.Update()
return true
},
_grow: function(can, str) {
if (can.page.Select(can, can._output, "div.code", function(div) {
can.page.Modify(can, div, {style: {"max-height": 400}})
can.page.Append(can, div, [{text: [str]}])
div.scrollBy(0, 10000)
return true
}).length == 0) {
can.onappend.board(can, str)
}
},
_grow: function(can, str) {
if (can.page.Select(can, can._output, "div.code", function(div) {
can.page.Modify(can, div, {style: {"max-height": 400}})
can.page.Append(can, div, [{text: [str]}])
div.scrollBy(0, 10000)
return true
}).length == 0) {
can.onappend.board(can, str)
}
},
})
Volcanos("onaction", {help: "交互操作", list: [
"共享工具", "打开链接", "生成链接", "生成脚本", "生成图片", "清空参数", "刷新数据", [
"其它 ->", "复制数据", "下载数据", "清空数据", "删除工具", "摄像头", "生成图片",
],
], _init: function(can, msg, list, cb, target) {},
_engine: function(event, can, button) {
can.Update(event, [ctx.ACTION, button].concat(can.Input([], true)))
},
"共享工具": function(event, can) { var meta = can.Conf()
can.onmotion.share(event, can, [{name: chat.TITLE, value: meta.name}, {name: chat.TOPIC, values: [cli.WHITE, cli.BLACK]}], [
mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input([], true)),
])
},
"打开链接": function(event, can) { var meta = can.Conf()
var pre = "/chat/cmd/"; if (can.user.mod.isPod) { pre = "/chat/pod/"+can.misc.Search(can, ice.POD)+"/cmd/" }
var args = can.Option(); args._path = pre+(meta.index||can.core.Keys(meta.ctx, meta.cmd))
args._path.indexOf("/cmd/web.wiki.word") > -1 && (args = {_path: pre+args.path})
"共享工具", "打开链接", "生成链接", "生成脚本", "生成图片", "清空参数", "刷新数据", [
"其它 ->", "复制数据", "下载数据", "清空数据", "删除工具", "摄像头", "生成图片",
],
], _init: function(can, msg, list, cb, target) {},
_engine: function(event, can, button) {
can.Update(event, [ctx.ACTION, button].concat(can.Input([], true)))
},
"共享工具": function(event, can) { var meta = can.Conf()
can.onmotion.share(event, can, [{name: chat.TITLE, value: meta.name}, {name: chat.TOPIC, values: [cli.WHITE, cli.BLACK]}], [
mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input([], true)),
])
},
"打开链接": function(event, can) { var meta = can.Conf()
var pre = "/chat/cmd/"; if (can.user.mod.isPod) { pre = "/chat/pod/"+can.misc.Search(can, ice.POD)+"/cmd/" }
var args = can.Option(); args._path = pre+(meta.index||can.core.Keys(meta.ctx, meta.cmd))
args._path.indexOf("/cmd/web.wiki.word") > -1 && (args = {_path: pre+args.path})
can.user.open(can.misc.MergeURL(can, args))
},
"生成链接": function(event, can) { var meta = can.Conf()
var pre = "/chat/cmd/"; if (can.user.mod.isPod) { pre = "/chat/pod/"+can.misc.Search(can, ice.POD)+"/cmd/" }
var args = can.Option(); args._path = pre+(meta.index||can.core.Keys(meta.ctx, meta.cmd))
args._path.indexOf("/cmd/web.wiki.word") > -1 && (args = {_path: pre+args.path})
var url = can.misc.MergeURL(can, args)
can.user.copy(event, can, url)
can.onmotion.share(event, can, [], [mdb.LINK, url])
},
"生成脚本": function(event, can, button) { var conf = can.Conf()
var args = can.Input("", true).join(ice.SP); var list = [
"export ctx_dev="+location.origin+"; ctx_temp=$(mktemp); curl -fsSL $ctx_dev -o $ctx_temp;"+" source $ctx_temp "+(conf.index||"")+ice.SP+args,
"ish_sys_dev_run_command "+args, "ish_sys_dev_run_action", "ish_sys_dev_run_source",
]
var ui = can.user.toast(can, {title: button, duration: -1, width: -300,
content: '<div class="story" data-type="spark", data-name="shell">'+
'<label>$ </label>'+'<span>'+list.join("</span><br/><label>$ </label><span>")+'</span>'+'</div>',
action: [cli.CLOSE],
})
can.onmotion.story.auto(can, ui._target)
can.user.copy(event, can, list[0])
},
"生成图片": function(event, can) { can.onmotion.toimage(event, can, can._name) },
"保存参数": function(event, can) { can.search(event, ["River.ondetail.保存参数"]) },
"清空参数": function(event, can) {
can.page.SelectArgs(can, can._option, "", function(item) { return item.value = "" })
},
"刷新数据": function(event, can) { can.Update({}, can.Input([], true)) },
can.user.open(can.misc.MergeURL(can, args))
},
"生成链接": function(event, can) { var meta = can.Conf()
var pre = "/chat/cmd/"; if (can.user.mod.isPod) { pre = "/chat/pod/"+can.misc.Search(can, ice.POD)+"/cmd/" }
var args = can.Option(); args._path = pre+(meta.index||can.core.Keys(meta.ctx, meta.cmd))
args._path.indexOf("/cmd/web.wiki.word") > -1 && (args = {_path: pre+args.path})
var url = can.misc.MergeURL(can, args)
can.user.copy(event, can, url)
can.onmotion.share(event, can, [], [mdb.LINK, url])
},
"生成脚本": function(event, can, button) { var conf = can.Conf()
var args = can.Input("", true).join(ice.SP); var list = [
"export ctx_dev="+location.origin+"; ctx_temp=$(mktemp); curl -fsSL $ctx_dev -o $ctx_temp;"+" source $ctx_temp "+(conf.index||"")+ice.SP+args,
"ish_sys_dev_run_command "+args, "ish_sys_dev_run_action", "ish_sys_dev_run_source",
]
var ui = can.user.toast(can, {title: button, duration: -1, width: -300,
content: '<div class="story" data-type="spark", data-name="shell">'+
'<label>$ </label>'+'<span>'+list.join("</span><br/><label>$ </label><span>")+'</span>'+'</div>',
action: [cli.CLOSE],
})
can.onmotion.story.auto(can, ui._target)
can.user.copy(event, can, list[0])
},
"生成图片": function(event, can) { can.onmotion.toimage(event, can, can._name) },
"保存参数": function(event, can) { can.search(event, ["River.ondetail.保存参数"]) },
"清空参数": function(event, can) {
can.page.SelectArgs(can, can._option, "", function(item) { return item.value = "" })
},
"刷新数据": function(event, can) { can.Update({}, can.Input([], true)) },
"复制数据": function(event, can) { var meta = can.Conf(), msg = can._msg
var res = [msg.append && msg.append.join(",")]; msg.Table(function(line, index, array) {
res.push(can.core.Item(line, function(key, value) { return value }).join(","))
})
"复制数据": function(event, can) { var meta = can.Conf(), msg = can._msg
var res = [msg.append && msg.append.join(",")]; msg.Table(function(line, index, array) {
res.push(can.core.Item(line, function(key, value) { return value }).join(","))
})
res.length > 1 && can.user.copy(event, can, res.join(ice.SP))
msg.result && can.user.copy(event, can, msg.Result())
},
"下载数据": function(event, can) { var meta = can.Conf(), msg = can._msg
var res = [msg.append && msg.append.join(",")]; msg.Table(function(line, index, array) {
res.push(can.core.Item(line, function(key, value) { return value }).join(","))
})
res.length > 1 && can.user.copy(event, can, res.join(ice.SP))
msg.result && can.user.copy(event, can, msg.Result())
},
"下载数据": function(event, can) { var meta = can.Conf(), msg = can._msg
var res = [msg.append && msg.append.join(",")]; msg.Table(function(line, index, array) {
res.push(can.core.Item(line, function(key, value) { return value }).join(","))
})
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) },
"删除工具": function(event, can) { can.page.Remove(can, can._target) },
// "生成图片": function(event, can) {
// can.user.toPNG(can, "hi.png", can._target.outerHTML, can.Conf(html.HEIGHT), can.Conf(html.WIDTH))
// },
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) },
"删除工具": function(event, can) { can.page.Remove(can, can._target) },
// "生成图片": function(event, can) {
// can.user.toPNG(can, "hi.png", can._target.outerHTML, can.Conf(html.HEIGHT), can.Conf(html.WIDTH))
// },
"摄像头": function(event, can) {
var constraints = {audio: false, video: {width: 200, height: 200}}
var ui = can.page.Append(can, can._output, [{view: ctx.ACTION}, {view: "capture", list: [{type: "video", _init: function(item) {
navigator.mediaDevices.getUserMedia(constraints).then(function(stream) {
item.srcObject = stream, item.onloadedmetadata = function(e) {
item.play()
}, ui.stream = stream
}).catch(function(err) { console.log(err.name + ": " + err.message); })
}}]}])
"摄像头": function(event, can) {
var constraints = {audio: false, video: {width: 200, height: 200}}
var ui = can.page.Append(can, can._output, [{view: ctx.ACTION}, {view: "capture", list: [{type: "video", _init: function(item) {
navigator.mediaDevices.getUserMedia(constraints).then(function(stream) {
item.srcObject = stream, item.onloadedmetadata = function(e) {
item.play()
}, ui.stream = stream
}).catch(function(err) { console.log(err.name + ": " + err.message); })
}}]}])
can.onappend._action(can, ["关闭", "抓拍"], ui.action, {
"抓拍": function(event) {
var canvas = can.page.Append(can, ui.capture, [{type: "canvas", width: ui.video.offsetWidth, height: ui.video.offsetHeight}]).first
canvas.getContext("2d").drawImage(ui.video, 0, 0)
can.page.Append(can, ui.capture, [{img: canvas.toDataURL('image/png'), style: {width: ui.video.offsetWidth, height: ui.video.offsetHeight}}])
can.page.Remove(can, canvas)
},
"关闭": function(event) {
can.core.List(ui.stream.getTracks(), function(track) { track.stop() })
can.page.Remove(can, ui.action)
can.page.Remove(can, ui.video)
can.page.Remove(can, ui.capture)
},
})
},
can.onappend._action(can, ["关闭", "抓拍"], ui.action, {
"抓拍": function(event) {
var canvas = can.page.Append(can, ui.capture, [{type: "canvas", width: ui.video.offsetWidth, height: ui.video.offsetHeight}]).first
canvas.getContext("2d").drawImage(ui.video, 0, 0)
can.page.Append(can, ui.capture, [{img: canvas.toDataURL('image/png'), style: {width: ui.video.offsetWidth, height: ui.video.offsetHeight}}])
can.page.Remove(can, canvas)
},
"关闭": function(event) {
can.core.List(ui.stream.getTracks(), function(track) { track.stop() })
can.page.Remove(can, ui.action)
can.page.Remove(can, ui.video)
can.page.Remove(can, ui.capture)
},
})
},
actions: function(event, can) { can.onmotion.toggle(can, can._action) },
clear: function(event, can, name) { can.onmotion.clear(can, can._output) },
close: function(event, can) { can.page.Remove(can, can._target) },
upload: function(event, can) { can.user.upload(event, can) },
change: function(event, can, name, value, cb) {
return can.page.SelectArgs(can, can._option, "", function(input) {
if (input.name == name && value != input.value) { input.value = value
var data = input.dataset||{}; can.Update(event, can.Input(), cb)
return input
}
})
},
actions: function(event, can) { can.onmotion.toggle(can, can._action) },
clear: function(event, can, name) { can.onmotion.clear(can, can._output) },
close: function(event, can) { can.page.Remove(can, can._target) },
upload: function(event, can) { can.user.upload(event, can) },
change: function(event, can, name, value, cb) {
return can.page.SelectArgs(can, can._option, "", function(input) {
if (input.name == name && value != input.value) { input.value = value
var data = input.dataset||{}; can.Update(event, can.Input(), cb)
return input
}
})
},
next: function(event, can) {
can.Update(event, [ctx.ACTION, "next", can.Status("total")||0, can.Option("limit"), can.Option("offend")])
},
prev: function(event, can) {
can.Update(event, [ctx.ACTION, "prev", can.Status("total")||0, can.Option("limit"), can.Option("offend")])
},
next: function(event, can) {
can.Update(event, [ctx.ACTION, "next", can.Status("total")||0, can.Option("limit"), can.Option("offend")])
},
prev: function(event, can) {
can.Update(event, [ctx.ACTION, "prev", can.Status("total")||0, can.Option("limit"), can.Option("offend")])
},
listTags: function(event, can, button) { var list = []
can.core.List([can.base, can.core, can.misc, can.page, can.user,
can.onengine, can.ondaemon, can.onappend, can.onlayout, can.onmotion, can.onkeymap,
], function(lib) {
can.core.Item(lib, function(key, value) { if (key.indexOf("_") == 0 || !lib.hasOwnProperty(key)) { return }
list.push({zone: lib._name, type: typeof value, name: key, text: can.base.isObject(value)? "": (value+"").split(ice.NL)[0],
path: "usr/volcanos/", file: lib._path, line: 1,
})
})
})
var msg = can.request(event, {_handle: true, text: can.base.Format(list)})
can.run(event, [ctx.ACTION, button], function() { can.user.toastSuccess(can) })
},
getClipboardData: function(event, can, button) {
function add(text) {
can.run(event, can.base.Simple(ctx.ACTION, button, can.base.ParseJSON(text)), function(msg) {
can.user.toastSuccess(can), can.Update()
}, true)
}
if (navigator.clipboard) {
navigator.clipboard.readText().then(add).catch(function(err) { can.misc.Log(err) })
} else {
can.user.input(event, can, [{type: html.TEXTAREA, name: mdb.TEXT}], function(ev, button, data, list, args) { add(list[0]) })
}
},
getLocation: function(event, can, button) {
can.user.agent.getLocation(function(data) { can.request(event, data)
can.user.input(event, can, [mdb.TYPE, mdb.NAME, mdb.TEXT, "latitude", "longitude"], function(ev, bu, data, list, args) {
can.run(event, [ctx.ACTION, button].concat(can.base.Simple(args, data)), function(msg) {
can.user.toastSuccess(can), can.Update()
}, true)
})
})
},
openLocation: function(event, can) { can.user.agent.openLocation(can.request(event)) },
listTags: function(event, can, button) { var list = []
can.core.List([can.base, can.core, can.misc, can.page, can.user,
can.onengine, can.ondaemon, can.onappend, can.onlayout, can.onmotion, can.onkeymap,
], function(lib) {
can.core.Item(lib, function(key, value) { if (key.indexOf("_") == 0 || !lib.hasOwnProperty(key)) { return }
list.push({zone: lib._name, type: typeof value, name: key, text: can.base.isObject(value)? "": (value+"").split(ice.NL)[0],
path: "usr/volcanos/", file: lib._path, line: 1,
})
})
})
var msg = can.request(event, {_handle: true, text: can.base.Format(list)})
can.run(event, [ctx.ACTION, button], function() { can.user.toastSuccess(can) })
},
getClipboardData: function(event, can, button) {
function add(text) {
can.run(event, can.base.Simple(ctx.ACTION, button, can.base.ParseJSON(text)), function(msg) {
can.user.toastSuccess(can), can.Update()
}, true)
}
if (navigator.clipboard) {
navigator.clipboard.readText().then(add).catch(function(err) { can.misc.Log(err) })
} else {
can.user.input(event, can, [{type: html.TEXTAREA, name: mdb.TEXT}], function(ev, button, data, list, args) { add(list[0]) })
}
},
getLocation: function(event, can, button) {
can.user.agent.getLocation(function(data) { can.request(event, data)
can.user.input(event, can, [mdb.TYPE, mdb.NAME, mdb.TEXT, "latitude", "longitude"], function(ev, bu, data, list, args) {
can.run(event, [ctx.ACTION, button].concat(can.base.Simple(args, data)), function(msg) {
can.user.toastSuccess(can), can.Update()
}, true)
})
})
},
openLocation: function(event, can) { can.user.agent.openLocation(can.request(event)) },
})
Volcanos("onexport", {help: "导出数据", list: []})

View File

@ -1,60 +1,60 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
can.onimport.show(can, can.base.Obj(msg.Result(), {}), target)
},
show: function(can, data, target) {
function show(data, target, index, total) { var list
switch (typeof data) {
case lang.OBJECT:
if (data == null) {
return can.page.Append(can, list, [{text: "null"}]).item
return
}
function wrap(begin, end, add, cb) {
can.page.Append(can, target, [{text: begin}])
add && can.page.Append(can, target, [{text: ["...", html.SPAN, "nonce"]}]), cb()
can.page.Append(can, target, [{text: end}])
}
function toggle(list) { list && can.onmotion.toggle(can, list) }
function _item() {
list = list || can.page.Append(can, target, [{view: html.LIST}]).list
return can.page.Append(can, list, [{view: html.ITEM}]).item
}
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
can.onimport.show(can, can.base.Obj(msg.Result(), {}), target)
},
show: function(can, data, target) {
function show(data, target, index, total) { var list
switch (typeof data) {
case lang.OBJECT:
if (data == null) {
return can.page.Append(can, list, [{text: "null"}]).item
return
}
function wrap(begin, end, add, cb) {
can.page.Append(can, target, [{text: begin}])
add && can.page.Append(can, target, [{text: ["...", html.SPAN, "nonce"]}]), cb()
can.page.Append(can, target, [{text: end}])
}
function toggle(list) { list && can.onmotion.toggle(can, list) }
function _item() {
list = list || can.page.Append(can, target, [{view: html.LIST}]).list
return can.page.Append(can, list, [{view: html.ITEM}]).item
}
if (can.base.isArray(data)) { // 数组
wrap("[", "]", data.length > 0, function() { can.core.List(data, function(value, index) { var item = _item()
show(value, item, index, data.length)
}) })
} else { // 对象
var length = can.core.Item(data).length, count = 0
wrap("{", "}", length > 0, function() { can.core.Item(data, function(key, value) { var item = _item()
can.page.Append(can, item, [{text: ['"'+key+'"', html.SPAN, "key"], onclick: function(event) { toggle(sub) }}, {text: ': '}])
var sub = show(value, item, count++, length)
}) })
}
break
case lang.STRING: /* 字串 */ can.page.Append(can, target, [{text: ['"'+data+'"', html.SPAN, lang.STRING]}]); break
default: /* 其它 */ can.page.Append(can, target, [{text: [''+data+'', html.SPAN, "const"]}])
}
(index < total-1) && can.page.Append(can, target, [{text: ice.FS}])
return list
}; show(data, can.page.Append(can, target, [{view: html.ITEM}]).item, 0, 0)
},
if (can.base.isArray(data)) { // 数组
wrap("[", "]", data.length > 0, function() { can.core.List(data, function(value, index) { var item = _item()
show(value, item, index, data.length)
}) })
} else { // 对象
var length = can.core.Item(data).length, count = 0
wrap("{", "}", length > 0, function() { can.core.Item(data, function(key, value) { var item = _item()
can.page.Append(can, item, [{text: ['"'+key+'"', html.SPAN, "key"], onclick: function(event) { toggle(sub) }}, {text: ': '}])
var sub = show(value, item, count++, length)
}) })
}
break
case lang.STRING: /* 字串 */ can.page.Append(can, target, [{text: ['"'+data+'"', html.SPAN, lang.STRING]}]); break
default: /* 其它 */ can.page.Append(can, target, [{text: [''+data+'', html.SPAN, "const"]}])
}
(index < total-1) && can.page.Append(can, target, [{text: ice.FS}])
return list
}; show(data, can.page.Append(can, target, [{view: html.ITEM}]).item, 0, 0)
},
}, [""])
Volcanos("onaction", {help: "组件菜单", list: ["展开", "折叠", "复制"],
"展开": function(event, can) {
can.page.Select(can, can._output, "div.list div.list", function(list) {
can.onmotion.hidden(can, list, true)
})
},
"折叠": function(event, can) {
can.page.Select(can, can._output, "div.list div.list", function(list) {
can.onmotion.hidden(can, list)
})
},
"复制": function(event, can) {
can.user.copy(event, can, can._msg.Result())
},
"展开": function(event, can) {
can.page.Select(can, can._output, "div.list div.list", function(list) {
can.onmotion.hidden(can, list, true)
})
},
"折叠": function(event, can) {
can.page.Select(can, can._output, "div.list div.list", function(list) {
can.onmotion.hidden(can, list)
})
},
"复制": function(event, can) {
can.user.copy(event, can, can._msg.Result())
},
})
Volcanos("onexport", {help: "导出数据", list: []})

View File

@ -1,44 +1,44 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() {
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
can.onmotion.clear(can), can.onimport._show(can, msg)
var r = 200, margin = 20; can.svg.Val(html.WIDTH, 2*(r+margin)), can.svg.Val(html.HEIGHT, 2*(r+margin))
can._args = can.base.Copy({field: "value"}, can.base.ParseURL(can._display))
can.onimport._draw(can, msg, can._args.field, r+margin, r+margin, r, margin, 0)
can.onmotion.clear(can, can.ui.project), can.onappend.table(can, msg, null, can.ui.project)
can.onmotion.hidden(can, can.ui.project, true)
can.page.Modify(can, can.ui.project, {style: {"max-width": 480}})
can.page.Select(can, can.ui.project, html.TR, function(tr, index) {
can.page.Modify(can, tr, {onmouseenter: function(event) {
can.onmotion.clear(can, can.svg), can.onimport._draw(can, msg, can._args.field, r+margin, r+margin, r, margin, index-1)
}})
})
})
},
_draw: function(can, msg, field, x, y, r, margin, which) {
function pos(x, y, r, angle) { angle -= 90
return [x + r * Math.cos(angle * Math.PI / 180), y + r * Math.sin(angle * Math.PI / 180)]
}
function pie(x, y, r, begin, span, color, cb) { can.onimport.draw({}, can, {shape: "path", style: {
"stroke-width": 1, stroke: color, fill: color, d: can.base.joins([
["M", x, y], ["L"].concat(pos(x, y, r, begin)), ["A", r, r, "0", span>180? "1": "0", "1"].concat(pos(x, y, r, begin+span)), ["Z"]
], ice.SP, ice.FS),
}, onmouseenter: function(event) {
can.base.isFunc(cb) && cb(event)
} }) }
can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() {
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
can.onmotion.clear(can), can.onimport._show(can, msg)
var r = 200, margin = 20; can.svg.Val(html.WIDTH, 2*(r+margin)), can.svg.Val(html.HEIGHT, 2*(r+margin))
can._args = can.base.Copy({field: "value"}, can.base.ParseURL(can._display))
can.onimport._draw(can, msg, can._args.field, r+margin, r+margin, r, margin, 0)
can.onmotion.clear(can, can.ui.project), can.onappend.table(can, msg, null, can.ui.project)
can.onmotion.hidden(can, can.ui.project, true)
can.page.Modify(can, can.ui.project, {style: {"max-width": 480}})
can.page.Select(can, can.ui.project, html.TR, function(tr, index) {
can.page.Modify(can, tr, {onmouseenter: function(event) {
can.onmotion.clear(can, can.svg), can.onimport._draw(can, msg, can._args.field, r+margin, r+margin, r, margin, index-1)
}})
})
})
},
_draw: function(can, msg, field, x, y, r, margin, which) {
function pos(x, y, r, angle) { angle -= 90
return [x + r * Math.cos(angle * Math.PI / 180), y + r * Math.sin(angle * Math.PI / 180)]
}
function pie(x, y, r, begin, span, color, cb) { can.onimport.draw({}, can, {shape: "path", style: {
"stroke-width": 1, stroke: color, fill: color, d: can.base.joins([
["M", x, y], ["L"].concat(pos(x, y, r, begin)), ["A", r, r, "0", span>180? "1": "0", "1"].concat(pos(x, y, r, begin+span)), ["Z"]
], ice.SP, ice.FS),
}, onmouseenter: function(event) {
can.base.isFunc(cb) && cb(event)
} }) }
var total = 0; msg.Table(function(value) { total += parseInt(value[field]) })
var color = [cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.PURPLE, cli.WHITE, cli.BLACK]
var begin = 0; msg["color"] = [], msg["weight"] = [], msg.Table(function(value, index) { var span = parseInt(value[field])/total*360
var p = index==which? pos(x, y, margin, begin+span/2): [x, y]; index == which && can.Status(value)
var c = color[index%color.length]; pie(p[0], p[1], r, begin, span, c, function(event) {
if (index == can._last) { return } can._last = index
can.onmotion.clear(can, can.svg), can.svg.Value("count", 0)
can.onimport._draw(can, msg, field, x, y, r, margin, index)
can.onimport._profile(can, event.target)
}), begin += span, msg.Push("color", '<span style="background-color:'+c+'"> </span>')
msg.Push("weight", parseInt(parseInt(value[field])*10000/total)/100+"%")
})
},
var total = 0; msg.Table(function(value) { total += parseInt(value[field]) })
var color = [cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.PURPLE, cli.WHITE, cli.BLACK]
var begin = 0; msg["color"] = [], msg["weight"] = [], msg.Table(function(value, index) { var span = parseInt(value[field])/total*360
var p = index==which? pos(x, y, margin, begin+span/2): [x, y]; index == which && can.Status(value)
var c = color[index%color.length]; pie(p[0], p[1], r, begin, span, c, function(event) {
if (index == can._last) { return } can._last = index
can.onmotion.clear(can, can.svg), can.svg.Value("count", 0)
can.onimport._draw(can, msg, field, x, y, r, margin, index)
can.onimport._profile(can, event.target)
}), begin += span, msg.Push("color", '<span style="background-color:'+c+'"> </span>')
msg.Push("weight", parseInt(parseInt(value[field])*10000/total)/100+"%")
})
},
})

View File

@ -1,191 +1,191 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
if (msg.Length() == 0) { return }
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
if (msg.Length() == 0) { return }
can._args = can.base.Copy({root: "ice", field: msg.append[0], split: ice.PS}, can.base.ParseURL(can._display))
can.dir_root = msg.Option(nfs.DIR_ROOT)||can._args.root||""
can._tree = can.onimport._tree(can, msg.Table(), can._args.field, can._args.split)
if (!can._tree[""]) { return }
can._tree[""].name = can._args.root
can._args = can.base.Copy({root: "ice", field: msg.append[0], split: ice.PS}, can.base.ParseURL(can._display))
can.dir_root = msg.Option(nfs.DIR_ROOT)||can._args.root||""
can._tree = can.onimport._tree(can, msg.Table(), can._args.field, can._args.split)
if (!can._tree[""]) { return }
can._tree[""].name = can._args.root
can.size = 30, can.margin = 30
can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() {
can.page.ClassList.add(can, can._fields, "draw")
can.onimport._show(can, msg), can.onmotion.hidden(can, can.ui.project)
var p = can.Action(ice.VIEW, can.sup.view||can.Action(ice.VIEW))
can.onaction[p](event, can, p)
})
},
can.size = 30, can.margin = 30
can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() {
can.page.ClassList.add(can, can._fields, "draw")
can.onimport._show(can, msg), can.onmotion.hidden(can, can.ui.project)
var p = can.Action(ice.VIEW, can.sup.view||can.Action(ice.VIEW))
can.onaction[p](event, can, p)
})
},
_tree: function(can, list, field, split) {
var node = {}; can.core.List(list, function(item) { if (!item[field]) { return }
can.core.List(can.base.trimPrefix(item[field], can.dir_root+can._args.split).split(split), function(value, index, array) {
var last = array.slice(0, index).join(split)||"", name = array.slice(0, index+1).join(split)
if (!value || node[name]) { return }
_tree: function(can, list, field, split) {
var node = {}; can.core.List(list, function(item) { if (!item[field]) { return }
can.core.List(can.base.trimPrefix(item[field], can.dir_root+can._args.split).split(split), function(value, index, array) {
var last = array.slice(0, index).join(split)||"", name = array.slice(0, index+1).join(split)
if (!value || node[name]) { return }
node[last] = node[last]||{name: last, meta: {}, list: []}
node[last].list.push(node[name] = {
name: value+(index==array.length-1? "": split),
meta: item, list: [], last: node[last],
file: item[field]||item.file, hide: true,
})
})
})
return node
},
_height: function(can, tree, deep) { if (!tree) { return 0 }
tree.deep = deep||0
if (tree.list.length == 0 || tree.hide) { return tree.height = 1 }
node[last] = node[last]||{name: last, meta: {}, list: []}
node[last].list.push(node[name] = {
name: value+(index==array.length-1? "": split),
meta: item, list: [], last: node[last],
file: item[field]||item.file, hide: true,
})
})
})
return node
},
_height: function(can, tree, deep) { if (!tree) { return 0 }
tree.deep = deep||0
if (tree.list.length == 0 || tree.hide) { return tree.height = 1 }
var height = 0; can.core.List(tree.list, function(item) {
height += can.onimport._height(can, item, (deep||0)+1)
})
return tree.height = height
},
_width: function(can, tree, deep) { if (!tree) { return 0 }
tree.deep = deep||0
if (tree.list.length == 0 || tree.hide) {
tree.view = can.onimport.draw({}, can, {shape: html.TEXT, point: [{x: 0, y: 0}], style: {inner: tree.name}})
return tree.width = tree.view.Val("textLength")+can.margin
}
var height = 0; can.core.List(tree.list, function(item) {
height += can.onimport._height(can, item, (deep||0)+1)
})
return tree.height = height
},
_width: function(can, tree, deep) { if (!tree) { return 0 }
tree.deep = deep||0
if (tree.list.length == 0 || tree.hide) {
tree.view = can.onimport.draw({}, can, {shape: html.TEXT, point: [{x: 0, y: 0}], style: {inner: tree.name}})
return tree.width = tree.view.Val("textLength")+can.margin
}
var width = 0; can.core.List(tree.list, function(item) {
width += can.onimport._width(can, item, (deep||0)+1)
})
return tree.width = width
},
_color: function(can, tree) {
return tree.meta&&tree.meta.color || (tree.list == 0? cli.PURPLE: cli.YELLOW)
},
var width = 0; can.core.List(tree.list, function(item) {
width += can.onimport._width(can, item, (deep||0)+1)
})
return tree.width = width
},
_color: function(can, tree) {
return tree.meta&&tree.meta.color || (tree.list == 0? cli.PURPLE: cli.YELLOW)
},
}, [""])
Volcanos("onaction", {help: "用户操作", list: ["编辑", [ice.VIEW, "横向", "纵向"], "生成图片"],
"编辑": function(event, can) {
can.onmotion.toggle(can, can._action)
can.onmotion.toggle(can, can._status)
},
"横向": function(event, can) {
can.onimport._height(can, can._tree[""])
can.sup.view = "横向", can.onmotion.clear(can, can.svg)
"编辑": function(event, can) {
can.onmotion.toggle(can, can._action)
can.onmotion.toggle(can, can._status)
},
"横向": function(event, can) {
can.onimport._height(can, can._tree[""])
can.sup.view = "横向", can.onmotion.clear(can, can.svg)
can.svg.Val(html.HEIGHT, can._tree[""].height*can.size+2*can.margin)
can.width = 0, can.onaction._draw_horizontal(can, can._tree[""], can.margin, can.margin)
can.svg.Val(html.WIDTH, can.width+can.margin)
},
"纵向": function(event, can) {
can.onimport._width(can, can._tree[""])
can.sup.view = "纵向", can.onmotion.clear(can, can.svg)
can.svg.Val(html.HEIGHT, can._tree[""].height*can.size+2*can.margin)
can.width = 0, can.onaction._draw_horizontal(can, can._tree[""], can.margin, can.margin)
can.svg.Val(html.WIDTH, can.width+can.margin)
},
"纵向": function(event, can) {
can.onimport._width(can, can._tree[""])
can.sup.view = "纵向", can.onmotion.clear(can, can.svg)
can.svg.Val(html.WIDTH, can._tree[""].width+2*can.margin)
can.height = 0, can.onaction._draw_vertical(can, can._tree[""], can.margin, can.margin+can.size)
can.svg.Val(html.HEIGHT, can.height+can.margin)
},
"生成图片": function(event, can) {
can.user.toPNG(can, "hi.png", can.svg.outerHTML, can.svg.Val(html.HEIGHT), can.svg.Val(html.WIDTH))
},
_draw: function(can, tree, x, y, style) {
var color = can.onimport._color(can, tree)
tree.view = can.onimport.draw({}, can, {
shape: html.TEXT, point: [{x: x, y: y}], style: can.base.Copy({
stroke: color, fill: color, "text-anchor": "start", inner: tree.name||tree.file,
}, style),
}), can.core.ItemCB(can.ondetail, tree.view, can, tree)
},
_draw_vertical: function(can, tree, x, y) { tree.x = x, tree.y = y
can.onaction._draw(can, tree, x+tree.width/2, y, {"text-anchor": "middle"})
can.svg.Val(html.WIDTH, can._tree[""].width+2*can.margin)
can.height = 0, can.onaction._draw_vertical(can, can._tree[""], can.margin, can.margin+can.size)
can.svg.Val(html.HEIGHT, can.height+can.margin)
},
"生成图片": function(event, can) {
can.user.toPNG(can, "hi.png", can.svg.outerHTML, can.svg.Val(html.HEIGHT), can.svg.Val(html.WIDTH))
},
_draw: function(can, tree, x, y, style) {
var color = can.onimport._color(can, tree)
tree.view = can.onimport.draw({}, can, {
shape: html.TEXT, point: [{x: x, y: y}], style: can.base.Copy({
stroke: color, fill: color, "text-anchor": "start", inner: tree.name||tree.file,
}, style),
}), can.core.ItemCB(can.ondetail, tree.view, can, tree)
},
_draw_vertical: function(can, tree, x, y) { tree.x = x, tree.y = y
can.onaction._draw(can, tree, x+tree.width/2, y, {"text-anchor": "middle"})
tree.height = can.size
if (y+tree.height > can.height) { can.height = y+tree.height }
if (tree.hide) { return }
tree.height = can.size
if (y+tree.height > can.height) { can.height = y+tree.height }
if (tree.hide) { return }
var offset = 0; can.core.List(tree.list, function(item) {
can.onimport.draw({}, can, {shape: "path2v", point: [
{x: x+tree.width/2, y: y+tree.height-can.margin/2},
{x: x+offset+item.width/2, y: y+tree.height+can.margin/2},
], style: {stroke: cli.CYAN}})
var offset = 0; can.core.List(tree.list, function(item) {
can.onimport.draw({}, can, {shape: "path2v", point: [
{x: x+tree.width/2, y: y+tree.height-can.margin/2},
{x: x+offset+item.width/2, y: y+tree.height+can.margin/2},
], style: {stroke: cli.CYAN}})
can.onaction._draw_vertical(can, item, x+offset, y+tree.height+can.margin)
offset += item.width
})
},
_draw_horizontal: function(can, tree, x, y) { tree.x = x, tree.y = y
can.onaction._draw(can, tree, x, y+tree.height*can.size/2, {"text-anchor": "start"})
can.onaction._draw_vertical(can, item, x+offset, y+tree.height+can.margin)
offset += item.width
})
},
_draw_horizontal: function(can, tree, x, y) { tree.x = x, tree.y = y
can.onaction._draw(can, tree, x, y+tree.height*can.size/2, {"text-anchor": "start"})
tree.width = tree.view.Val("textLength")||(tree.name||"").length*10
if (x+tree.width > can.width) { can.width = x+tree.width }
if (tree.hide) { return }
tree.width = tree.view.Val("textLength")||(tree.name||"").length*10
if (x+tree.width > can.width) { can.width = x+tree.width }
if (tree.hide) { return }
var offset = 0; can.core.List(tree.list, function(item) {
can.onimport.draw({}, can, {shape: "path2h", point: [
{x: x+tree.width+can.margin/8, y: y+tree.height*can.size/2},
{x: x+tree.width+can.margin*2-2*can.margin/8, y: y+offset+item.height*can.size/2}
], style: {stroke: cli.CYAN}})
var offset = 0; can.core.List(tree.list, function(item) {
can.onimport.draw({}, can, {shape: "path2h", point: [
{x: x+tree.width+can.margin/8, y: y+tree.height*can.size/2},
{x: x+tree.width+can.margin*2-2*can.margin/8, y: y+offset+item.height*can.size/2}
], style: {stroke: cli.CYAN}})
can.onaction._draw_horizontal(can, item, x+tree.width+2*can.margin, y+offset)
offset += item.height*can.size
})
},
can.onaction._draw_horizontal(can, item, x+tree.width+2*can.margin, y+offset)
offset += item.height*can.size
})
},
})
Volcanos("ondetail", {help: "用户交互", list: [],
onmouseenter: function(event, can, tree) { var y = tree.y+tree.height*can.size/2
can.page.Remove(can, can.pos), can.pos = can.onimport.draw({}, can, {
shape: svg.RECT, point: [
{x: tree.x-can.margin/4, y: y-can.size/2},
{x: tree.x+tree.width+can.margin/8, y: y+can.size/2},
], style: {stroke: cli.RED, fill: html.NONE},
}), can.onkeymap.prevent(event)
},
onclick: function(event, can, tree) {
if (tree.list.length > 0 || tree.tags || tree.name.endsWith(can._args.split)) {
return tree.hide = !tree.hide, can.onaction[can.Action(ice.VIEW)](event, can)
}
onmouseenter: function(event, can, tree) { var y = tree.y+tree.height*can.size/2
can.page.Remove(can, can.pos), can.pos = can.onimport.draw({}, can, {
shape: svg.RECT, point: [
{x: tree.x-can.margin/4, y: y-can.size/2},
{x: tree.x+tree.width+can.margin/8, y: y+can.size/2},
], style: {stroke: cli.RED, fill: html.NONE},
}), can.onkeymap.prevent(event)
},
onclick: function(event, can, tree) {
if (tree.list.length > 0 || tree.tags || tree.name.endsWith(can._args.split)) {
return tree.hide = !tree.hide, can.onaction[can.Action(ice.VIEW)](event, can)
}
for (var node = tree; node; node = node.last) {
can.request(event, node.meta)
}
var msg = can.request(event, can.Option())
can.run(event, can.base.Obj(can._args.prefix, []).concat([can.Option("repos")||"", tree.file||"", tree.name]), function(msg) {
if (msg.Length() == 0) {
return can.ondetail.plugin(can, tree, {}, "web.code.inner", [can.dir_root, tree.file, tree.line], [ctx.ACTION, "inner"])
}
if (msg.Append(mdb.INDEX)) { msg.Table(function(value) {
can.ondetail.plugin(can, tree, value, value.index, [], [ctx.ACTION, ice.RUN, value.index])
}); return }
for (var node = tree; node; node = node.last) {
can.request(event, node.meta)
}
var msg = can.request(event, can.Option())
can.run(event, can.base.Obj(can._args.prefix, []).concat([can.Option("repos")||"", tree.file||"", tree.name]), function(msg) {
if (msg.Length() == 0) {
return can.ondetail.plugin(can, tree, {}, "web.code.inner", [can.dir_root, tree.file, tree.line], [ctx.ACTION, "inner"])
}
if (msg.Append(mdb.INDEX)) { msg.Table(function(value) {
can.ondetail.plugin(can, tree, value, value.index, [], [ctx.ACTION, ice.RUN, value.index])
}); return }
tree.tags = true
if (msg.Option("split")) {
tree.list = can.onimport._tree(can, msg.Table(), msg.Option("field")||msg.append[0], msg.Option("split"))[""].list||[]
can.core.List(tree.list, function(item) { item.last = tree })
} else {
msg.Table(function(item) { tree.list.push({
type: "tags", name: item.name||item.file||item[msg.append[0]],
meta: item, list: [], last: tree,
file: item.file, line: item.line, hide: true,
}) })
}
tree.hide = !tree.hide, can.onaction[can.Action(ice.VIEW)](event, can)
}, true)
},
tree.tags = true
if (msg.Option("split")) {
tree.list = can.onimport._tree(can, msg.Table(), msg.Option("field")||msg.append[0], msg.Option("split"))[""].list||[]
can.core.List(tree.list, function(item) { item.last = tree })
} else {
msg.Table(function(item) { tree.list.push({
type: "tags", name: item.name||item.file||item[msg.append[0]],
meta: item, list: [], last: tree,
file: item.file, line: item.line, hide: true,
}) })
}
tree.hide = !tree.hide, can.onaction[can.Action(ice.VIEW)](event, can)
}, true)
},
plugin: function(can, tree, value, index, args, prefix) {
for (var node = tree; node; node = node.last) {
can.base.Copy(value, node.meta)
}
can.onappend.plugin(can, can.base.Copy({type: chat.FLOAT, index: index, args: args}, value), function(sub) {
sub.run = function(event, cmds, cb) { var msg = can.request(event)
can.run(event, can.misc.concat(can, prefix, cmds), cb, true)
}, can.ondetail.figure(can, sub)
})
},
figure: function(can, sub, msg, cb) {
can.getActionSize(function(left, top, width, height) { left = left||0
var top = 120, margin = 20; if (can.user.isMobile) { margin = 0
top = can.user.isLandscape()? 24: 48
}
can.onmotion.move(can, sub._target, {position: html.FIXED, left: left+margin, top: top})
can.page.style(can, sub._output, html.MAX_WIDTH, width-margin*2)
sub.Conf(html.HEIGHT, height-top-2*html.ACTION_HEIGHT)
can.base.isFunc(cb) && cb(msg)
})
},
plugin: function(can, tree, value, index, args, prefix) {
for (var node = tree; node; node = node.last) {
can.base.Copy(value, node.meta)
}
can.onappend.plugin(can, can.base.Copy({type: chat.FLOAT, index: index, args: args}, value), function(sub) {
sub.run = function(event, cmds, cb) { var msg = can.request(event)
can.run(event, can.misc.concat(can, prefix, cmds), cb, true)
}, can.ondetail.figure(can, sub)
})
},
figure: function(can, sub, msg, cb) {
can.getActionSize(function(left, top, width, height) { left = left||0
var top = 120, margin = 20; if (can.user.isMobile) { margin = 0
top = can.user.isLandscape()? 24: 48
}
can.onmotion.move(can, sub._target, {position: html.FIXED, left: left+margin, top: top})
can.page.style(can, sub._output, html.MAX_WIDTH, width-margin*2)
sub.Conf(html.HEIGHT, height-top-2*html.ACTION_HEIGHT)
can.base.isFunc(cb) && cb(msg)
})
},
})

View File

@ -1,153 +1,153 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
if (msg.Option("branch")) { return can.onappend.table(can, msg) }
can.onappend._status(can, ["from", "commit", "total", "max", "date", "text", "add", "del"])
can.Conf(html.HEIGHT, can.Conf(html.HEIGHT)||200)
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
if (msg.Option("branch")) { return can.onappend.table(can, msg) }
can.onappend._status(can, ["from", "commit", "total", "max", "date", "text", "add", "del"])
can.Conf(html.HEIGHT, can.Conf(html.HEIGHT)||200)
can.msg = msg, can.data = msg.Table(), can.onimport._sum(can)
can.Action(html.HEIGHT, msg.Option(html.HEIGHT)||can.user.mod.isCmd? "max": can.user.isMobile&&can.user.isLandscape()? "200": "400")
can.Action("speed", parseInt(msg.Option("speed")||"100"))
can.msg = msg, can.data = msg.Table(), can.onimport._sum(can)
can.Action(html.HEIGHT, msg.Option(html.HEIGHT)||can.user.mod.isCmd? "max": can.user.isMobile&&can.user.isLandscape()? "200": "400")
can.Action("speed", parseInt(msg.Option("speed")||"100"))
can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() {
can.page.ClassList.add(can, can._fields, "draw")
can.onimport._show(can, msg), can.onmotion.hidden(can, can.ui.project)
can.onaction[can.Action("view")](event, can)
})
},
_sum: function(can) {
var begin = "", count = 0, rest = 0, add = 0, del = 0, max = 0
can.max = 0, can.min = 0, can.list = can.core.List(can.data, function(value, index) {
var line = {
date: value[can.msg.append[0]],
text: value[can.msg.append[4]],
add: parseInt(value[can.msg.append[1]]),
del: parseInt(value[can.msg.append[2]]),
}
can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() {
can.page.ClassList.add(can, can._fields, "draw")
can.onimport._show(can, msg), can.onmotion.hidden(can, can.ui.project)
can.onaction[can.Action("view")](event, can)
})
},
_sum: function(can) {
var begin = "", count = 0, rest = 0, add = 0, del = 0, max = 0
can.max = 0, can.min = 0, can.list = can.core.List(can.data, function(value, index) {
var line = {
date: value[can.msg.append[0]],
text: value[can.msg.append[4]],
add: parseInt(value[can.msg.append[1]]),
del: parseInt(value[can.msg.append[2]]),
}
line.begin = rest
line.max = rest + line.add
line.min = rest - line.del
line.close = rest + line.add - line.del
line.begin = rest
line.max = rest + line.add
line.min = rest - line.del
line.close = rest + line.add - line.del
begin = begin || value.date, count++
rest = line.close, add += line.add, del += line.del
begin = begin || value.date, count++
rest = line.close, add += line.add, del += line.del
if (line.max - line.min > max) { max = line.max - line.min }
if (line.max > can.max) { can.max = line.max }
if (line.min < can.min) { can.min = line.min }
return line
})
can.Status({"from": begin, "commit": count, "total": add+del, "max": max})
},
if (line.max - line.min > max) { max = line.max - line.min }
if (line.max > can.max) { can.max = line.max }
if (line.min < can.min) { can.min = line.min }
return line
})
can.Status({"from": begin, "commit": count, "total": add+del, "max": max})
},
}, [""])
Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图", "柱状图", "数据源"], ["height", "100", "200", "400", "600", "800", "max"], ["speed", "10", "20", "50", "100"]],
"编辑": function(event, can) {
can.onmotion.toggle(can, can._action)
can.onmotion.toggle(can, can._status)
},
"趋势图": function(event, can) { var height = can.Action(html.HEIGHT)
if (height == "max") { height = can.Conf(html.HEIGHT) }
height = parseInt(height)
"编辑": function(event, can) {
can.onmotion.toggle(can, can._action)
can.onmotion.toggle(can, can._status)
},
"趋势图": function(event, can) { var height = can.Action(html.HEIGHT)
if (height == "max") { height = can.Conf(html.HEIGHT) }
height = parseInt(height)
var space = 10, width = parseInt(can.Conf(html.WIDTH))
var step = parseInt((width-2*space) / can.list.length)
var space = 10, width = parseInt(can.Conf(html.WIDTH))
var step = parseInt((width-2*space) / can.list.length)
can.onmotion.clear(can, can.svg)
can.svg.Val(html.HEIGHT, height)
can.svg.Val(html.WIDTH, width)
can.onmotion.clear(can, can.svg)
can.svg.Val(html.HEIGHT, height)
can.svg.Val(html.WIDTH, width)
function scale(y) { return (y - can.min)/(can.max - can.min)*(height-2*space) }
function order(index, x, y) { return {x: space+step*index+x, y: height-space-scale(y)} }
function scale(y) { return (y - can.min)/(can.max - can.min)*(height-2*space) }
function order(index, x, y) { return {x: space+step*index+x, y: height-space-scale(y)} }
can.core.Next(can.list, function(line, next, index) { can.Status(line, ["date", "text", "add", "del"])
can.onimport.draw({}, can, {
shape: "line", point: [
order(index, step/2, line.min), order(index, step/2, line.max),
], style: {
"stroke-width": 1, "stroke": line.begin < line.close? chat.WHITE: chat.BLACK,
},
})
can.core.Next(can.list, function(line, next, index) { can.Status(line, ["date", "text", "add", "del"])
can.onimport.draw({}, can, {
shape: "line", point: [
order(index, step/2, line.min), order(index, step/2, line.max),
], style: {
"stroke-width": 1, "stroke": line.begin < line.close? chat.WHITE: chat.BLACK,
},
})
can.onimport.draw({}, can, {
shape: "rect", point: [
order(index, step/4, line.close), order(index, step/4*3, line.begin),
], style: can.base.Copy({"stroke-width": 1, "rx": 0, "ry": 0}, line.begin < line.close? {
"stroke": chat.WHITE, "fill": chat.WHITE,
}: {
"stroke": chat.BLACK, "fill": chat.BLACK,
}),
_init: function(view) {
can.core.ItemCB(can.ondetail, function(key, cb) {
view[key] = function(event) { cb(event, can, line) }
})
},
})
can.onimport.draw({}, can, {
shape: "rect", point: [
order(index, step/4, line.close), order(index, step/4*3, line.begin),
], style: can.base.Copy({"stroke-width": 1, "rx": 0, "ry": 0}, line.begin < line.close? {
"stroke": chat.WHITE, "fill": chat.WHITE,
}: {
"stroke": chat.BLACK, "fill": chat.BLACK,
}),
_init: function(view) {
can.core.ItemCB(can.ondetail, function(key, cb) {
view[key] = function(event) { cb(event, can, line) }
})
},
})
can.core.Timer(parseInt(can.Action("speed")), next)
})
},
"柱状图": function(event, can) {
var max = {}, min = {}
can.core.List(can.msg.append, function(key, which) {
can.core.List(can.data, function(value, index) {
var v = parseInt(value[key])||0; if (index == 0) {
max[key] = v, min[key] = v
return
}
if (v > max[key]) { max[key] = v }
if (v < min[key]) { min[key] = v }
})
})
can.core.Timer(parseInt(can.Action("speed")), next)
})
},
"柱状图": function(event, can) {
var max = {}, min = {}
can.core.List(can.msg.append, function(key, which) {
can.core.List(can.data, function(value, index) {
var v = parseInt(value[key])||0; if (index == 0) {
max[key] = v, min[key] = v
return
}
if (v > max[key]) { max[key] = v }
if (v < min[key]) { min[key] = v }
})
})
var height = parseInt(can.Action(html.HEIGHT))
var space = 10, width = parseInt(can.Conf(html.WIDTH))
var step = parseInt((width-2*space) / can.list.length)
var height = parseInt(can.Action(html.HEIGHT))
var space = 10, width = parseInt(can.Conf(html.WIDTH))
var step = parseInt((width-2*space) / can.list.length)
can.onmotion.clear(can, can.svg)
can.svg.Val(html.HEIGHT, height)
can.svg.Val(html.WIDTH, width)
can.onmotion.clear(can, can.svg)
can.svg.Val(html.HEIGHT, height)
can.svg.Val(html.WIDTH, width)
function scale(key, y) { return (y - min[key])/(max[key] - min[key])*(height-2*space) }
function order(index, key, x, y) { return {x: space+step*index+x, y: space+scale(key, y)} }
function scale(key, y) { return (y - min[key])/(max[key] - min[key])*(height-2*space) }
function order(index, key, x, y) { return {x: space+step*index+x, y: space+scale(key, y)} }
var width = (step-4)/can.msg.append.length
can.core.List(can.msg.append, function(key, which) {
max[key] != min[key] && can.core.Next(can.data, function(line, next, index) {
var y = scale(key, parseFloat(line[key]))
y && can.onimport.draw({}, can, {
shape: "rect", point: [
order(index, key, width*which+2, 0), order(index, key, width*which+2+width, y),
], style: {
"stroke-width": 1, "stroke": chat.WHITE, "fill": chat.WHITE, "rx": 0, "ry": 0,
},
_init: function(view) {
can.core.ItemCB(can.ondetail, function(key, cb) {
view[key] = function(event) { cb(event, can, line) }
})
},
})
var width = (step-4)/can.msg.append.length
can.core.List(can.msg.append, function(key, which) {
max[key] != min[key] && can.core.Next(can.data, function(line, next, index) {
var y = scale(key, parseFloat(line[key]))
y && can.onimport.draw({}, can, {
shape: "rect", point: [
order(index, key, width*which+2, 0), order(index, key, width*which+2+width, y),
], style: {
"stroke-width": 1, "stroke": chat.WHITE, "fill": chat.WHITE, "rx": 0, "ry": 0,
},
_init: function(view) {
can.core.ItemCB(can.ondetail, function(key, cb) {
view[key] = function(event) { cb(event, can, line) }
})
},
})
can.core.Timer(parseInt(can.Action("speed")), next)
})
})
},
"数据源": function(event, can) {
can.onmotion.clear(can, can.ui.display)
can.onappend.table(can, can.msg, null, can.ui.display)
can.onmotion.show(can, can.ui.display)
},
can.core.Timer(parseInt(can.Action("speed")), next)
})
})
},
"数据源": function(event, can) {
can.onmotion.clear(can, can.ui.display)
can.onappend.table(can, can.msg, null, can.ui.display)
can.onmotion.show(can, can.ui.display)
},
height: function(event, can) {
can.onaction[can.Action("view")](event, can)
},
speed: function(event, can) {
can.onaction[can.Action("view")](event, can)
},
height: function(event, can) {
can.onaction[can.Action("view")](event, can)
},
speed: function(event, can) {
can.onaction[can.Action("view")](event, can)
},
})
Volcanos("ondetail", {help: "用户交互", list: [],
onmouseenter: function(event, can, line) {
can.Status(line, ["date", "text", "add", "del"])
},
onmouseenter: function(event, can, line) {
can.Status(line, ["date", "text", "add", "del"])
},
})
Volcanos("onexport", {help: "导出数据", list: []})

View File

@ -1,48 +1,48 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) {
can.onimport.select(can, msg)
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
can.onappend.table(can, msg), can.onappend.board(can, msg)
can.core.Timer(12000, function() { can.onaction.play(event, can) })
can.page.Select(can, can._output, "td a", function(a) {
can.page.Modify(can, a, {target: ""})
})
},
select: function(can, msg) {
msg.Clear(), can.page.Select(can, document.body, can.Option("tags"), function(a, index) {
msg.Push(mdb.INDEX, index)
msg.Push(mdb.NAME, a.innerText)
msg.Push(mdb.LINK, a.href)
a.href == location.href && can.core.Timer(100, function() {
can.page.Select(can, can._output, html.TR, function(tr, i) {
i-1 == index && can.page.ClassList.add(can, tr, "select")
})
})
})
msg.Option(ice.MSG_STATUS, JSON.stringify([
{name: "time", value: can.base.Time(null, "%y-%m-%d %H:%M:%S")},
{name: "count", value: msg.Length()},
]))
},
can.onimport.select(can, msg)
can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg)
can.onappend.table(can, msg), can.onappend.board(can, msg)
can.core.Timer(12000, function() { can.onaction.play(event, can) })
can.page.Select(can, can._output, "td a", function(a) {
can.page.Modify(can, a, {target: ""})
})
},
select: function(can, msg) {
msg.Clear(), can.page.Select(can, document.body, can.Option("tags"), function(a, index) {
msg.Push(mdb.INDEX, index)
msg.Push(mdb.NAME, a.innerText)
msg.Push(mdb.LINK, a.href)
a.href == location.href && can.core.Timer(100, function() {
can.page.Select(can, can._output, html.TR, function(tr, i) {
i-1 == index && can.page.ClassList.add(can, tr, "select")
})
})
})
msg.Option(ice.MSG_STATUS, JSON.stringify([
{name: "time", value: can.base.Time(null, "%y-%m-%d %H:%M:%S")},
{name: "count", value: msg.Length()},
]))
},
})
Volcanos("onaction", {help: "控件交互", list: [],
next: function(event, can) { var msg = can._msg
msg.Table(function(line, index) {
if (line.link == location.href) {
location.href = msg.link[index+1]
}
})
},
play: function(event, can) {
can.page.SelectAll(can, document.body, html.VIDEO, function(video) {
video.playbackRate = parseFloat(can.Option("rate"))
video.currentTime = parseInt(can.Option("skip"))
video.ontimeupdate = function(event) {
if (video.currentTime > parseInt(can.Option("next"))) {
can.onaction.next(event, can)
}
}, video.play(), video.requestFullscreen()
})
},
next: function(event, can) { var msg = can._msg
msg.Table(function(line, index) {
if (line.link == location.href) {
location.href = msg.link[index+1]
}
})
},
play: function(event, can) {
can.page.SelectAll(can, document.body, html.VIDEO, function(video) {
video.playbackRate = parseFloat(can.Option("rate"))
video.currentTime = parseInt(can.Option("skip"))
video.ontimeupdate = function(event) {
if (video.currentTime > parseInt(can.Option("next"))) {
can.onaction.next(event, can)
}
}, video.play(), video.requestFullscreen()
})
},
})
Volcanos("onexport", {help: "导出数据", list: []})

View File

@ -1,15 +1,15 @@
Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, cb, target) {
can.onmotion.clear(can)
can.onappend.table(can, msg)
can.onappend.board(can, msg)
can.onmotion.story.auto(can)
can.base.isFunc(cb) && cb(msg)
},
can.onmotion.clear(can)
can.onappend.table(can, msg)
can.onappend.board(can, msg)
can.onmotion.story.auto(can)
can.base.isFunc(cb) && cb(msg)
},
_process: function(can, msg) {
msg.Option(ice.MSG_TOAST) && can.user.toast(can, msg.Option(ice.MSG_TOAST))
return can.core.CallFunc([can.onimport, msg.Option(ice.MSG_PROCESS)], [can, msg])
},
_process: function(can, msg) {
msg.Option(ice.MSG_TOAST) && can.user.toast(can, msg.Option(ice.MSG_TOAST))
return can.core.CallFunc([can.onimport, msg.Option(ice.MSG_PROCESS)], [can, msg])
},
})
Volcanos("onaction", {help: "控件交互", list: []})
Volcanos("onexport", {help: "导出数据", list: []})

614
proto.js
View File

@ -1,398 +1,398 @@
var kit = {
Dict: function() { var res = {}
for (var i = 0; i < arguments.length; i += 2) {
res[arguments[i]] = arguments[i+1]
} return res
}
Dict: function() { var res = {}
for (var i = 0; i < arguments.length; i += 2) {
res[arguments[i]] = arguments[i+1]
} return res
}
}
var ice = {
SP: " ", PS: "/", PT: ".", DF: ":", FS: ",", NL: "\n", LT: "<", GT: ">",
POD: "pod", CTX: "ctx", CMD: "cmd", ARG: "arg", OPT: "opt",
RUN: "run", RES: "res", ERR: "err",
SP: " ", PS: "/", PT: ".", DF: ":", FS: ",", NL: "\n", LT: "<", GT: ">",
POD: "pod", CTX: "ctx", CMD: "cmd", ARG: "arg", OPT: "opt",
RUN: "run", RES: "res", ERR: "err",
OK: "ok", TRUE: "true", FALSE: "false", SUCCESS: "success", FAILURE: "failure", PROCESS: "process",
PWD: "./",
OK: "ok", TRUE: "true", FALSE: "false", SUCCESS: "success", FAILURE: "failure", PROCESS: "process",
PWD: "./",
AUTO: "auto", HELP: "help", HTTP: "http",
VIEW: "view", MODE: "mode", SHIP: "ship",
COPY: "copy", SHOW: "show", HIDE: "hide",
AUTO: "auto", HELP: "help", HTTP: "http",
VIEW: "view", MODE: "mode", SHIP: "ship",
COPY: "copy", SHOW: "show", HIDE: "hide",
MSG_DETAIL: "detail",
MSG_OPTION: "option",
MSG_APPEND: "append",
MSG_RESULT: "result",
MSG_FIELDS: "fields",
MSG_SESSID: "sessid",
MSG_DETAIL: "detail",
MSG_OPTION: "option",
MSG_APPEND: "append",
MSG_RESULT: "result",
MSG_FIELDS: "fields",
MSG_SESSID: "sessid",
MSG_SOURCE: "_source",
MSG_TARGET: "_target",
MSG_HANDLE: "_handle",
MSG_UPLOAD: "_upload",
MSG_DAEMON: "_daemon",
MSG_ACTION: "_action",
MSG_STATUS: "_status",
MSG_SOURCE: "_source",
MSG_TARGET: "_target",
MSG_HANDLE: "_handle",
MSG_UPLOAD: "_upload",
MSG_DAEMON: "_daemon",
MSG_ACTION: "_action",
MSG_STATUS: "_status",
MSG_DISPLAY: "_display",
MSG_PROCESS: "_process",
MSG_DISPLAY: "_display",
MSG_PROCESS: "_process",
MSG_USERNAME: "user.name",
MSG_USERNICK: "user.nick",
MSG_USERNAME: "user.name",
MSG_USERNICK: "user.nick",
MSG_TITLE: "sess.title",
MSG_TOPIC: "sess.topic",
MSG_RIVER: "sess.river",
MSG_STORM: "sess.storm",
MSG_TOAST: "sess.toast",
MSG_TITLE: "sess.title",
MSG_TOPIC: "sess.topic",
MSG_RIVER: "sess.river",
MSG_STORM: "sess.storm",
MSG_TOAST: "sess.toast",
PROCESS_AGAIN: "_again",
MSG_PREFIX: "_prefix",
PROCESS_AGAIN: "_again",
MSG_PREFIX: "_prefix",
ErrWarn: "warn: ",
ErrNotFound: "not found: ",
ErrWarn: "warn: ",
ErrNotFound: "not found: ",
}
var ctx = {
CONTEXT: "context", COMMAND: "command", ACTION: "action", CONFIG: "config",
INDEX: "index", ARGS: "args", STYLE: "style",
INPUTS: "inputs", FEATURE: "feature",
CONTEXT: "context", COMMAND: "command", ACTION: "action", CONFIG: "config",
INDEX: "index", ARGS: "args", STYLE: "style",
INPUTS: "inputs", FEATURE: "feature",
}
var cli = {
CODE: "code", COST: "cost", FROM: "from", BACK: "back",
OPEN: "open", CLOSE: "close", BEGIN: "begin", END: "end",
START: "start", STOP: "stop", DONE: "done", ERROR: "error",
CLEAR: "clear", REFRESH: "refresh",
EXEC: "exec",
SHOW: "show",
MAIN: "main",
MAKE: "make",
CODE: "code", COST: "cost", FROM: "from", BACK: "back",
OPEN: "open", CLOSE: "close", BEGIN: "begin", END: "end",
START: "start", STOP: "stop", DONE: "done", ERROR: "error",
CLEAR: "clear", REFRESH: "refresh",
EXEC: "exec",
SHOW: "show",
MAIN: "main",
MAKE: "make",
RED: "red", GREEN: "green", BLUE: "blue",
YELLOW: "yellow", CYAN: "cyan", PURPLE: "purple", MAGENTA: "magenta",
WHITE: "white", BLACK: "black",
RED: "red", GREEN: "green", BLUE: "blue",
YELLOW: "yellow", CYAN: "cyan", PURPLE: "purple", MAGENTA: "magenta",
WHITE: "white", BLACK: "black",
}
var web = {
SPACE: "space", SHARE: "share",
SPACE: "space", SHARE: "share",
}
var aaa = {
USERNAME: "username", USERNICK: "usernick", BACKGROUND: "background", AVATAR: "avatar",
LANGUAGE: "language", ENGLISH: "english", CHINESE: "chinese",
LOGIN: "login", LOGOUT: "logout", INVITE: "invite",
USERNAME: "username", USERNICK: "usernick", BACKGROUND: "background", AVATAR: "avatar",
LANGUAGE: "language", ENGLISH: "english", CHINESE: "chinese",
LOGIN: "login", LOGOUT: "logout", INVITE: "invite",
}
var mdb = {
DICT: "dict", META: "meta", HASH: "hash", LIST: "list",
DICT: "dict", META: "meta", HASH: "hash", LIST: "list",
ID: "id", KEY: "key", TIME: "time", ZONE: "zone", TYPE: "type", NAME: "name", TEXT: "text",
LINK: "link", SCAN: "scan", SHOW: "show", HELP: "help",
SHORT: "short", FIELD: "field", TOTAL: "total", COUNT: "count", LIMIT: "limit",
INDEX: "index", VALUE: "value", EXTRA: "extra", ALIAS: "alias", EXPIRE: "expire",
ID: "id", KEY: "key", TIME: "time", ZONE: "zone", TYPE: "type", NAME: "name", TEXT: "text",
LINK: "link", SCAN: "scan", SHOW: "show", HELP: "help",
SHORT: "short", FIELD: "field", TOTAL: "total", COUNT: "count", LIMIT: "limit",
INDEX: "index", VALUE: "value", EXTRA: "extra", ALIAS: "alias", EXPIRE: "expire",
CREATE: "create", REMOVE: "remove", INSERT: "insert", DELETE: "delete",
MODIFY: "modify", SELECT: "select",
INPUTS: "inputs", PRUNES: "prunes", EXPORT: "export", IMPORT: "import",
CREATE: "create", REMOVE: "remove", INSERT: "insert", DELETE: "delete",
MODIFY: "modify", SELECT: "select",
INPUTS: "inputs", PRUNES: "prunes", EXPORT: "export", IMPORT: "import",
PLUGIN: "plugin", RENDER: "render", SEARCH: "search", ENGINE: "engine",
NEXT: "next", PREV: "prev", PAGE: "page", MAIN: "main",
PLUGIN: "plugin", RENDER: "render", SEARCH: "search", ENGINE: "engine",
NEXT: "next", PREV: "prev", PAGE: "page", MAIN: "main",
FOREACH: "*", RANDOMS: "%",
FOREACH: "*", RANDOMS: "%",
}
var ssh = {
SCRIPT: "script",
SCRIPT: "script",
}
var nfs = {
DEFS: "defs",
HTML: "html", CSS: "css", JS: "js", GO: "go", SH: "sh", CSV: "csv", JSON: "json",
PATH: "path", FILE: "file", LINE: "line", SIZE: "size",
DIR: "dir", CAT: "cat", TRASH: "trash",
DIR_ROOT: "dir_root",
FIND: "find", GREP: "grep",
SAVE: "save", LOAD: "load",
TAGS: "tags",
DEFS: "defs",
HTML: "html", CSS: "css", JS: "js", GO: "go", SH: "sh", CSV: "csv", JSON: "json",
PATH: "path", FILE: "file", LINE: "line", SIZE: "size",
DIR: "dir", CAT: "cat", TRASH: "trash",
DIR_ROOT: "dir_root",
FIND: "find", GREP: "grep",
SAVE: "save", LOAD: "load",
TAGS: "tags",
}
var tcp = {
HOST: "host", PORT: "port",
HOST: "host", PORT: "port",
}
var code = {
VIMER: "vimer", INNER: "inner", FAVOR: "favor",
WEBPACK: "webpack",
VIMER: "vimer", INNER: "inner", FAVOR: "favor",
WEBPACK: "webpack",
}
var wiki = {
TITLE: "title", BRIEF: "brief", REFER: "refer", SPARK: "spark",
ORDER: "order", TABLE: "table", CHART: "chart", IMAGE: "image", VIDEO: "video",
FIELD: "field", SHELL: "shell", LOCAL: "local", PARSE: "parse",
TITLE: "title", BRIEF: "brief", REFER: "refer", SPARK: "spark",
ORDER: "order", TABLE: "table", CHART: "chart", IMAGE: "image", VIDEO: "video",
FIELD: "field", SHELL: "shell", LOCAL: "local", PARSE: "parse",
NAVMENU: "navmenu", PREMENU: "premenu",
NAVMENU: "navmenu", PREMENU: "premenu",
ITEM: ".story",
H2: "h2.story",
H3: "h3.story",
DIV_PAGE: "div.page",
ITEM: ".story",
H2: "h2.story",
H3: "h3.story",
DIV_PAGE: "div.page",
}
var chat = {ONIMPORT: "onimport", ONACTION: "onaction", ONKEYMAP: "onkeymap", ONEXPORT: "onexport",
LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", OUTPUT: "output", INPUT: "input", UPLOAD: "upload",
STORY: "story", FLOAT: "float", CONTEXTS: "contexts", CARTE: "carte", TOAST: "toast",
LEGNED: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status",
LAYOUT: "layout", PROJECT: "project", CONTENT: "content", DISPLAY: "display", PROFILE: "profile",
LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", OUTPUT: "output", INPUT: "input", UPLOAD: "upload",
STORY: "story", FLOAT: "float", CONTEXTS: "contexts", CARTE: "carte", TOAST: "toast",
LEGNED: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status",
LAYOUT: "layout", PROJECT: "project", CONTENT: "content", DISPLAY: "display", PROFILE: "profile",
TITLE: "title", TOPIC: "topic", BLACK: "black", WHITE: "white", PRINT: "print",
SHARE: "share", RIVER: "river", STORM: "storm", FIELD: "field", TOAST: "toast",
PUBLIC: "public", PROTECTED: "protected", PRIVATE: "private",
USER: "user", TOOL: "tool", NODE: "node",
TITLE: "title", TOPIC: "topic", BLACK: "black", WHITE: "white", PRINT: "print",
SHARE: "share", RIVER: "river", STORM: "storm", FIELD: "field", TOAST: "toast",
PUBLIC: "public", PROTECTED: "protected", PRIVATE: "private",
USER: "user", TOOL: "tool", NODE: "node",
AGENT: "agent", CHECK: "check", GRANT: "grant",
STATE: "state", MENUS: "menus", TRANS: "trans",
AGENT: "agent", CHECK: "check", GRANT: "grant",
STATE: "state", MENUS: "menus", TRANS: "trans",
ONMAIN: "onmain", ONLOGIN: "onlogin", ONSEARCH: "onsearch",
ONSIZE: "onsize", ONTOAST: "ontoast", ONREMOTE: "onremote",
ONKEYDOWN: "onkeydown",
ONMAIN: "onmain", ONLOGIN: "onlogin", ONSEARCH: "onsearch",
ONSIZE: "onsize", ONTOAST: "ontoast", ONREMOTE: "onremote",
ONKEYDOWN: "onkeydown",
HEAD: "head", LEFT: "left", MAIN: "main", AUTO: "auto", HIDE: "hide", FOOT: "foot",
SCROLL: "scroll", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom",
HEADER: "header", FOOTER: "footer",
HEAD: "head", LEFT: "left", MAIN: "main", AUTO: "auto", HIDE: "hide", FOOT: "foot",
SCROLL: "scroll", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom",
HEADER: "header", FOOTER: "footer",
TABS: "tabs", DIV_TABS: "div.tabs",
TABS: "tabs", DIV_TABS: "div.tabs",
SSO: "sso",
SSO: "sso",
PLUGIN_STATE_JS: "/plugin/state.js",
PLUGIN_INPUT_JS: "/plugin/input.js",
PLUGIN_TABLE_JS: "/plugin/table.js",
PLUGIN_STATE_JS: "/plugin/state.js",
PLUGIN_INPUT_JS: "/plugin/input.js",
PLUGIN_TABLE_JS: "/plugin/table.js",
libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"],
panel_list: [
{name: "Header", help: "标题栏", pos: "head", state: ["time", "usernick", "avatar"]},
{name: "River", help: "群聊组", pos: "left", action: ["create", "refresh"]},
{name: "Action", help: "工作台", pos: "main"},
{name: "Search", help: "搜索框", pos: "auto"},
{name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]},
],
plugin_list: [
"/plugin/state.js",
"/plugin/input.js",
"/plugin/table.js",
"/plugin/input/key.js",
"/plugin/input/date.js",
"/plugin/story/spide.js",
"/plugin/story/trend.js",
"/plugin/local/code/inner.js",
"/plugin/local/code/vimer.js",
"/plugin/local/wiki/draw/path.js",
"/plugin/local/wiki/draw.js",
"/plugin/local/wiki/word.js",
"/plugin/local/chat/div.js",
"/plugin/local/team/plan.js",
"/plugin/input/province.js",
],
ACTION_LAYOUT_FMT: `
fieldset.Action.grid>div.output fieldset.plugin {
width:_width; height:_height;
}
fieldset.Action.grid>div.output fieldset.plugin>div.output {
width:_width; height:_height;
}
`,
libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"],
panel_list: [
{name: "Header", help: "标题栏", pos: "head", state: ["time", "usernick", "avatar"]},
{name: "River", help: "群聊组", pos: "left", action: ["create", "refresh"]},
{name: "Action", help: "工作台", pos: "main"},
{name: "Search", help: "搜索框", pos: "auto"},
{name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]},
],
plugin_list: [
"/plugin/state.js",
"/plugin/input.js",
"/plugin/table.js",
"/plugin/input/key.js",
"/plugin/input/date.js",
"/plugin/story/spide.js",
"/plugin/story/trend.js",
"/plugin/local/code/inner.js",
"/plugin/local/code/vimer.js",
"/plugin/local/wiki/draw/path.js",
"/plugin/local/wiki/draw.js",
"/plugin/local/wiki/word.js",
"/plugin/local/chat/div.js",
"/plugin/local/team/plan.js",
"/plugin/input/province.js",
],
ACTION_LAYOUT_FMT: `
fieldset.Action.grid>div.output fieldset.plugin {
width:_width; height:_height;
}
fieldset.Action.grid>div.output fieldset.plugin>div.output {
width:_width; height:_height;
}
`,
}
var team = {
TASK: "task", PLAN: "plan",
TASK: "task", PLAN: "plan",
}
var mall = {
ASSET: "asset", SALARY: "salary",
ASSET: "asset", SALARY: "salary",
}
var svg = {
G: "g", X: "x", Y: "y", R: "r", RECT: "rect",
M: "M", Q: "Q", T: "T",
G: "g", X: "x", Y: "y", R: "r", RECT: "rect",
M: "M", Q: "Q", T: "T",
}
var html = {
FIELDSET: "fieldset", LEGEND: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status",
FORM_OPTION: "form.option", DIV_ACTION: "div.action", DIV_OUTPUT: "div.output", DIV_STATUS: "div.status",
FIELDSET_PANEL: "fieldset.panel", FIELDSET_PLUGIN: "fieldset.plugin", FIELDSET_STORY: "fieldset.story",
FIELDSET: "fieldset", LEGEND: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status",
FORM_OPTION: "form.option", DIV_ACTION: "div.action", DIV_OUTPUT: "div.output", DIV_STATUS: "div.status",
FIELDSET_PANEL: "fieldset.panel", FIELDSET_PLUGIN: "fieldset.plugin", FIELDSET_STORY: "fieldset.story",
FIELDSET_HEAD: "fieldset.head", FIELDSET_FOOT: "fieldset.foot",
FIELDSET_LEFT: "fieldset.left", FIELDSET_MAIN: "fieldset.main",
FIELDSET_AUTO: "fieldset.auto", FIELDSET_FLOAT: "fieldset.float",
FIELDSET_HEAD: "fieldset.head", FIELDSET_FOOT: "fieldset.foot",
FIELDSET_LEFT: "fieldset.left", FIELDSET_MAIN: "fieldset.main",
FIELDSET_AUTO: "fieldset.auto", FIELDSET_FLOAT: "fieldset.float",
OPTION_ARGS: "select.args,input.args,textarea.args",
INPUT_ARGS: "input.args,textarea.args",
DIV_ITEM: "div.item", DIV_FLOAT: "div.float",
OPTION_ARGS: "select.args,input.args,textarea.args",
INPUT_ARGS: "input.args,textarea.args",
DIV_ITEM: "div.item", DIV_FLOAT: "div.float",
INPUT_BUTTON: "input[type=button]",
UPLOAD: "upload", USERNAME: "username", PASSWORD: "password",
INPUT: "input", TEXT: "text", TEXTAREA: "textarea", SELECT: "select", BUTTON: "button",
FORM: "form", FILE: "file", SPACE: "space", CLICK: "click", SUBMIT: "submit", CANCEL: "cancel",
DIV: "div", IMG: "img", CODE: "code", SPAN: "span", VIDEO: "video",
TABLE: "table", TR: "tr", TH: "th", TD: "td", BR: "br", UL: "ul", LI: "li",
A: "a", LABEL: "label", INNER: "inner", TITLE: "title",
INPUT_BUTTON: "input[type=button]",
UPLOAD: "upload", USERNAME: "username", PASSWORD: "password",
INPUT: "input", TEXT: "text", TEXTAREA: "textarea", SELECT: "select", BUTTON: "button",
FORM: "form", FILE: "file", SPACE: "space", CLICK: "click", SUBMIT: "submit", CANCEL: "cancel",
DIV: "div", IMG: "img", CODE: "code", SPAN: "span", VIDEO: "video",
TABLE: "table", TR: "tr", TH: "th", TD: "td", BR: "br", UL: "ul", LI: "li",
A: "a", LABEL: "label", INNER: "inner", TITLE: "title",
CLASS: "class", FLOAT: "float", CLEAR: "clear", BOTH: "both",
BACKGROUND: "background", SELECT: "select", HIDDEN: "hidden",
DISPLAY: "display", BLOCK: "block", NONE: "none",
STROKE_WIDTH: "stroke-width", STROKE: "stroke", FILL: "fill", FONT_SIZE: "font-size", MONOSPACE: "monospace",
SCROLL: "scroll", HEIGHT: "height", WIDTH: "width", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom",
MAX_HEIGHT: "max-height", MAX_WIDTH: "max-width", MARGIN_X: "margin-x", MARGIN_Y: "margin-y",
PLUGIN_MARGIN: 10, ACTION_HEIGHT: 27, ACTION_MARGIN: 200,
CLASS: "class", FLOAT: "float", CLEAR: "clear", BOTH: "both",
BACKGROUND: "background", SELECT: "select", HIDDEN: "hidden",
DISPLAY: "display", BLOCK: "block", NONE: "none",
STROKE_WIDTH: "stroke-width", STROKE: "stroke", FILL: "fill", FONT_SIZE: "font-size", MONOSPACE: "monospace",
SCROLL: "scroll", HEIGHT: "height", WIDTH: "width", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom",
MAX_HEIGHT: "max-height", MAX_WIDTH: "max-width", MARGIN_X: "margin-x", MARGIN_Y: "margin-y",
PLUGIN_MARGIN: 10, ACTION_HEIGHT: 27, ACTION_MARGIN: 200,
FIXED: "fixed",
FIXED: "fixed",
WSS: "wss", SVG: "svg", CANVAS: "canvas", IFRAME: "iframe", CHROME: "chrome",
LIST: "list", ITEM: "item", MENU: "menu", NODE: "node",
HIDE: "hide", SHOW: "show",
H1: "h1", H2: "h2", H3: "h3",
WSS: "wss", SVG: "svg", CANVAS: "canvas", IFRAME: "iframe", CHROME: "chrome",
LIST: "list", ITEM: "item", MENU: "menu", NODE: "node",
HIDE: "hide", SHOW: "show",
H1: "h1", H2: "h2", H3: "h3",
}
var lang = {
UNDEFINED: "undefined",
STRING: "string", NUMBER: "number",
OBJECT: "object", FUNCTION: "function",
ESCAPE: "Escape", ENTER: "Enter", TAB: "Tab",
UNDEFINED: "undefined",
STRING: "string", NUMBER: "number",
OBJECT: "object", FUNCTION: "function",
ESCAPE: "Escape", ENTER: "Enter", TAB: "Tab",
}
function shy(help, meta, list, cb) {
var index = 0, args = arguments; function next(type) {
if (index < args.length && (!type || type == typeof args[index])) {
return args[index++]
}
}
var index = 0, args = arguments; function next(type) {
if (index < args.length && (!type || type == typeof args[index])) {
return args[index++]
}
}
cb = args[args.length-1]||function() {}
cb.help = next(lang.STRING)||""
cb.meta = next(lang.OBJECT)|| {}
cb.list = next(lang.OBJECT)||[]
return cb
cb = args[args.length-1]||function() {}
cb.help = next(lang.STRING)||""
cb.meta = next(lang.OBJECT)|| {}
cb.list = next(lang.OBJECT)||[]
return cb
}; var _can_name = "", _can_path = ""
var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args: {}, pack: {}, libs: [], cache: {}}, function(name, can, libs, cb) {
var meta = arguments.callee.meta, list = arguments.callee.list
if (typeof name == lang.OBJECT) { var Config = name; Config.plugin = Config.plugin||chat.plugin_list
Config.panels = Config.panels||chat.panel_list, Config.main = Config.main||{name: "Header"}
meta.libs = chat.libs, meta.iceberg = Config.iceberg||meta.iceberg
var meta = arguments.callee.meta, list = arguments.callee.list
if (typeof name == lang.OBJECT) { var Config = name; Config.plugin = Config.plugin||chat.plugin_list
Config.panels = Config.panels||chat.panel_list, Config.main = Config.main||{name: "Header"}
meta.libs = chat.libs, meta.iceberg = Config.iceberg||meta.iceberg
// 预加载
libs = []; for (var i = 0; i < Config.panels.length; i++) { var panel = Config.panels[i]
panel && (libs = libs.concat(panel.list = panel.list||["/panel/"+panel.name+".css", "/panel/"+panel.name+".js"]))
}; libs = libs.concat(Config.plugin, Config.main.list)
// 预加载
libs = []; for (var i = 0; i < Config.panels.length; i++) { var panel = Config.panels[i]
panel && (libs = libs.concat(panel.list = panel.list||["/panel/"+panel.name+".css", "/panel/"+panel.name+".js"]))
}; libs = libs.concat(Config.plugin, Config.main.list)
// 根模块
_can_name = "", name = Config.name||"chat", cb = can||function(can) {
can.onengine._init(can, can.Conf(Config), Config.panels, Config._init, can._target)
}, can = {_follow: name, _target: Config.target||document.body}, can._root = can
for (var k in Config) { can[k] = Config[k] }
}
// 根模块
_can_name = "", name = Config.name||"chat", cb = can||function(can) {
can.onengine._init(can, can.Conf(Config), Config.panels, Config._init, can._target)
}, can = {_follow: name, _target: Config.target||document.body}, can._root = can
for (var k in Config) { can[k] = Config[k] }
}
can = can||{}
var proto = {__proto__: meta, _path: _can_path, _name: name, _load: function(name, each) { // 加载缓存
var cache = meta.cache[name]||[]; for (list.reverse(); list.length > 0; list) {
var sub = list.pop(); sub != can && cache.push(sub)
}; meta.cache[name] = cache
can = can||{}
var proto = {__proto__: meta, _path: _can_path, _name: name, _load: function(name, each) { // 加载缓存
var cache = meta.cache[name]||[]; for (list.reverse(); list.length > 0; list) {
var sub = list.pop(); sub != can && cache.push(sub)
}; meta.cache[name] = cache
// 加载模块
for (var i = 0; i < cache.length; i++) { var sub = cache[i], name = sub._name
if (typeof each == lang.FUNCTION && each(can, name, sub)) { continue }
!can[name] && (can[name] = {}); for (var k in sub) {
can[name].hasOwnProperty(k) || (can[name][k] = sub[k])
}
}
},
require: function(libs, cb, each) { if (!libs || libs.length == 0) {
typeof cb == lang.FUNCTION && setTimeout(function() { cb(can) }, 10)
return // 加载完成
}
// 加载模块
for (var i = 0; i < cache.length; i++) { var sub = cache[i], name = sub._name
if (typeof each == lang.FUNCTION && each(can, name, sub)) { continue }
!can[name] && (can[name] = {}); for (var k in sub) {
can[name].hasOwnProperty(k) || (can[name][k] = sub[k])
}
}
},
require: function(libs, cb, each) { if (!libs || libs.length == 0) {
typeof cb == lang.FUNCTION && setTimeout(function() { cb(can) }, 10)
return // 加载完成
}
if (!libs[0]) { return can.require(libs.slice(1), cb, each) }
libs[0] = libs[0].toLowerCase()
if (!libs[0]) { return can.require(libs.slice(1), cb, each) }
libs[0] = libs[0].toLowerCase()
if (libs[0] == "") {
libs[0] = can._name.replace(".js", ".css")
} else if (libs[0][0] != ice.PS && libs[0].indexOf(ice.HTTP) != 0) {
libs[0] = can._name.slice(0, can._name.lastIndexOf(ice.PS)+1)+libs[0]
}
if (libs[0] == "") {
libs[0] = can._name.replace(".js", ".css")
} else if (libs[0][0] != ice.PS && libs[0].indexOf(ice.HTTP) != 0) {
libs[0] = can._name.slice(0, can._name.lastIndexOf(ice.PS)+1)+libs[0]
}
// 请求模块
var name = libs[0].split("?")[0]
function next() { can._load(name, each), can.require(libs.slice(1), cb, each) }
meta.cache[name]? next(): (_can_path = libs[0], meta._load(name, next))
},
request: function(event, option) { event = event||{}
var msg = event._msg||can.misc.Message(event, can); event._msg = msg
function set(key, value) { msg.Option(key) || value == "" || msg.Option(key, value) }
// 请求模块
var name = libs[0].split("?")[0]
function next() { can._load(name, each), can.require(libs.slice(1), cb, each) }
meta.cache[name]? next(): (_can_path = libs[0], meta._load(name, next))
},
request: function(event, option) { event = event||{}
var msg = event._msg||can.misc.Message(event, can); event._msg = msg
function set(key, value) { msg.Option(key) || value == "" || msg.Option(key, value) }
can.core.List(arguments, function(option, index) { if (!option || index == 0) { return }
can.base.isFunc(option.Option)? can.core.List(option.Option(), function(key) {
set(key, option.Option(key))
}): can.core.Item(can.base.isFunc(option)? option(): option, set)
}); return msg
},
can.core.List(arguments, function(option, index) { if (!option || index == 0) { return }
can.base.isFunc(option.Option)? can.core.List(option.Option(), function(key) {
set(key, option.Option(key))
}): can.core.Item(can.base.isFunc(option)? option(): option, set)
}); return msg
},
get: function(name, key, cb) {
return can.search({}, [can.core.Keys(name, "onexport", key)], cb)
},
set: function(name, key, value) { var msg = can.request({}); msg.Option(key, value)
return can.search(msg._event, [can.core.Keys(name, "onimport", key)])
},
setHeaderMenu: function(list, cb) { can._menu && can.page.Remove(can, can._menu)
var msg = can.request({}, {trans: can.onaction._trans})
return can._menu = can.search(msg._event, ["Header.onimport.menu", can._name].concat(list), cb)
},
setHeader: function(key, value) { return can.set("Header", key, value) },
getHeader: function(key, cb) { return can.get("Header", key, cb) },
getAction: function(key, cb) { return can.get("Action", key, cb) },
getActionSize: function(cb) { return can.get("Action", "size", cb) },
search: function(event, cmds, cb) { return can.run && can.run(event, ["_search"].concat(cmds), cb, true) },
get: function(name, key, cb) {
return can.search({}, [can.core.Keys(name, "onexport", key)], cb)
},
set: function(name, key, value) { var msg = can.request({}); msg.Option(key, value)
return can.search(msg._event, [can.core.Keys(name, "onimport", key)])
},
setHeaderMenu: function(list, cb) { can._menu && can.page.Remove(can, can._menu)
var msg = can.request({}, {trans: can.onaction._trans})
return can._menu = can.search(msg._event, ["Header.onimport.menu", can._name].concat(list), cb)
},
setHeader: function(key, value) { return can.set("Header", key, value) },
getHeader: function(key, cb) { return can.get("Header", key, cb) },
getAction: function(key, cb) { return can.get("Action", key, cb) },
getActionSize: function(cb) { return can.get("Action", "size", cb) },
search: function(event, cmds, cb) { return can.run && can.run(event, ["_search"].concat(cmds), cb, true) },
ConfHeight: function(value) { return can.Conf(html.HEIGHT, value) },
ConfWidth: function(value) { return can.Conf(html.WIDTH, value) },
Conf: function(key, value) { var res = can._conf
for (var i = 0; i < arguments.length; i += 2) {
if (typeof key == lang.OBJECT) {
res = can.core.Value(can._conf, arguments[i])
i--
return
}
res = can.core.Value(can._conf, arguments[i], arguments[i+1])
}
return res
}, _conf: {},
}
ConfHeight: function(value) { return can.Conf(html.HEIGHT, value) },
ConfWidth: function(value) { return can.Conf(html.WIDTH, value) },
Conf: function(key, value) { var res = can._conf
for (var i = 0; i < arguments.length; i += 2) {
if (typeof key == lang.OBJECT) {
res = can.core.Value(can._conf, arguments[i])
i--
return
}
res = can.core.Value(can._conf, arguments[i], arguments[i+1])
}
return res
}, _conf: {},
}
if (navigator.userAgent.indexOf("MSIE") > -1) {
for (var k in proto) { can[k] = proto[k] }
} else {
can.__proto__ = proto
}
if (navigator.userAgent.indexOf("MSIE") > -1) {
for (var k in proto) { can[k] = proto[k] }
} else {
can.__proto__ = proto
}
if (_can_name) { // 加入缓存
meta.cache[_can_name] = meta.cache[_can_name]||[], meta.cache[_can_name].push(can)
} else { // 加入队列
list.push(can)
}
if (can._follow) { libs = libs.concat(meta.libs, meta.volcano) }
if (libs && libs.length > 0) {
for (var i = 0; i < libs.length; i++) {
if (libs[i] == undefined) {
if (_can_name) { // 加入缓存
meta.cache[_can_name] = meta.cache[_can_name]||[], meta.cache[_can_name].push(can)
} else { // 加入队列
list.push(can)
}
if (can._follow) { libs = libs.concat(meta.libs, meta.volcano) }
if (libs && libs.length > 0) {
for (var i = 0; i < libs.length; i++) {
if (libs[i] == undefined) {
} else if (libs[i] == "") {
libs[i] = _can_path.replace(".js", ".css")
} else if (libs[i][0] != ice.PS && libs[i].indexOf(ice.HTTP) != 0) {
libs[i] = _can_path.slice(0, _can_path.lastIndexOf(ice.PS)+1)+libs[i]
}
}
}
return can.require(libs, cb), can
} else if (libs[i] == "") {
libs[i] = _can_path.replace(".js", ".css")
} else if (libs[i][0] != ice.PS && libs[i].indexOf(ice.HTTP) != 0) {
libs[i] = _can_path.slice(0, _can_path.lastIndexOf(ice.PS)+1)+libs[i]
}
}
}
return can.require(libs, cb), can
})
Volcanos.meta._load = function(url, cb) {
switch (url.split("?")[0].split(ice.PT).pop().toLowerCase()) {
case nfs.CSS:
var item = document.createElement(mdb.LINK)
item.rel = "stylesheet", item.type = "text/css"
item.onload = cb, item.href = url
return (document.head||document.body).appendChild(item), item
case nfs.JS:
var item = document.createElement(ssh.SCRIPT)
item.onload = cb, item.onerror = cb, item.src = url
return document.body.appendChild(item), item
}
switch (url.split("?")[0].split(ice.PT).pop().toLowerCase()) {
case nfs.CSS:
var item = document.createElement(mdb.LINK)
item.rel = "stylesheet", item.type = "text/css"
item.onload = cb, item.href = url
return (document.head||document.body).appendChild(item), item
case nfs.JS:
var item = document.createElement(ssh.SCRIPT)
item.onload = cb, item.onerror = cb, item.src = url
return document.body.appendChild(item), item
}
}
function can(tool) {
Volcanos({name: "chat", panels: [
{name: "Header", help: "标题栏", pos: "hide", state: ["time", "usernick", "avatar"]},
{name: "Action", help: "工作台", pos: chat.MAIN, tool: tool},
{name: "Search", help: "搜索框", pos: "auto"},
]})
Volcanos({name: "chat", panels: [
{name: "Header", help: "标题栏", pos: "hide", state: ["time", "usernick", "avatar"]},
{name: "Action", help: "工作台", pos: chat.MAIN, tool: tool},
{name: "Search", help: "搜索框", pos: "auto"},
]})
}