1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00
volcanos/lib/core.js
2023-12-05 21:56:42 +08:00

129 lines
8.3 KiB
JavaScript

Volcanos("core", {
Defer: function(cb) { var defer = []; cb(defer)
while (defer.length > 0) { defer.pop()() }
},
Keys: function() { var list = []
for (var i = 0; i < arguments.length; i++) { var v = arguments[i]; switch (typeof v) {
case code.OBJECT: for (var j = 0; j < v.length; j++) { list.push(v[j]) } break
case code.NUMBER: list.push(v+""); break
case code.FUNCTION: v = v()
default: v && list.push(v+"")
} } return list.join(nfs.PT)
},
Value: function(data, key, value) { if (data == undefined) { return } if (key == undefined) { return data }
if (typeof key == code.OBJECT) { if (key.length != undefined) { key = key.join(nfs.PT) } else { for (var k in key) { arguments.callee.call(this, data, k, key[k]) } return data } }
if (value != undefined) { var _node = data, keys = key.split(nfs.PT)
for (var i = 0; i < keys.length; i++) { var _next = _node[keys[i]]||{}; _node[keys[i]] = _next
if (i < keys.length - 1) { _node = _next } else { _node[keys[i]] = value }
}
}
var node = data, keys = key.split(nfs.PT); while (node && keys.length > 0) {
if (keys[0] == "-1") { keys[0] = node.length-1 } node = node[keys[0]], keys = keys.slice(1)
} return node == undefined? data[key]: node
},
Split: function(str) { if (!str || !str.length) { return [] }
var opt = {detail: false}, arg = []; for (var i = 1; i < arguments.length; i++) { var v = arguments[i]; typeof v == code.OBJECT? opt = v: arg.push(v) }
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 == code.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: code.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 (quote[str[i]]) {
if (s == "") {
begin > -1 && push(str.slice(begin, i)), s = str[i], begin = i+1
} else if (s == str[i]) {
push({type: code.STRING, text: str.slice(begin, i), left: s, right: str[i]}), s = "", begin = -1
}
} else if (trans[str[i]]) { begin == -1 && (begin = i), i++
} else { begin == -1 && (begin = i) }
} return begin > -1 && (s? push({type: code.STRING, text: str.slice(begin), left: s, right: ""}): push(str.slice(begin))), res
},
SplitInput: function(item, type) { if (typeof item == code.OBJECT) { return item } type = type||html.TEXT; switch (item) {
case ctx.RUN: return {type: html.BUTTON, name: item}
case ice.LIST: return {type: html.BUTTON, name: item, action: ice.AUTO}
case ice.BACK: return {type: html.BUTTON, name: item}
case mdb.NAME: return {type: html.TEXT, name: item}
case mdb.TEXT: return {type: html.TEXTAREA, name: item}
case ctx.ARGS: return {type: html.TEXTAREA, name: item}
default: var ls = this.Split(item, lex.SP, "*:=@"), res = {type: type, name: ls[0]}; for (var i = 1; i < ls.length; i += 2) { switch (ls[i]) {
case "*": res["need"] = "must", i--; break
case nfs.DF: res[mdb.TYPE] = ls[i+1]; break
case mdb.EQ:
if (res[mdb.TYPE] == html.SELECT) { res.values = this.Split(ls[i+1]); for (var j = 1; j < res.values.length; j++) {
if (res.values[0] == "" || res.values[0] == res.values[j]) { res.value = res.values[0], res.values = res.values.slice(1); break }
} } else { res.value = ls[i+1] } break
case ice.AT: res[ctx.ACTION] = ls[i+1]; break
} } return res
} },
CallFunc: function(func, args, mod) { args = args||{}; var can = args["can"]||args[0], msg = args["msg"]||args[1], cb = args["cb"]
if (Array.isArray(args)) { this.List(args, function(arg) { if (!arg) { return } if (arg.request && arg.run) { can = arg } else if (arg.Append && arg.Result) { msg = arg } else if (typeof arg == code.FUNCTION) { cb = arg } }) }
func = typeof func == code.FUNCTION? func: typeof func == code.OBJECT && func.length > 0? this.Value(func[0], this.Keys(func.slice(1))): typeof func == code.STRING? this.Value(mod||can, func): null
if (typeof func != code.FUNCTION) { if (typeof cb == code.FUNCTION) { cb() } return }
var list = [], echo = false; args.length > 0? list = args: this.List(func.toString().split(")")[0].split("(")[1].split(mdb.FS), function(item, index) { item = item.trim(); if (item == "") { return }
list.push(args[item] || msg&&msg.Option&&msg.Option(item) || can&&can.Conf&&can.Conf(item) || null); if (item == "cb") { echo = true }
}); var res = func.apply(mod||can, list); if (msg && msg.Defer) { msg.Defer() }
if (!echo && typeof cb == code.FUNCTION) { res && msg&&msg.Echo&&msg.Echo(res), arguments.callee.apply(this, [cb, {msg: msg, res: res}]) } return res
},
List: function(list, cb, interval, cbs) {
if (typeof list == code.STRING) { list = [list] } else if (typeof list == code.NUMBER) { // [end cb interval]|[begin end interval]
var begin = 0, end = list, step = typeof interval == code.NUMBER? interval: 1; if (typeof cb == code.NUMBER) { begin = list, end = cb, cb = null }
list = []; for (var i = begin; i < end; i += step) { list.push(i) }
} list = list||[]
if (interval > 0) {
function loop(i) { i >= list.length? typeof cbs == code.FUNCTION && cbs(list): cb(list[i], i, list), setTimeout(function() { loop(i+1) }, interval) }
typeof cb == code.FUNCTION && list.length > 0 && setTimeout(function() { loop(0) }, interval/4)
} else { var res = []
for (var i = 0; i < list.length; i++) { var _res = typeof cb == code.FUNCTION? cb(list[i], i, list): list[i]; _res != undefined && res.push(_res) }
list = res
} return list
},
Next: function(list, cb, cbs) {
switch (typeof list) {
case code.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 == code.FUNCTION && cb(list[i], function() { next(i+1) }, i, list): typeof cbs == code.FUNCTION && cbs(list) }
return next(0), list
},
Item: function(obj, cb) { var list = []
for (var k in obj) { var res = typeof cb == code.FUNCTION? cb(k, obj[k], list): k; res != undefined && list.push(res) }
return list
},
ItemKeys: function(obj, cb) { var list = [], keys = []; for (var k in obj) { keys.push(k) } keys.sort()
for (var i in keys) { var k = keys[i]; var res = typeof cb == code.FUNCTION? cb(k, obj[k]): k; res != undefined && list.push(res) }
return list
},
ItemOrder: function(obj, key, cb) { var list = [], order = [], keys = {}, vals = {}, i = 0
for (var k in obj) { o = obj[k][key]||i++, order.push(o), keys[o] = k, vals[o] = obj[k] } order.sort()
for (var i in order) { var k = order[i], res = typeof cb == code.FUNCTION? cb(keys[k], vals[k]): k; res != undefined && list.push(res) }
return list
},
ItemForm: function(obj, cb) { var list = []
for (var k in obj) { list = list.concat(this.List(obj[k], function(v, i) { return typeof cb == code.FUNCTION && cb(v, i, k, obj) })) }
return list
},
ItemCB: function(meta, cb, can, item) { var list = []
for (var k in meta) { if (k.indexOf("on") == 0 && typeof meta[k] == code.FUNCTION) { (function(k) { list.push(k)
if (typeof cb == code.FUNCTION) {
cb(k, meta[k])
} else { cb[k] = function(event) { can.misc.Event(event, can, function(msg) {
meta[k](event, can, item)
}) } }
})(k) } } return list
},
Timer: shy("定时器, value, [1,2,3,4], {delay, interval, length}", function(interval, cb, cbs) { var timer = {stop: false}
if (interval == "0") { return cb && cb(), cbs && cbs() }
function loop(i) { timer.stop || i >= interval.length && interval.length >= 0 || cb(timer, interval.interval||interval[i], i, interval)?
typeof cbs == code.FUNCTION && cbs(timer, interval): setTimeout(function() { loop(i+1) }, interval.interval||interval[i+1])
} interval = typeof interval == code.OBJECT? interval: [interval]; if (interval.interval == 0) { return cb(), timer }
var delay = interval.delay||interval.interval/2||interval[0]
return typeof cb == code.FUNCTION && (timer._timer = setTimeout(function() { loop(0) }, delay)), timer
}),
})