mirror of
https://shylinux.com/x/volcanos
synced 2025-04-25 16:58:06 +08:00
opt frame.js
This commit is contained in:
parent
10bda20cd3
commit
291243c067
352
frame.js
352
frame.js
@ -1,28 +1,25 @@
|
||||
Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) {
|
||||
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.title(can.misc.Search(can, chat.TITLE)||can.misc.Search(can, ice.POD)||location.host)
|
||||
|
||||
can.require([can.volcano], null, function(can, key, sub) { can[key] = sub })
|
||||
can.run = function(event, cmds, cb) { var msg = can.request(event); cmds = cmds||[]
|
||||
return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, can, cmds, cb)
|
||||
}
|
||||
can.user.title(can.misc.Search(can, chat.TITLE)||can.misc.Search(can, ice.POD)||location.host)
|
||||
}; can.require([can.volcano], null, function(can, key, sub) { can[key] = sub })
|
||||
|
||||
can.core.Next(list, function(item, next) { item.type = chat.PANEL
|
||||
can.onappend._init(can, can.base.Copy(item, can.core.Value(can, [chat.RIVER, item.name])), item.list, function(panel) {
|
||||
panel.run = function(event, cmds, cb) { var msg = panel.request(event); cmds = cmds||[]
|
||||
return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, panel, cmds, cb)
|
||||
}, can[item.name] = panel, panel._trans = panel.onaction && panel.onaction._trans||{}
|
||||
can.core.Item(panel.onplugin, function(key, cmd) {
|
||||
panel.onplugin.hasOwnProperty(key) && can.base.isFunc(cmd) && can.onengine.plugin(panel, key, cmd)
|
||||
can.onappend._init(can, can.base.Copy(item, can.core.Value(can, [chat.RIVER, item.name])), item.list, function(sub) {
|
||||
sub.run = function(event, cmds, cb) { var msg = sub.request(event); cmds = cmds||[]
|
||||
return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, sub, cmds, cb)
|
||||
}, can[item.name] = sub
|
||||
can.core.ItemCB(sub.onaction, function(key, cb) {
|
||||
can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {can: sub, msg: msg}) })
|
||||
}), can.core.CallFunc([sub.onaction, chat._INIT], {can: sub, cb: next, target: sub._target})
|
||||
can.core.Item(sub.onplugin, function(key, cmd) {
|
||||
sub.onplugin.hasOwnProperty(key) && can.base.isFunc(cmd) && can.onengine.plugin(sub, key, cmd)
|
||||
})
|
||||
can.core.ItemCB(panel.onaction, function(key, cb) {
|
||||
can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {can: panel, msg: msg}) })
|
||||
}), can.core.CallFunc([panel.onaction, chat._INIT], {can: panel, cb: next, target: panel._target})
|
||||
}, target)
|
||||
}, function() { can.misc.Info(can.user.title(), ice.RUN, can)
|
||||
can.onmotion._init(can, target), can.onkeymap._init(can)
|
||||
}, function() { can.onmotion._init(can, target), can.onkeymap._init(can), can.misc.Info(can.user.title(), ice.RUN, can)
|
||||
can.onengine.listen(can, chat.ONSEARCH, function(msg, word) { word[0] == ctx.COMMAND && can.run(msg, ["can.command"]) })
|
||||
can.onengine.signal(can, chat.ONMAIN, can.request()), can.base.isFunc(cb) && cb()
|
||||
})
|
||||
@ -30,34 +27,36 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) {
|
||||
_search: function(event, can, msg, panel, cmds, cb) {
|
||||
var sub, mod = can, fun = can, key = ""; can.core.List(cmds[1].split(ice.PT), function(value) {
|
||||
fun && (sub = mod, mod = fun, fun = mod[value], key = value)
|
||||
}); if (!sub || !mod || !fun) { can.misc.Warn(ice.ErrNotFound, cmds)
|
||||
return can.base.isFunc(cb) && cb(msg.Echo(ice.ErrWarn, ice.ErrNotFound, cmds))
|
||||
}
|
||||
}); if (!sub || !mod || !fun) { can.misc.Warn(ice.ErrNotFound, cmds); return can.base.isFunc(cb) && cb(msg.Echo(ice.ErrWarn, ice.ErrNotFound, cmds)) }
|
||||
return can.core.CallFunc(fun, {
|
||||
event: event, can: sub, msg: msg, cmds: cmds.slice(2), cb: cb, target: sub._target,
|
||||
button: key, cmd: key, arg: cmds.slice(2), list: cmds.slice(2),
|
||||
event: event, can: sub, msg: msg, cmds: cmds.slice(2), cb: cb, target: sub._target, button: key, cmd: key, arg: cmds.slice(2), list: cmds.slice(2),
|
||||
}, mod)
|
||||
},
|
||||
_remote: function(event, can, msg, panel, cmds, cb) {
|
||||
if (panel.onengine._engine(event, can, msg, panel, cmds, cb)) { return }
|
||||
if (panel.onengine._plugin(event, can, msg, panel, cmds, cb)) { return }
|
||||
|
||||
var keys = can.core.Keys(panel._name, cmds.join(ice.FS))
|
||||
if (can.user.isLocalFile) { var msg = can.request(event); msg.Clear(ice.MSG_APPEND)
|
||||
var res = Volcanos.meta.pack[keys]; res? msg.Copy(res): can.user.toast(can, "缺失数据")
|
||||
return can.base.isFunc(cb) && cb(msg)
|
||||
}
|
||||
if (panel.onengine._static(event, can, msg, panel, cmds, cb)) { return }
|
||||
|
||||
var toast, _toast = msg.Option(chat._TOAST); if (_toast) { can.onmotion.delay(can, function() { toast = toast||can.user.toastProcess(msg._can, _toast) }) }
|
||||
msg.option = can.core.List(msg.option, function(item) { return {_toast: true, _handle: true}[item] && delete(msg[item])? undefined: item })
|
||||
can.onengine.signal(panel, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds}))
|
||||
msg.option = can.core.List(msg.option, function(item) { return [chat._TOAST, ice.MSG_HANDLE].indexOf(item) > -1 && delete(msg[item])? undefined: item })
|
||||
can.getHeader(chat.TOPIC, function(topic) { can.request(event, {topic: topic}) })
|
||||
if (can.base.isUndefined(msg._daemon)) { var sub = msg._can
|
||||
can.base.isUndefined(sub._daemon) && can.ondaemon._list[0] && (sub._daemon = can.ondaemon._list.push(can)-1)
|
||||
if (sub._daemon) { msg.Option(ice.MSG_DAEMON, can.core.Keys(can.ondaemon._list[0], sub._daemon)) }
|
||||
} can.onengine.signal(panel, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds}))
|
||||
|
||||
can.getHeader("topic", function(topic) { can.request(event, {topic: topic}) })
|
||||
var names = msg.Option(chat._NAMES)||panel._names||((can.Conf("iceberg")||Volcanos.meta.iceberg)+panel._name)
|
||||
can.misc.Run(event, can, {names: names, daemon: msg._daemon}, cmds, function(msg) {
|
||||
Volcanos.meta.pack[keys] = msg, toast && toast.close(), toast = true, can.base.isFunc(cb) && cb(msg)
|
||||
can.misc.Run(event, can, {names: names, daemon: msg._daemon}, cmds, function(msg) { toast && toast.close(), toast = true
|
||||
can.base.isFunc(cb) && cb(msg), Volcanos.meta.pack[can.core.Keys(panel._name, cmds.join(ice.FS))] = msg
|
||||
})
|
||||
},
|
||||
_static: function(event, can, msg, panel, cmds, cb) {
|
||||
if (can.user.isLocalFile) { var msg = can.request(event); msg.Clear(ice.MSG_APPEND)
|
||||
var keys = can.core.Keys(panel._name, cmds.join(ice.FS))
|
||||
var res = Volcanos.meta.pack[keys]; res? msg.Copy(res): can.user.toast(can, "缺失数据")
|
||||
return can.base.isFunc(cb) && cb(msg), true
|
||||
} return false
|
||||
},
|
||||
_engine: function(event, can, msg, panel, cmds, cb) { return false },
|
||||
_plugin: function(event, can, msg, panel, cmds, cb) {
|
||||
if (cmds[0] == ctx.ACTION && cmds[1] == ice.RUN) {
|
||||
@ -71,8 +70,7 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) {
|
||||
} return false
|
||||
},
|
||||
plugin: shy("添加插件", function(can, name, command) {
|
||||
if (name == undefined) { return }
|
||||
if (command == undefined) {
|
||||
if (can.base.isUndefined(name)) { return } else if (can.base.isUndefined(command)) {
|
||||
if (!can.base.isString(name) || name.indexOf("can.") == -1) { return }
|
||||
return arguments.callee.meta[can.base.trimPrefix(name, "can.")]
|
||||
}
|
||||
@ -88,26 +86,19 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) {
|
||||
})
|
||||
Volcanos(chat.ONDAEMON, {_init: function(can, name) { if (can.user.isLocalFile) { return }
|
||||
can.misc.WSS(can, {type: html.CHROME, name: can.misc.Search(can, cli.DAEMON)||name||"", text: can.user.title()}, function(event, msg, cmd, arg) { if (!msg) { return }
|
||||
var sub = can.ondaemon._list[msg.Option(ice.MSG_TARGET)]
|
||||
can.base.isFunc(can.ondaemon[cmd])? can.core.CallFunc(can.ondaemon[cmd], {
|
||||
can: can, sub: sub, msg: msg, cmd: cmd, arg: arg, cb: function() { msg.Reply() },
|
||||
}): can.onengine._search({}, can, msg, can, [chat._SEARCH, cmd].concat(arg), function() { msg.Reply() })
|
||||
var sub = can.ondaemon._list[msg.Option(ice.MSG_TARGET)]; can.base.isFunc(can.ondaemon[cmd])?
|
||||
can.core.CallFunc(can.ondaemon[cmd], { can: can, sub: sub, msg: msg, cmd: cmd, arg: arg, cb: function() { msg.Reply() }, }):
|
||||
can.onengine._search({}, can, msg, can, [chat._SEARCH, cmd].concat(arg), function() { msg.Reply() })
|
||||
})
|
||||
}, _list: [""],
|
||||
pwd: function(can, msg, arg) { can._wss_name = can.ondaemon._list[0] = arg[0] },
|
||||
toast: function(can, msg, arg) { can.core.CallFunc(can.user.toast, [can].concat(arg)) },
|
||||
refresh: function(can, msg, sub) { sub.Update() },
|
||||
input: function(can, msg, sub, arg) {
|
||||
can.page.Select(can, sub._target, "input:focus", function(target) { target.value += arg[0] })
|
||||
},
|
||||
input: function(can, msg, sub, arg) { can.page.Select(can, sub._target, "input:focus", function(target) { target.value += arg[0] }) },
|
||||
action: function(can, msg, sub, arg) {
|
||||
if (can.page.Select(can, sub._option, "input.args[name="+arg[0]+"]", function(target) {
|
||||
return target.focus(), target
|
||||
}).length > 0) { return }
|
||||
|
||||
var _sub = can.core.Value(sub, chat._OUTPUTS_CURRENT); if (_sub && _sub.onaction) {
|
||||
return _sub.onaction && _sub.onaction._daemon({}, _sub, arg)
|
||||
} sub.runAction({}, arg[0], arg.slice(1))
|
||||
if (can.page.Select(can, sub._option, "input.args[name="+arg[0]+"]", function(target) { return target.focus(), target }).length > 0) { return }
|
||||
var _sub = can.core.Value(sub, chat._OUTPUTS_CURRENT); if (_sub && _sub.onaction) { return _sub.onaction && _sub.onaction._daemon({}, _sub, arg) }
|
||||
sub.runAction({}, arg[0], arg.slice(1))
|
||||
},
|
||||
grow: function(can, msg, sub, arg) { sub.onimport._grow(sub, msg, can.page.Color(arg.join(""))) },
|
||||
close: function(can, msg, sub) { can.user.close() },
|
||||
@ -149,6 +140,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
case lang.OBJECT: can.page.style(can, sub._target, style); break
|
||||
} sub.Mode() != meta.type && can.page.ClassList.add(can, field, sub.Mode())
|
||||
|
||||
sub._trans = can.base.Copy(sub._trans||{}, can.core.Value(sub, [chat.ONACTION, "_trans"]))
|
||||
meta.inputs && sub.onappend._option(sub, meta, sub._option, meta.msg)
|
||||
if (meta.msg) { var msg = sub.request(); msg.Copy(can.base.Obj(meta.msg)), sub.onappend._output(sub, msg, meta.display||msg.Option(ice.MSG_DISPLAY)||meta.feature.display) }
|
||||
|
||||
@ -208,21 +200,10 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
}, true)
|
||||
})
|
||||
}
|
||||
if (meta && meta.index && meta.index.indexOf("can.") == 0) {
|
||||
return can.onengine._plugin(event, can, msg, can, can.misc.concat(can, [meta.index], cmds), function(msg) {
|
||||
if (can.base.isFunc(cb)) { can.core.CallFunc(cb, {can: can, msg: msg}); return }
|
||||
!silent && can.onappend._output(can, msg, meta.display||msg.Option(ice.MSG_DISPLAY)||meta.feature.display)
|
||||
})
|
||||
}
|
||||
if (can.base.isUndefined(msg._daemon) && !silent) {
|
||||
can.base.isUndefined(can._daemon) && can.ondaemon._list[0] && (can._daemon = can.ondaemon._list.push(can)-1)
|
||||
if (can._daemon) { msg.Option(ice.MSG_DAEMON, can.core.Keys(can.ondaemon._list[0], can._daemon)) }
|
||||
}
|
||||
return can.run(event, cmds, function(msg) { if (can.base.isFunc(cb)) { can.core.CallFunc(cb, {can: can, msg: msg}); return }
|
||||
var sub = can.core.Value(can, chat._OUTPUTS_CURRENT)||{}, process = msg._can == can || msg._can == sub
|
||||
if (process && can.core.CallFunc([can, chat.ONIMPORT, ice.MSG_PROCESS], {can: can, msg: msg}) || silent) { return }
|
||||
if (cmds && cmds[0] == ctx.ACTION && msg.Length() == 0 && msg.Result() == "") { return can.Update() }
|
||||
if (!cmds || cmds[0] != ctx.ACTION) { can._msg = msg, msg._cmds = cmds }
|
||||
if (cmds && cmds[0] == ctx.ACTION) { if (msg.Length() == 0 && msg.Result() == "") { return can.Update() } } else { can._msg = msg, msg._cmds = cmds }
|
||||
can.onappend._output(can, msg, meta.display||msg.Option(ice.MSG_DISPLAY)||meta.feature.display)
|
||||
})
|
||||
},
|
||||
@ -230,18 +211,17 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
Volcanos(display, {_root: can._root, _follow: can.core.Keys(can._follow, display), _target: output, _fields: can._target,
|
||||
_legend: can._legend, _option: can._option, _action: can._action, _output: output, _status: can._status,
|
||||
Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status,
|
||||
}, [display, chat.PLUGIN_TABLE_JS], function(sub) { sub.Conf(can.Conf()), sub.Mode(can.Mode())
|
||||
}, [display, chat.PLUGIN_TABLE_JS], function(sub) { sub.Conf(can.Conf())
|
||||
sub.run = function(event, cmds, cb, silent) { var msg = can.request(event)
|
||||
if (msg.RunAction(event, sub, cmds)) { return }
|
||||
return can.Update(event, can.Input(cmds, !silent), cb, silent)
|
||||
}, can._outputs && can._outputs.push(sub), sub.sup = can
|
||||
|
||||
sub._index = can._index, sub._msg = msg, sub.Conf(sub._args = can.base.ParseURL(display))
|
||||
sub._trans = can.base.Copy(sub._trans||{}, can.core.Value(sub, "onaction._trans"))
|
||||
sub._trans = can.base.Copy(sub._trans||{}, can._trans, can.core.Value(sub, [chat.ONACTION, "_trans"]))
|
||||
if (sub.onimport && can.base.isArray(sub.onimport.list) && sub.onimport.list.length > 0) {
|
||||
can.onmotion.clear(can, can._option), can.onappend._option(can, {inputs: can.page.inputs(can, sub.onimport.list) })
|
||||
}
|
||||
|
||||
can._display_output? can._display_output(sub, msg): can.core.CallFunc([sub, chat.ONIMPORT, chat._INIT], {can: sub, msg: msg, cb: function(msg) {
|
||||
can.onmotion.clear(can, can._action), can.user.isMobile && can.ConfHeight() > can.ConfWidth() && can.onmotion.hidden(can, can._action)
|
||||
action === false || sub.onappend._action(sub, msg.Option(ice.MSG_ACTION)||can.Conf(ice.MSG_ACTION), action||can._action)
|
||||
@ -263,9 +243,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
|
||||
field: function(can, type, item, target) { type = type||html.PLUGIN, item = item||{}
|
||||
var name = (item.nick||item.name||"").split(ice.SP)[0], title = !item.help || can.user.language(can) == "en"? name: name+"("+item.help.split(ice.SP)[0]+")"
|
||||
if (name == "word") { title = item.help.split(ice.SP)[0] }
|
||||
return can.page.Append(can, target||can._output, [{view: [can.base.join([type||"", item.name||"", item.pos||""]), html.FIELDSET], list: [
|
||||
name && {text: [title, html.LEGEND]}, {view: [html.OPTION, html.FORM]}, html.ACTION, html.OUTPUT, html.STATUS,
|
||||
name && {text: [name == "word"? item.help.split(ice.SP)[0]: title, html.LEGEND]}, {view: [html.OPTION, html.FORM]}, html.ACTION, html.OUTPUT, html.STATUS,
|
||||
]}])
|
||||
},
|
||||
input: function(can, item, value, target, style) {
|
||||
@ -278,9 +257,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
can.onkeymap.input(event, can), can.onkeymap.selectOutput(event, can), event.key == lang.ENTER && can.onkeymap.prevent(event)
|
||||
} }
|
||||
if (item.range) { input._init = function(target) { item.mode = chat.SIMPLE
|
||||
can.onappend.figure(can, item, target, function(sub, value, old) {
|
||||
target.value = value, can.onaction[item.name](event, can, item.name)
|
||||
})
|
||||
can.onappend.figure(can, item, target, function(sub, value, old) { target.value = value, can.onaction[item.name](event, can, item.name) })
|
||||
} }
|
||||
var br = input.type == html.TEXTAREA? [{type: html.BR, style: {clear: html.BOTH}}]: []
|
||||
var title = can.Conf(can.core.Keys(ctx.FEATURE, chat.TITLE, item.name))||""; title && (input.title = title)
|
||||
@ -288,13 +265,10 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
},
|
||||
table: function(can, msg, cb, target, sort) { if (msg.Length() == 0) { return } var meta = can.base.Obj(msg.Option(mdb.META))
|
||||
var table = can.page.AppendTable(can, msg, target||can._output, msg.append, cb||function(value, key, index, line, array) {
|
||||
if (msg.append.length == 2 && msg.append[0] == mdb.KEY && msg.append[1] == mdb.VALUE) {
|
||||
if (msg.append.length == 2 && msg.append[0] == mdb.KEY && msg.append[1] == mdb.VALUE) { if (key == mdb.VALUE) { key = line.key }
|
||||
line = {}, can.core.List(array, function(item) { line[item.key] = item.value })
|
||||
if (key == mdb.VALUE) { key = line.key }
|
||||
key == "extra.cmd" && can.onappend.plugin(can, {ctx: line["extra.ctx"], cmd: line["extra.cmd"], arg: line["extra.arg"]}, function(sub) {
|
||||
sub.run = function(event, cmds, cb) { var msg = can.request(event, line, can.Option())
|
||||
can.runActionCommand(event, can.core.Keys(line["extra.ctx"], line["extra.cmd"]), cmds, cb)
|
||||
}
|
||||
sub.run = function(event, cmds, cb) { can.runActionCommand(can.request(event, line, can.Option()), can.core.Keys(line["extra.ctx"], line["extra.cmd"]), cmds, cb) }
|
||||
}, target||can._output)
|
||||
}
|
||||
function run(cmds) {
|
||||
@ -328,31 +302,24 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
var code = can.page.Append(can, target||can._output, [{text: [can.page.Color(text), html.DIV, html.CODE]}]).code
|
||||
can.page.Select(can, code, html.INPUT_BUTTON, function(target) { target.onclick = function(event) {
|
||||
can.runAction(can.request(event, can.Option()), target.name, [], function(msg) { can.run() })
|
||||
} })
|
||||
return (code.scrollBy && code.scrollBy(0, 10000)), code
|
||||
},
|
||||
tools: function(can, msg, cb, target) {
|
||||
can.onimport.tool(can, can.base.Obj(msg.Option(ice.MSG_TOOLKIT), []), cb, target)
|
||||
} }); return (code.scrollBy && code.scrollBy(0, 10000)), code
|
||||
},
|
||||
tools: function(can, msg, cb, target) { can.onimport.tool(can, can.base.Obj(msg.Option(ice.MSG_TOOLKIT), []), cb, target) },
|
||||
|
||||
_plugin: function(can, value, meta, cb, target, field) {
|
||||
meta.feature = can.base.getValid(meta.feature, can.base.Obj(value.meta))||{}
|
||||
meta.inputs = can.base.getValid(meta.inputs, can.base.Obj(value.list))||[]
|
||||
meta.display = meta.display||value.display
|
||||
meta.height = meta.height||can.ConfHeight()
|
||||
meta.width = meta.width||can.ConfWidth()
|
||||
meta.type = meta.type||chat.PLUGIN
|
||||
meta.name = meta.name||value.name
|
||||
meta.help = meta.help||value.help
|
||||
meta.feature = can.base.getValid(meta.feature, can.base.Obj(value.meta))||{}
|
||||
meta.display = meta.display||value.display, meta.height = meta.height||can.ConfHeight(), meta.width = meta.width||can.ConfWidth()
|
||||
meta.type = meta.type||chat.PLUGIN, meta.name = meta.name||value.name, meta.help = meta.help||value.help
|
||||
meta.args = can.base.getValid(can.base.Obj(meta.args), can.base.Obj(meta.arg), can.base.Obj(value.args), can.base.Obj(value.arg))||[]
|
||||
if (can.misc.Debug(can, "plugin", meta.index, meta.args, meta)) { debugger }
|
||||
if (can.misc.Debug(can, chat.PLUGIN, meta.index, meta.args, meta)) { debugger }
|
||||
can.onappend._init(can, meta, [chat.PLUGIN_STATE_JS], function(sub, skip) { sub._index = value.index||meta.index
|
||||
sub.run = function(event, cmds, cb) { can.runActionCommand(event, sub._index, cmds, cb) }
|
||||
can.base.isFunc(cb) && cb(sub, meta, skip)
|
||||
}, target||can._output, field)
|
||||
},
|
||||
plugin: function(can, meta, cb, target, field) { meta = meta||{}, meta.index = meta.index||can.core.Keys(meta.ctx, meta.cmd)
|
||||
if (can.misc.Debug(can, "plugin", meta.index, meta.args, meta)) { debugger }
|
||||
if (can.misc.Debug(can, chat.PLUGIN, meta.index, meta.args, meta)) { debugger }
|
||||
var p = can.onengine.plugin(can, meta.index), res = {}; function cbs(sub, meta, skip) { kit.proto(res, sub), cb(sub, meta, skip) }
|
||||
(meta.inputs && meta.inputs.length > 0 || meta.meta)? /* 局部命令 */ can.onappend._plugin(can, {meta: meta.meta, list: meta.list}, meta, cbs, target, field):
|
||||
p? /* 前端命令 */ can.onappend._plugin(can, {name: meta.index, help: p.help, meta: p.meta, list: p.list}, meta, function(sub, meta, skip) {
|
||||
@ -365,17 +332,14 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
}) }); return res
|
||||
},
|
||||
figure: function(can, meta, target, cbs) { if ([html.BUTTON, html.SELECT].indexOf(meta.type) > -1) { return }
|
||||
var input = meta.action||mdb.KEY; input != ice.AUTO && can.require(["/plugin/input/"+input+".js"], function(can) {
|
||||
var input = meta.action||mdb.KEY; input != ice.AUTO && can.require(["/plugin/input/"+input+nfs._JS], function(can) {
|
||||
can.core.ItemCB(can.onfigure[input], function(key, on) { var last = target[key]; target[key] = function(event) { on(event, can, meta, function(cb) {
|
||||
function _cbs(sub, value, old) { can.onmotion.hidden(can, sub._target), can.base.isFunc(cbs)? cbs(sub, value, old): target.value = value||"", can.onmotion.delay(can, function() { can.onmotion.focus(can, target) }) }
|
||||
if (target._can) { return can.onmotion.toggle(can, target._can._target, true), can.base.isFunc(cb) && cb(target._can, _cbs) }
|
||||
can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT, mode: meta.mode}, ["/plugin/input/"+input+".js"], function(sub) { sub.Conf(meta)
|
||||
sub.run = function(event, cmds, cb) {
|
||||
if (meta.range) { var msg = can.request(event)
|
||||
for (var i = meta.range[0]; i < meta.range[1]; i += meta.range[2]||1) { msg.Push("value", i) } cb(msg)
|
||||
} else {
|
||||
(meta.run||can.run)(sub.request(event, can.Option()), cmds, cb, true)
|
||||
}
|
||||
can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT, mode: meta.mode}, ["/plugin/input/"+input+nfs._JS], function(sub) { sub.Conf(meta)
|
||||
sub.run = function(event, cmds, cb) { var msg = can.request(event)
|
||||
if (meta.range) { for (var i = meta.range[0]; i < meta.range[1]; i += meta.range[2]||1) { msg.Push(mdb.VALUE, i) } cb(msg); return }
|
||||
(meta.run||can.run)(sub.request(event, can.Option()), cmds, cb, true)
|
||||
}
|
||||
can.onlayout.figure({target: target}, can, sub._target), can.page.style(sub, sub._target, meta.style)
|
||||
target._can = sub, sub.close = function() { can.page.Remove(can, sub._target), delete(target._can) }
|
||||
@ -386,26 +350,17 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||document.body
|
||||
var width = can.page.width(), height = can.page.height()
|
||||
can.page.SelectChild(can, target, can.page.Keys(html.FIELDSET_HEAD, html.FIELDSET_FOOT), function(field) {
|
||||
height -= field.offsetHeight
|
||||
})
|
||||
var height = can.page.height(), width = can.page.width()
|
||||
can.page.SelectChild(can, target, can.page.Keys(html.FIELDSET_HEAD, html.FIELDSET_FOOT), function(field) { height -= field.offsetHeight })
|
||||
can.page.SelectChild(can, target, html.FIELDSET_LEFT, function(field) {
|
||||
can.page.styleHeight(can, field, height), can.user.isMobile || (width -= field.offsetWidth)
|
||||
can.page.SelectChild(can, field, html.DIV_OUTPUT, function(output) {
|
||||
can.page.styleHeight(can, output, height-html.ACTION_HEIGHT)
|
||||
})
|
||||
can.page.SelectChild(can, field, html.DIV_OUTPUT, function(output) { can.page.styleHeight(can, output, height-html.ACTION_HEIGHT) })
|
||||
})
|
||||
can.user.isMobile || can.page.SelectChild(can, target, html.FIELDSET_MAIN, function(field) {
|
||||
can.page.style(can, field, html.HEIGHT, height, html.WIDTH, width)
|
||||
can.page.SelectChild(can, field, html.DIV_ACTION, function(action) {
|
||||
height -= action.offsetHeight
|
||||
})
|
||||
can.page.SelectChild(can, field, html.DIV_OUTPUT, function(output) {
|
||||
can.page.styleHeight(can, output, height)
|
||||
})
|
||||
})
|
||||
can.onengine.signal(can, chat.ONSIZE, can.request({}, {width: width, height: height}))
|
||||
can.page.SelectChild(can, field, html.DIV_ACTION, function(action) { height -= action.offsetHeight })
|
||||
can.page.SelectChild(can, field, html.DIV_OUTPUT, function(output) { can.page.styleHeight(can, output, height) })
|
||||
}), can.onengine.signal(can, chat.ONSIZE, can.request({}, {height: height, width: width}))
|
||||
},
|
||||
background: function(can, url, target) { can.page.style(can, target||document.body, "background-image", url == "" || url == "void"? "": 'url("'+url+'")') },
|
||||
figure: function(event, can, target, right) { if (!event || !event.target) { return {} } target = target||can._fields||can._target
|
||||
@ -425,16 +380,13 @@ Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||documen
|
||||
}); return can.onmotion.move(can, target, layout), layout
|
||||
},
|
||||
|
||||
display: function(can, target) {
|
||||
return can.page.Appends(can, target||can._output, [{view: [chat.LAYOUT, html.TABLE], list: [
|
||||
{type: html.TR, list: [chat.CONTENT]}, {type: html.TR, list: [chat.DISPLAY]},
|
||||
]}])
|
||||
},
|
||||
display: function(can, target) { return can.page.Appends(can, target||can._output, [{view: [chat.LAYOUT, html.TABLE], list: [
|
||||
{type: html.TR, list: [chat.CONTENT]}, {type: html.TR, list: [chat.DISPLAY]},
|
||||
]}]) },
|
||||
profile: function(can, target) {
|
||||
function toggle(view) { var show = view.style.display == html.NONE
|
||||
can.onmotion.toggle(can, view, show), view._toggle? view._toggle(event, show): can.onimport.layout && can.onimport.layout(can); return show
|
||||
}
|
||||
var gt = "❯", lt = "❮", down = lt, up = gt, button = {}
|
||||
} var gt = "❯", lt = "❮", down = lt, up = gt, button = {}
|
||||
var ui = can.page.Append(can, target||can._output, [{view: [chat.LAYOUT, html.TABLE], list: [
|
||||
{view: [chat.PROJECT, html.TD], list: [chat.PROJECT]}, {type: html.TD, list: [
|
||||
{type: html.TR, list: [{type: html.TR, list: [
|
||||
@ -451,8 +403,7 @@ Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||documen
|
||||
]}, {view: [chat.PROFILE, html.TD], list: [chat.PROFILE]},
|
||||
]}]}, {view: [chat.DISPLAY, html.TR], list: [chat.DISPLAY]}
|
||||
]}
|
||||
] }])
|
||||
function set(meta, button) { can.page.Appends(can, meta.target, [{text: [button, html.DIV]}]) }
|
||||
] }]); function set(meta, button) { can.page.Appends(can, meta.target, [{text: [button, html.DIV]}]) }
|
||||
can.core.List([chat.PROJECT, chat.DISPLAY, chat.PROFILE], function(item) { var meta = button[item]
|
||||
ui[item]._hide = function() { set(meta, meta.hide) }, ui[item]._show = function() { set(meta, meta.show) }
|
||||
}); return can.ui = ui
|
||||
@ -467,15 +418,12 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) {
|
||||
story: {
|
||||
_hash: {
|
||||
spark: function(can, meta, target) {
|
||||
meta[mdb.NAME] == html.INNER? can.onmotion.copy(can, target): can.page.Select(can, target, html.SPAN, function(item) {
|
||||
can.onmotion.copy(can, item)
|
||||
})
|
||||
meta[mdb.NAME] == html.INNER? can.onmotion.copy(can, target): can.page.Select(can, target, html.SPAN, function(item) { can.onmotion.copy(can, item) })
|
||||
},
|
||||
},
|
||||
auto: function(can, target) { var that = this; target = target||can._output
|
||||
can.page.Select(can, target, ".story", function(item) { var meta = item.dataset
|
||||
can.page.style(can, item, can.base.Obj(meta.style))
|
||||
can.core.CallFunc(that._hash[meta.type], [can, meta, target])
|
||||
can.page.Select(can, target, wiki.STORY_ITEM, function(item) { var meta = item.dataset
|
||||
can.page.style(can, item, can.base.Obj(meta.style)), can.core.CallFunc(that._hash[meta.type], [can, meta, target])
|
||||
})
|
||||
can.page.Select(can, target, html.INPUT_BUTTON, function(target) {
|
||||
if (target.value == target.name) { target.value = can.user.trans(can, target.name) }
|
||||
@ -486,8 +434,7 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) {
|
||||
},
|
||||
},
|
||||
|
||||
hidden: function(can, target, show) { target = target||can._target
|
||||
can.page.styleDisplay(can, target, show? "": html.NONE)
|
||||
hidden: function(can, target, show) { target = target||can._target, can.page.styleDisplay(can, target, show? "": html.NONE)
|
||||
return show? target._show && target._show(): target._hide && target._hide(), show
|
||||
},
|
||||
toggle: function(can, target, show, hide) { target = target||can._target
|
||||
@ -500,44 +447,26 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) {
|
||||
var old = can.page.Select(can, target, name, function(target, index) {
|
||||
if (can.page.ClassList.has(can, target, html.SELECT)) { return index }
|
||||
})[0]
|
||||
which != undefined && can.page.Select(can, target, name, function(target, index) {
|
||||
if (can.page.ClassList.set(can, target, html.SELECT, target == which || which == index)) {
|
||||
can.base.isFunc(cb) && cb(target)
|
||||
}
|
||||
can.base.isUndefined(which) || can.page.Select(can, target, name, function(target, index) {
|
||||
if (can.page.ClassList.set(can, target, html.SELECT, target == which || which == index)) { can.base.isFunc(cb) && cb(target) }
|
||||
}); return old
|
||||
},
|
||||
modify: function(can, target, cb, item) { var back = target.innerHTML
|
||||
if (back.length > 120 || back.indexOf(ice.NL) > -1) { return can.onmotion.modifys(can, target, cb) }
|
||||
var ui = can.page.Appends(can, target, [{type: html.INPUT, value: target.innerText, style: {
|
||||
width: can.base.Max(target.offsetWidth-20, 400),
|
||||
}, onkeydown: function(event) {
|
||||
switch (event.key) {
|
||||
case lang.ENTER: target.innerHTML = event.target.value
|
||||
event.target.value == back || cb(event, event.target.value, back)
|
||||
break
|
||||
case lang.ESCAPE: target.innerHTML = back; break
|
||||
default: can.onkeymap.input(event, can)
|
||||
}
|
||||
}, _init: function(target) { item && can.onappend.figure(can, item, target, cb)
|
||||
can.onmotion.focus(can, target), can.onmotion.delay(can, function() { target.click() })
|
||||
}}])
|
||||
var ui = can.page.Appends(can, target, [{type: html.INPUT, value: target.innerText, style: {width: can.base.Max(target.offsetWidth-20, 400)}, onkeydown: function(event) { switch (event.key) {
|
||||
case lang.ENTER: target.innerHTML = event.target.value, event.target.value == back || cb(event, event.target.value, back); break
|
||||
case lang.ESCAPE: target.innerHTML = back; break
|
||||
default: can.onkeymap.input(event, can)
|
||||
} }, _init: function(target) { item && can.onappend.figure(can, item, target, cb), can.onmotion.focus(can, target), can.onmotion.delay(can, function() { target.click() }) }}])
|
||||
},
|
||||
modifys: function(can, target, cb, item) { var back = target.innerHTML
|
||||
var ui = can.page.Appends(can, target, [{type: html.TEXTAREA, value: target.innerText, style: {
|
||||
height: can.base.Min(target.offsetHeight-20, 60), width: can.base.Max(target.offsetWidth-20, 400),
|
||||
}, onkeydown: function(event) {
|
||||
switch (event.key) {
|
||||
case lang.ENTER:
|
||||
if (event.ctrlKey) { target.innerHTML = event.target.value
|
||||
event.target.value == back || cb(event, event.target.value, back)
|
||||
}
|
||||
break
|
||||
case lang.ESCAPE: target.innerHTML = back; break
|
||||
default: can.onkeymap.input(event, can)
|
||||
}
|
||||
}, _init: function(target) { item && can.onappend.figure(can, item, target)
|
||||
can.onmotion.focus(can, target), can.onmotion.delay(can, function() { target.click() })
|
||||
}}])
|
||||
}, onkeydown: function(event) { switch (event.key) {
|
||||
case lang.ENTER: if (event.ctrlKey) { target.innerHTML = event.target.value, event.target.value == back || cb(event, event.target.value, back) } break
|
||||
case lang.ESCAPE: target.innerHTML = back; break
|
||||
default: can.onkeymap.input(event, can)
|
||||
} }, _init: function(target) { item && can.onappend.figure(can, item, target), can.onmotion.focus(can, target), can.onmotion.delay(can, function() { target.click() }) }}])
|
||||
},
|
||||
tableFilter: function(can, target, value) { can.page.Select(can, target, html.TR, function(tr, index) {
|
||||
index == 0 && can.page.ClassList.set(can, tr, html.HIDDEN, can.page.Select(can, tr, html.TD, function(td) { if (td.innerText.indexOf(value) > -1) { return td } }) == 0)
|
||||
@ -549,32 +478,21 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) {
|
||||
can.core.List(list, function(target) { target && target._cache_key && can.page.Cache(target._cache_key, target, target.scrollTop+1) })
|
||||
var key = next(can._cache_data = can._cache_data||{}, arguments[2]._cache_key); if (!key) { return }
|
||||
return can.core.List(list, function(target) { if (!target) { return }
|
||||
var pos = can.page.Cache(target._cache_key = key, target)
|
||||
if (pos) { target.scrollTo && target.scrollTo(0, pos-1); return target }
|
||||
var pos = can.page.Cache(target._cache_key = key, target); if (pos) { target.scrollTo && target.scrollTo(0, pos-1); return target }
|
||||
}).length > 0
|
||||
},
|
||||
share: function(event, can, input, args) { var _args = args
|
||||
return can.user.input(event, can, input, function(args) {
|
||||
can.onengine.signal(can, chat.ONSHARE, can.request(event, {args: [mdb.TYPE, chat.FIELD].concat(_args||[], args||[])}))
|
||||
})
|
||||
},
|
||||
focus: function(can, target) { if (!target) { return }
|
||||
target.focus(), target.setSelectionRange && target.setSelectionRange(0, target.value.length)
|
||||
return can.user.input(event, can, input, function(args) { can.onengine.signal(can, chat.ONSHARE, can.request(event, {args: [mdb.TYPE, chat.FIELD].concat(_args||[], args||[])})) })
|
||||
},
|
||||
focus: function(can, target) { if (!target) { return } target.focus(), target.setSelectionRange && target.setSelectionRange(0, target.value.length) },
|
||||
copy: function(can, target, cb) { target.title = "点击复制", target.onclick = function(event) { can.user.copy(event, can, target.innerText), can.base.isFunc(cb) && cb(event) } },
|
||||
|
||||
copy: function(can, target, cb) {
|
||||
target.title = "点击复制", target.onclick = function(event) {
|
||||
can.user.copy(event, can, target.innerText), can.base.isFunc(cb) && cb(event)
|
||||
}
|
||||
},
|
||||
move: function(can, target, layout, cb) { var begin; layout = layout||{}
|
||||
can.page.style(can, target, layout), target.onmousedown = function(event) {
|
||||
layout.height = target.offsetHeight, layout.width = target.offsetWidth
|
||||
layout.left = target.offsetLeft, layout.top = target.offsetTop
|
||||
begin = can.base.Copy({x: event.x, y: event.y}, layout)
|
||||
}, target.onmouseup = function(event) { begin = null }
|
||||
|
||||
target.onmousemove = function(event) { if (!begin) { return }
|
||||
}, target.onmouseup = function(event) { begin = null }, target.onmousemove = function(event) { if (!begin) { return }
|
||||
if (event.shiftKey) {
|
||||
layout.height = begin.height + event.y - begin.y, layout.width = begin.width + event.x - begin.x
|
||||
can.page.style(can, target, html.HEIGHT, layout.height, html.WIDTH, layout.width)
|
||||
@ -584,30 +502,23 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) {
|
||||
}
|
||||
}
|
||||
},
|
||||
hide: function(can, time, cb, target) { target = target||can._target
|
||||
hide: function(can, time, cb, target) { target = target||can._target, can.page.style(can, target, html.OPACITY, 1)
|
||||
time = can.base.isObject(time)? time: {value: 10, length: time||20}
|
||||
can.page.style(can, target, html.OPACITY, 1)
|
||||
can.core.Timer(time, function(event, value, index) {
|
||||
can.page.style(can, target, html.OPACITY, 1-(index+1)/time.length)
|
||||
}, function() { can.base.isFunc(cb) && cb(), can.page.style(can, target, html.DISPLAY, html.NONE) })
|
||||
can.core.Timer(time, function(event, value, index) { can.page.style(can, target, html.OPACITY, 1-(index+1)/time.length) },
|
||||
function() { can.base.isFunc(cb) && cb(), can.page.style(can, target, html.DISPLAY, html.NONE) })
|
||||
},
|
||||
show: function(can, time, cb, target) { target = target||can._target
|
||||
show: function(can, time, cb, target) { target = target||can._target, can.page.style(can, target, html.OPACITY, 0, html.DISPLAY, html.BLOCK)
|
||||
time = can.base.isObject(time)? time: {interval: 10, length: time||30}
|
||||
can.page.style(can, target, html.OPACITY, 0, html.DISPLAY, html.BLOCK)
|
||||
can.core.Timer(time, function(event, value, index) {
|
||||
can.page.style(can, target, html.OPACITY, (index+1)/time.length)
|
||||
}, cb)
|
||||
can.core.Timer(time, function(event, value, index) { can.page.style(can, target, html.OPACITY, (index+1)/time.length) }, cb)
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONKEYMAP, {_init: function(can, target) {
|
||||
document.body.onclick = function(event) {
|
||||
if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return }
|
||||
if (can.user.isWebview && can.page.tagis(event.target, html.A)) {
|
||||
if (can.page.tagis(event.target, html.A) && can.user.isWebview) {
|
||||
return event.shiftKey? window.outopen(event.target.href): can.user.open(event.target.href)
|
||||
}
|
||||
can.page.Select(can, document.body, can.page.Keys("div.carte.float", "fieldset.input.key.float"), function(target) {
|
||||
can.page.Remove(can, target)
|
||||
})
|
||||
can.page.Select(can, document.body, can.page.Keys("div.carte.float", "fieldset.input.key.float"), function(target) { can.page.Remove(can, target) })
|
||||
}
|
||||
can.onkeymap._build(can), document.body.onkeydown = function(event) {
|
||||
var msg = can.request(event, {"model": "normal"}); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }
|
||||
@ -634,20 +545,14 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) {
|
||||
})
|
||||
},
|
||||
_parse: function(event, can, mode, list, target) { list = list||[]
|
||||
if (event.metaKey && !can.user.isWebview) { return }
|
||||
if (["Meta", "Alt", "Control", "Shift"].indexOf(event.key) > -1) { return list }
|
||||
list.push(event.key); for (var pre = 0; pre < list.length; pre++) {
|
||||
if ("0" <= list[pre] && list[pre] <= "9") { continue } break
|
||||
}; var count = parseInt(list.slice(0, pre).join(""))||1
|
||||
|
||||
var map = can.onkeymap._mode[mode]
|
||||
if (event.metaKey && !can.user.isWebview) { return } if ([lang.META, lang.ALT, lang.CONTROL, lang.SHIFT].indexOf(event.key) > -1) { return list }
|
||||
list.push(event.key); for (var pre = 0; pre < list.length; pre++) { if ("0" <= list[pre] && list[pre] <= "9") { continue } break }
|
||||
var count = parseInt(list.slice(0, pre).join(""))||1, map = can.onkeymap._mode[mode]
|
||||
function repeat(cb, count) { list = []; for (var i = 1; i <= count; i++) { if (can.core.CallFunc(cb, {event: event, can: can, target: target, count: count})) { break } } }
|
||||
var cb = map && map[event.key]; if (can.base.isFunc(cb) && event.key.length > 1) { repeat(cb, count); return list }
|
||||
var cb = map && map[event.key.toLowerCase()]; if (can.base.isFunc(cb) && event.key.length > 1) { repeat(cb, count); return list }
|
||||
|
||||
var map = can.onkeymap._engine[mode]; if (!map) { return [] }
|
||||
for (var i = pre; i < list.length; i++ ) {
|
||||
var map = map.list[list[i]]; if (!map) { return [] }
|
||||
for (var i = pre; i < list.length; i++ ) { var map = map.list[list[i]]; if (!map) { return [] }
|
||||
if (i == list.length-1 && can.base.isFunc(map.cb)) { repeat(map.cb, count); return [] }
|
||||
} return list
|
||||
},
|
||||
@ -665,8 +570,8 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) {
|
||||
f: function(event, can, target) { can.onengine.signal(can, chat.ONOPENSEARCH, can.request({}, {type: mdb.FOREACH})) },
|
||||
},
|
||||
insert: {
|
||||
Escape: function(event, can, target) { if (event.key == "Escape") { target.blur() } },
|
||||
Enter: function(event, can, target) { if (event.key != "Enter") { return }
|
||||
Escape: function(event, can, target) { if (event.key == lang.ESCAPE) { target.blur() } },
|
||||
Enter: function(event, can, target) { if (event.key != lang.ENTER) { return }
|
||||
var his = target._history||[]; his.push(target.value), target._history = his, target._current = his.length
|
||||
can.page.tagis(event.target, html.INPUT) && can.onmotion.focus(can, target)
|
||||
},
|
||||
@ -682,16 +587,11 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) {
|
||||
if (target.value[end] != ice.SP && target.value[i] == ice.SP) { break }
|
||||
} can.onkeymap.deleteText(target, i+1, end-i)
|
||||
},
|
||||
|
||||
n: function(event, can, target) {
|
||||
var his = target._history||[], pos = target._current||0
|
||||
pos = ++pos % (his.length+1)
|
||||
target._current = pos, target.value = his[pos]||""
|
||||
n: function(event, can, target) { var his = target._history||[], pos = target._current||0
|
||||
pos = ++pos % (his.length+1), target._current = pos, target.value = his[pos]||""
|
||||
},
|
||||
p: function(event, can, target) {
|
||||
var his = target._history||[], pos = target._current||0
|
||||
pos = --pos % (his.length+1); if (pos < 0) { pos = his.length }
|
||||
target._current = pos, target.value = his[pos]||""
|
||||
p: function(event, can, target) { var his = target._history||[], pos = target._current||0
|
||||
pos = --pos % (his.length+1); if (pos < 0) { pos = his.length } target._current = pos, target.value = his[pos]||""
|
||||
},
|
||||
},
|
||||
}, _engine: {},
|
||||
@ -700,10 +600,8 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) {
|
||||
target._keys = can.onkeymap._parse(event, can, mdb.INSERT+(event.ctrlKey? "_ctrl": ""), target._keys, target)
|
||||
},
|
||||
cursorMove: function(target, count, begin) {
|
||||
if (begin != undefined) { if (begin < 0) { begin += target.value.length+1 }
|
||||
target.setSelectionRange(begin, begin)
|
||||
}
|
||||
count != undefined && target.setSelectionRange(target.selectionStart+count, target.selectionStart+count)
|
||||
if (begin != undefined) { if (begin < 0) { begin += target.value.length+1 } target.setSelectionRange(begin, begin) }
|
||||
count == undefined || target.setSelectionRange(target.selectionStart+count, target.selectionStart+count)
|
||||
return target.selectionStart
|
||||
},
|
||||
insertText: function(target, text) { var start = target.selectionStart
|
||||
@ -717,37 +615,27 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) {
|
||||
},
|
||||
|
||||
selectInputs: function(event, can, cb, target) {
|
||||
if (["Meta", "Alt", "Control", "Shift"].indexOf(event.key) > -1) { return }
|
||||
|
||||
if (event.ctrlKey) { if (target._index == undefined) { target._index = -1, target._value = target.value }
|
||||
if ([lang.META, lang.ALT, lang.CONTROL, lang.SHIFT].indexOf(event.key) > -1) { return }
|
||||
if (event.ctrlKey) { if (can.base.isUndefined(target._index)) { target._index = -1, target._value = target.value }
|
||||
function select(order) { if (order == -1) { target.value = target._value }
|
||||
var index = 0; return can.page.Select(can, can._output, [html.TBODY, html.TR], function(tr) {
|
||||
if (can.page.ClassList.has(can, tr, html.HIDDEN)) { return }
|
||||
can.page.ClassList.del(can, tr, html.SELECT); if (order != index++) { return tr }
|
||||
can.page.ClassList.add(can, tr, html.SELECT), can.page.Select(can, tr, html.TD, function(td, index) {
|
||||
index == 0 && (target.value = td.innerText)
|
||||
}); return tr
|
||||
can.page.ClassList.del(can, tr, html.SELECT); if (order == index++) { can.page.ClassList.add(can, tr, html.SELECT)
|
||||
can.page.Select(can, tr, html.TD, function(td, index) { index == 0 && (target.value = td.innerText) })
|
||||
} return tr
|
||||
}).length
|
||||
}
|
||||
var total = select(target._index); switch (event.key) {
|
||||
case "n": select(target._index = (target._index+2) % (total+1) - 1); break
|
||||
case "p": select(target._index = (target._index+total+1) % (total+1) - 1); break
|
||||
default: return
|
||||
}
|
||||
return can.Status(mdb.INDEX, target._index), can.onkeymap.prevent(event)
|
||||
} return can.Status(mdb.INDEX, target._index), can.onkeymap.prevent(event)
|
||||
}
|
||||
|
||||
target._index = -1, target._value = target.value
|
||||
can.page.Select(can, can._output, [html.TBODY, html.TR], function(tr, index) {
|
||||
var has = false; can.page.Select(can, tr, html.TD, function(td) {
|
||||
has = has || td.innerText.indexOf(target.value)>-1
|
||||
}), can.page.ClassList.set(can, tr, html.HIDDEN, !has)
|
||||
})
|
||||
|
||||
var total = can.page.Select(can, can._output, [html.TBODY, html.TR], function(tr) {
|
||||
if (!can.page.ClassList.has(can, tr, html.HIDDEN)) { return tr }
|
||||
}).length; total == 0 && can.base.isFunc(cb) && cb()
|
||||
can.Status(kit.Dict(mdb.TOTAL, total, mdb.INDEX, target._index))
|
||||
can.page.Select(can, can._output, [html.TBODY, html.TR], function(tr, index) { var has = false
|
||||
can.page.Select(can, tr, html.TD, function(td) { has = has || td.innerText.indexOf(target.value)>-1 }), can.page.ClassList.set(can, tr, html.HIDDEN, !has)
|
||||
}), target._index = -1, target._value = target.value
|
||||
var total = can.page.Select(can, can._output, [html.TBODY, html.TR], function(tr) { if (!can.page.ClassList.has(can, tr, html.HIDDEN)) { return tr } }).length
|
||||
total == 0 && can.base.isFunc(cb) && cb(), can.Status(kit.Dict(mdb.TOTAL, total, mdb.INDEX, target._index))
|
||||
},
|
||||
selectOutput: function(event, can) { if (!event.ctrlKey || event.key < "0" || event.key > "9") { return }
|
||||
event.key == "0"? can.onimport._back(can): can.page.Select(can, can._output, html.TR, function(tr, index) { if (index == event.key) {
|
||||
|
31
lib/base.js
31
lib/base.js
@ -9,7 +9,7 @@ Volcanos("base", {
|
||||
} catch (e) { return val&&val.split&&val.split(ice.FS) || def }
|
||||
},
|
||||
Copy: function(to, from, skip) { if (!from) { return to }
|
||||
if (arguments.length == 2 || typeof skip == "boolean") {
|
||||
if (arguments.length == 2 || typeof skip == lang.BOOLEAN) {
|
||||
for (var k in from) {
|
||||
if (skip && to[k] != undefined) { continue }
|
||||
if (from[k] === "") { delete(to[k]); continue }
|
||||
@ -35,9 +35,9 @@ Volcanos("base", {
|
||||
Args: function() { var res = []
|
||||
for (var i = 0; i < arguments.length; i += 2) {
|
||||
if (typeof arguments[i] == lang.OBJECT) {
|
||||
for (var k in arguments[i]) { res.push(encodeURIComponent(k)+"="+encodeURIComponent(arguments[i][k])) } i--; continue
|
||||
for (var k in arguments[i]) { res.push(encodeURIComponent(k)+ice.EQ+encodeURIComponent(arguments[i][k])) } i--; continue
|
||||
} else if (arguments[i]) {
|
||||
res.push(encodeURIComponent(arguments[i])+"="+encodeURIComponent(arguments[i+1]))
|
||||
res.push(encodeURIComponent(arguments[i])+ice.EQ+encodeURIComponent(arguments[i+1]))
|
||||
}
|
||||
} return res.join("&")
|
||||
},
|
||||
@ -51,13 +51,12 @@ Volcanos("base", {
|
||||
for (var k in arguments[i]) { args[k] = arguments[i][k] }
|
||||
}
|
||||
} }
|
||||
var list = []; for (var k in args) { k &&args[k] && list.push(encodeURIComponent(k)+"="+encodeURIComponent(args[k])) }
|
||||
var list = []; for (var k in args) { k &&args[k] && list.push(encodeURIComponent(k)+ice.EQ+encodeURIComponent(args[k])) }
|
||||
return url.split("?")[0]+(list.length>0? "?"+list.join("&"): "")
|
||||
},
|
||||
_parse: function(url, res) { var list = url.split("?"); res = res||{}, 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
|
||||
list[1] && list[1].split("&").forEach(function(item) { var ls = item.split(ice.EQ); res[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1]) })
|
||||
return res
|
||||
},
|
||||
ParseURL: function(url) { var res = this._parse(url); res.link = url, res.origin = res._origin; return res },
|
||||
ParseJSON: function(str) { var res; if (typeof str == lang.OBJECT) { return str }
|
||||
@ -151,21 +150,9 @@ Volcanos("base", {
|
||||
trimPrefix: function(str, pre) { if (str.indexOf(pre) == -1) { return str } return str.slice(pre.length) },
|
||||
trimSuffix: function(str, end) { var index = str.lastIndexOf(end); if (index == -1 || index+end.length != str.length) { return str } return str.slice(0, index) },
|
||||
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)
|
||||
},
|
||||
joinKV: function(list, inner, outer) { var res = []
|
||||
for (var i = 0; i < list.length-1; i += 2) {
|
||||
res.push(list[i]+(inner||": ")+list[i+1])
|
||||
} return res.join(outer||ice.SP)
|
||||
},
|
||||
count: function(str, s) { var n = 0
|
||||
for (var i = 0; i < str.length; i++) {
|
||||
if (str[i] == s) { n++ }
|
||||
} return n
|
||||
},
|
||||
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) },
|
||||
joinKV: function(list, inner, outer) { var res = []; for (var i = 0; i < list.length-1; i += 2) { res.push(list[i]+(inner||": ")+list[i+1]) } return res.join(outer||ice.SP) },
|
||||
count: function(str, s) { var n = 0; for (var i = 0; i < str.length; i++) { if (str[i] == s) { n++ } } return n },
|
||||
replaceAll: function(str) {
|
||||
for (var i = 1; i < arguments.length; i += 2) { if (!arguments[i]) { continue }
|
||||
if (str.replaceAll) { str = str.replaceAll(arguments[i], arguments[i+1]); continue }
|
||||
|
72
lib/core.js
72
lib/core.js
@ -47,26 +47,20 @@ Volcanos("core", {
|
||||
} else { begin == -1 && (begin = i) }
|
||||
} return begin >= 0 && (s? push({type: lang.STRING, text: str.slice(begin), left: s, right: ""}): push(str.slice(begin))), res
|
||||
},
|
||||
SplitInput: function(item, type) { if (typeof item == lang.OBJECT) { return item }
|
||||
type = type||html.TEXT; switch (item) {
|
||||
case mdb.LIST: return {type: type = html.BUTTON, name: item, action: ice.AUTO}
|
||||
case ice.BACK: return {type: type = html.BUTTON, name: item}
|
||||
case mdb.NAME: return {type: type = html.TEXT, name: item}
|
||||
case mdb.TEXT: return {type: type = html.TEXTAREA, name: item}
|
||||
default: var ls = this.Split(item, " ", ":=@"), res = {type: type, name: ls[0]}; for (var i = 1; i < ls.length; i += 2) {
|
||||
switch (ls[i]) {
|
||||
case ":": res[mdb.TYPE] = ls[i+1]; break
|
||||
case "=":
|
||||
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 "@": res[ctx.ACTION] = ls[i+1]; break
|
||||
}
|
||||
} return res
|
||||
}
|
||||
},
|
||||
SplitInput: function(item, type) { if (typeof item == lang.OBJECT) { return item } type = type||html.TEXT; switch (item) {
|
||||
case mdb.LIST: return {type: type = html.BUTTON, name: item, action: ice.AUTO}
|
||||
case ice.BACK: return {type: type = html.BUTTON, name: item}
|
||||
case mdb.NAME: return {type: type = html.TEXT, name: item}
|
||||
case mdb.TEXT: return {type: type = html.TEXTAREA, name: item}
|
||||
default: var ls = this.Split(item, " ", ":=@"), res = {type: type, name: ls[0]}; for (var i = 1; i < ls.length; i += 2) { switch (ls[i]) {
|
||||
case ":": res[mdb.TYPE] = ls[i+1]; break
|
||||
case "=":
|
||||
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 "@": 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]
|
||||
func = typeof func == lang.FUNCTION? func: typeof func == lang.OBJECT && func.length > 0? this.Value(func[0], this.Keys(func.slice(1))): typeof func == lang.STRING? this.Value(mod||can, func): null
|
||||
if (typeof func != lang.FUNCTION) { if (typeof args["cb"] == lang.FUNCTION) { args["cb"]() } return }
|
||||
@ -76,18 +70,16 @@ Volcanos("core", {
|
||||
},
|
||||
List: 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
|
||||
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||[]
|
||||
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)
|
||||
function loop(i) { i >= list.length? 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
|
||||
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: function(list, cb, cbs) {
|
||||
@ -99,27 +91,17 @@ Volcanos("core", {
|
||||
return next(0), list
|
||||
},
|
||||
Item: 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
|
||||
for (var k in obj) { var res = typeof cb == lang.FUNCTION? cb(k, obj[k]): k; res != undefined && list.push(res) }
|
||||
return list
|
||||
},
|
||||
Items: 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
|
||||
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
|
||||
},
|
||||
ItemSort: function(obj, key, cb) { var list = []
|
||||
var 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]
|
||||
var res = typeof cb == lang.FUNCTION? cb(keys[k], vals[k]): k
|
||||
res != undefined && list.push(res)
|
||||
} return list
|
||||
ItemSort: 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 == lang.FUNCTION? cb(keys[k], vals[k]): k; res != undefined && list.push(res) }
|
||||
return list
|
||||
},
|
||||
ItemCB: function(meta, cb, can, item) { var list = []
|
||||
for (var k in meta) { if (k.indexOf("on") == 0 && typeof meta[k] == lang.FUNCTION) { (function(k) { list.push(k)
|
||||
|
30
lib/misc.js
30
lib/misc.js
@ -4,15 +4,14 @@ Volcanos("misc", {Message: function(event, can) { var msg = {}
|
||||
if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }
|
||||
if (cmds && cmds[0] == ctx.ACTION && can.base.isFunc(meta[cmds[1]])) { msg.Option(ice.MSG_HANDLE, ice.TRUE)
|
||||
return can.core.CallFunc(meta[cmds[1]], {event: event._event||event, can: sub, msg: msg, button: cmds[1], cmd: cmds[1]}), true
|
||||
}
|
||||
return false
|
||||
} return false
|
||||
},
|
||||
Display: function(file) { msg.Option(ice.MSG_DISPLAY, file) },
|
||||
DisplayStory: function(file) { msg.Option(ice.MSG_DISPLAY, "/plugin/story/"+file) },
|
||||
OptionStatus: function() { return msg.Option(ice.MSG_STATUS) },
|
||||
OptionProcess: function() { return msg.Option(ice.MSG_PROCESS) },
|
||||
SearchOrOption: function(key) { return can.misc.Search(can, key)||msg.Option(key) },
|
||||
StatusTimeCount: function(obj) { msg.append && msg.Status(can.base.Copy({"time": can.base.Time(), "count": msg.Length()+"x"+msg.append.length}, obj)) },
|
||||
StatusTimeCount: function(obj) { msg.append && msg.Status(can.base.Copy(kit.Dict(mdb.TIME, can.base.Time(), mdb.COUNT, msg.Length()+"x"+msg.append.length), obj)) },
|
||||
Status: function(obj) { msg.Option(ice.MSG_STATUS, JSON.stringify(can.core.Item(obj, function(key, value) { return {name: key, value: value} }))) },
|
||||
|
||||
Option: function(key, val) {
|
||||
@ -29,9 +28,8 @@ Volcanos("misc", {Message: function(event, can) { var msg = {}
|
||||
},
|
||||
Result: function() {
|
||||
if (msg.result && msg.result[0] == ice.ErrWarn) { var res = msg.result[0]
|
||||
for (var i = 1; i < msg.result.length; i+=2) {
|
||||
res += msg.result[i]+(msg.result[i+1]||"")+ice.SP
|
||||
} return res
|
||||
for (var i = 1; i < msg.result.length; i+=2) { res += msg.result[i]+(msg.result[i+1]||"")+ice.SP }
|
||||
return res
|
||||
} return msg.result && msg.result.join("") || ""
|
||||
},
|
||||
TableDetail: function() { var item = {hash: can.Option(mdb.HASH)}
|
||||
@ -133,7 +131,7 @@ Volcanos("misc", {Message: function(event, can) { var msg = {}
|
||||
},
|
||||
WSS: function(can, args, cb, onopen, onclose, onerror) { if (can.user.isIE) { return }
|
||||
var url = location.protocol.replace(ice.HTTP, "ws")+"//"+location.host+"/space/"
|
||||
if (url.indexOf("chrome") == 0) { url = "ws://localhost:9020/space/" }
|
||||
if (url.indexOf(html.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)
|
||||
@ -162,9 +160,7 @@ Volcanos("misc", {Message: function(event, can) { var msg = {}
|
||||
}
|
||||
},
|
||||
|
||||
MergeCache: function(can, hash) {
|
||||
return can.misc.MergeURL(can, {_path: can.base.Path(web.SHARE_CACHE, hash)}, true)
|
||||
},
|
||||
MergeCache: function(can, hash) { return can.misc.MergeURL(can, {_path: can.base.Path(web.SHARE_CACHE, hash)}, true) },
|
||||
MergePodCmd: function(can, objs) {
|
||||
objs.pod = can.core.Keys(can.misc.Search(can, ice.POD), objs.pod)
|
||||
objs.topic = can.misc.Search(can, chat.TOPIC)
|
||||
@ -239,22 +235,18 @@ Volcanos("misc", {Message: function(event, can) { var msg = {}
|
||||
item._name && args.push(item._name)
|
||||
} else if (item.Option) {
|
||||
filter += item.Option(log.DEBUG)||""
|
||||
} else if (arguments[i].indexOf && arguments[i].indexOf(filter||"trace") > -1) {
|
||||
} else if (arguments[i].indexOf && arguments[i].indexOf(filter||log.TRACE) > -1) {
|
||||
output = true
|
||||
} args.push(arguments[i])
|
||||
} if (output) { return console.debug.apply(console, args), true }
|
||||
},
|
||||
FileLine: function(depth, length) { length = length||9
|
||||
var file = this.fileLine(depth+1, length); return file.file+ice.DF+file.line
|
||||
},
|
||||
FileLine: function(depth, length) { var file = this.fileLine(depth+1, length||9); return file.file+ice.DF+file.line },
|
||||
fileLine: function(depth, length) { var list = this._stack()
|
||||
function split(i) { if (!list[i]) { return {} }
|
||||
var ls = list[i].trim().split(ice.SP).slice(-2), link = ls.slice(-1)[0]; link.indexOf("(") == 0 && (link = link.slice(1, -1)), link.indexOf("@") > -1 && (ls = link.split("@"), link = ls[1])
|
||||
var path = link, file = "", line = "", cols = ""; path = link.indexOf(ice.HTTP) == 0 && (path = link.split(ice.PS).slice(3).join(ice.PS))
|
||||
for (var i = path.length; i > 0; i--) { if (path[i] != ice.DF) { continue }
|
||||
if (cols == "") {
|
||||
cols = path.slice(i+1), path = path.slice(0, i)
|
||||
} else if (line == "") {
|
||||
if (cols == "") { cols = path.slice(i+1), path = path.slice(0, i) } else if (line == "") {
|
||||
line = path.slice(i+1), path = path.slice(0, i)
|
||||
file = path.split(ice.PS).slice(-length).join(ice.PS), path = path.slice(0, -file.length)
|
||||
break
|
||||
@ -262,9 +254,7 @@ Volcanos("misc", {Message: function(event, can) { var msg = {}
|
||||
} return {name: ls[0], link: link, path: path, file: file, line: line, cols: cols}
|
||||
}
|
||||
if (depth < 0) { var current = split(-depth)
|
||||
for (var i = -depth+1; i < list.length; i++) { var pos = split(i)
|
||||
if (pos.file != current.file) { return pos }
|
||||
}
|
||||
for (var i = -depth+1; i < list.length; i++) { var pos = split(i); if (pos.file != current.file) { return pos } }
|
||||
} return split(depth)||{}
|
||||
},
|
||||
_stack: function() { return ((new Error()).stack||"").split(ice.NL).slice(2) },
|
||||
|
@ -108,7 +108,7 @@ Volcanos("page", {ClassList: {
|
||||
RangeTable: function(can, table, index, sort_asc) {
|
||||
index = can.core.List(index, function(item) { if (item > -1) { return item } }); if (index.length == 0) { return }
|
||||
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
|
||||
return tr.style.display == html.NONE||can.page.ClassList.has(can, tr, html.HIDE)? null: tr
|
||||
}).slice(1)
|
||||
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))
|
||||
@ -140,8 +140,8 @@ Volcanos("page", {ClassList: {
|
||||
var _list = []; for (var i = 0; i < list.length; i++) { switch (list[i]) {
|
||||
case "": _list.push(""); break
|
||||
case ice.AUTO:
|
||||
_list.push({type: html.BUTTON, name: "list"})
|
||||
_list.push({type: html.BUTTON, name: "back"})
|
||||
_list.push({type: html.BUTTON, name: ice.LIST})
|
||||
_list.push({type: html.BUTTON, name: ice.BACK})
|
||||
break
|
||||
case mdb.PAGE:
|
||||
_list.push({type: html.TEXT, name: mdb.LIMIT, value: can._msg.Option(mdb.LIMIT)})
|
||||
|
79
lib/user.js
79
lib/user.js
@ -1,8 +1,6 @@
|
||||
Volcanos("user", {info: {}, agent: {
|
||||
chooseImage: function(can, cb) { can.base.isFunc(cb) && cb([]) },
|
||||
scanQRCode: function(can, cb) {
|
||||
can.user.input(event, can, [{type: html.TEXTAREA, name: "text", text: ""}], function(list) { cb(can.base.ParseJSON(list[0])) })
|
||||
},
|
||||
scanQRCode: function(can, cb) { can.user.input(event, can, [{type: html.TEXTAREA, name: "text", text: ""}], function(list) { cb(can.base.ParseJSON(list[0])) }) },
|
||||
getLocation: function(can, cb) { var call = arguments.callee; if (call._res) { return cb(call._res) }
|
||||
navigator.geolocation.getCurrentPosition(function(res) {
|
||||
cb(call._res = {latitude: parseInt(res.coords.latitude*100000), longitude: parseInt(res.coords.longitude*100000)})
|
||||
@ -38,9 +36,7 @@ Volcanos("user", {info: {}, agent: {
|
||||
open: function(url) { window.open(url) },
|
||||
close: function(url) { window.close() },
|
||||
|
||||
title: function(text) { if (window.webview) { return title(text) }
|
||||
return text && (document.title = text), document.title
|
||||
},
|
||||
title: function(text) { if (window.webview) { return title(text) } return text && (document.title = text), document.title },
|
||||
topic: function(can, name) { can.base.isString(name) && (name = [name]) || name || []
|
||||
can.user.isMobile && name.push("mobile") && can.user.isLandscape() && name.push("landscape")
|
||||
can.user.language(can) && name.push(can.user.language(can))
|
||||
@ -67,15 +63,12 @@ Volcanos("user", {info: {}, agent: {
|
||||
"clear": "清空", "refresh": "刷新",
|
||||
"submit": "提交", "cancel": "取消",
|
||||
|
||||
"Close": "关闭",
|
||||
"Close others": "关闭其它",
|
||||
"Close all": "关闭所有",
|
||||
"Close": "关闭", "Close others": "关闭其它", "Close all": "关闭所有",
|
||||
}[text]||text
|
||||
},
|
||||
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"]: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"]
|
||||
if (fmt == "%W") { return list }
|
||||
return can.base.Time(time, (fmt||"%y-%m-%d %H:%M:%S").replace("%w", list[now.getDay()]))
|
||||
return fmt == "%W"? list: can.base.Time(time, (fmt||"%y-%m-%d %H:%M:%S").replace("%w", list[now.getDay()]))
|
||||
},
|
||||
|
||||
toastConfirm: function(can, content, title, action) { return can.user.toast(can, {content: content, title: title, action: action||[cli.CLOSE], duration: -1, width: -300}) },
|
||||
@ -91,16 +84,13 @@ Volcanos("user", {info: {}, agent: {
|
||||
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, nfs.CONTENT]},
|
||||
html.ACTION, meta.progress != undefined && {view: "progress", style: {width: width}, list: [
|
||||
html.ACTION, can.base.isUndefined(meta.progress) && {view: "progress", style: {width: width}, list: [
|
||||
{view: "current", style: {width: (meta.progress||0)/100*width}},
|
||||
]},
|
||||
] }]); can.onengine.signal(can, chat.ONTOAST, can.request({}, {time: can.misc._time(), title: meta.title, content: meta.content, fileline: can.misc.FileLine(-3)}))
|
||||
var action = can.onappend._action(can, meta.action && meta.action.list? meta.action.list: meta.action||[""], ui.action, {
|
||||
_engine: function(event, button) { can.core.CallFunc(meta.action[button]||meta.action, [event, button]) },
|
||||
open: function(event) {
|
||||
if (meta.content.indexOf(ice.HTTP) == 0) { can.user.open(meta.content) }
|
||||
if (meta.title.indexOf(ice.HTTP) == 0) { can.user.open(meta.title) }
|
||||
},
|
||||
open: function(event) { meta.content.indexOf(ice.HTTP) == 0 && can.user.open(meta.content), meta.title.indexOf(ice.HTTP) == 0 && can.user.open(meta.title) },
|
||||
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..." }
|
||||
@ -109,9 +99,8 @@ Volcanos("user", {info: {}, agent: {
|
||||
},
|
||||
share: function(can, msg, cmd) {
|
||||
can.run(msg, cmd||[ctx.ACTION, chat.SHARE], function(msg) {
|
||||
can.user.toast(can, {title: msg.Append(mdb.NAME), duration: -1,
|
||||
content: msg.Append(mdb.TEXT), action: [cli.CLOSE, cli.OPEN],
|
||||
}), can.user.copy(msg._event, can, msg.Append(mdb.NAME))
|
||||
can.user.toast(can, {title: msg.Append(mdb.NAME), duration: -1, content: msg.Append(mdb.TEXT), action: [cli.CLOSE, cli.OPEN]})
|
||||
can.user.copy(msg._event, can, msg.Append(mdb.NAME))
|
||||
})
|
||||
},
|
||||
copy: function(event, can, text) { if (!text) { return }
|
||||
@ -125,7 +114,7 @@ Volcanos("user", {info: {}, agent: {
|
||||
|
||||
carte: function(event, can, meta, list, cb, parent) {
|
||||
meta = meta||can.ondetail||can.onaction||{}, list = can.base.getValid(list, meta.list, can.core.Item(meta))||[]; if (list.length == 0) { return }
|
||||
cb = cb||function(event, button, meta) { var cb = meta[button]||meta["_engine"]; can.base.isFunc(cb) && cb(event, can, button) }
|
||||
cb = cb||function(event, button, meta) { var cb = meta[button]||meta[chat._ENGINE]; can.base.isFunc(cb) && cb(event, can, button) }
|
||||
parent || can.page.Select(can, document.body, can.page.Keys("div.carte.float"), function(target) { can.page.Remove(can, target) })
|
||||
var ui = can.page.Append(can, document.body, [{view: [[chat.CARTE, chat.FLOAT]], onmouseleave: function(event) {
|
||||
// can.page.Remove(can, ui._target)
|
||||
@ -146,8 +135,7 @@ Volcanos("user", {info: {}, agent: {
|
||||
var carte = {_target: ui._target, _parent: parent, layout: can.onlayout.figure(event, can, ui._target)}
|
||||
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)
|
||||
carteRight: function(event, can, meta, list, cb, parent) { var carte = can.user.carte(event, can, meta, list, cb, parent)
|
||||
return can.page.style(can, carte._target, can.onlayout.figure(event, can, carte._target, true)), carte
|
||||
},
|
||||
|
||||
@ -159,8 +147,7 @@ Volcanos("user", {info: {}, agent: {
|
||||
item.type = item.type||(item.values? html.SELECT: item.name == html.TEXT? html.TEXTAREA: html.TEXT), need[item.name] = item.need
|
||||
item._init = function(target) { if (item.type == html.PASSWORD || item.type == html.USERNAME) { return }
|
||||
if (item.name && item.name != ctx.ACTION) { target.value = msg.Option(item.name)||can.Option(item.name)||target.value||"" }
|
||||
item.run = item.run||function(event, cmds, cb) {
|
||||
var _msg = can.request(event, {_handle: ice.TRUE, action: msg.Option(html.ACTION)}, msg, can.Option())
|
||||
item.run = item.run||function(event, cmds, cb) { var _msg = can.request(event, {_handle: ice.TRUE, action: msg.Option(html.ACTION)}, msg, can.Option())
|
||||
can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) { item.name && item.value && _msg.Option(item.name, item.value) })
|
||||
can.run(event, cmds, cb, true)
|
||||
}, item._enter = function(event) { action.submit(event, can, html.SUBMIT) }
|
||||
@ -192,13 +179,9 @@ Volcanos("user", {info: {}, agent: {
|
||||
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, html.INPUT_FILE)[0]
|
||||
if (upload.files.length == 0) { return upload.focus() }
|
||||
var msg = can.request(event, can.Option(), {_handle: ice.TRUE})
|
||||
msg._upload = upload.files[0], msg._progress = action.show
|
||||
can.runAction(event, html.UPLOAD, [], cb||function(msg) {
|
||||
can.user.toastSuccess(can), can.Update(), action.close()
|
||||
})
|
||||
var upload = can.page.Select(can, ui.action, html.INPUT_FILE)[0]; if (upload.files.length == 0) { return upload.focus() }
|
||||
var msg = can.request(event, can.Option(), {_handle: ice.TRUE}); msg._upload = upload.files[0], msg._progress = action.show
|
||||
can.runAction(event, html.UPLOAD, [], cb||function(msg) { can.user.toastSuccess(can), can.Update(), action.close() })
|
||||
},
|
||||
show: function (event, value, total, loaded) {
|
||||
ui.cost.innerHTML = can.base.Duration(new Date() - begin)
|
||||
@ -240,26 +223,20 @@ Volcanos("user", {info: {}, agent: {
|
||||
|
||||
login: function(can, cb, method, auto) { method = can.base.Obj(method, ["登录", "扫码"])
|
||||
var meta = {
|
||||
"登录": function(event, button, data) {
|
||||
can.run({}, [aaa.LOGIN, data[html.USERNAME], data[html.PASSWORD]], function(msg) {
|
||||
if (!msg.Option(ice.MSG_USERNAME)) { return can.user.toast(can, "用户名或密码错误") }
|
||||
can.page.Remove(can, ui._target), can.base.isFunc(cb) && cb()
|
||||
}); 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", "back": 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(event, button, data) { can.run({}, [aaa.LOGIN, data[html.USERNAME], data[html.PASSWORD]], function(msg) {
|
||||
if (!msg.Option(ice.MSG_USERNAME)) { return can.user.toast(can, "用户名或密码错误") }
|
||||
can.page.Remove(can, ui._target), can.base.isFunc(cb) && cb()
|
||||
}); 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: chat.SSO, "back": 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() })
|
||||
}) },
|
||||
}; if (auto) { return meta["授权"]() } else if (method.length == 1) { meta[method[0]](); return }
|
||||
|
||||
var ui = can.user.input({}, can, [{type: html.USERNAME}, {type: html.PASSWORD}], function(event, button, data) { return meta[button](event, button, data) }, method)
|
||||
|
@ -5,8 +5,8 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
|
||||
|
||||
can.onmotion.delay(can, function() {
|
||||
can.core.Item(kit.Dict(
|
||||
html.STROKE_WIDTH, 2, html.STROKE, cli.YELLOW, html.FILL, cli.PURPLE,
|
||||
html.FONT_SIZE, 24, html.FONT_FAMILY, html.MONOSPACE,
|
||||
svg.STROKE_WIDTH, 2, svg.STROKE, cli.YELLOW, svg.FILL, cli.PURPLE,
|
||||
svg.FONT_SIZE, 24, svg.FONT_FAMILY, svg.MONOSPACE,
|
||||
"go", ice.RUN, svg.SHAPE, svg.RECT, svg.GRID, 10,
|
||||
), function(key, value) { can.svg.Value(key, can.Action(key, can.svg.Value(key)||value)) })
|
||||
|
||||
@ -30,7 +30,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
|
||||
},
|
||||
_group: function(can, target) { var name = target.Groups()
|
||||
function show(event) { can.group = target
|
||||
can.core.List([html.STROKE_WIDTH, html.STROKE, html.FILL, html.FONT_SIZE], function(key) {
|
||||
can.core.List([svg.STROKE_WIDTH, svg.STROKE, svg.FILL, svg.FONT_SIZE], function(key) {
|
||||
can.Action(key, target.Value(key)||can.Action(key))
|
||||
})
|
||||
}
|
||||
@ -230,31 +230,31 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互",
|
||||
sc: function(event, can) { can.Action(svg.SHAPE, svg.CIRCLE) },
|
||||
se: function(event, can) { can.Action(svg.SHAPE, svg.ELLIPSE) },
|
||||
|
||||
cr: function(event, can) { can.onaction._change(can, html.STROKE, cli.RED) },
|
||||
cb: function(event, can) { can.onaction._change(can, html.STROKE, cli.BLUE) },
|
||||
cg: function(event, can) { can.onaction._change(can, html.STROKE, cli.GREEN) },
|
||||
cy: function(event, can) { can.onaction._change(can, html.STROKE, cli.YELLOW) },
|
||||
cp: function(event, can) { can.onaction._change(can, html.STROKE, cli.PURPLE) },
|
||||
cc: function(event, can) { can.onaction._change(can, html.STROKE, cli.CYAN) },
|
||||
ch: function(event, can) { can.onaction._change(can, html.STROKE, cli.BLACK) },
|
||||
cw: function(event, can) { can.onaction._change(can, html.STROKE, cli.WHITE) },
|
||||
cr: function(event, can) { can.onaction._change(can, svg.STROKE, cli.RED) },
|
||||
cb: function(event, can) { can.onaction._change(can, svg.STROKE, cli.BLUE) },
|
||||
cg: function(event, can) { can.onaction._change(can, svg.STROKE, cli.GREEN) },
|
||||
cy: function(event, can) { can.onaction._change(can, svg.STROKE, cli.YELLOW) },
|
||||
cp: function(event, can) { can.onaction._change(can, svg.STROKE, cli.PURPLE) },
|
||||
cc: function(event, can) { can.onaction._change(can, svg.STROKE, cli.CYAN) },
|
||||
ch: function(event, can) { can.onaction._change(can, svg.STROKE, cli.BLACK) },
|
||||
cw: function(event, can) { can.onaction._change(can, svg.STROKE, cli.WHITE) },
|
||||
|
||||
fr: function(event, can) { can.onaction._change(can, html.FILL, cli.RED) },
|
||||
fb: function(event, can) { can.onaction._change(can, html.FILL, cli.BLUE) },
|
||||
fg: function(event, can) { can.onaction._change(can, html.FILL, cli.GREEN) },
|
||||
fy: function(event, can) { can.onaction._change(can, html.FILL, cli.YELLOW) },
|
||||
fp: function(event, can) { can.onaction._change(can, html.FILL, cli.PURPLE) },
|
||||
fc: function(event, can) { can.onaction._change(can, html.FILL, cli.CYAN) },
|
||||
fh: function(event, can) { can.onaction._change(can, html.FILL, cli.BLACK) },
|
||||
fw: function(event, can) { can.onaction._change(can, html.FILL, cli.WHITE) },
|
||||
fr: function(event, can) { can.onaction._change(can, svg.FILL, cli.RED) },
|
||||
fb: function(event, can) { can.onaction._change(can, svg.FILL, cli.BLUE) },
|
||||
fg: function(event, can) { can.onaction._change(can, svg.FILL, cli.GREEN) },
|
||||
fy: function(event, can) { can.onaction._change(can, svg.FILL, cli.YELLOW) },
|
||||
fp: function(event, can) { can.onaction._change(can, svg.FILL, cli.PURPLE) },
|
||||
fc: function(event, can) { can.onaction._change(can, svg.FILL, cli.CYAN) },
|
||||
fh: function(event, can) { can.onaction._change(can, svg.FILL, cli.BLACK) },
|
||||
fw: function(event, can) { can.onaction._change(can, svg.FILL, cli.WHITE) },
|
||||
},
|
||||
}, _engine: {},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {help: "组件菜单", list: [
|
||||
[html.STROKE_WIDTH, 1, 2, 3, 4, 5],
|
||||
[html.STROKE, cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.PURPLE, cli.BLACK, cli.WHITE],
|
||||
[html.FILL, cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.PURPLE, cli.BLACK, cli.WHITE, "#0000"],
|
||||
[html.FONT_SIZE, 12, 16, 18, 24, 32],
|
||||
[svg.STROKE_WIDTH, 1, 2, 3, 4, 5],
|
||||
[svg.STROKE, cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.PURPLE, cli.BLACK, cli.WHITE],
|
||||
[svg.FILL, cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.PURPLE, cli.BLACK, cli.WHITE, "#0000"],
|
||||
[svg.FONT_SIZE, 12, 16, 18, 24, 32],
|
||||
|
||||
["go", ice.RUN, ice.AUTO, "manual"],
|
||||
["mode", "draw", "resize"],
|
||||
@ -283,7 +283,7 @@ Volcanos(chat.ONACTION, {help: "组件菜单", list: [
|
||||
create: function(event, can) {
|
||||
can.user.input(event, can, [svg.GROUP], function(list) { var name = list[0]
|
||||
var group = can.onimport.group(can, name)
|
||||
can.core.List([html.STROKE_WIDTH, html.STROKE, html.FILL, html.FONT_SIZE], function(name) {
|
||||
can.core.List([svg.STROKE_WIDTH, svg.STROKE, svg.FILL, svg.FONT_SIZE], function(name) {
|
||||
group.Value(name, can.Action(name))
|
||||
})
|
||||
})
|
||||
@ -461,7 +461,7 @@ Volcanos(chat.ONEXPORT, {help: "导出数据", list: [svg.GROUP, "figure", "inde
|
||||
},
|
||||
content: function(can, svg) {
|
||||
return ['<svg vertion="1.1" xmlns="https://www.w3.org/2000/svg" text-anchor="middle" dominant-baseline="middle"'].concat(
|
||||
svg? can.core.List([html.HEIGHT, html.WIDTH, mdb.COUNT, svg.PID, svg.GRID, html.STROKE_WIDTH, html.STROKE, html.FILL, html.FONT_SIZE], function(item) {
|
||||
svg? can.core.List([html.HEIGHT, html.WIDTH, mdb.COUNT, svg.PID, svg.GRID, svg.STROKE_WIDTH, svg.STROKE, svg.FILL, svg.FONT_SIZE], function(item) {
|
||||
return svg.Value(item)? ice.SP + item + '="' + svg.Value(item) + '"': ""
|
||||
}): [" height="+((can.ConfHeight()||450)-50)+" width="+(can.ConfWidth()||600)]).concat(['>', svg? svg.innerHTML: "", "</svg>"]).join("")
|
||||
},
|
||||
|
@ -19,7 +19,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
|
||||
_draw: function(can, msg, field, color, x, y, r, margin, which) { field = field||mdb.VALUE
|
||||
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: svg.PATH, style: kit.Dict(
|
||||
html.STROKE_WIDTH, 1, html.STROKE, color, html.FILL, color, "d", can.base.joins([
|
||||
svg.STROKE_WIDTH, 1, svg.STROKE, color, svg.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) } }) }
|
||||
|
@ -55,7 +55,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
|
||||
},
|
||||
layout: function(can) { can.margin = can.margin||20
|
||||
can.onmotion.clear(can), can.onimport._show(can, can.request())
|
||||
can.svg.Val(html.FONT_SIZE, can.Action("size"))
|
||||
can.svg.Val(svg.FONT_SIZE, can.Action("size"))
|
||||
can.page.style(can, can._output, html.MAX_HEIGHT, "")
|
||||
can.onaction[can.Action(ice.VIEW)](event, can, can.Action(ice.VIEW))
|
||||
},
|
||||
@ -84,11 +84,11 @@ Volcanos(chat.ONACTION, {help: "用户操作", list: [
|
||||
_draw: function(can, tree, x, y, style) { var color = can.onimport._color(can, tree)
|
||||
if (!tree.name) { return }
|
||||
tree.view = can.onimport.draw({}, can, {shape: html.TEXT, point: [{x: x, y: y}], style: can.base.Copy(kit.Dict(
|
||||
html.STROKE, color, html.FILL, color, html.TEXT_ANCHOR, "start", "inner", tree.name||tree.file,
|
||||
svg.STROKE, color, svg.FILL, color, svg.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, kit.Dict(html.TEXT_ANCHOR, "middle"))
|
||||
can.onaction._draw(can, tree, x+tree.width/2, y, kit.Dict(svg.TEXT_ANCHOR, "middle"))
|
||||
|
||||
tree.height = can.margin
|
||||
if (y+tree.height > can.height) { can.height = y+tree.height }
|
||||
@ -103,7 +103,7 @@ Volcanos(chat.ONACTION, {help: "用户操作", list: [
|
||||
})
|
||||
},
|
||||
_draw_horizontal: function(can, tree, x, y) { tree.x = x, tree.y = y
|
||||
can.onaction._draw(can, tree, x, y+tree.height*can.margin/2, kit.Dict(html.TEXT_ANCHOR, "start"))
|
||||
can.onaction._draw(can, tree, x, y+tree.height*can.margin/2, kit.Dict(svg.TEXT_ANCHOR, "start"))
|
||||
|
||||
tree.width = tree.view&&tree.view.Val("textLength")||(tree.name||"").length*10
|
||||
if (x+tree.width > can.width) { can.width = x+tree.width }
|
||||
|
@ -57,8 +57,8 @@ Volcanos(chat.ONACTION, {help: "组件菜单", list: [
|
||||
[html.SPEED, 10, 20, 50, 100],
|
||||
],
|
||||
"折线图": function(event, can) { var args = can.onimport._layout(can)
|
||||
var black = can.onimport.group(can, cli.BLACK, kit.Dict(html.STROKE, cli.BLACK, html.FILL, cli.BLACK))
|
||||
var white = can.onimport.group(can, cli.WHITE, kit.Dict(html.STROKE, cli.WHITE, html.FILL, cli.WHITE))
|
||||
var black = can.onimport.group(can, cli.BLACK, kit.Dict(svg.STROKE, cli.BLACK, svg.FILL, cli.BLACK))
|
||||
var white = can.onimport.group(can, cli.WHITE, kit.Dict(svg.STROKE, cli.WHITE, svg.FILL, cli.WHITE))
|
||||
can.onimport.transform(can, black), can.onimport.transform(can, white)
|
||||
can.core.List(can.list, function(list) {
|
||||
var max = list[0], min = list[0], step = (can.ConfWidth()-2*args.space)/(list.length-1)
|
||||
@ -74,8 +74,8 @@ Volcanos(chat.ONACTION, {help: "组件菜单", list: [
|
||||
function scale(y) { return (y - can.min)/(can.max - can.min)*(args.height-2*args.space) }
|
||||
function order(index, x, y) { return {x: args.space+args.step*index+x, y: args.height-args.space-scale(y)} }
|
||||
|
||||
var black = can.onimport.group(can, cli.BLACK, kit.Dict(html.STROKE, cli.BLACK, html.FILL, cli.BLACK))
|
||||
var white = can.onimport.group(can, cli.WHITE, kit.Dict(html.STROKE, cli.WHITE, html.FILL, cli.WHITE))
|
||||
var black = can.onimport.group(can, cli.BLACK, kit.Dict(svg.STROKE, cli.BLACK, svg.FILL, cli.BLACK))
|
||||
var white = can.onimport.group(can, cli.WHITE, kit.Dict(svg.STROKE, cli.WHITE, svg.FILL, cli.WHITE))
|
||||
|
||||
can.core.Next(can.list, function(line, next, index) { can.Status(line)
|
||||
can.onimport.draw({}, can, {shape: svg.LINE, point: [
|
||||
@ -110,7 +110,7 @@ Volcanos(chat.ONACTION, {help: "组件菜单", list: [
|
||||
can.onimport.draw({}, can, {shape: svg.RECT, point: [
|
||||
{x: args.space+args.step*index+width*which+2, y: args.height-args.space-scale(key, parseInt(line[key]))},
|
||||
{x: args.space+args.step*index+width*(which+1)+2, y: args.height-args.space},
|
||||
], style: kit.Dict(html.STROKE_WIDTH, 1, html.STROKE, cli.WHITE, html.FILL, cli.WHITE, svg.RX, 0, svg.RY, 0), _init: function(view) {
|
||||
], style: kit.Dict(svg.STROKE_WIDTH, 1, svg.STROKE, cli.WHITE, svg.FILL, cli.WHITE, svg.RX, 0, svg.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(html.SPEED)), next)
|
||||
}), which++
|
||||
|
95
proto.js
95
proto.js
@ -105,6 +105,7 @@ var nfs = {
|
||||
DIR: "dir", CAT: "cat", DEFS: "defs", TRASH: "trash", SCRIPT: "script", CONTENT: "content", DIR_ROOT: "dir_root", PWD: "./",
|
||||
HTML: "html", CSS: "css", JS: "js", GO: "go", SH: "sh", CSV: "csv", JSON: "json",
|
||||
ZML: "zml", IML: "iml", TXT: "txt", PNG: "png",
|
||||
_CSS: ".css", _JS: ".js",
|
||||
}
|
||||
var tcp = {
|
||||
HOST: "host", PORT: "port",
|
||||
@ -191,77 +192,43 @@ var mall = {
|
||||
var svg = {
|
||||
GROUP: "group", PID: "pid", GRID: "grid",
|
||||
SHAPE: "shape", TEXT: "text", RECT: "rect", LINE: "line", CIRCLE: "circle", ELLIPSE: "ellipse",
|
||||
STROKE_WIDTH: "stroke-width", STROKE: "stroke", FILL: "fill", FONT_SIZE: "font-size", FONT_FAMILY: "font-family", MONOSPACE: "monospace", TEXT_ANCHOR: "text-anchor",
|
||||
G: "g", X: "x", Y: "y", R: "r", RX: "rx", RY: "ry", CX: "cx", CY: "cy", X1: "x1", Y1: "y1", X2: "x2", Y2: "y2",
|
||||
PATH: "path", PATH2V: "path2v", PATH2H: "path2h",
|
||||
M: "M", Q: "Q", T: "T",
|
||||
}
|
||||
var html = {
|
||||
// FIELDSET
|
||||
var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 31, ACTION_MARGIN: 200,
|
||||
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", DIV_CONTENT: "div.content",
|
||||
FIELDSET_PANEL: "fieldset.panel", FIELDSET_PLUGIN: "fieldset.plugin", FIELDSET_STORY: "fieldset.story", FIELDSET_FLOAT: "fieldset.float",
|
||||
FIELDSET_HEAD: "fieldset.head", FIELDSET_FOOT: "fieldset.foot", FIELDSET_LEFT: "fieldset.left", FIELDSET_MAIN: "fieldset.main",
|
||||
OPTION_ARGS: "select.args,input.args,textarea.args", INPUT_ARGS: "input.args,textarea.args", INPUT_BUTTON: "input[type=button]", INPUT_FILE: "input[type=file]",
|
||||
|
||||
// HTML
|
||||
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",
|
||||
FORM: "form", FILE: "file", CLICK: "click", SUBMIT: "submit", CANCEL: "cancel", UPLOAD: "upload", USERNAME: "username", PASSWORD: "password",
|
||||
TABLE: "table", THEAD: "thead", TBODY: "tbody", TR: "tr", TH: "th", TD: "td", BR: "br", UL: "ul", LI: "li",
|
||||
A: "a", LABEL: "label", INNER: "inner", TITLE: "title",
|
||||
H1: "h1", H2: "h2", H3: "h3",
|
||||
H1: "h1", H2: "h2", H3: "h3", A: "a", LABEL: "label", INNER: "inner", TITLE: "title",
|
||||
SPAN: "span", CODE: "code", DIV: "div", IMG: "img", VIDEO: "video", SPACE: "space",
|
||||
WSS: "wss", SVG: "svg", CANVAS: "canvas", IFRAME: "iframe", CHROME: "chrome",
|
||||
|
||||
// CSS
|
||||
CLASS: "class", DISPLAY: "display", BLOCK: "block", NONE: "none",
|
||||
CLASS: "class", DISPLAY: "display", BLOCK: "block", NONE: "none", HIDDEN: "hidden", TOGGLE: "toggle",
|
||||
HEIGHT: "height", WIDTH: "width", PADDING: "padding", MARGIN: "margin", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom",
|
||||
MIN_HEIGHT: "min-height", MAX_HEIGHT: "max-height", MAX_WIDTH: "max-width", MIN_WIDTH: "min-width", MARGIN_TOP: "margin-top", MARGIN_X: "margin-x", MARGIN_Y: "margin-y",
|
||||
STROKE_WIDTH: "stroke-width", STROKE: "stroke", FILL: "fill", FONT_SIZE: "font-size", FONT_FAMILY: "font-family", MONOSPACE: "monospace", TEXT_ANCHOR: "text-anchor",
|
||||
SELECT: "select", HIDDEN: "hidden", TOGGLE: "toggle",
|
||||
FLOAT: "float", CLEAR: "clear", BOTH: "both",
|
||||
BACKGROUND: "background",
|
||||
OVERFLOW: "overflow",
|
||||
OPACITY: "opacity",
|
||||
SCROLL: "scroll",
|
||||
SPEED: "speed",
|
||||
FIXED: "fixed",
|
||||
PLUGIN_MARGIN: 10, ACTION_HEIGHT: 31, ACTION_MARGIN: 200,
|
||||
BACKGROUND: "background", OPACITY: "opacity", OVERFLOW: "overflow", SCROLL: "scroll", SPEED: "speed", FLOAT: "float", CLEAR: "clear", BOTH: "both",
|
||||
|
||||
PAGE: "page", TABS: "tabs",
|
||||
MENU: "menu", NODE: "node",
|
||||
ZONE: "zone", NAME: "name",
|
||||
LIST: "list", ITEM: "item",
|
||||
ICON: "icon",
|
||||
|
||||
HIDE: "hide", SHOW: "show", AUTO: "auto",
|
||||
HEAD: "head", LEFT: "left", MAIN: "main", FOOT: "foot",
|
||||
PAGE: "page", TABS: "tabs", MENU: "menu", NODE: "node",
|
||||
ZONE: "zone", LIST: "list", ITEM: "item", NAME: "name", ICON: "icon",
|
||||
SHOW: "show", HIDE: "hide", AUTO: "auto", HEAD: "head", LEFT: "left", MAIN: "main", FOOT: "foot",
|
||||
PLUGIN: "plugin", LAYOUT: "layout", CONTENT: "content",
|
||||
|
||||
DIV_PAGE: "div.page",
|
||||
DIV_TABS: "div.tabs",
|
||||
DIV_ZONE: "div.zone",
|
||||
DIV_LIST: "div.list",
|
||||
DIV_ITEM: "div.item",
|
||||
DIV_NAME: "div.name",
|
||||
DIV_CODE: "div.code",
|
||||
DIV_TOGGLE: "div.toggle",
|
||||
DIV_LAYOUT_HEAD: "div.layout.head",
|
||||
DIV_LAYOUT_LEFT: "div.layout.left",
|
||||
DIV_LAYOUT_FOOT: "div.layout.foot",
|
||||
TABLE_CONTENT: "table.content",
|
||||
DIV_FLOAT: "div.float",
|
||||
|
||||
ESCAPE: "Escape", ENTER: "Enter", TAB: "Tab",
|
||||
_CSS: ".css", _JS: ".js",
|
||||
DIV_PAGE: "div.page", DIV_TABS: "div.tabs",
|
||||
DIV_ZONE: "div.zone", DIV_LIST: "div.list", DIV_ITEM: "div.item", DIV_NAME: "div.name",
|
||||
DIV_LAYOUT_HEAD: "div.layout.head", DIV_LAYOUT_FOOT: "div.layout.foot", DIV_LAYOUT_LEFT: "div.layout.left",
|
||||
DIV_CODE: "div.code", DIV_FLOAT: "div.float", TABLE_CONTENT: "table.content",
|
||||
}
|
||||
var lang = {
|
||||
UNDEFINED: "undefined",
|
||||
STRING: "string", NUMBER: "number",
|
||||
OBJECT: "object", FUNCTION: "function",
|
||||
ESCAPE: "Escape", ENTER: "Enter", TAB: "Tab",
|
||||
CONTROL: "Control", SHIFT: "Shift",
|
||||
PS: "/",
|
||||
UNDEFINED: "undefined", STRING: "string", NUMBER: "number", BOOLEAN: "boolean", OBJECT: "object", FUNCTION: "function",
|
||||
META: "Meta", ALT: "Alt", CONTROL: "Control", SHIFT: "Shift", TAB: "Tab", ENTER: "Enter", ESCAPE: "Escape", PS: "/",
|
||||
}
|
||||
|
||||
function shy(help, meta, list, cb) { var args = arguments, i = 0
|
||||
@ -269,21 +236,14 @@ function shy(help, meta, list, cb) { var args = arguments, i = 0
|
||||
return cb = typeof args[args.length-1] == lang.FUNCTION? args[args.length-1]: function() {}, cb.help = next(lang.STRING)||"", cb.meta = next(lang.OBJECT)||{}, cb.list = next(lang.OBJECT)||[], cb
|
||||
}; var _can_name = "", _can_path = ""
|
||||
var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {}}, function(name, can, libs, cb) {
|
||||
var meta = arguments.callee.meta, list = arguments.callee.list
|
||||
if (typeof name == lang.OBJECT) {
|
||||
if (name.length > 0) { return Volcanos({panels: [
|
||||
{name: "Header", help: "标题栏", pos: html.HIDE, state: [aaa.USERNICK]},
|
||||
{name: "Action", help: "工作台", pos: html.MAIN, tool: name},
|
||||
{name: "Search", help: "搜索框", pos: html.AUTO},
|
||||
]}) }
|
||||
var meta = arguments.callee.meta, list = arguments.callee.list; if (typeof name == lang.OBJECT) {
|
||||
if (name.length > 0) { return Volcanos({panels: [{name: "Header", pos: html.HIDE, state: [aaa.USERNICK]}, {name: "Action", pos: html.MAIN, tool: name}]}) }
|
||||
var Config = name; name = Config.name||ice.CAN, kit.proto(meta, Config), _can_name = ""
|
||||
meta.iceberg = Config.iceberg||meta.iceberg, meta.libs = Config.libs||chat.libs, panels = Config.panels||chat.panel_list
|
||||
libs = [], panels.forEach(function(p) { p && (libs = libs.concat(p.list = p.list||["/panel/"+p.name+html._CSS, "/panel/"+p.name+html._JS])) })
|
||||
libs = libs.concat(Config.plugin||chat.plugin_list)
|
||||
libs = [], panels.forEach(function(p) { p && (libs = libs.concat(p.list = p.list||["/panel/"+p.name+nfs._CSS, "/panel/"+p.name+nfs._JS])) }), libs = libs.concat(Config.plugin||chat.plugin_list)
|
||||
cb = can||function(can) { can.onengine._init(can, can.Conf(Config), panels, Config._init, can._target) }
|
||||
can = {_follow: name, _target: Config.target||meta.target, _height: Config.height||meta._height, _width: Config.width||meta._width}
|
||||
}
|
||||
|
||||
var proto = {_path: _can_path, _name: name, _load: function(name, cbs) { 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
|
||||
cache.forEach(function(sub) { var name = sub._name; if (typeof cbs == lang.FUNCTION && cbs(can, name, sub)) { return }
|
||||
@ -292,14 +252,14 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", cache:
|
||||
},
|
||||
requireModules: function(libs, cb, cbs) {
|
||||
for (var i = 0; i < libs.length; i++) { if (libs[i].indexOf(ice.HTTP) == 0 || libs[i].indexOf(ice.PS) == 0) { continue }
|
||||
if (libs[i].indexOf(html._CSS) == -1 && libs[i].indexOf(html._JS) == -1) { libs[i] = libs[i]+"/lib/"+libs[i]+html._JS }
|
||||
if (libs[i].indexOf(nfs._CSS) == -1 && libs[i].indexOf(nfs._JS) == -1) { libs[i] = libs[i]+"/lib/"+libs[i]+nfs._JS }
|
||||
libs[i] = "/require/node_modules/"+libs[i]
|
||||
} can.require(libs, cb, cbs)
|
||||
},
|
||||
require: function(libs, cb, cbs) {
|
||||
if (!libs || libs.length == 0) { return typeof cb == lang.FUNCTION && setTimeout(function() { cb(can) }, 10) }
|
||||
if (libs[0] == undefined) { return can.require(libs.slice(1), cb, cbs) }
|
||||
if (libs[0] == "") { libs[0] = can._name.replace(html._JS, html._CSS) }
|
||||
if (libs[0] == "") { libs[0] = can._name.replace(nfs._JS, nfs._CSS) }
|
||||
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].indexOf(ice.HTTP) == 0? libs[0]: libs[0].split("?")[0]).toLowerCase()
|
||||
function next() { can._load(name, cbs), can.require(libs.slice(1), cb, cbs) }
|
||||
@ -331,7 +291,7 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", cache:
|
||||
get: function(name, key, cb) { var value; can.search({}, [can.core.Keys(name, chat.ONEXPORT, key)], cb||function(msg) { value = msg.Result() }); return value },
|
||||
set: function(name, key, value) { var msg = can.request(); msg.Option(key, value); return can.search(msg, [[name, chat.ONIMPORT, key]]) },
|
||||
setHeaderMenu: function(list, cb) { can._menu && can.page.Remove(can, can._menu)
|
||||
return can._menu = can.search(can.request({}, {trans: can.onaction._trans}), [["Header", chat.ONIMPORT, "menu"], can._name].concat(list), cb)
|
||||
return can._menu = can.search(can.request({}, {trans: can.onaction._trans}), [["Header", chat.ONIMPORT, html.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) },
|
||||
@ -354,20 +314,17 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", cache:
|
||||
for (var i = 0; i < arguments.length; i += 2) {
|
||||
if (typeof key == lang.OBJECT) { res = can.core.Value(can._conf, arguments[i]), i--; continue }
|
||||
res = can.core.Value(can._conf, arguments[i], arguments[i+1])
|
||||
} return res == undefined && key.indexOf(ctx.FEATURE+ice.PT) == -1? can.Conf(can.core.Keys(ctx.FEATURE, key)): res
|
||||
} return can.base.isUndefined(res) && key.indexOf(ctx.FEATURE+ice.PT) == -1? can.Conf(can.core.Keys(ctx.FEATURE, key)): res
|
||||
}, _conf: {},
|
||||
}; can = can||{}, kit.proto(can, proto), kit.proto(proto, meta)
|
||||
}; can = can||{}, kit.proto(can, proto), kit.proto(proto, meta), _can_path = _can_name||_can_path
|
||||
|
||||
if (_can_name) { meta.cache[_can_name] = meta.cache[_can_name]||[], meta.cache[_can_name].push(can) } else { list.push(can) }
|
||||
|
||||
_can_path = _can_name||_can_path
|
||||
if (libs && libs.length > 0) { for (var i = 0; i < libs.length; i++) { if (libs[i] == undefined) { continue }
|
||||
if (libs[i] == "") { libs[i] = _can_path.replace(html._JS, html._CSS) }
|
||||
if (libs[i] == "") { libs[i] = _can_path.replace(nfs._JS, nfs._CSS) }
|
||||
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] }
|
||||
} } if (can._follow) { libs = libs.concat(meta.libs, meta.volcano) }
|
||||
return can.require(libs, cb), can
|
||||
})
|
||||
|
||||
try { if (typeof(window) == lang.OBJECT) { // chrome
|
||||
Volcanos.meta.target = document.body, Volcanos.meta._height = window.innerHeight, Volcanos.meta._width = window.innerWidth
|
||||
Volcanos.meta._load = function(url, cb) { switch (url.split("?")[0].split(ice.PT).pop().toLowerCase()) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user