forked from x/volcanos
add some
This commit is contained in:
parent
bbd9ed606b
commit
8f3c12ee99
132
frame.js
132
frame.js
@ -1,4 +1,5 @@
|
||||
Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) {
|
||||
Volcanos(chat.ONENGINE, {
|
||||
_init: function(can, meta, list, cb, target) {
|
||||
can.Option = function() {}, 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.core.Next(list, function(item, next) { item.type = chat.PANEL
|
||||
can.onappend._init(can, item, item.list, function(sub) { can[item.name] = sub, sub.db = {}, sub.ui = {}, sub.db._boot = can.misc._time()
|
||||
@ -21,7 +22,7 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) {
|
||||
if (panel.onengine._engine(event, can, msg, panel, cmds, cb)) { return }
|
||||
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() {
|
||||
if (sub.__toast || sub._toast) { return } toast = toast||can.user.toastProcess(sub, _toast) }, 30) }
|
||||
if (sub.__toast || sub._toast) { return } toast = toast||can.user.toastProcess(sub, _toast) }, 30) }
|
||||
if (can.base.isUndefined(msg[ice.MSG_DAEMON])) {
|
||||
can.base.isUndefined(sub._daemon) && can.ondaemon._list[0] && (sub._daemon = can.ondaemon._list.push(sub)-1)
|
||||
if (sub._daemon) { msg.Option(ice.MSG_DAEMON, can.core.Keys(can.ondaemon._list[0], sub._daemon)) }
|
||||
@ -70,13 +71,14 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) {
|
||||
return can.core.List(can.onengine.listen.meta[name], function(cb) { can.core.CallFunc(cb, {event: msg._event, msg: msg}) }).length, msg
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONDAEMON, {_init: function(can, name, type, cbs) { if (can.user.isLocalFile) { return }
|
||||
Volcanos(chat.ONDAEMON, {
|
||||
_init: function(can, name, type, cbs) { if (can.user.isLocalFile) { return }
|
||||
return can.misc.WSS(can, {type: type||web.PORTAL, name: name||can.misc.Search(can, cli.DAEMON)||""}, function(event, msg, cmd, arg, cb) {
|
||||
if (cbs && can.core.CallFunc(cbs, {event: event, msg: msg, cmd: cmd, arg: arg, cb: cb})) { return }
|
||||
var sub = can.ondaemon._list[can.core.Keys(msg[ice.MSG_TARGET])]||can;
|
||||
sub.sub && can.base.isFunc(sub.sub.ondaemon[cmd])? can.core.CallFunc(sub.sub.ondaemon[cmd], {can: can, msg: msg, sub: sub, cmd: cmd, arg: arg, cb: cb}):
|
||||
can.base.isFunc(sub.ondaemon[cmd])? can.core.CallFunc(sub.ondaemon[cmd], {can: can, msg: msg, sub: sub, cmd: cmd, arg: arg, cb: cb}):
|
||||
can.onengine._search({}, can, msg, can, [chat._SEARCH, cmd].concat(arg), cb)
|
||||
can.base.isFunc(sub.ondaemon[cmd])? can.core.CallFunc(sub.ondaemon[cmd], {can: can, msg: msg, sub: sub, cmd: cmd, arg: arg, cb: cb}):
|
||||
can.onengine._search({}, can, msg, can, [chat._SEARCH, cmd].concat(arg), cb)
|
||||
})
|
||||
}, _list: [""], pwd: function(can, arg) { can.misc.sessionStorage(can, "can.daemon", can._wss_name = can.ondaemon._list[0] = arg[0]) },
|
||||
close: function(can, msg, sub) { can.user.close() }, exit: function(can, msg, sub) { can.user.close() },
|
||||
@ -127,14 +129,15 @@ Volcanos(chat.ONDAEMON, {_init: function(can, name, type, cbs) { if (can.user.is
|
||||
can._root.Header.run(can.request({}, {_space: can.ConfSpace()||can.misc.Search(can, ice.POD), _index: can.ConfIndex()}), [ctx.ACTION, web.ONLINE], function(msg) {
|
||||
can.page.Appends(can, can.ui.online, msg.Table(function(value, index) {
|
||||
return index < 5 && {img: can.misc.Resource(can, value.username == can.user.info.username? value.icons: value.avatar||"usr/icons/contexts.png"),
|
||||
title: [[value.usernick, value.username].join(lex.SP), [value.agent, value.system, value.ip].join(lex.SP)].join(lex.NL)}
|
||||
title: [[value.usernick, value.username].join(lex.SP), [value.agent, value.system, value.ip].join(lex.SP)].join(lex.NL)}
|
||||
}))
|
||||
msg.Length() > 0 && can.page.Append(can, can.ui.online, [{text: msg.Length()+""}])
|
||||
can.onmotion.orderShow(can, can.ui.online, "*", 10, 300)
|
||||
}), can.ondaemon._online(can, 30000)
|
||||
}, delay) },
|
||||
})
|
||||
Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
Volcanos(chat.ONAPPEND, {
|
||||
_init: function(can, meta, list, cb, target, field) {
|
||||
meta.index && (meta.name = meta.index), meta.name = can.core.Split(meta.name||"", "\t .\n").pop()||can.Conf(mdb.NAME)
|
||||
field = field||can.onappend.field(can, meta.type, meta, target)._target
|
||||
meta.style == html.OUTPUT && can.onappend.style(can, html.OUTPUT, field)
|
||||
@ -161,7 +164,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
},
|
||||
Option: function(key, value) {
|
||||
// value && (value = can.user.trans(sub, value, null, html.INPUT));
|
||||
return can.page.SelectArgs(can, option, key, value)[0] },
|
||||
return can.page.SelectArgs(can, option, key, value)[0] },
|
||||
Update: function(event, cmds, cb, silent) { event = event||{}, sub.request(event)._caller(), event.metaKey && sub.request(event, {metaKey: ice.TRUE})
|
||||
var msg = sub.request(event), list = can.core.Value(sub, "sub.db._checkbox"); can.core.Item(list, function(key, value) { msg.Option(key, value) })
|
||||
sub.request(event, sub.Option())
|
||||
@ -242,7 +245,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
var p = can.misc.Search(can, ctx.ACTION); auto || can.page.style(can, can._target, "visibility", "")
|
||||
can.isCmdMode() || can.page.style(can, can._target, "visibility", "")
|
||||
if (can.Conf("_ismain") && !can.Conf("_role") && can.misc.Search(can, log.DEBUG) != ice.TRUE) {
|
||||
|
||||
|
||||
} else if (p && can.isCmdMode()) {
|
||||
skip || can.Conf(ice.AUTO) == cli.DELAY || can.Update(can.request({}, {_method: http.GET}), [ctx.ACTION, p])
|
||||
} else {
|
||||
@ -254,7 +257,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
function run(event, button) { can.misc.Event(event, can, function(msg) { var _can = can._fields? can.sup: can; can.requestAction(event, button)
|
||||
action == can._action && can.onengine.signal(can, "onevent", can.request(event, {_type: html.ACTION}))
|
||||
var cb = meta[button]||meta[chat._ENGINE]; cb? can.core.CallFunc(cb, {event: event, can: can, button: button}):
|
||||
can.run(event, can.base.isIn(button, mdb.LIST, web.REFRESH)? []: [ctx.ACTION, button].concat(_can.Input()))
|
||||
can.run(event, can.base.isIn(button, mdb.LIST, web.REFRESH)? []: [ctx.ACTION, button].concat(_can.Input()))
|
||||
}) }
|
||||
var list = can.page.inputs(can, can.base.getValid(can.base.Obj(list), can.core.Value(can, [chat.ONACTION, mdb.LIST]), meta != can.onaction? can.core.Item(meta): [])||[])
|
||||
limit = limit||html.ACTION_BUTTON; if (list.length > limit) {
|
||||
@ -270,34 +273,36 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
var button = event.target.value; can.onexport.session && can.onexport.session(can, "action:"+item[0], button)
|
||||
can.onaction._select && can.onaction._select(event, can, item[0], button)
|
||||
meta[item[0]]? can.core.CallFunc(meta[item[0]], [event, can, item[0], button]):
|
||||
meta[button]? can.core.CallFunc(meta[button], [event, can, button]): can.Action(item[0], button)
|
||||
meta[button]? can.core.CallFunc(meta[button], [event, can, button]): can.Action(item[0], button)
|
||||
})}, _init: function() {
|
||||
if (can.onexport && can.onexport.session) { var value = can.onexport.session(can, "action:"+item[0]); value && can.Action(item[0], value) }
|
||||
}}: /* 4.其它 */(item.type == html.BUTTON && (item.value = item.value||can.user.trans(can, item.name, meta._trans), item.onclick = item.onclick||function(event) {
|
||||
run(event, item.name||item.value)
|
||||
}, item._init = item._init||function(target) { item.action && can.onappend.figure(sub, item, target, function(_sub, value) { can.Update() })
|
||||
if (item.type == html.BUTTON && can.page.isIconInput(can, item.name)) { can.onappend.icons(can, target, item.name) }
|
||||
}), item), "", action)
|
||||
}), item),
|
||||
"", action)
|
||||
})
|
||||
var _can = can._fields? can.sup: can
|
||||
can.isCmdMode() || can.base.beginWith(can.ConfIndex(), "can.", "web.chat.macos.") ||
|
||||
can.page.tagis(can._fields||can._target, html.FIELDSET_PANEL) || action == can._action && can.page.Append(can, action,
|
||||
can.core.Item(can.user.isMobile? {
|
||||
open: !can.isCmdMode() && "打开链接",
|
||||
// chat: "发送聊天",
|
||||
}: {_space: "",
|
||||
full: !can.isCmdMode() && "切换全屏",
|
||||
open: !can.isCmdMode() && "打开链接",
|
||||
chat: can.user.isTechOrRoot(can) && can.ConfIndex() != chat.MESSAGE && "发送聊天",
|
||||
// help: can.page.ClassList.has(can, can._fields||can._target, html.PLUGIN) && can.Conf("_help") && can.Conf("_help") != "" && "查看文档",
|
||||
}, function(key, value) {
|
||||
return (value || value === "") && {view: [[html.ITEM, html.BUTTON, key, mdb.ICONS, "state"]], list: [{icon: icon[key]}],
|
||||
title: key == "_space"? "": can.user.trans(can, key), onclick: function(event) {
|
||||
can.onengine.signal(can, "onevent", can.request(event, {_type: html.ACTION, action: key}))
|
||||
can.page.tagis(can._fields||can._target, html.FIELDSET_PANEL) || action == can._action && can.page.Append(can, action,
|
||||
can.core.Item(can.user.isMobile? {
|
||||
open: !can.isCmdMode() && "打开链接",
|
||||
// chat: "发送聊天",
|
||||
}: {_space: "",
|
||||
full: !can.isCmdMode() && "切换全屏",
|
||||
open: !can.isCmdMode() && "打开链接",
|
||||
chat: can.user.isTechOrRoot(can) && can.ConfIndex() != chat.MESSAGE && "发送聊天",
|
||||
// help: can.page.ClassList.has(can, can._fields||can._target, html.PLUGIN) && can.Conf("_help") && can.Conf("_help") != "" && "查看文档",
|
||||
}, function(key, value) {
|
||||
return (value || value === "") && {view: [[html.ITEM, html.BUTTON, key, mdb.ICONS, "state"]], list: [{icon: icon[key]}],
|
||||
title: key == "_space"? "": can.user.trans(can, key), onclick: function(event) {
|
||||
can.onengine.signal(can, "onevent", can.request(event, {_type: html.ACTION, action: key}))
|
||||
var cb = _can.onaction[value]; cb && _can.onaction[value](event, _can, value, _can.sub)
|
||||
}}
|
||||
}).concat(can.Conf("_plugin_action")||[])
|
||||
); return meta
|
||||
}
|
||||
}
|
||||
}).concat(can.Conf("_plugin_action")||[])
|
||||
); return meta
|
||||
},
|
||||
_output0: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event); meta.feature = meta.feature||{}
|
||||
if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION) { if (msg.RunAction(event, can.sub, cmds)) { return } }
|
||||
@ -330,14 +335,17 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
sub._trans = can.base.Copy(can.base.Copy(sub._trans||{}, can._trans), can.core.Value(sub, [chat.ONACTION, chat._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, html.TEXT) })
|
||||
}
|
||||
can.page.ClassList.del(can, sub._fields, html.FORM), delete(can._status._cache), delete(can._status._cache_key)
|
||||
sub._output.className = html.OUTPUT
|
||||
} can.onmotion.toggle(can, can._action, true), delete(can._status._cache), delete(can._status._cache_key)
|
||||
// can.page.ClassList.del(can, sub._fields, html.FORM)
|
||||
// sub._output.className = html.OUTPUT
|
||||
// can.onappend.style(can, sub._args.style, can._output)
|
||||
// can.isCmdMode() && can.onappend.style(can, html.OUTPUT)
|
||||
// sub.isCmdMode() && sub.onexport.title(sub, sub.ConfIndex())
|
||||
can.onmotion.toggle(can, can._action, true)
|
||||
can.onexport._output(sub, msg), sub.Mode() != ice.MSG_RESULT && can.onmotion.clear(can, output)
|
||||
can._output_old = can._output, can._output = sub._output = sub._target = output = can.page.insertBefore(can, [html.OUTPUT], can._status)
|
||||
can.page.style(can, can._output, "visibility", "hidden")
|
||||
can.page.style(can, can._output, "position", "fixed")
|
||||
if (sub.Mode() == ice.MSG_RESULT) { can._output.innerHTML = can._output_old.innerHTML }
|
||||
can.onexport._output(sub, msg)
|
||||
can.core.CallFunc([sub, chat.ONIMPORT, chat._INIT], {can: sub, msg: msg, cb: function(msg) {
|
||||
if (action !== false) { can.onkeymap._build(sub)
|
||||
var list = can.base.Obj(msg.Option(ice.MSG_ACTION)||can.Conf(ice.MSG_ACTION), [])||[]
|
||||
@ -348,11 +356,14 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
} can.onappend.style(sub, sub.Conf(ctx.STYLE)), can.onmotion.story.auto(can, can._output)
|
||||
if (can.onimport.size) {
|
||||
can.page.ClassList.has(can, can._target, html.FLOAT) && !can.page.ClassList.has(can, can._target, html.PLUG)?
|
||||
can.onimport.size(can, can.ConfHeight(), can.base.Min(can.ConfWidth(), can._target.offsetWidth), can.Conf("_auto"), can.Mode()):
|
||||
can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), can.Conf("_auto"), can.Mode())
|
||||
can.onimport.size(can, can.ConfHeight(), can.base.Min(can.ConfWidth(), can._target.offsetWidth), can.Conf("_auto"), can.Mode()):
|
||||
can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), can.Conf("_auto"), can.Mode())
|
||||
can.isCmdMode() && can.page.style(can, can._output, html.HEIGHT, sub.ConfHeight())
|
||||
can.onexport.output(sub, msg); if (can.Conf("_output")) { can.Conf("_output")(sub, msg) }
|
||||
} msg.Defer(), can.base.isFunc(cb) && cb(msg), can.page.style(can, can._target, "visibility", ""), can.page.style(can, can._output, "visibility", "")
|
||||
} msg.Defer(), can.base.isFunc(cb) && cb(msg), can.page.style(can, can._target, "visibility", ""),
|
||||
can._output.scrollTop = can._output_old.scrollTop, can._output.scrollLeft = can._output_old.scrollLeft
|
||||
can.page.style(can, can._output, "visibility", ""), can.page.Remove(can, can._output_old)
|
||||
can.page.style(can, can._output, "position", "")
|
||||
}, target: output}), msg.Defer()
|
||||
})
|
||||
},
|
||||
@ -405,7 +416,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
}}])
|
||||
})
|
||||
},
|
||||
|
||||
|
||||
field: function(can, type, item, target) { type = type||html.STORY, item = item||{}
|
||||
var name = can.core.Split(item.nick||item.index||"", " .").pop()||""; can.base.isIn(name,
|
||||
"cluster",
|
||||
@ -414,8 +425,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
can.core.Split(can.ConfIndex(), nfs.PT).pop()
|
||||
) && (name = (item.index||"").split(nfs.PT).slice(-2).join(nfs.PT))
|
||||
type == html.PLUG || (type == html.STORY && item.style != html.FLOAT) ||
|
||||
// can.base.isIn(can.ConfIndex(), web.DESKTOP, web.MESSAGE, web.VIMER) ||
|
||||
(name = can.core.Keys(item.space||item._space, name))
|
||||
// can.base.isIn(can.ConfIndex(), web.DESKTOP, web.MESSAGE, web.VIMER) ||
|
||||
(name = can.core.Keys(item.space||item._space, name))
|
||||
item.index && (item.help = item.help||can.user.trans(can, item.index.split(".").pop(), ""))
|
||||
var title = item.title || can.user.isMobile && (can.user.isEnglish(can)? name: (item.help||name)) || (!item.help || name == item.help || can.user.isEnglish(can)? name: name+"("+can.core.Split(item.help)[0]+")")
|
||||
target = can.base.isFunc(target)? target(): target
|
||||
@ -490,12 +501,14 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
}
|
||||
},
|
||||
_filter: function(can) {
|
||||
can.page.insertBefore(can, can.onappend.filter(can, can._action, can.ui.content||can._output).parentNode,
|
||||
(can.page.SelectOne(can, can._action, "div.item._space")||{}).nextSibling, can._action)
|
||||
can.page.insertBefore(can, can.onappend.filter(can, can._action, can.ui.content||can._output).parentNode, (can.page.SelectOne(can, can._action, "div.item._space")||{}).nextSibling, can._action)
|
||||
},
|
||||
filter: function(can, target, output) { output = output||can.ui.content||target
|
||||
return can.onappend.input(can, {type: html.TEXT, name: web.FILTER, icon: icon.SEARCH, placeholder: "search in n items", onkeydown: function() {}, onkeyup: function(event) {
|
||||
var value = event.currentTarget? event.currentTarget.value: ""
|
||||
if (can.sub && can.sub.onaction && can.sub.onaction.filter && can.sub.onaction.filter(event, can.sub, value)) {
|
||||
return
|
||||
}
|
||||
if (event.key == code.ENTER) {
|
||||
can.page.Select(can, output, html.DIV_ITEM+":not(.hide)", function(target) { target.click() })
|
||||
} else if (event.key == code.ESCAPE) { event.currentTarget.value = "", event.currentTarget.blur()
|
||||
@ -587,7 +600,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
if (key == "secretKey" && value) { _value = value.slice(0, 4)+"****" }
|
||||
if (key == web.TOKEN && value) { _value = value.slice(0, 4)+"****" }
|
||||
if (key == aaa.PASSWORD && value) { _value = "********" }
|
||||
|
||||
|
||||
function onclick() { return false }
|
||||
if (key == mdb.STATUS && can.base.isIn(value, mdb.DISABLE, ice.FALSE)) { _value = `<i class="${icon.enable}">`
|
||||
function onclick() { run(event, mdb.MODIFY, [mdb.STATUS, mdb.ENABLE]); return true }
|
||||
@ -699,14 +712,14 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
target.scrollHeight > target.offsetHeight && can.page.style(can, vbar, html.VISIBILITY, html.VISIBLE,
|
||||
html.HEIGHT, height, html.RIGHT, target == can.ui.content? undefined: -target.scrollLeft,
|
||||
html.TOP, target == can.ui.content? target.scrollTop/(target.scrollHeight-target.offsetHeight)*(target.offsetHeight-height):
|
||||
can.base.Max(target.scrollTop+target.scrollTop/(target.scrollHeight-target.offsetHeight)*(target.offsetHeight-height)-10, target.scrollHeight-height),
|
||||
can.base.Max(target.scrollTop+target.scrollTop/(target.scrollHeight-target.offsetHeight)*(target.offsetHeight-height)-10, target.scrollHeight-height),
|
||||
)
|
||||
var width = can.base.Min(target.offsetWidth*target.offsetWidth/target.scrollWidth, target.offsetWidth/4)
|
||||
hbar.innerHTML = `${(target.scrollLeft*100/(target.scrollWidth-target.offsetWidth)).toFixed(2)}%`
|
||||
target.scrollWidth > target.offsetWidth+10 && can.page.style(can, hbar, html.VISIBILITY, html.VISIBLE,
|
||||
html.WIDTH, width, html.BOTTOM, target == can.ui.content? undefined: -target.scrollTop,
|
||||
html.LEFT, target == can.ui.content? target.scrollLeft/(target.scrollWidth-target.offsetWidth)*(target.offsetWidth-width):
|
||||
target.scrollLeft+target.scrollLeft/(target.scrollWidth-target.offsetWidth)*(target.offsetWidth-width),
|
||||
target.scrollLeft+target.scrollLeft/(target.scrollWidth-target.offsetWidth)*(target.offsetWidth-width),
|
||||
)
|
||||
can.onmotion.delayOnce(can, function() {
|
||||
can.page.style(can, vbar, html.VISIBILITY, html.HIDDEN), can.page.style(can, hbar, html.VISIBILITY, html.HIDDEN)
|
||||
@ -750,7 +763,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
} else { can.page.Append(can, target, [item]) }
|
||||
}
|
||||
}); return list } ui.list = append(target, type, list)
|
||||
|
||||
|
||||
function calc(item, size, total) { return ui.size[item]? ui.size[item] < 1? total*ui.size[item]: ui.size[item]: can.base.isString(size)? parseInt(can.base.trimSuffix(size, "px")): size }
|
||||
var defer = [], content_height, content_width; function layout(type, list, height, width) { var _width = width, _height = height; can.core.List(list, function(item) {
|
||||
var meta = {}
|
||||
@ -775,14 +788,14 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
}), can.core.List(list, function(item) {
|
||||
if (can.base.isArray(item)) { layout(type == FLEX? FLOW: FLEX, item, height, width) }
|
||||
}) }
|
||||
|
||||
|
||||
ui.project && can.page.Select(can, can._option, "div.item.menu", function(target) { can.page.style(can, target, "display", "unset") })
|
||||
ui.project && (can.user.isMobile && can.onmotion.hidden(can, ui.project), ui.filter = can.onappend.filter(can, ui.project))
|
||||
ui.display && can.onmotion.hidden(can, ui.display), ui.profile && can.onmotion.hidden(can, ui.profile)
|
||||
can.onexport.session && can.onexport.session(can, "project.hide") == ice.TRUE && ui.project && can.onmotion.hidden(can, ui.project)
|
||||
can.onexport.session && can.onexport.session(can, "display.show") == ice.TRUE && can.onmotion.toggle(can, ui.display, true)
|
||||
can.onexport.session && can.onexport.session(can, "profile.show") == ice.TRUE && can.onmotion.toggle(can, ui.profile, true)
|
||||
|
||||
|
||||
ui.layout = function(height, width, delay, cb) { can.onmotion.delay(can, function() {
|
||||
defer = [], layout(type, ui.list, height, width), defer.forEach(function(cb) { cb() })
|
||||
if (can.db.value) {
|
||||
@ -830,7 +843,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
if (can.onmotion.cache(can, function() { return name }, ui.output)) { return }
|
||||
if (typeof item == code.FUNCTION) { return item(ui.output) }
|
||||
item.type = item.type||chat.STORY, can.onappend.plugin(can, item, function(sub) {
|
||||
sub.onimport.size(sub, sub.ConfHeight(), sub.ConfWidth(), false)
|
||||
sub.onimport.size(sub, sub.ConfHeight(), sub.ConfWidth(), false)
|
||||
sub.onexport._output = function() {
|
||||
sub.onimport.size(sub, sub.ConfHeight(), sub.ConfWidth(), false)
|
||||
}
|
||||
@ -838,7 +851,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
}, _init: function(target) { index == 0 && can.onmotion.delay(can, function() { target.click() }) }}])._target
|
||||
}); return ui._target = target, ui
|
||||
},
|
||||
|
||||
|
||||
plugin: function(can, meta, cb, target, field) {
|
||||
meta = meta||{}, meta.index = meta.index||can.core.Keys(meta.ctx, meta.cmd)||"can._output", meta._space = meta._space||can.ConfSpace()
|
||||
var res = {}; function _cb(sub, meta, skip) { kit.proto(res, sub), cb && cb(sub, meta, skip) }
|
||||
@ -915,7 +928,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
|
||||
})
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||can._root._target; var height = can.page.height(), width = can.page.width()
|
||||
Volcanos(chat.ONLAYOUT, {
|
||||
_init: function(can, target) { target = target||can._root._target; 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)
|
||||
@ -974,7 +988,8 @@ Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||can._ro
|
||||
return layout
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONMOTION, {_init: function(can, target) {
|
||||
Volcanos(chat.ONMOTION, {
|
||||
_init: function(can, target) {
|
||||
target.onclick = function(event) {
|
||||
if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return }
|
||||
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) }
|
||||
@ -1067,8 +1082,7 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) {
|
||||
}
|
||||
}).length == 0)
|
||||
}) },
|
||||
tableFilter: function(can, target, value) {
|
||||
can.page.Select(can, target, html.TR, function(tr, index) {
|
||||
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.toLowerCase().indexOf(value.toLowerCase()) > -1) { return td } }) == 0)
|
||||
}) },
|
||||
delayResize: function(can, target, key) {
|
||||
@ -1142,7 +1156,7 @@ Volcanos(chat.ONMOTION, {_init: function(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.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) })
|
||||
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, can.page.style(can, target, html.OPACITY, 0, html.DISPLAY, html.BLOCK)
|
||||
time = can.base.isObject(time)? time: {interval: 10, length: time||30}
|
||||
@ -1165,10 +1179,10 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) {
|
||||
case html.TOP: can.page.style(can, target, html.TOP, can.base.Min(begin.top + dy, top||0, height-target.offsetHeight)), dy = -dy
|
||||
case html.BOTTOM: cb? cb(begin.height + dy, begin.width): can.page.style(can, target, html.HEIGHT, begin.height + dy); break
|
||||
default:
|
||||
can.page.style(can, target,
|
||||
html.LEFT, can.base.Min(begin.left + dx, left||0, width-target.offsetWidth),
|
||||
html.TOP, can.base.Min(begin.top + dy, top||0, height-html.ACTION_HEIGHT)
|
||||
)
|
||||
can.page.style(can, target,
|
||||
html.LEFT, can.base.Min(begin.left + dx, left||0, width-target.offsetWidth),
|
||||
html.TOP, can.base.Min(begin.top + dy, top||0, height-html.ACTION_HEIGHT)
|
||||
)
|
||||
} can.onkeymap.prevent(event)
|
||||
} else { var p = can.page.position(event, target), margin = 10, cursor = ""
|
||||
if (p.x < margin) { cursor = "ew-resize", action = html.LEFT
|
||||
@ -1268,7 +1282,7 @@ Volcanos(chat.ONKEYMAP, {
|
||||
target.value = target.value.substring(0, start)+target.value.substring(end, target.value.length)
|
||||
return target.setSelectionRange(start, start), cut
|
||||
},
|
||||
|
||||
|
||||
selectCtrlN: function(event, can, target, key, cb) { if (!event.ctrlKey || event.key < "0" || event.key > "9") { return }
|
||||
return can.page.Select(can, target, key, function(target, index) { if (index+1 == event.key) { return cb? cb(target): target.click() } })[0]
|
||||
},
|
||||
|
@ -34,10 +34,10 @@ Volcanos("base", {
|
||||
} return true
|
||||
} return to === from
|
||||
},
|
||||
|
||||
|
||||
Ext: function(path) { return path.split(nfs.PS).pop().split(nfs.PT).pop().toLowerCase() },
|
||||
Dir: function(path) { return path.endsWith(nfs.PS)? path: path.slice(0, path.lastIndexOf(nfs.PS)+1) },
|
||||
|
||||
|
||||
Path: function(path) { var res = "", arg = arguments; for (var i = 0; i < arg.length; i++) { if (!arg[i]) { continue }
|
||||
res += (arg[i][0]==nfs.PS || res=="" || res[res.length-1]==nfs.PS? "": nfs.PS) + arg[i].trim()
|
||||
} return res },
|
||||
@ -79,7 +79,7 @@ Volcanos("base", {
|
||||
Format: function(obj) { return JSON.stringify(obj) },
|
||||
Simple: function() { var res = []; for (var i = 0; i < arguments.length; i++) { var val = arguments[i]; switch (typeof val) {
|
||||
case code.OBJECT: if (val.length > 0) { res = res.concat(val); break }
|
||||
for (var k in val) { k && val[k] && res.push(k, val[k]) } break
|
||||
for (var k in val) { k && val[k] && res.push(k, val[k]) } break
|
||||
default: res.push(val)
|
||||
} } return res },
|
||||
AddUniq: function(list, value) { list = list||[], list.indexOf(value) == -1 && list.push(value); return list },
|
||||
|
12
lib/core.js
12
lib/core.js
@ -61,9 +61,9 @@ Volcanos("core", {
|
||||
case "*": res["need"] = "must", i--; break
|
||||
case nfs.DF: res[mdb.TYPE] = ls[i+1]; break
|
||||
case mdb.EQ:
|
||||
if (res[mdb.TYPE] == html.SELECT) { res.values = this.Split(ls[i+1]); for (var j = 1; j < res.values.length; j++) {
|
||||
if (res.values[0] == "" || res.values[0] == res.values[j]) { res.value = res.values[0], res.values = res.values.slice(1); break }
|
||||
} } else { res.value = ls[i+1] } break
|
||||
if (res[mdb.TYPE] == html.SELECT) { res.values = this.Split(ls[i+1]); for (var j = 1; j < res.values.length; j++) {
|
||||
if (res.values[0] == "" || res.values[0] == res.values[j]) { res.value = res.values[0], res.values = res.values.slice(1); break }
|
||||
} } else { res.value = ls[i+1] } break
|
||||
case ice.AT: res[ctx.ACTION] = ls[i+1]; break
|
||||
} } return res
|
||||
} },
|
||||
@ -92,13 +92,13 @@ Volcanos("core", {
|
||||
Next: function(list, cb, cbs, data) {
|
||||
switch (typeof list) {
|
||||
case code.OBJECT:
|
||||
if (list == null) { list = []; break } if (list.length == undefined) { var ls = []; for (var k in list) { ls.push(k) } list = ls } break
|
||||
if (list == null) { list = []; break } if (list.length == undefined) { var ls = []; for (var k in list) { ls.push(k) } list = ls } break
|
||||
default: if (list == undefined) { list = []; break } list = [list]
|
||||
}
|
||||
function next(i) {
|
||||
data = (i < list.length?
|
||||
typeof cb == code.FUNCTION && cb(list[i], function(_data) { data = _data||data, next(i+1) }, i, list, data):
|
||||
typeof cbs == code.FUNCTION && cbs(list))||data
|
||||
typeof cbs == code.FUNCTION && cbs(list))||data
|
||||
}
|
||||
return next(0), list
|
||||
},
|
||||
@ -140,7 +140,7 @@ Volcanos("core", {
|
||||
Timer: shy("定时器, value, [1,2,3,4], {delay, interval, length}", function(interval, cb, cbs) { var timer = {stop: false}
|
||||
if (interval == "0") { return cb && cb(), cbs && cbs() }
|
||||
function loop(i) { timer.stop || i >= interval.length && interval.length >= 0 || cb(timer, interval.interval||interval[i], i, interval)?
|
||||
typeof cbs == code.FUNCTION && cbs(timer, interval): setTimeout(function() { loop(i+1) }, interval.interval||interval[i+1])
|
||||
typeof cbs == code.FUNCTION && cbs(timer, interval): setTimeout(function() { loop(i+1) }, interval.interval||interval[i+1])
|
||||
} interval = typeof interval == code.OBJECT? interval: [interval]; if (interval.interval == 0) { return cb(), timer }
|
||||
var delay = interval.delay||interval.interval/2||interval[0]
|
||||
return typeof cb == code.FUNCTION && (timer._timer = setTimeout(function() { loop(0) }, delay)), timer
|
||||
|
18
lib/date.js
18
lib/date.js
@ -37,7 +37,7 @@ Volcanos("date", {
|
||||
lunarFestival: getFestival(this.lfestival, month, day), Festival: getFestival(this.festival, m, d),
|
||||
}
|
||||
res.autoDay = res.lunarFestival||res.Festival||term||(day==1? this.toChinaMonth(month): this.toChinaDay(day))
|
||||
res.autoClass = "lunar"+(res.lunarFestival||res.Festival? " fest":"")+(term? " term": "")
|
||||
res.autoClass = "lunar"+(res.lunarFestival||res.Festival? " fest":"")+(term? " term": "")
|
||||
return res
|
||||
},
|
||||
// 天干表 ["甲","乙","丙","丁","戊","己","庚","辛","壬","癸"]
|
||||
@ -80,7 +80,7 @@ Volcanos("date", {
|
||||
'1-1': {title: '元旦节'},
|
||||
'12-24': {title: '平安夜'},
|
||||
'12-25': {title: '圣诞节'},
|
||||
|
||||
|
||||
'2-14': {title: '情人节'},
|
||||
'3-8': {title: '妇女节'},
|
||||
'4-1': {title: '愚人节'},
|
||||
@ -88,7 +88,7 @@ Volcanos("date", {
|
||||
'5-4': {title: '青年节'},
|
||||
'6-1': {title: '儿童节'},
|
||||
'9-10': {title: '教师节'},
|
||||
|
||||
|
||||
'7-1': {title: '建党节'},
|
||||
'8-1': {title: '建军节'},
|
||||
'10-1': {title: '国庆节'},
|
||||
@ -151,27 +151,27 @@ Volcanos("date", {
|
||||
_info[0].substr(1,2),
|
||||
_info[0].substr(3,1),
|
||||
_info[0].substr(4,2),
|
||||
|
||||
|
||||
_info[1].substr(0,1),
|
||||
_info[1].substr(1,2),
|
||||
_info[1].substr(3,1),
|
||||
_info[1].substr(4,2),
|
||||
|
||||
|
||||
_info[2].substr(0,1),
|
||||
_info[2].substr(1,2),
|
||||
_info[2].substr(3,1),
|
||||
_info[2].substr(4,2),
|
||||
|
||||
|
||||
_info[3].substr(0,1),
|
||||
_info[3].substr(1,2),
|
||||
_info[3].substr(3,1),
|
||||
_info[3].substr(4,2),
|
||||
|
||||
|
||||
_info[4].substr(0,1),
|
||||
_info[4].substr(1,2),
|
||||
_info[4].substr(3,1),
|
||||
_info[4].substr(4,2),
|
||||
|
||||
|
||||
_info[5].substr(0,1),
|
||||
_info[5].substr(1,2),
|
||||
_info[5].substr(3,1),
|
||||
@ -247,7 +247,7 @@ Volcanos("date", {
|
||||
'665f67f0e37f14898082b0723b02d5','7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721',
|
||||
'7f0e36665b66a449801e9808297c35','665f67f0e37f14898082b072297c35','7ec967f0e37f14998082b0787b06bd',
|
||||
'7f07e7f0e47f531b0723b0b6fb0721','7f0e26665b66a449801e9808297c35','665f67f0e37f1489801eb072297c35',
|
||||
'7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722'],
|
||||
'7ec967f0e37f14998082b0787b06bd','7f07e7f0e47f531b0723b0b6fb0721','7f0e27f1487f531b0b0bb0b6fb0722'],
|
||||
})
|
||||
Volcanos("page", {trans: function(can, text) {
|
||||
return can.base.replaceAll(text, "&", "&", "<", "<", ">", ">")
|
||||
|
35
lib/misc.js
35
lib/misc.js
@ -292,7 +292,7 @@ Volcanos("misc", {
|
||||
if (can.base.isArray(item)) {
|
||||
return item.join(nfs.DF)
|
||||
}
|
||||
return can.base.replaceAll(item, ":", "%3A") }).slice(1).join(nfs.DF)
|
||||
return can.base.replaceAll(item, ":", "%3A") }).slice(1).join(nfs.DF)
|
||||
if (can.isCmdMode() || can._name == "River" || can._name == "Action") { location.hash = hash }
|
||||
}
|
||||
return can.core.List(can.core.Split(can.base.trimPrefix(location.hash, "#"), nfs.DF)||[], function(item) { return decodeURIComponent(item) })
|
||||
@ -353,19 +353,20 @@ Volcanos("misc", {
|
||||
_stacks: function(n, s) { var list = ((s||(new Error())).stack||"").split(lex.NL).slice(typeof n == "undefined"? 2: n)
|
||||
for (var i = 0; i < list.length; i++) { var ls = list[i].trim().split(lex.SP)
|
||||
list[i] = ls.pop().trim(); if (list[i][0] == "(") { list[i] = list[i].slice(1, -1) }
|
||||
list[i] = " "+list[i]; if (ls.length > 1) { list[i] += " "+ls.pop() }
|
||||
list[i] = list[i].replace(/\?[^:]+/, "").replace(location.origin, "")
|
||||
} return list
|
||||
}, _stack: function() { return ((new Error()).stack||"").split(lex.NL).slice(2) },
|
||||
_time: function() { var now = new Date()
|
||||
var hour = now.getHours(); hour < 10 && (hour = "0"+hour)
|
||||
var minute = now.getMinutes(); minute < 10 && (minute = "0"+minute)
|
||||
var second = now.getSeconds(); second < 10 && (second = "0"+second)
|
||||
var mill = now.getMilliseconds(); mill < 10 && (mill = "00"+mill) || mill < 100 && (mill = "0"+mill)
|
||||
return [hour, minute, second].join(nfs.DF)+nfs.PT+mill
|
||||
},
|
||||
_args: function(level, arg) { var args = [this._time(), this.FileLine(this._skip+1, 3)].concat(level? [level]: [])
|
||||
for (var i in arg) { arg[i] != undefined && args.push(arg[i]) } return args
|
||||
},
|
||||
_signal: function(args) { this._list.push(args) }, _list: [], _skip: navigator && navigator.userAgent.indexOf("Chrome") > -1? 3: 3,
|
||||
})
|
||||
list[i] = " "+list[i]; if (ls.length > 1) { list[i] += " "+ls.pop() }
|
||||
list[i] = list[i].replace(/\?[^:]+/, "").replace(location.origin, "")
|
||||
} return list
|
||||
}, _stack: function() { return ((new Error()).stack||"").split(lex.NL).slice(2) },
|
||||
_time: function() { var now = new Date()
|
||||
var hour = now.getHours(); hour < 10 && (hour = "0"+hour)
|
||||
var minute = now.getMinutes(); minute < 10 && (minute = "0"+minute)
|
||||
var second = now.getSeconds(); second < 10 && (second = "0"+second)
|
||||
var mill = now.getMilliseconds(); mill < 10 && (mill = "00"+mill) || mill < 100 && (mill = "0"+mill)
|
||||
return [hour, minute, second].join(nfs.DF)+nfs.PT+mill
|
||||
},
|
||||
_args: function(level, arg) { var args = [this._time(), this.FileLine(this._skip+1, 3)].concat(level? [level]: [])
|
||||
for (var i in arg) { arg[i] != undefined && args.push(arg[i]) } return args
|
||||
},
|
||||
_signal: function(args) { this._list.push(args) }, _list: [], _skip: navigator && navigator.userAgent.indexOf("Chrome") > -1? 3: 3,
|
||||
})
|
||||
|
416
lib/page.js
416
lib/page.js
@ -9,7 +9,7 @@ Volcanos("page", {
|
||||
return target.className = can.core.List(list, function(value) { return value == key? undefined: value }).join(lex.SP).trim()
|
||||
},
|
||||
set: function(can, target, key, condition) {
|
||||
return (condition? this.add(can, target, key): this.del(can, target, key)).indexOf(key) > -1 },
|
||||
return (condition? this.add(can, target, key): this.del(can, target, key)).indexOf(key) > -1 },
|
||||
neg: function(can, target, key) { return (this.has(can, target, key)? this.del(can, target, key): this.add(can, target, key)).indexOf(key) > -1 },
|
||||
tag: function(can, target) { return [document.body.tagName.toLowerCase()].concat(document.body.classList).join(lex.PT) }
|
||||
},
|
||||
@ -57,71 +57,72 @@ Volcanos("page", {
|
||||
} })
|
||||
if (item.view) { var list = can.core.List(item.view); if (can.base.isArray(list[0])) {
|
||||
list[0] = can.base.replaceAll(can.core.List(list[0], function(v) { return v }).join(lex.SP), ".", " ")
|
||||
}
|
||||
list[0] && can.page.ClassList.add(can, data, list[0]), type = list[1]||type, data.innerHTML = list[2]||data.innerHTML||"", name = list[3]||name
|
||||
} else if (item.text) { var list = can.core.List(item.text); if (can.base.isArray(list[2])) { list[2] = list[2].join(lex.SP) }
|
||||
data.innerHTML = list[0]||data.innerHTML||"", type = list[1]||item.type||html.SPAN, list[2] && can.page.ClassList.add(can, data, list[2])
|
||||
} else if (item.icon) { var list = can.core.List(item.icon)
|
||||
if (icon[item.icon]) {
|
||||
type = "i", data.className = icon[item.icon]
|
||||
} else if (can.page.unicode[list[0]]) {
|
||||
type = html.SPAN, name = list[0], data.className = "icon "+list[0], data.innerText = can.page.unicode[list[0]]
|
||||
} else {
|
||||
type = "i", data.className = list[0]
|
||||
}
|
||||
} else if (item.button) { var list = can.core.List(item.button); type = html.BUTTON, name = list[0]||name, data.innerText = can.user.trans(can, name)
|
||||
data.onclick = function(event) { can.misc.Event(event, can, function(msg) { can.base.isFunc(list[1]) && list[1](event, name), can.onkeymap.prevent(event) }) }
|
||||
} else if (item.select) { var list = item.select; type = html.SELECT, name = list[0][0], data.className = data.className||list[0][0]
|
||||
data.onchange = function(event) { can.misc.Event(event, can, function(msg) { can.base.isFunc(list[1]) && list[1](event, event.target.value, name) }) }
|
||||
item.list = list[0].slice(1).map(function(value) { return {type: html.OPTION, value: value, inner: can.user.trans(can, value)} })
|
||||
} else if (item.input) { var list = can.core.List(item.input); type = html.INPUT, name = list[0], data.className = data.className||list[0], data.type = data.type||html.TEXT
|
||||
data.onkeydown = function(event) { can.base.isFunc(list[1]) && list[1](event) }
|
||||
data.onkeyup = function(event) { can.base.isFunc(list[2]) && list[2](event) }
|
||||
} else if (item.username) { var list = can.core.List(item.username); type = html.INPUT, name = list[0]||name||html.USERNAME
|
||||
// data.className = list[1]||data.className||name, data.autocomplete = data.autocomplete||html.USERNAME
|
||||
data.className = list[1]||data.className||name
|
||||
} else if (item.password) { var list = can.core.List(item.password); type = html.INPUT, name = list[0]||name||html.PASSWORD
|
||||
// data.className = list[1]||data.className||name, data.type = html.PASSWORD, data.autocomplete = data.autocomplete||"current-password"
|
||||
data.className = list[1]||data.className||name, data.type = html.PASSWORD
|
||||
} else if (item.img) {
|
||||
var list = can.core.List(item.img); type = html.IMG, data.src = list[0]
|
||||
if (can.base.contains(data.src, ".jpg")) {
|
||||
data.className = data.className||"jpg"
|
||||
}
|
||||
} else if (item.row) { type = html.TR, item.list = item.row.map(function(text) { return {text: [text, item.sub||html.TD]} })
|
||||
} else if (item.th) { type = html.TR, item.list = item.th.map(function(text) { return {text: [text, html.TH]} })
|
||||
} else if (item.td) { type = html.TR, item.list = item.td.map(function(text) { return can.base.isObject(text)? text: {text: [text||"", html.TD]} }) }
|
||||
// if (type == html.SELECT) { data.title = can.user.trans(can, data.title||name) }
|
||||
if (type == html.INPUT) {
|
||||
if (data.type == html.TEXT || data.type == html.PASSWORD || !data.type) { data.autocomplete = data.autocomplete||"off"
|
||||
data.placeholder = (data.placeholder||name||"").split(nfs.PT).pop(), data.title = can.user.trans(can, data.title||data.placeholder, null, html.INPUT)
|
||||
} else if (data.type == html.BUTTON) {
|
||||
// data.value = can.user.trans(can, data.value)
|
||||
}
|
||||
} if (type == html.TEXTAREA) { data.placeholder = can.user.trans(can, (data.placeholder||name||"").split(nfs.PT).pop(), null, html.INPUT) }
|
||||
can.core.List(["className", "placeholder", "title"], function(key) { data[key] || delete(data[key]) })
|
||||
name && (data.name = name); var node = can.page.Create(can, type, data)
|
||||
value[type] = value[name] = value[can.core.Split(data.className)[0]] = node, value._target = value._target||node, value.first = value.first||node, value.last = node
|
||||
item.list && can.page.Append(can, node, item.list, value), target && target.appendChild && target.appendChild(node), can.base.isFunc(item._init) && item._init(node, value)
|
||||
}); return value
|
||||
},
|
||||
}
|
||||
list[0] && can.page.ClassList.add(can, data, list[0]), type = list[1]||type, data.innerHTML = list[2]||data.innerHTML||"", name = list[3]||name
|
||||
} else if (item.text) { var list = can.core.List(item.text); if (can.base.isArray(list[2])) { list[2] = list[2].join(lex.SP) }
|
||||
data.innerHTML = list[0]||data.innerHTML||"", type = list[1]||item.type||html.SPAN, list[2] && can.page.ClassList.add(can, data, list[2])
|
||||
} else if (item.icon) { var list = can.core.List(item.icon)
|
||||
if (icon[item.icon]) {
|
||||
type = "i", data.className = icon[item.icon]
|
||||
} else if (can.page.unicode[list[0]]) {
|
||||
type = html.SPAN, name = list[0], data.className = "icon "+list[0], data.innerText = can.page.unicode[list[0]]
|
||||
} else {
|
||||
type = "i", data.className = list[0]
|
||||
}
|
||||
} else if (item.button) { var list = can.core.List(item.button); type = html.BUTTON, name = list[0]||name, data.innerText = can.user.trans(can, name)
|
||||
data.onclick = function(event) { can.misc.Event(event, can, function(msg) { can.base.isFunc(list[1]) && list[1](event, name), can.onkeymap.prevent(event) }) }
|
||||
} else if (item.select) { var list = item.select; type = html.SELECT, name = list[0][0], data.className = data.className||list[0][0]
|
||||
data.onchange = function(event) { can.misc.Event(event, can, function(msg) { can.base.isFunc(list[1]) && list[1](event, event.target.value, name) }) }
|
||||
item.list = list[0].slice(1).map(function(value) { return {type: html.OPTION, value: value, inner: can.user.trans(can, value)} })
|
||||
} else if (item.input) { var list = can.core.List(item.input); type = html.INPUT, name = list[0], data.className = data.className||list[0], data.type = data.type||html.TEXT
|
||||
data.onkeydown = function(event) { can.base.isFunc(list[1]) && list[1](event) }
|
||||
data.onkeyup = function(event) { can.base.isFunc(list[2]) && list[2](event) }
|
||||
} else if (item.username) { var list = can.core.List(item.username); type = html.INPUT, name = list[0]||name||html.USERNAME
|
||||
// data.className = list[1]||data.className||name, data.autocomplete = data.autocomplete||html.USERNAME
|
||||
data.className = list[1]||data.className||name
|
||||
} else if (item.password) { var list = can.core.List(item.password); type = html.INPUT, name = list[0]||name||html.PASSWORD
|
||||
// data.className = list[1]||data.className||name, data.type = html.PASSWORD, data.autocomplete = data.autocomplete||"current-password"
|
||||
data.className = list[1]||data.className||name, data.type = html.PASSWORD
|
||||
} else if (item.img) {
|
||||
var list = can.core.List(item.img); type = html.IMG, data.src = list[0]
|
||||
if (can.base.contains(data.src, ".jpg")) {
|
||||
data.className = data.className||"jpg"
|
||||
}
|
||||
} else if (item.row) { type = html.TR, item.list = item.row.map(function(text) { return {text: [text, item.sub||html.TD]} })
|
||||
} else if (item.th) { type = html.TR, item.list = item.th.map(function(text) { return {text: [text, html.TH]} })
|
||||
} else if (item.td) { type = html.TR, item.list = item.td.map(function(text) { return can.base.isObject(text)? text: {text: [text||"", html.TD]} }) }
|
||||
// if (type == html.SELECT) { data.title = can.user.trans(can, data.title||name) }
|
||||
if (type == html.INPUT) {
|
||||
if (data.type == html.TEXT || data.type == html.PASSWORD || !data.type) { data.autocomplete = data.autocomplete||"off"
|
||||
data.placeholder = (data.placeholder||name||"").split(nfs.PT).pop(), data.title = can.user.trans(can, data.title||data.placeholder, null, html.INPUT)
|
||||
} else if (data.type == html.BUTTON) {
|
||||
// data.value = can.user.trans(can, data.value)
|
||||
}
|
||||
} if (type == html.TEXTAREA) { data.placeholder = can.user.trans(can, (data.placeholder||name||"").split(nfs.PT).pop(), null, html.INPUT) }
|
||||
can.core.List(["className", "placeholder", "title"], function(key) { data[key] || delete(data[key]) })
|
||||
name && (data.name = name); var node = can.page.Create(can, type, data)
|
||||
value[type] = value[name] = value[can.core.Split(data.className)[0]] = node, value._target = value._target||node, value.first = value.first||node, value.last = node
|
||||
item.list && can.page.Append(can, node, item.list, value), target && target.appendChild && target.appendChild(node), can.base.isFunc(item._init) && item._init(node, value)
|
||||
}); return value },
|
||||
Appends: function(can, target, key, value) { return target.innerHTML = "", can.page.Append(can, target, key, value) },
|
||||
AppendData: function(can, target, prefix, key, value, cb) { var open = can.page.unicode.opens, close = can.page.unicode.closes
|
||||
function short(value, length) {
|
||||
if (length == undefined) {
|
||||
value.indexOf(lex.NL) > -1 && (value = value.trim().split(lex.NL)[0]+can.page.unicode.inner)
|
||||
return can.page.trans(can, value)
|
||||
} else { if (length > 5) {
|
||||
return can.page.unicode.inner }
|
||||
} else {
|
||||
if (length > 5) {
|
||||
return can.page.unicode.inner
|
||||
}
|
||||
} return value
|
||||
}
|
||||
function show(value, deep) { deep = deep == undefined? 2: 0; switch (typeof value) {
|
||||
case code.OBJECT: if (!value) { return {} }
|
||||
if (value._path) { return {value: "@\""+value._path+"\""} }
|
||||
if (value.tagName) { return {type: nfs.TARGET, value: "$"+value.tagName.toLowerCase()+(value.className? nfs.PT+value.className.replaceAll(lex.SP, nfs.PT):"")} }
|
||||
if (deep < 0) { return {value: value.length == undefined? "{"+can.page.unicode.inner+"}": "["+can.page.unicode.inner+"]"} }
|
||||
if (value.length != undefined) { return {value: (value.length > 3? value.length+lex.SP: "")+"["+can.core.List(value, function(value, index) { if (index < 6) { return short(show(value, deep-1).value, index+1) } }).join(mdb.FS)+"]"} }
|
||||
return {value: "{"+can.core.Item(value, function(key, val, list) { if (value.hasOwnProperty(key) && val && list.length < 7) { return short(key+nfs.DF+show(val, deep-1).value, list.length) } }).join(mdb.FS)+"}"}
|
||||
if (value._path) { return {value: "@\""+value._path+"\""} }
|
||||
if (value.tagName) { return {type: nfs.TARGET, value: "$"+value.tagName.toLowerCase()+(value.className? nfs.PT+value.className.replaceAll(lex.SP, nfs.PT):"")} }
|
||||
if (deep < 0) { return {value: value.length == undefined? "{"+can.page.unicode.inner+"}": "["+can.page.unicode.inner+"]"} }
|
||||
if (value.length != undefined) { return {value: (value.length > 3? value.length+lex.SP: "")+"["+can.core.List(value, function(value, index) { if (index < 6) { return short(show(value, deep-1).value, index+1) } }).join(mdb.FS)+"]"} }
|
||||
return {value: "{"+can.core.Item(value, function(key, val, list) { if (value.hasOwnProperty(key) && val && list.length < 7) { return short(key+nfs.DF+show(val, deep-1).value, list.length) } }).join(mdb.FS)+"}"}
|
||||
case code.STRING: return {open: "s", close: "s", value: "\""+(deep == 2? value.replaceAll("\n", "\\n"): short(value))+"\""}
|
||||
case code.NUMBER: return {open: "n", close: "n", value: value}
|
||||
case code.BOOLEAN: return {open: "b", close: "b", value: value}
|
||||
@ -134,7 +135,7 @@ Volcanos("page", {
|
||||
cb && cb(prefix, value); if (!can.base.isIn(typeof value, code.OBJECT, code.FUNCTION)) { return }
|
||||
ui.icon.innerText = (can.onmotion.toggle(can, ui.list)? _show.open: _show.close)+lex.SP
|
||||
if (typeof value == code.FUNCTION) { return ui.list.innerText = value.toString() }
|
||||
|
||||
|
||||
if (loaded) { return } loaded = true, ui.icon.innerText = _show.open+lex.SP
|
||||
if (value.tagName) { can.page.Append(can, ui.list, [can.page.AppendView(can, value)]), can.onappend.style(can, mdb.VIEW, ui.list)
|
||||
can.core.List(can.core.Item(target, function(key, value) { if (["textContent", "innerHTML", "outerHTML"].indexOf(key) > -1 || typeof value == code.FUNCTION || key.toUpperCase() == key) { return } return key }).sort(), function(key) {
|
||||
@ -145,7 +146,7 @@ Volcanos("page", {
|
||||
} else {
|
||||
can.core.List(can.core.Item(value, function(key, val) { if (
|
||||
(value["preventDefault"] && val && typeof val != code.FUNCTION) || (value["responseText"] && val && typeof val != code.FUNCTION) ||
|
||||
value.hasOwnProperty(key) && val) { return key } }).sort(), function(key) { can.page.AppendData(can, ui.list, can.core.Keys(prefix, key), key, value[key], cb) })
|
||||
value.hasOwnProperty(key) && val) { return key } }).sort(), function(key) { can.page.AppendData(can, ui.list, can.core.Keys(prefix, key), key, value[key], cb) })
|
||||
var key = "__proto__"; value[key] && can.core.Item(value[key]).length > 0 && can.page.AppendData(can, ui.list, can.core.Keys(prefix, key), key, value[key], cb)
|
||||
}
|
||||
}}, {view: [[html.LIST, _show.type||typeof(value), html.HIDE]]}]); return ui
|
||||
@ -188,7 +189,8 @@ Volcanos("page", {
|
||||
{type: "colgroup", list: can.core.List(list, function(key) { if (key[0] != "_") {
|
||||
try { var value = can.Option(key) } catch (e) {}
|
||||
if (value == undefined) { return {view: [key, "col"]} } return {view: [[key, "option"], "col"]}
|
||||
} }) }, {type: html.THEAD}, {type: html.TBODY}]}])
|
||||
} }) }, {type: html.THEAD}, {type: html.TBODY},
|
||||
]}])
|
||||
can.page.Append(can, ui.thead, [{type: html.TR, data: {dataset: {index: -1}}, list: can.core.List(list, function(key) {
|
||||
if (key[0] != "_") { return {type: html.TH, list: [{text: can.user.trans(can, key, null, html.INPUT)}, {icon: "bi bi-sort-down-alt"}, {icon: "bi bi-sort-up"}]} }
|
||||
}) }])
|
||||
@ -234,27 +236,57 @@ Volcanos("page", {
|
||||
case html.A: return `<a href="${arg[1]}" target="_blank">${arg[2]||arg[1]}</a>`
|
||||
case html.IMG: return arg[3]? `<img src="${arg[1]}" height="${arg[2]}" width=${arg[3]}>`: arg[2]? `<img src="${arg[1]}" height="${arg[2]}">`: `<img src="${arg[1]}">`
|
||||
case html.SPAN: arg[2] && typeof arg[2] == code.OBJECT && arg[2].join && (arg[2] = arg[2].join(lex.SP))
|
||||
return arg[2]? `<span class="${arg[2]}">${arg[1]}</span>`: arg[1]
|
||||
return arg[2]? `<span class="${arg[2]}">${arg[1]}</span>`: arg[1]
|
||||
default: /* type inner arg... */
|
||||
var list = ["<"+type]; for (var i = 2; i < arg.length; i += 2) { list.push(lex.SP+arg[i]+mdb.EQ+arg[i+1]) }
|
||||
return list.concat(">", arg[1], "</", type, ">").join("")
|
||||
var list = ["<"+type]; for (var i = 2; i < arg.length; i += 2) { list.push(lex.SP+arg[i]+mdb.EQ+arg[i+1]) }
|
||||
return list.concat(">", arg[1], "</", type, ">").join("")
|
||||
} },
|
||||
ColorList: [
|
||||
"#8085e9",
|
||||
"#95a2ff",
|
||||
"#73abf5",
|
||||
"#3cb9fc",
|
||||
"#0082fc",
|
||||
"#87e885",
|
||||
"#90ed7d",
|
||||
"#22ed7c",
|
||||
"#05f8d6",
|
||||
"#cb9bff",
|
||||
"#bf19ff",
|
||||
"#f47a75",
|
||||
"#fa8080",
|
||||
"#f7a35c",
|
||||
"#ffc076",
|
||||
"#f9e264",
|
||||
"#fae768",
|
||||
"#5f45ff",
|
||||
"#02cdff",
|
||||
"#0090ff",
|
||||
"#854cff",
|
||||
"#09b0d3",
|
||||
"#1d27c9",
|
||||
"#765005",
|
||||
"#314976",
|
||||
"#009db2",
|
||||
"#024b51",
|
||||
"#0780cf",
|
||||
],
|
||||
Color: function(text) { if (typeof text != code.STRING) { return "" } text = text.replace(/\\n/g, "<br>")
|
||||
if (text.indexOf(ice.HTTP) == 0 && text.length > 10) { var ls = text.split(lex.SP); text = "<a href='"+ls[0]+"' target='_blank'>"+decodeURI(ls[0])+"</a>"+ls.slice(1).join(lex.SP) }
|
||||
if (text.indexOf("export ctx_dev=") == 0 && text.length > 10) { return "<div class='story' data-type='spark' data-name='shell'><div>"+"<span>"+text+"</span>"+"</div></div>" }
|
||||
if (text.indexOf("\033\[") == -1) { return text }
|
||||
text = text.replace(/\033\[41m/g, "<span style='background-color:#f00'>")
|
||||
text = text.replace(/\033\[31m/g, "<span style='color:#f00'>")
|
||||
text = text.replace(/\033\[32m/g, "<span style='color:#0f0'>")
|
||||
text = text.replace(/\033\[33m/g, "<span style='color:#ff0'>")
|
||||
text = text.replace(/\033\[34m/g, "<span style='color:#00f'>")
|
||||
text = text.replace(/\033\[36m/g, "<span style='color:#0ff'>")
|
||||
text = text.replace(/\033\[37m/g, "<span style='color:gray'>")
|
||||
text = text.replace(/\033\[34;1m/g, "<span style='color:#00f'>")
|
||||
text = text.replace(/\033\[37;1m/g, "<span style='color:#fff'>")
|
||||
text = text.replace(/\033\[1m/g, "<span style='font-weight:bold'>")
|
||||
text = text.replace(/\033\[0m/g, "</span>")
|
||||
text = text.replace(/\033\[m/g, "</span>")
|
||||
if (text.indexOf("\033\[") == -1) { return text }
|
||||
text = text.replace(/\033\[41m/g, "<span style='background-color:#f00'>")
|
||||
text = text.replace(/\033\[31m/g, "<span style='color:#f00'>")
|
||||
text = text.replace(/\033\[32m/g, "<span style='color:#0f0'>")
|
||||
text = text.replace(/\033\[33m/g, "<span style='color:#ff0'>")
|
||||
text = text.replace(/\033\[34m/g, "<span style='color:#00f'>")
|
||||
text = text.replace(/\033\[36m/g, "<span style='color:#0ff'>")
|
||||
text = text.replace(/\033\[37m/g, "<span style='color:gray'>")
|
||||
text = text.replace(/\033\[34;1m/g, "<span style='color:#00f'>")
|
||||
text = text.replace(/\033\[37;1m/g, "<span style='color:#fff'>")
|
||||
text = text.replace(/\033\[1m/g, "<span style='font-weight:bold'>")
|
||||
text = text.replace(/\033\[0m/g, "</span>")
|
||||
text = text.replace(/\033\[m/g, "</span>")
|
||||
return text
|
||||
},
|
||||
Keys: function() { var list = []; /* FS SP GT PT */ for (var i = 0; i < arguments.length; i++) { var v = arguments[i]; if (typeof v == code.OBJECT) {
|
||||
@ -322,7 +354,7 @@ Volcanos("page", {
|
||||
menu: "☰",
|
||||
opens: "▾", closes: "▸",
|
||||
prev: "❮", next: "❯",
|
||||
|
||||
|
||||
start: "+", // play: "▸",
|
||||
back: "◀", reback: "▶",
|
||||
push: "⇈", pull: "⇊",
|
||||
@ -334,124 +366,124 @@ Volcanos("page", {
|
||||
inputs: function(can, list, type) { 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: ice.LIST})
|
||||
_list.push({type: html.BUTTON, name: ice.BACK})
|
||||
break
|
||||
_list.push({type: html.BUTTON, name: ice.LIST})
|
||||
_list.push({type: html.BUTTON, name: ice.BACK})
|
||||
break
|
||||
case web.FILTER:
|
||||
_list.push({type: html.TEXT, name: web.FILTER, icon: icon.search})
|
||||
break
|
||||
_list.push({type: html.TEXT, name: web.FILTER, icon: icon.search})
|
||||
break
|
||||
case mdb.PAGE:
|
||||
_list.push({type: html.TEXT, name: mdb.OFFEND, value: can._msg.Option(mdb.OFFEND)})
|
||||
_list.push({type: html.TEXT, name: mdb.LIMIT, value: can._msg.Option(mdb.LIMIT), _init: function(target) {
|
||||
can.onappend.figure(can, {action: "key", run: function(event, cmds, cb) {
|
||||
var msg = can.request(event)
|
||||
msg.Push(cmds[1], "10")
|
||||
msg.Push(cmds[1], "30")
|
||||
msg.Push(cmds[1], "50")
|
||||
msg.Push(cmds[1], "100")
|
||||
cb(msg)
|
||||
}}, target, function() { can.Update() })
|
||||
}})
|
||||
_list.push(mdb.NEXT, mdb.PREV)
|
||||
break
|
||||
_list.push({type: html.TEXT, name: mdb.OFFEND, value: can._msg.Option(mdb.OFFEND)})
|
||||
_list.push({type: html.TEXT, name: mdb.LIMIT, value: can._msg.Option(mdb.LIMIT), _init: function(target) {
|
||||
can.onappend.figure(can, {action: "key", run: function(event, cmds, cb) {
|
||||
var msg = can.request(event)
|
||||
msg.Push(cmds[1], "10")
|
||||
msg.Push(cmds[1], "30")
|
||||
msg.Push(cmds[1], "50")
|
||||
msg.Push(cmds[1], "100")
|
||||
cb(msg)
|
||||
}}, target, function() { can.Update() })
|
||||
}})
|
||||
_list.push(mdb.NEXT, mdb.PREV)
|
||||
break
|
||||
default:
|
||||
(function() { var item = can.core.SplitInput(list[i], type||html.BUTTON)
|
||||
if (item.type == html.SELECT) { item._init = function(target) { target.value = item.value||item.values[0], target.onchange = function(event) { can.misc.Event(event, can, function(msg) {
|
||||
can.run(event)
|
||||
}) } } } item.action && (function() { item._init = function(target) {
|
||||
can.onappend.figure(can, item, target, function() { can.Update({}, ) })
|
||||
} })()
|
||||
_list.push(item), type = item.type
|
||||
})()
|
||||
} } return _list },
|
||||
input: function(can, item, value) { var input = {type: html.INPUT, name: item.name, data: item, style: item.style||{}, dataset: {}, _init: item._init}
|
||||
item.value == ice.AUTO && (item.value = "", item.action = ice.AUTO), item.action == ice.AUTO && (input.dataset.action = ice.AUTO)
|
||||
switch (item.type = item.type||html.TEXT) {
|
||||
case html.SELECT: input.type = html.SELECT, item.className||can.page.ClassList.add(can, item, ctx.ARGS)
|
||||
item.values = can.base.isString(item.values)? can.core.Split(item.values): item.values
|
||||
if (!item.values && item.value) { item.values = can.core.Split(item.value), item.value = item.values[0] }
|
||||
if (item.values.slice(1).indexOf(item.values[0]) > -1) { item.value = item.value||item.values[0], item.values = item.values.slice(1) }
|
||||
item.value = value||item.value, input.list = item.values.map(function(value) {
|
||||
return {type: html.OPTION, value: value, inner: can.user.trans(can, value, null, html.VALUE)}
|
||||
}); break
|
||||
case html.TEXTAREA: input.type = html.TEXTAREA // no break
|
||||
case html.USERNAME: // no break
|
||||
case html.PASSWORD: // no break
|
||||
case html.TEXT:
|
||||
case html.FILTER:
|
||||
item.className||can.page.ClassList.add(can, item, ctx.ARGS), item.name = item.name||item.type, item.value = value||item.value||"";
|
||||
item.placeholder = item.placeholder||item.name
|
||||
break
|
||||
case html.UPLOAD: item.type = html.FILE, input.name = html.UPLOAD; break
|
||||
case html.BUTTON: item.value = item.value||item.name||mdb.LIST; break
|
||||
} return input
|
||||
},
|
||||
icons: function(can, name, space) { if (!name) { return }
|
||||
if (can.base.contains(name, ".ico", ".png", ".jpg")) { return {img: can.misc.Resource(can, (name.indexOf(nfs.PS) == -1? nfs.USR_ICONS: "")+name, space)} }
|
||||
// if (can.page.unicode[name]) { return {text: [can.page.unicode[name], "", "icon"]} }
|
||||
if (name == mdb.DELETE) { return {icon: "bi bi-trash"} }
|
||||
if (can.base.beginWith(name, "bi ")) { return {icon: name} }
|
||||
var _icon = can.base.getValid(can.Conf("_icons."+name), can.Conf("_trans.icons."+name), can.core.Value(can.onaction, ["_trans.icons."+name]), icon[name])
|
||||
if (_icon) { return {icon: _icon} }
|
||||
},
|
||||
requireChina: function(can, title, list, name, path) {
|
||||
can.onappend.plugin(can, {title: title, display: "/plugin/story/china.js", style: html.FLOAT, height: can.ConfHeight(), width: can.ConfHeight()}, function(sub) {
|
||||
sub.run = function(event, cmds, cb) { var msg = can.request(event, {title: title, name: name, path: path})
|
||||
can.core.List(list, function(item) { msg.Push(mdb.NAME, item.name), msg.Push(mdb.VALUE, item.value) }), cb(msg)
|
||||
can.onmotion.resize(can, sub._target, function(height, width) { sub.onimport.size(sub, height, width, true) })
|
||||
}
|
||||
})
|
||||
},
|
||||
requireModules: function(can, libs, cb, cbs) { if (!libs || libs.length == 0) { return cb && cb() }
|
||||
for (var i = 0; i < libs.length; i++) { if (libs[i].indexOf(nfs.PS) == 0 || libs[i].indexOf(ice.HTTP) == 0) { continue }
|
||||
if (libs[i].indexOf(nfs._CSS) == -1 && libs[i].indexOf(nfs._JS) == -1) { libs[i] = libs[i]+"/lib/"+libs[i]+nfs._JS }
|
||||
libs[i] = nfs.M+libs[i]
|
||||
} can.require(libs, cb, cbs)
|
||||
},
|
||||
requireDraw: function(can, cb) { can.require([chat.PLUGIN_LOCAL+"wiki/draw.js", chat.PLUGIN_LOCAL+"wiki/draw/path.js"], function() {
|
||||
can.onimport._last_init(can, can.request()), can.onappend.style(can, wiki.DRAW, can._fields), cb()
|
||||
}, function(can, mod, sub) { mod == chat.ONIMPORT && (can[mod]._last_init = sub._init) }) },
|
||||
drawText: function(can, text, size, margin, fonts) { text = text.slice(0, 1), size = size||80, margin = margin == undefined? 10: margin
|
||||
var colors = ["rgb(239,150,26)", 'rgb(255,58,201)', "rgb(111,75,255)", "rgb(36,174,34)", "rgb(80,80,80)"]
|
||||
var canvas = can.page.Create(can, html.CANVAS, {width: size, height: size}), ctx = canvas.getContext("2d")
|
||||
ctx.fillStyle = colors[Math.floor(Math.random()*(colors.length))], ctx.fillRect(margin, margin, size-2*margin, size-2*margin)
|
||||
ctx.fillStyle = cli.WHITE, ctx.font = (fonts||can.base.Min(size/text.length-30, 16))+"px Arial", ctx.textAlign = "center", ctx.textBaseline = "middle", ctx.fillText(text, size/2, size/2)
|
||||
return canvas.toDataURL(html.IMAGE_PNG, 1)
|
||||
},
|
||||
position: function(event, target) { var p = target.getBoundingClientRect(); return {x: event.clientX - p.x, y: event.clientY - p.y} },
|
||||
getquery: function(can, target) {
|
||||
var list = []; for (var p = target; p; p = p.parentNode) {
|
||||
if (can.page.tagis(p, "body")) { list.pop(); break }
|
||||
list.push(can.core.Keys(p.tagName.toLowerCase(), can.core.List(p.classList).join(".")), ">")
|
||||
if (can.page.tagis(p, html.FIELDSET)) {
|
||||
if (can.page.tagis(p, "fieldset.web.chat.tutor")) { return "" }
|
||||
list.pop(); break
|
||||
}
|
||||
(function() { var item = can.core.SplitInput(list[i], type||html.BUTTON)
|
||||
if (item.type == html.SELECT) { item._init = function(target) { target.value = item.value||item.values[0], target.onchange = function(event) { can.misc.Event(event, can, function(msg) {
|
||||
can.run(event)
|
||||
}) } } } item.action && (function() { item._init = function(target) {
|
||||
can.onappend.figure(can, item, target, function() { can.Update({}, ) })
|
||||
} })()
|
||||
_list.push(item), type = item.type
|
||||
})()
|
||||
} } return _list },
|
||||
input: function(can, item, value) { var input = {type: html.INPUT, name: item.name, data: item, style: item.style||{}, dataset: {}, _init: item._init}
|
||||
item.value == ice.AUTO && (item.value = "", item.action = ice.AUTO), item.action == ice.AUTO && (input.dataset.action = ice.AUTO)
|
||||
switch (item.type = item.type||html.TEXT) {
|
||||
case html.SELECT: input.type = html.SELECT, item.className||can.page.ClassList.add(can, item, ctx.ARGS)
|
||||
item.values = can.base.isString(item.values)? can.core.Split(item.values): item.values
|
||||
if (!item.values && item.value) { item.values = can.core.Split(item.value), item.value = item.values[0] }
|
||||
if (item.values.slice(1).indexOf(item.values[0]) > -1) { item.value = item.value||item.values[0], item.values = item.values.slice(1) }
|
||||
item.value = value||item.value, input.list = item.values.map(function(value) {
|
||||
return {type: html.OPTION, value: value, inner: can.user.trans(can, value, null, html.VALUE)}
|
||||
}); break
|
||||
case html.TEXTAREA: input.type = html.TEXTAREA // no break
|
||||
case html.USERNAME: // no break
|
||||
case html.PASSWORD: // no break
|
||||
case html.TEXT:
|
||||
case html.FILTER:
|
||||
item.className||can.page.ClassList.add(can, item, ctx.ARGS), item.name = item.name||item.type, item.value = value||item.value||"";
|
||||
item.placeholder = item.placeholder||item.name
|
||||
break
|
||||
case html.UPLOAD: item.type = html.FILE, input.name = html.UPLOAD; break
|
||||
case html.BUTTON: item.value = item.value||item.name||mdb.LIST; break
|
||||
} return input
|
||||
},
|
||||
icons: function(can, name, space) { if (!name) { return }
|
||||
if (can.base.contains(name, ".ico", ".png", ".jpg")) { return {img: can.misc.Resource(can, (name.indexOf(nfs.PS) == -1? nfs.USR_ICONS: "")+name, space)} }
|
||||
// if (can.page.unicode[name]) { return {text: [can.page.unicode[name], "", "icon"]} }
|
||||
if (name == mdb.DELETE) { return {icon: "bi bi-trash"} }
|
||||
if (can.base.beginWith(name, "bi ")) { return {icon: name} }
|
||||
var _icon = can.base.getValid(can.Conf("_icons."+name), can.Conf("_trans.icons."+name), can.core.Value(can.onaction, ["_trans.icons."+name]), icon[name])
|
||||
if (_icon) { return {icon: _icon} }
|
||||
},
|
||||
requireChina: function(can, title, list, name, path) {
|
||||
can.onappend.plugin(can, {title: title, display: "/plugin/story/china.js", style: html.FLOAT, height: can.ConfHeight(), width: can.ConfHeight()}, function(sub) {
|
||||
sub.run = function(event, cmds, cb) { var msg = can.request(event, {title: title, name: name, path: path})
|
||||
can.core.List(list, function(item) { msg.Push(mdb.NAME, item.name), msg.Push(mdb.VALUE, item.value) }), cb(msg)
|
||||
can.onmotion.resize(can, sub._target, function(height, width) { sub.onimport.size(sub, height, width, true) })
|
||||
}
|
||||
return list.reverse().join("")
|
||||
},
|
||||
theme: function(cb) { var themeMedia = window.matchMedia("(prefers-color-scheme: dark)")
|
||||
cb && themeMedia.addListener(function(event) { cb(event.matches? html.DARK: html.LIGHT) })
|
||||
cb && cb(themeMedia.matches? html.DARK: html.LIGHT)
|
||||
return themeMedia.matches? html.DARK: html.LIGHT
|
||||
},
|
||||
parseAction: function(can, value) { var action = []
|
||||
can.page.Select(can, can.page.Create(can, html.DIV, value.action), html.INPUT, function(target) {
|
||||
action.push(target.name), target.name != target.value && can.user.trans(can, kit.Dict(target.name, target.value))
|
||||
})
|
||||
return action
|
||||
},
|
||||
buttonStyle: function(can, name) {
|
||||
return can.core.Value(can.onaction, ["_trans", "style", name])||(can.base.isIn(name, mdb.CREATE, mdb.INSERT, mdb.IMPORT, nfs.CLONE, cli.START, ctx.RUN, web.UPLOAD, web.CONFIRM, aaa.LOGIN, code.AUTOGEN, "sso", "add", "pull", "push", "commit", "preview", "auto-preview", ice.APP)? html.NOTICE:
|
||||
can.base.isIn(name, mdb.REMOVE, mdb.DELETE, mdb.PRUNES, mdb.PRUNE, nfs.TRASH, cli.RESTART, cli.STOP, cli.CLOSE, cli.REBOOT, web.CANCEL, code.UPGRADE, "del", "drop", "access", "kill", "prockill")? html.DANGER: "")
|
||||
},
|
||||
exportValue: function(can, msg, target) { target = target||can._output
|
||||
msg.OptionDefault(ice.MSG_THEME, can.getHeaderTheme())
|
||||
msg.OptionDefault(ice.MSG_BG, can.page.styleValue(can, "--plugin-bg-color", target))
|
||||
msg.OptionDefault(ice.MSG_FG, can.page.styleValue(can, "--plugin-fg-color", target))
|
||||
can.user.info.language && msg.OptionDefault(ice.MSG_LANGUAGE, can.user.info.language)
|
||||
return msg
|
||||
},
|
||||
styleValue: function(can, key, target) { const styles = getComputedStyle(target||document.body); return styles.getPropertyValue(key) },
|
||||
styleValueInt: function(can, key, target) { return parseInt(can.base.trimSuffix(can.page.styleValue(can, key, target), "px")) }
|
||||
})
|
||||
},
|
||||
requireModules: function(can, libs, cb, cbs) { if (!libs || libs.length == 0) { return cb && cb() }
|
||||
for (var i = 0; i < libs.length; i++) { if (libs[i].indexOf(nfs.PS) == 0 || libs[i].indexOf(ice.HTTP) == 0) { continue }
|
||||
if (libs[i].indexOf(nfs._CSS) == -1 && libs[i].indexOf(nfs._JS) == -1) { libs[i] = libs[i]+"/lib/"+libs[i]+nfs._JS }
|
||||
libs[i] = nfs.M+libs[i]
|
||||
} can.require(libs, cb, cbs)
|
||||
},
|
||||
requireDraw: function(can, cb) { can.require([chat.PLUGIN_LOCAL+"wiki/draw.js", chat.PLUGIN_LOCAL+"wiki/draw/path.js"], function() {
|
||||
can.onimport._last_init(can, can.request()), can.onappend.style(can, wiki.DRAW, can._fields), cb()
|
||||
}, function(can, mod, sub) { mod == chat.ONIMPORT && (can[mod]._last_init = sub._init) }) },
|
||||
drawText: function(can, text, size, margin, fonts) { text = text.slice(0, 1), size = size||80, margin = margin == undefined? 10: margin
|
||||
var colors = ["rgb(239,150,26)", 'rgb(255,58,201)', "rgb(111,75,255)", "rgb(36,174,34)", "rgb(80,80,80)"]
|
||||
var canvas = can.page.Create(can, html.CANVAS, {width: size, height: size}), ctx = canvas.getContext("2d")
|
||||
ctx.fillStyle = colors[Math.floor(Math.random()*(colors.length))], ctx.fillRect(margin, margin, size-2*margin, size-2*margin)
|
||||
ctx.fillStyle = cli.WHITE, ctx.font = (fonts||can.base.Min(size/text.length-30, 16))+"px Arial", ctx.textAlign = "center", ctx.textBaseline = "middle", ctx.fillText(text, size/2, size/2)
|
||||
return canvas.toDataURL(html.IMAGE_PNG, 1)
|
||||
},
|
||||
position: function(event, target) { var p = target.getBoundingClientRect(); return {x: event.clientX - p.x, y: event.clientY - p.y} },
|
||||
getquery: function(can, target) {
|
||||
var list = []; for (var p = target; p; p = p.parentNode) {
|
||||
if (can.page.tagis(p, "body")) { list.pop(); break }
|
||||
list.push(can.core.Keys(p.tagName.toLowerCase(), can.core.List(p.classList).join(".")), ">")
|
||||
if (can.page.tagis(p, html.FIELDSET)) {
|
||||
if (can.page.tagis(p, "fieldset.web.chat.tutor")) { return "" }
|
||||
list.pop(); break
|
||||
}
|
||||
}
|
||||
return list.reverse().join("")
|
||||
},
|
||||
theme: function(cb) { var themeMedia = window.matchMedia("(prefers-color-scheme: dark)")
|
||||
cb && themeMedia.addListener(function(event) { cb(event.matches? html.DARK: html.LIGHT) })
|
||||
cb && cb(themeMedia.matches? html.DARK: html.LIGHT)
|
||||
return themeMedia.matches? html.DARK: html.LIGHT
|
||||
},
|
||||
parseAction: function(can, value) { var action = []
|
||||
can.page.Select(can, can.page.Create(can, html.DIV, value.action), html.INPUT, function(target) {
|
||||
action.push(target.name), target.name != target.value && can.user.trans(can, kit.Dict(target.name, target.value))
|
||||
})
|
||||
return action
|
||||
},
|
||||
buttonStyle: function(can, name) {
|
||||
return can.core.Value(can.onaction, ["_trans", "style", name])||(can.base.isIn(name, mdb.CREATE, mdb.INSERT, mdb.IMPORT, nfs.CLONE, cli.START, ctx.RUN, web.UPLOAD, web.CONFIRM, aaa.LOGIN, code.AUTOGEN, "sso", "add", "pull", "push", "commit", "preview", "auto-preview", ice.APP)? html.NOTICE:
|
||||
can.base.isIn(name, mdb.REMOVE, mdb.DELETE, mdb.PRUNES, mdb.PRUNE, nfs.TRASH, cli.RESTART, cli.STOP, cli.CLOSE, cli.REBOOT, web.CANCEL, code.UPGRADE, "del", "drop", "access", "kill", "prockill")? html.DANGER: "")
|
||||
},
|
||||
exportValue: function(can, msg, target) { target = target||can._output
|
||||
msg.OptionDefault(ice.MSG_THEME, can.getHeaderTheme())
|
||||
msg.OptionDefault(ice.MSG_BG, can.page.styleValue(can, "--plugin-bg-color", target))
|
||||
msg.OptionDefault(ice.MSG_FG, can.page.styleValue(can, "--plugin-fg-color", target))
|
||||
can.user.info.language && msg.OptionDefault(ice.MSG_LANGUAGE, can.user.info.language)
|
||||
return msg
|
||||
},
|
||||
styleValue: function(can, key, target) { const styles = getComputedStyle(target||document.body); return styles.getPropertyValue(key) },
|
||||
styleValueInt: function(can, key, target) { return parseInt(can.base.trimSuffix(can.page.styleValue(can, key, target), "px")) }
|
||||
})
|
||||
|
17
lib/user.js
17
lib/user.js
@ -71,8 +71,8 @@ Volcanos("user", {
|
||||
if (can.base.isFunc(text)) { text = text.name||"" } if (list && can.base.isString(list)) { return list }
|
||||
var key = can.core.Keys(zone, text)
|
||||
return can.core.Value(list, key) || can.core.Value(can._trans, key) ||
|
||||
can.Conf(["trans", key]) || can.Conf(["feature._trans", key]) ||
|
||||
can.core.Value(can.user._trans, key) || text
|
||||
can.Conf(["trans", key]) || can.Conf(["feature._trans", key]) ||
|
||||
can.core.Value(can.user._trans, key) || text
|
||||
}, _trans: {"_week_header": ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]},
|
||||
time: function(can, time, fmt) {
|
||||
var now = can.base.Date(time), list = can.user._trans["_week_header"]
|
||||
@ -109,7 +109,7 @@ Volcanos("user", {
|
||||
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) {
|
||||
event && event.isTrusted && can.onengine.signal(can, "onevent", can.request(event, {_type: "close"}))
|
||||
action.timer.stop = true, can.page.Remove(can, ui._target) },
|
||||
action.timer.stop = true, can.page.Remove(can, ui._target) },
|
||||
cancel: function(event) { action.timer.stop = true, can.page.Remove(can, ui._target) },
|
||||
timer: can.core.Timer({interval: 100, length: (meta.duration||1000)/100}, function(event, interval, index) {
|
||||
if (index > 30) { ui.duration.innerHTML = index/10+(index%10==0?".0":"")+"s..." }
|
||||
@ -155,14 +155,13 @@ Volcanos("user", {
|
||||
var _events = event._events||event
|
||||
function click(event, button, index) { can.misc.Event(event, can, function() { can.request(event, {action: button}), can.onkeymap.prevent(event), event._events = _events;
|
||||
can.onengine.signal(can, "onevent", can.request(event, {_type: html.ACTION}));
|
||||
(can.base.isFunc(cb)? cb(event, button, meta, carte, index):
|
||||
meta[button]? can.core.CallFunc([meta, button], {event: event, can: can, msg: msg, button: button}):
|
||||
can.Update(event, [ctx.ACTION, button])) || can.onmotion.clearCarte(can)
|
||||
(can.base.isFunc(cb)? cb(event, button, meta, carte, index): meta[button]? can.core.CallFunc([meta, button], {event: event, can: can, msg: msg, button: button}): can.Update(event, [ctx.ACTION, button])) || can.onmotion.clearCarte(can)
|
||||
}) }
|
||||
var isinput = can.page.tagis(event.target, html.INPUT)
|
||||
var ui = can.page.Append(can, document.body, [{view: [[chat.CARTE,
|
||||
can.Conf(ctx.INDEX)||can.ConfIndex(), msg.Option(ctx.ACTION), meta._style||msg.Option("_style"),
|
||||
chat.FLOAT]], list: can.core.List(list, function(item, index) {
|
||||
chat.FLOAT,
|
||||
]], list: can.core.List(list, function(item, index) {
|
||||
if (typeof item == code.FUNCTION) { item = item(can); if (!item) { return } }
|
||||
if (item === "") { return {type: html.HR} }
|
||||
if (item == web.FILTER) { return {
|
||||
@ -202,7 +201,7 @@ Volcanos("user", {
|
||||
carteItem: function(event, can, item) { if (!item.action) { return }
|
||||
var trans = {}, list = can.page.Select(can, can.page.Create(can, html.DIV, item.action), "", function(target) { trans[target.name] = can.user.trans(can, target.value); return target.name })
|
||||
can.user.carteRight(event, can, {_trans: trans}, list, function(_event, button) {
|
||||
can.Update(can.request(_event, event._msg, item), [ctx.ACTION, button]) })
|
||||
can.Update(can.request(_event, event._msg, item), [ctx.ACTION, button]) })
|
||||
},
|
||||
input: function(event, can, form, cb, button) { if (!form || form.length == 0) { return cb() }
|
||||
event = event||{}; var msg = can.request(event); event = event._event||event; var need = {}
|
||||
@ -230,7 +229,7 @@ Volcanos("user", {
|
||||
focus: function() { can.onmotion.focus(can, can.page.Select(can, ui._target, html.INPUT_ARGS)[0]) },
|
||||
cancel: function(event) {
|
||||
can.onengine.signal(can, "onremove", can.request(event, {query: can.page.getquery(can, ui._target)}))
|
||||
can.page.Remove(can, ui._target) },
|
||||
can.page.Remove(can, ui._target) },
|
||||
submit: function(event, can, button) { var args = [], data = {}, err = false
|
||||
var list = can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) {
|
||||
if (item.value == "" && need[item.name] == "must") { err = true, item.focus(), can.user.toast(can, item.name+" 是必选字段, 请重新输入") }
|
||||
|
@ -1,5 +1,6 @@
|
||||
(function() { const ALL = "all", TABS = "tabs", TABVIEW = "tabview", VERTICAL = "vertical", HORIZON = "horizon", GRID = "grid", FREE = "free", FLOW = "flow", PAGE = "page", CAN_LAYOUT = "can.layout"
|
||||
Volcanos(chat.ONIMPORT, {_init: function(can, msg) { var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM), list = can.db.list
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) { var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM), list = can.db.list
|
||||
var _select; can.onmotion.clear(can), can.onaction.layout(can, list[3])
|
||||
can.core.Next(msg.Table(), function(item, next, index) { item.type = chat.PLUGIN, item.mode = can.Mode(); if (item.deleted == ice.TRUE) { return next() }
|
||||
if (msg.Length() == 1) { item.height = can.ConfHeight()-can.Conf(html.MARGIN_Y), can.base.isIn(item.index, web.CHAT_MACOS_DESKTOP, web.CHAT_MESSAGE, web.WIKI_PORTAL) && (item.style = html.OUTPUT) }
|
||||
@ -37,7 +38,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { var river = can.Conf(chat.R
|
||||
can.onmotion.hidden(can, can._header_tabs = can.page.Append(can, target, ["_tabs"])._target)
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONACTION, {_init: function(can, target) { can.db.list = can.misc.SearchHash(can)
|
||||
Volcanos(chat.ONACTION, {
|
||||
_init: function(can, target) { can.db.list = can.misc.SearchHash(can)
|
||||
can.db.list.length == 0 && can.misc.Search(can, chat.RIVER) && can.misc.Search(can, chat.STORM) && (can.db.list = [can.misc.Search(can, chat.RIVER), can.misc.Search(can, chat.STORM)])
|
||||
can.Conf(html.MARGIN_X, 2*html.PLUGIN_PADDING+2*html.PLUGIN_MARGIN), can.Conf(html.MARGIN_Y, 2*html.PLUGIN_PADDING+2*html.PLUGIN_MARGIN+html.ACTION_HEIGHT)
|
||||
can.core.List(["ontouchstart", "ontouchmove", "ontouchend"], function(item) {
|
||||
@ -90,7 +92,7 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { can.db.list = can.misc.S
|
||||
// if (can._current && !event.metaKey) { var sub = can._current.sub; sub && can.core.CallFunc([sub, "onaction.onkeydown"], {event: event, can: sub}); return }
|
||||
can.onkeymap.selectCtrlN(event, can, can._action, html.DIV_TABS) || can.onkeymap._parse(event, can, mode)
|
||||
},
|
||||
|
||||
|
||||
ontouchstart: function(event, can) { can.touch = can.touch || {}, can.touch.isStart = true, can.touch.startX = event.touches[0].clientX },
|
||||
ontouchmove: function(event, can) { can.touch.isMove = true, can.touch.distanceX = event.touches[0].clientX - can.touch.startX },
|
||||
ontouchend: function(event, can) {
|
||||
@ -98,7 +100,7 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { can.db.list = can.misc.S
|
||||
if (can.touch.distanceX > 0) { can.onengine.signal(can, "onslideright") } else { can.onengine.signal(can, "onslideleft") }
|
||||
} can.touch.isMove = false, can.touch.distanceX = 0, can.touch.isStart = false, can.touch.startX = 0
|
||||
},
|
||||
|
||||
|
||||
store: function(can) { can.user.opens(can.misc.MergePodCmd(can, {cmd: web.STORE})) },
|
||||
dream: function(can) { can.user.opens(can.misc.MergePodCmd(can, {cmd: web.DREAM})) },
|
||||
portal: function(can) { can.user.opens(can.misc.MergePodCmd(can, {cmd: web.PORTAL})) },
|
||||
@ -118,7 +120,7 @@ Volcanos(chat.ONLAYOUT, {
|
||||
tabs: function(can, height, width) { can.ConfHeight(height+html.ACTION_HEIGHT), can.ConfWidth(width) },
|
||||
tabview: function(can, height, width) { can.ConfHeight(height+html.ACTION_HEIGHT), can.ConfWidth(width), can.onmotion.toggle(can, can._header_tabs, true)
|
||||
can.page.SelectOne(can, can._header_tabs, html.DIV_ITEM_SELECT)
|
||||
// || can.page.Select(can, can._header_tabs, html.DIV_ITEM, function(target, index) { index == 0 && target.click() })
|
||||
// || can.page.Select(can, can._header_tabs, html.DIV_ITEM, function(target, index) { index == 0 && target.click() })
|
||||
},
|
||||
horizon: function(can, height, width) { can.ConfHeight(height), can.ConfWidth(width/2) },
|
||||
vertical: function(can, height, width) { can.ConfHeight(height/2), can.ConfWidth(width) },
|
||||
@ -134,7 +136,7 @@ Volcanos(chat.ONLAYOUT, {
|
||||
return sub.onimport.size(sub, can.ConfHeight()-(can.user.isMobile? 2*html.PLUGIN_PADDING: can.Conf(html.MARGIN_Y)-([ALL, TABS].indexOf(can.onexport.layout(can)) > -1? html.ACTION_HEIGHT: 0)), can.ConfWidth()-can.Conf(html.MARGIN_X), can.onexport.isauto(can))
|
||||
}
|
||||
sub.onimport.size(sub, can.ConfHeight()-can.Conf(html.MARGIN_Y)-(can._plugins.length == 1 || button && button != ALL || sub.isCmdMode()? 0: html.ACTION_MARGIN),
|
||||
can.ConfWidth()-can.Conf(html.MARGIN_X), can._plugins.length > 1 && can.onexport.isauto(can)) && can.page.style(can, sub._output, html.HEIGHT, "", html.MAX_HEIGHT, "")
|
||||
can.ConfWidth()-can.Conf(html.MARGIN_X), can._plugins.length > 1 && can.onexport.isauto(can)) && can.page.style(can, sub._output, html.HEIGHT, "", html.MAX_HEIGHT, "")
|
||||
}) },
|
||||
_storage: function(can, value) { return can.user.isMobile? "all": (can.misc.sessionStorage(can, can.core.Keys(CAN_LAYOUT, location.pathname), value)||[])[0] },
|
||||
})
|
||||
@ -157,26 +159,28 @@ Volcanos(chat.ONEXPORT, {
|
||||
msg.Push(kit.Dict(ice.CTX, ice.CAN, ice.CMD, ctx.COMMAND, mdb.TYPE, ice.CAN, mdb.NAME, name||command.name, mdb.TEXT, command.help, ctx.CONTEXT, ice.CAN, ctx.COMMAND, name, ctx.INDEX, can.core.Keys(ice.CAN, name)), fields)
|
||||
}) }
|
||||
})
|
||||
Volcanos(chat.ONENGINE, {_engine: function(event, sup, msg, can, cmds, cb) {
|
||||
var storm = can.core.Value(can._root, can.core.Keys(chat.RIVER, cmds[0], chat.STORM, cmds[1])); if (!storm || cmds.length != 2) { return false }
|
||||
if (storm.index) {
|
||||
can.runAction(event, ctx.COMMAND, [].concat(can.core.List(storm.index, function(item) {
|
||||
if (typeof item == code.FUNCTION) { item = item(can) } if (item) { return item.index||item }
|
||||
})), function(msg) {
|
||||
can.core.List(storm.index, function(item) { if (!item || typeof item == code.FUNCTION) { return }
|
||||
msg.Push(ctx.ARGS, JSON.stringify(item.args||[]))
|
||||
msg.Push(ctx.STYLE, item.style||"").Push(ctx.DISPLAY, item.display||"")
|
||||
msg.Push(web.SPACE, item.space||"").Push("_ismain", ice.TRUE)
|
||||
}), cb(msg)
|
||||
})
|
||||
} else { can.core.List(storm.list, function(item) { can.base.isString(item) && (item = {index: item})
|
||||
msg.Push(ctx.INDEX, item.index||"").Push(mdb.ICONS, item.icons||"")
|
||||
msg.Push(mdb.NAME, item.name||"").Push(mdb.HELP, item.help||"")
|
||||
msg.Push(ctx.INPUTS, JSON.stringify(item.inputs)).Push(ctx.FEATURE, JSON.stringify(item.feature))
|
||||
msg.Push(ctx.ARGS, item.args||"[]").Push(ctx.STYLE, item.style||"").Push(ctx.DISPLAY, item.display||"")
|
||||
msg.Push(web.SPACE, item.space||"").Push("_ismain", ice.TRUE)
|
||||
}), can.base.isFunc(cb) && cb(msg) } return true
|
||||
}})
|
||||
Volcanos(chat.ONENGINE, {
|
||||
_engine: function(event, sup, msg, can, cmds, cb) {
|
||||
var storm = can.core.Value(can._root, can.core.Keys(chat.RIVER, cmds[0], chat.STORM, cmds[1])); if (!storm || cmds.length != 2) { return false }
|
||||
if (storm.index) {
|
||||
can.runAction(event, ctx.COMMAND, [].concat(can.core.List(storm.index, function(item) {
|
||||
if (typeof item == code.FUNCTION) { item = item(can) } if (item) { return item.index||item }
|
||||
})), function(msg) {
|
||||
can.core.List(storm.index, function(item) { if (!item || typeof item == code.FUNCTION) { return }
|
||||
msg.Push(ctx.ARGS, JSON.stringify(item.args||[]))
|
||||
msg.Push(ctx.STYLE, item.style||"").Push(ctx.DISPLAY, item.display||"")
|
||||
msg.Push(web.SPACE, item.space||"").Push("_ismain", ice.TRUE)
|
||||
}), cb(msg)
|
||||
})
|
||||
} else { can.core.List(storm.list, function(item) { can.base.isString(item) && (item = {index: item})
|
||||
msg.Push(ctx.INDEX, item.index||"").Push(mdb.ICONS, item.icons||"")
|
||||
msg.Push(mdb.NAME, item.name||"").Push(mdb.HELP, item.help||"")
|
||||
msg.Push(ctx.INPUTS, JSON.stringify(item.inputs)).Push(ctx.FEATURE, JSON.stringify(item.feature))
|
||||
msg.Push(ctx.ARGS, item.args||"[]").Push(ctx.STYLE, item.style||"").Push(ctx.DISPLAY, item.display||"")
|
||||
msg.Push(web.SPACE, item.space||"").Push("_ismain", ice.TRUE)
|
||||
}), can.base.isFunc(cb) && cb(msg) } return true
|
||||
},
|
||||
})
|
||||
Volcanos(chat.ONKEYMAP, {
|
||||
_mode: {
|
||||
plugin: {
|
||||
|
@ -1,11 +1,12 @@
|
||||
(function() { var NTIP = "ntip", NLOG = "nlog", NCMD = "ncmd", NKEY = "nkey"
|
||||
Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can._wss = can.ondaemon._init(can)
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg, target) { can._wss = can.ondaemon._init(can)
|
||||
can.Conf(cli.BEGIN, can.base.Time(null, "%H:%M:%S"))
|
||||
if (!can.user.isMobile && !can.misc.isDebug(can)) { can.onmotion.hidden(can); return }
|
||||
can.Conf(nfs.VERSION, can.base.trimPrefix(window._version, "?_v=").split("&")[0])
|
||||
can.ConfHeight(can.page.height()), can.ConfWidth(can.page.width())
|
||||
can.Conf(NKEY, can.core.Item(can.misc.localStorage(can)).length)
|
||||
|
||||
|
||||
can.onimport._title(can, msg, target)
|
||||
can.onimport._storm(can, msg, target)
|
||||
can.core.List([
|
||||
@ -29,9 +30,10 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can._wss = can.onda
|
||||
_command: function(can, msg, target) { can.onappend.input(can, {type: html.TEXT, _className: "args trans", icon: icon.TERMINAL, name: ice.CMD, onkeydown: function(event) { can.onkeymap.input(event, can)
|
||||
function close() { can.ui.cli && can.ui.cli.onaction.close() } if (event.key == code.ESCAPE) { return close() } if (event.key != code.ENTER) { return } close()
|
||||
switch (event.target.value) {
|
||||
case web.CLEAR:
|
||||
case cli.CLOSE: break
|
||||
default: var list = can.core.Split(event.target.value, lex.SP)
|
||||
case web.CLEAR:
|
||||
case cli.CLOSE: break
|
||||
default:
|
||||
var list = can.core.Split(event.target.value, lex.SP)
|
||||
can.onexport._float(can, "cli", {index: "can.console", display: "/plugin/local/code/xterm.js"}, list, function(sub) { can.getActionSize(function(left) { can.page.style(can, sub._target, html.LEFT, left+html.PLUGIN_MARGIN, html.RIGHT, "") }) })
|
||||
}
|
||||
}}, "", target, [chat.TITLE]) },
|
||||
@ -70,7 +72,7 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
|
||||
onrecord: function(can, msg) { var zone = can.misc.sessionStorage(can, "web.chat.script:zone"); zone && can.runAction(can.request(), nfs.SCRIPT, [zone].concat(msg.cmds[0])) },
|
||||
onaction_cmd: function(can) { can.onappend.style(can, html.HIDE) },
|
||||
onstorm_select: function(event, can, river, storm) { event.isTrusted != undefined && can.onimport._data(can, chat.TUTOR, {time: can.base.Time(), type: chat.STORM, text: [river, storm].join(",")}) },
|
||||
|
||||
|
||||
ontheme: function(event, can, theme) { can.onimport.tutor(event, can, chat.THEME, theme) },
|
||||
onevent: function(event, can, query) { var msg = can.request(event)
|
||||
can.onimport.tutor(event, can, msg.Option("_type")||event.type, query||can.page.getquery(can, event.currentTarget||event.target))
|
||||
@ -78,7 +80,7 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
|
||||
onindex: function(event, can, index) { can.onimport.tutor(event, can, ctx.INDEX, index) },
|
||||
onproject: function(event, can, query) { can.onimport.tutor(event, can, html.ITEM, query) },
|
||||
onremove: function(event, can, query) { can.onimport.tutor(event, can, mdb.REMOVE, query) },
|
||||
|
||||
|
||||
oncommand_focus: function(can) { can.page.Select(can, can._output, ["div.cmd", html.INPUT], function(target) { can.onmotion.focus(can, target) }) },
|
||||
onlayout: function(can, layout, before) { if (can.user.isMobile) { return }
|
||||
can.page.ClassList.del(can, can._target, before), can.page.ClassList.add(can, can._target, layout)
|
||||
@ -158,7 +160,7 @@ Volcanos(chat.ONPLUGIN, {
|
||||
}),
|
||||
data: shy("网页数据", [mdb.KEY], function(can, msg, arg, cb) { var can = msg._can, root = can.Conf("_target")||can._root
|
||||
arg[0]? can.page.AppendData(can, can._output, arg[0], arg[0].split(nfs.PT).pop(), can.core.Value(root, arg[0]), function(prefix, value) { can.Option(mdb.KEY, prefix) })._target.click():
|
||||
can.page.AppendData(can, can._output, "", root._name, root, function(prefix, value) { can.Option(mdb.KEY, prefix) })._target.click()
|
||||
can.page.AppendData(can, can._output, "", root._name, root, function(prefix, value) { can.Option(mdb.KEY, prefix) })._target.click()
|
||||
can.onappend.style(can, "view")
|
||||
}),
|
||||
console: shy("网页终端", {
|
||||
@ -193,4 +195,5 @@ Volcanos(chat.ONPLUGIN, {
|
||||
daemon: can.misc.sessionStorage(can, "can.daemon"),
|
||||
})).Display("/plugin/story/json.js")
|
||||
}),
|
||||
}) })()
|
||||
})
|
||||
})()
|
||||
|
@ -1,11 +1,13 @@
|
||||
Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg, target) {
|
||||
can.onimport._title(can, msg, target), can.onimport._state(can, msg, target), can.onimport._search(can, msg, target)
|
||||
can.onimport._avatar(can, msg, target), can.onimport._background(can, msg, target)
|
||||
},
|
||||
_title: function(can, msg, target) { can.core.List(can.base.getValid(can.Conf(chat.TITLE)||msg.result, [
|
||||
decodeURIComponent(can.misc.Search(can, ice.POD)||location.host)]), function(item) {
|
||||
can.page.Append(can, target, [{view: [[html.ITEM, chat.TITLE, html.FLEX]], list: [{img: can.misc.ResourceFavicon(can)}, {text: item}], title: "返回主页", onclick: function(event) { can.onaction.title(event, can) }}])
|
||||
}) },
|
||||
_title: function(can, msg, target) {
|
||||
can.core.List(can.base.getValid(can.Conf(chat.TITLE)||msg.result, [decodeURIComponent(can.misc.Search(can, ice.POD)||location.host),]), function(item) {
|
||||
can.page.Append(can, target, [{view: [[html.ITEM, chat.TITLE, html.FLEX]], list: [{img: can.misc.ResourceFavicon(can)}, {text: item}], title: "返回主页", onclick: function(event) { can.onaction.title(event, can) }}])
|
||||
})
|
||||
},
|
||||
_state: function(can, msg, target) { can.core.List(can.base.Obj(can.Conf(chat.STATE)||msg.Option(chat.STATE), [cli.QRCODE, chat.THEME, aaa.LANGUAGE, aaa.USERNICK, aaa.AVATAR, mdb.TIME]).reverse(), function(item) {
|
||||
if (can.user.isMobile && can.base.isIn(item, cli.QRCODE, chat.THEME, aaa.LANGUAGE, mdb.TIME)) { return }
|
||||
can.page.Append(can, target, [{view: [[html.ITEM, chat.STATE, item], "", can.Conf(item)||msg.Option(item)||""], onclick: function(event) {
|
||||
@ -62,9 +64,9 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) {
|
||||
menu: function(can, cmds, cb, trans) { can.base.isString(cmds) && (cmds = [cmds])
|
||||
return can.page.Append(can, can._output, [{view: cmds[0], list: can.core.List(can.base.getValid(cmds.slice(1), [cmds[0]]), function(item) {
|
||||
return can.base.isString(item)? /* 1.string */ {view: [[html.ITEM, html.MENU, item], "", can.user.trans(can, item, trans)], onclick: function(event) { can.base.isFunc(cb) && cb(event, item, [item]) }}:
|
||||
can.base.isArray(item)? /* 2.array */ {view: [[html.ITEM, html.MENU, item[0]]], list: [{text: can.user.trans(can, item[0], trans)}, {icon: icon.CHEVRON_DOWN}], onclick: function(event) { can.onkeymap.prevent(event)
|
||||
can.onaction.carte(can.request(event, {_style: "header "+item[0]}), can, item.slice(1), function(event, button, meta) { can.base.isFunc(cb) && cb(event, button, item) }, trans)
|
||||
}}: /* 3.others */ item
|
||||
can.base.isArray(item)? /* 2.array */ {view: [[html.ITEM, html.MENU, item[0]]], list: [{text: can.user.trans(can, item[0], trans)}, {icon: icon.CHEVRON_DOWN}], onclick: function(event) { can.onkeymap.prevent(event)
|
||||
can.onaction.carte(can.request(event, {_style: "header "+item[0]}), can, item.slice(1), function(event, button, meta) { can.base.isFunc(cb) && cb(event, button, item) }, trans)
|
||||
}}: /* 3.others */ item
|
||||
}) }])._target
|
||||
},
|
||||
})
|
||||
@ -106,7 +108,7 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
|
||||
msg.Option(nfs.SCRIPT) && can.require(can.base.Obj(msg.Option(nfs.SCRIPT)), function(can) { can.onaction.source(can, msg) })
|
||||
var tool = can._root.Action._conf.tool
|
||||
if (can.Conf(aaa.USERNICK, (msg.Option(aaa.USERNICK)||msg.Option(ice.MSG_USERNICK)||msg.Option(ice.MSG_USERNAME)).slice(0, 8)) || can.misc.Search(can, web.SHARE)
|
||||
|| tool && can.base.isIn(tool[0]._command, web.PORTAL, aaa.OFFER, aaa.APPLY)) { return show(msg) }
|
||||
|| tool && can.base.isIn(tool[0]._command, web.PORTAL, aaa.OFFER, aaa.APPLY)) { return show(msg) }
|
||||
can.onlayout._init(can)
|
||||
can.user.login(can, function() { can.onengine.signal(can, chat.ONMAIN, msg) }, msg)
|
||||
})
|
||||
@ -123,13 +125,13 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
|
||||
name: data.name, river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM), theme: can._theme, title: can.user.title(), layout: can.getAction(html.LAYOUT),
|
||||
}), code.WEBPACK, [], function(msg) { can.user.download(can, web.SHARE_LOCAL+msg.Result(), name, nfs.HTML), can.user.toastSuccess(can, "打包成功", code.WEBPACK) })
|
||||
}) },
|
||||
|
||||
|
||||
title: function(event, can) { var args = {}; can.core.List(can.onaction._params, function(key) { var value = can.misc.Search(can, key); value && (args[key] = value) })
|
||||
var msg = can.request(event); can.onengine.signal(can, "ontitle", msg), can.core.List(msg.Append(), function(key) { args[key] = msg.Append(key) })
|
||||
can.user.jumps(can.misc.MergeURL(can, args, true))
|
||||
},
|
||||
avatar: function(event, can) { if (can.user.isMobile) { return can.onaction.usernick(event, can) }
|
||||
var src = can.onexport.avatar(can); can.onaction.carte(can.request(event, {_style: "header avatar"}), can, ["<img src='"+src+"'>"]) },
|
||||
var src = can.onexport.avatar(can); can.onaction.carte(can.request(event, {_style: "header avatar"}), can, ["<img src='"+src+"'>"]) },
|
||||
usernick: function(event, can) { can.onaction.carte(can.request(event, {_style: "header usernick"}), can, can.onaction._menus) },
|
||||
shareuser: function(event, can) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE, mdb.TYPE, aaa.LOGIN, mdb.NAME, can.user.title()]) },
|
||||
theme: function(event, can) { can.page.Select(can, can._output, "div.item.theme>i:first-child", function(target) {
|
||||
@ -154,7 +156,7 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
|
||||
logout: function(event, can) { can.user.logout(can) },
|
||||
share: function(event, can, args) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE].concat(args||[])) },
|
||||
carte: function(event, can, list, cb, trans) { return can.user.carte(event, can, can.onaction, list, cb, null, trans) },
|
||||
|
||||
|
||||
_params: [log.DEBUG, chat.TITLE],
|
||||
_menus: [
|
||||
cli.QRCODE, "shareuser",
|
||||
@ -166,7 +168,7 @@ Volcanos(chat.ONACTION, {_init: function(can) {},
|
||||
chat.THEME, "界面主题", aaa.LANGUAGE, "语言地区",
|
||||
nfs.SAVE, "保存网页", aaa.EMAIL, "发送邮件", web.TOIMAGE, "生成图片", code.WEBPACK, "打包页面",
|
||||
aaa.USER, "用户信息", "setnick", "设置昵称", "setavatar", "设置头像", "setbackground", "设置背景", aaa.PASSWORD, "修改密码", web.CLEAR, "清除背景", aaa.LOGOUT, "退出登录",
|
||||
|
||||
|
||||
"change language to zh-cn", "切换语言为中文",
|
||||
"change language to en-us", "切换语言为英文",
|
||||
"en-us", "英文", "zh-cn", "中文", "auto", "默认",
|
||||
|
@ -1,5 +1,6 @@
|
||||
(function() { const CAN_RIVER = "can.river", CAN_STORM = "can.storm"
|
||||
Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onimport._main(can, msg), can.onappend.style(can, html.FLEX, can._action)
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) { can.onimport._main(can, msg), can.onappend.style(can, html.FLEX, can._action)
|
||||
var select; can.page.Appends(can, can._output, msg.Table(function(item, index) {
|
||||
return can.onimport._river(can, item, function(target) { (index == 0 || item.hash == can._main_river) && (select = target) })
|
||||
})), select && select.click(), can.onimport._menu(can, msg)
|
||||
@ -17,7 +18,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onimport._main(can, msg
|
||||
} },
|
||||
_menu: function(can, msg) { can.user.isMobile || can.user.mod.isPod? can.onmotion.hidden(can, can._action): can.onappend._action(can, can.onaction.list, can._action) },
|
||||
})
|
||||
Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.SHARE, web.REFRESH], _init: function(can) {
|
||||
Volcanos(chat.ONACTION, {list: [mdb.CREATE, web.SHARE, web.REFRESH],
|
||||
_init: function(can) {
|
||||
can.db.storm_list = {}, can.onmotion.hidden(can)
|
||||
var next = can.page.unicode.next, prev = can.page.unicode.prev
|
||||
can._prev = can.page.Append(can, can._target, [{view: [[html.TOGGLE, mdb.PREV], "", prev], onclick: function(event) {
|
||||
@ -123,7 +125,8 @@ Volcanos(chat.ONDETAIL, {
|
||||
{name: mdb.TEXT, value: "hello", _trans: "简介"},
|
||||
], function(args) { can.run({}, [river, chat.STORM, ctx.ACTION, mdb.CREATE].concat(args), function(msg) { can.misc.Search(can, {river: river, storm: msg.Result()}) }) }) },
|
||||
})
|
||||
Volcanos(chat.ONEXPORT, {width: function(can) { return can._target.offsetWidth },
|
||||
Volcanos(chat.ONEXPORT, {
|
||||
width: function(can) { return can._target.offsetWidth },
|
||||
storm: function(can, msg, arg) { can.core.Item(can._root.river, function(river, value) { can.core.Item(value.storm, function(storm, item) { if (arg[1] != "" && storm.indexOf(arg[1]) == -1 && item.name.indexOf(arg[1]) == -1) { return }
|
||||
msg.Push({ctx: ice.CAN, cmd: can._name, type: river, name: storm, text: shy("跳转", function(event) { can.onaction.action(event, can, river, storm) })})
|
||||
}) }) },
|
||||
|
@ -1,4 +1,5 @@
|
||||
Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can, can.ui.content)
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) { can.onmotion.clear(can, can.ui.content)
|
||||
var table = can.onappend.table(can, msg, function(value, key, index, data) { return {text: [can.base.isFunc(value) && value.help || value, html.TD], onclick: function(event) {
|
||||
can.page.tagis(event.target, html.A) || can.onaction[can.db.type == mdb.FOREACH || event.ctrlKey? mdb.PLUGIN: mdb.SELECT](event, can, data)
|
||||
}} }, can.ui.content, msg.append); can.onmotion.story.auto(can), can.onimport._size(can)
|
||||
@ -6,8 +7,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can, can
|
||||
can.onmotion.focus(can, can.ui.filter), msg.Length() == 1 && can.ui.profile.innerHTML == "" && can.page.Select(can, table, html.TD)[0].click()
|
||||
},
|
||||
_size: function(can) { can.ui && can.ui.content && can.getActionSize(function(left, top, width, height) {
|
||||
can.page.style(can, can._target, {left: left||0, top: top||0, width: width}),
|
||||
can.page.style(can, can._output, html.MAX_HEIGHT, height -= 2*10+(can.user.isMobile? 2: 1)*html.ACTION_HEIGHT+can.onexport.statusHeight(can))
|
||||
can.page.style(can, can._target, {left: left||0, top: top||0, width: width})
|
||||
can.page.style(can, can._output, html.MAX_HEIGHT, height -= 2*10+(can.user.isMobile? 2: 1)*html.ACTION_HEIGHT+can.onexport.statusHeight(can))
|
||||
can.core.List([can.ui.content, can.ui.display], function(target) { can.page.style(can, target, html.MAX_WIDTH, can.ConfWidth(width-2*10)) })
|
||||
can.ConfHeight(can.base.Min(height-can.ui.content.offsetHeight-can.ui.display.offsetHeight, height/2))
|
||||
}) },
|
||||
@ -64,7 +65,7 @@ Volcanos(chat.ONACTION, {_init: function(can) { can.onmotion.hidden(can) }, list
|
||||
}, can.ui.profile) }
|
||||
if (data.ctx == ice.NFS && data.cmd == nfs.PACK) { var ls = can.misc.SplitPath(can, data.text)
|
||||
can.runAction(event, ctx.RUN, [web.CODE_VIMER, ctx.ACTION, mdb.RENDER, data.type, ls[1], ls[0]], function(msg) {
|
||||
msg.Table(function(meta) { plugin(meta) }), can.onappend.board(can, msg.Result(), can.ui.profile) })
|
||||
msg.Table(function(meta) { plugin(meta) }), can.onappend.board(can, msg.Result(), can.ui.profile) })
|
||||
} else {
|
||||
plugin(meta)
|
||||
}
|
||||
|
@ -543,7 +543,37 @@ Volcanos(chat.ONEXPORT, {
|
||||
text: function(can, line) { return can.core.Value(can.page.SelectOne(can, line, "td.text"), "innerText") },
|
||||
size: function(can, size, full) { if (size > 1) { return size } if (size > 0) { return size*full } },
|
||||
keys: function(can, path, file) { return [path||can.Option(nfs.PATH), file||can.Option(nfs.FILE)].join(nfs.DF) },
|
||||
content: function(can) { return can.page.Select(can, can.current&&can.current.content||can.ui.content, "td.text", function(item) { return item.innerText.trimEnd() }).join(lex.NL) },
|
||||
content: function(can) {
|
||||
var parse = can.onexport.parse(can)
|
||||
var deep = 0
|
||||
return can.page.Select(can, can.current&&can.current.content||can.ui.content, "td.text", function(item) { var text = item.innerText.trimEnd()
|
||||
if (parse == "js" && !can.base.beginWith(text, "(")) { var list = []
|
||||
for (var i = 0; i < text.length; i++) {
|
||||
if (text[i] == "{") {
|
||||
list.push(text[i])
|
||||
} else if (text[i] == "}") {
|
||||
if (list[list.length-1] == "{") { list.pop() } else { list.push(text[i]) }
|
||||
}
|
||||
if (text[i] == "(") {
|
||||
list.push(text[i])
|
||||
} else if (text[i] == ")") {
|
||||
if (list[list.length-1] == "(") { list.pop() } else { list.push(text[i]) }
|
||||
}
|
||||
if (text[i] == "[") {
|
||||
list.push(text[i])
|
||||
} else if (text[i] == "]") {
|
||||
if (list[list.length-1] == "[") { list.pop() } else { list.push(text[i]) }
|
||||
}
|
||||
}
|
||||
if (list.indexOf("}") > -1) { deep-- } else if (list.indexOf("]") > -1) { deep-- } else if (list.indexOf(")") > -1) { deep-- }
|
||||
if (deep < 0) { deep = 0 }
|
||||
text = "\t".repeat(deep < 0? 0: deep)+text.trimStart()
|
||||
can.base.beginWith(text, "+") && (text = "\t"+text)
|
||||
if (list.indexOf("{") > -1) { deep++ } else if (list.indexOf("[") > -1) { deep++ } else if (list.indexOf("(") > -1) { deep++ }
|
||||
}
|
||||
return text
|
||||
}).join(lex.NL)
|
||||
},
|
||||
position: function(can, index, total) { total = total||can.ui.content._max; return (parseInt(index))+nfs.PS+parseInt(total)+" = "+parseInt((index)*100/total)+"%" },
|
||||
selection: function(can, str) { var s = document.getSelection().toString(), begin = str.indexOf(s), end = begin+s.length
|
||||
for (var i = begin; i >= 0; i--) { if (str[i].match(/[a-zA-Z0-9_.]/)) { s = str.slice(i, end) } else { break } } return s
|
||||
|
@ -72,10 +72,16 @@ Volcanos(chat.ONACTION, {_trans: {input: {main: "程序", top: "顶域"}},
|
||||
if (can.base.beginWith(text, "import ")) { count++; return }
|
||||
if (block == "import") { count++ }
|
||||
}); return count }
|
||||
if (can.onexport.parse(can) == nfs.GO) { var line = can.onaction.selectLine(can); can.onmotion.clear(can, can.ui.content), can.ui.content._max = 0
|
||||
if (can.onexport.parse(can) == nfs.GO) {
|
||||
var line = can.onaction.selectLine(can); can.onmotion.clear(can, can.ui.content), can.ui.content._max = 0
|
||||
can.core.List(msg.Result().split(lex.NL), function(text) { can.onaction.appendLine(can, text) })
|
||||
can.onaction.selectLine(can, line+imports(msg.Result())-imports(msg.Option(nfs.CONTENT)))
|
||||
}
|
||||
if (can.onexport.parse(can) == nfs.JS) {
|
||||
var line = can.onaction.selectLine(can); can.onmotion.clear(can, can.ui.content), can.ui.content._max = 0
|
||||
can.core.List(msg.Option("content").split(lex.NL), function(text) { can.onaction.appendLine(can, text) })
|
||||
can.onaction.selectLine(can, line)
|
||||
}
|
||||
},
|
||||
trash: function(event, can, button) { var msg = can.request(event), p = msg.Option(nfs.PATH)+msg.Option(nfs.FILE)
|
||||
can.onaction._run(event, can, button, [p], function(msg) { can.ui.zone.source.refresh() })
|
||||
|
@ -1,4 +1,5 @@
|
||||
Volcanos(chat.ONIMPORT, {_init: function(can, msg) {
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg) {
|
||||
can.isCmdMode() || can.onmotion.hidden(can, can._action)
|
||||
can.OptionPath = function(value) { return can.Option(nfs.PATH, value) }
|
||||
can.OptionPid = function(value) { return can.Option(svg.PID, value) }
|
||||
@ -74,9 +75,9 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) {
|
||||
return meta._init && meta._init(target), target
|
||||
},
|
||||
layout: function(can) {
|
||||
can.ui.svg && can.page.style(can, can.ui.svg, html.MIN_HEIGHT, can.ConfHeight(), html.MIN_WIDTH, can.ConfWidth())
|
||||
can.ui.svg && can.page.style(can, can.ui.svg, html.MIN_HEIGHT, can.ConfHeight()-4, html.MIN_WIDTH, can.ConfWidth())
|
||||
can.ui.layout && can.ui.layout(can.ConfHeight(), can.ConfWidth(), 0, function(height, width) {
|
||||
can.page.style(can, can.ui.svg, html.MIN_HEIGHT, height, html.MIN_WIDTH, width)
|
||||
can.page.style(can, can.ui.svg, html.MIN_HEIGHT, height-4, html.MIN_WIDTH, width)
|
||||
})
|
||||
},
|
||||
})
|
||||
|
@ -1,6 +1,7 @@
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_process: function(can, msg) { if (msg.IsErr()) { can.onappend.style(can, "warn", can.user.toastFailure(can, msg.Result())._target) }
|
||||
if (can.onimport[msg.OptionProcess()]) { return can.core.CallFunc([can.onimport, msg.OptionProcess()], {can: can, sub: can.sub, msg: msg, arg: msg.Option("_arg")}), true } },
|
||||
_process: function(can, msg) {
|
||||
if (msg.IsErr()) { can.onappend.style(can, "warn", can.user.toastFailure(can, msg.Result())._target) }
|
||||
if (can.onimport[msg.OptionProcess()]) { return can.core.CallFunc([can.onimport, msg.OptionProcess()], {can: can, sub: can.sub, msg: msg, arg: msg.Option("_arg")}), true } },
|
||||
_location: function(can, msg, arg) { can.user.jumps(arg) },
|
||||
_replace: function(can, msg, arg) { location.replace(arg) },
|
||||
_history: function(can, msg) { history.length == 1? can.user.close(): history.back() },
|
||||
@ -98,7 +99,7 @@ Volcanos(chat.ONIMPORT, {
|
||||
}
|
||||
arg = can.page.Color(arg); if (!can.page.SelectOne(can, can._output, html.DIV_CODE, function(div) {
|
||||
return can.page.style(can, div, html.MAX_HEIGHT, can.onexport.outputHeight(can)),
|
||||
can.page.Append(can, div, [{text: arg}]), can._output.scrollTop = div.offsetTop, div.scrollBy(0, 10000), true
|
||||
can.page.Append(can, div, [{text: arg}]), can._output.scrollTop = div.offsetTop, div.scrollBy(0, 10000), true
|
||||
})) { can.onappend.board(can, arg) }
|
||||
},
|
||||
_open: function(can, msg, arg) { can.user.open(arg); msg._arg.length > 1 && can.Update() },
|
||||
@ -130,7 +131,8 @@ Volcanos(chat.ONIMPORT, {
|
||||
can.page.SelectArgs(can, can._action, "", function(target) { target.value = his[i++]||"" }); break
|
||||
} can.Update(event) },
|
||||
})
|
||||
Volcanos(chat.ONACTION, {list: ["刷新数据",
|
||||
Volcanos(chat.ONACTION, {
|
||||
list: ["刷新数据",
|
||||
function(can) { if (!can.user.isMobile) { return "刷新界面" } },
|
||||
function(can) { if (!can.user.isMobile && !can.isCmdMode()) { return "切换浮动" } },
|
||||
function(can) { if (!can.user.isMobile && !can.isCmdMode()) { return "切换全屏" } },
|
||||
@ -161,14 +163,15 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
|
||||
],
|
||||
_engine: function(event, can, button) { can.Update(event, [ctx.ACTION, button].concat(can.Input())) },
|
||||
_switch: function(can, sub, mode, save, load) {
|
||||
if (can.page.ClassList.neg(can, can._target, mode)) {
|
||||
(can._mode_list = can._mode_list||[]).push(kit.Dict(
|
||||
if (can.page.ClassList.neg(can, can._target, mode)) { can._mode_list = can._mode_list||[]
|
||||
can._mode_list.push(kit.Dict(
|
||||
html.HEIGHT, can.ConfHeight(), html.WIDTH, can.ConfWidth(), ice.MODE, can.Mode()||"",
|
||||
html.ACTION, can.page.isDisplay(can._action), html.STATUS, can.page.isDisplay(can._status),
|
||||
html.OUTPUT, can.base.Copy({}, can._output.style, html.HEIGHT, html.WIDTH, html.MAX_HEIGHT, html.MAX_WIDTH),
|
||||
ctx.STYLE, can.base.Copy({}, can._target.style, html.LEFT, html.TOP, html.RIGHT, html.BOTTOM), save()
|
||||
)), can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), false, mode)
|
||||
} else { var back = (can._mode_list = can._mode_list||[]).pop(); if (!back) { return }
|
||||
} else {
|
||||
var back = (can._mode_list = can._mode_list||[]).pop(); if (!back) { return }
|
||||
can.onmotion.toggle(can, can._action, back.action), can.onmotion.toggle(can, can._status, back.status)
|
||||
can.onimport.size(can, back.height, back.width, false, back.mode), can.page.style(can, can._target, back.style), load && load(back)
|
||||
}
|
||||
@ -176,9 +179,8 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
|
||||
"刷新数据": function(event, can) { can.Update(event, can.Input()), can.user.toastSuccess(can) },
|
||||
"刷新界面": function(event, can) { var sub = can.sub; sub.onlayout._init(sub, sub.ConfHeight(), sub.ConfWidth()), can.user.toastSuccess(can) },
|
||||
"切换浮动": function(event, can, button, sub) {
|
||||
can.onaction._switch(can, sub, chat.FLOAT, function() {
|
||||
can.onmotion.float(can)
|
||||
}) },
|
||||
can.onaction._switch(can, sub, chat.FLOAT, function() { can.onmotion.float(can) })
|
||||
},
|
||||
"切换全屏": function(event, can, button, sub) { can.onaction._switch(can, sub, chat.FULL, function() {
|
||||
can.page.style(can, can._target, html.LEFT, "", html.TOP, can.onexport.marginTop(), html.BOTTOM, "")
|
||||
can.ConfHeight(can.page.height()-can.onexport.marginTop()-can.onexport.marginBottom(can)), can.ConfWidth(can.page.width())
|
||||
@ -193,7 +195,7 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
|
||||
can._root.Header.run(can.request(event, {pod: can.ConfSpace()}), [ctx.ACTION, chat.MESSAGE].concat(cmds), function(msg) { cb(msg) })
|
||||
}}], function(list) { var args = can.core.Item(can.Option(), function(key, value) { return value })
|
||||
can._root.Header.run(can.request(event, {pod: can.ConfSpace()}), [ctx.ACTION, chat.MESSAGE, list[0],
|
||||
mdb.TYPE, "plug", ctx.INDEX, can.ConfIndex(), ctx.ARGS, args.length < 2? args[0]||"": JSON.stringify(args)])
|
||||
mdb.TYPE, "plug", ctx.INDEX, can.ConfIndex(), ctx.ARGS, args.length < 2? args[0]||"": JSON.stringify(args)])
|
||||
can.onappend._float(can, chat.MESSAGE)
|
||||
})
|
||||
},
|
||||
@ -203,7 +205,7 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
|
||||
"ish_sys_dev_run_command "+args, "ish_sys_dev_run_action", "ish_sys_dev_run_source",
|
||||
]; can.user.copy(event, can, list[0]) },
|
||||
"生成图片": function(event, can) { can.user.toimage(can, can.name) },
|
||||
|
||||
|
||||
_view: function(can, cb) { var sub = can.sub; cb(sub), sub.onimport.layout(sub) },
|
||||
"参数": function(event, can) { can.onaction._view(can, function(sub) { can.onmotion.toggle(can, can._option) }) },
|
||||
"操作": function(event, can) { can.onaction._view(can, function(sub) { can.onmotion.toggle(can, can._action) }) },
|
||||
@ -221,7 +223,7 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
|
||||
var sub = can.sub; sub.onimport.tool(sub, [data], function(sub) { sub.select() })
|
||||
})
|
||||
},
|
||||
|
||||
|
||||
"保存参数": function(event, can) { can.search(event, ["River.ondetail.保存参数"]) },
|
||||
"清空参数": function(event, can) { can.page.SelectArgs(can, can._option, "", function(target) { return target.value = "" }) },
|
||||
"复制数据": function(event, can) { var sub = can.sub; can.user.copy(event, can, sub.onexport.table(sub)||sub.onexport.board(sub)) },
|
||||
@ -229,7 +231,7 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
|
||||
can.user.downloads(can, sub.onexport.table(sub), list[0], nfs.CSV), can.user.downloads(can, sub.onexport.board(sub), list[0], nfs.TXT)
|
||||
}) },
|
||||
"清空数据": function(event, can) { can.onmotion.clear(can, can._output) },
|
||||
|
||||
|
||||
"查看文档": function(event, can) { can.requests(event, {action: ice.HELP}), can.onengine.signal(can, chat.ONDEBUGS, can.requestPodCmd(event)) },
|
||||
"查看脚本": function(event, can) { can.onappend._float(can, web.CODE_VIMER, can.misc.SplitPath(can, can.sub._path)) },
|
||||
"查看源码": function(event, can) { can.requests(event, {action: nfs.SOURCE}), can.onengine.signal(can, chat.ONDEBUGS, can.requestPodCmd(event)) },
|
||||
@ -248,7 +250,7 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
|
||||
"查看日志": function(event, can) { var logid = can.Status("log.id"); can.onappend._float(can, web.CODE_XTERM, ["sh", logid, "grep "+logid+" var/log/bench.log | grep -v grep | grep -v '"+logid+" $'"]) },
|
||||
"打包页面": function(event, can) { can.onengine.signal(can, "onwebpack", can.request(event)) },
|
||||
"删除工具": function(event, can) { can.onaction._close(event, can) },
|
||||
|
||||
|
||||
refresh: function(event, can) { can.onimport.size(can, can.ConfHeight(), can.ConfWidth(), true, can.Mode()) },
|
||||
close: function(event, can) {
|
||||
if (can.isCmdMode()) {
|
||||
@ -281,11 +283,11 @@ Volcanos(chat.ONACTION, {list: ["刷新数据",
|
||||
can.user.toast(can, {title: msg.Append(mdb.NAME), duration: -1, content: msg.Append(mdb.TEXT), action: [cli.CLOSE, cli.OPEN]})
|
||||
})
|
||||
},
|
||||
|
||||
|
||||
getClipboardData: function(event, can, button) {
|
||||
function add(text) { can.runAction(event, button, can.base.Simple(can.base.ParseJSON(text)), function() { can.Update() }) }
|
||||
navigator.clipboard? navigator.clipboard.readText().then(add).catch(function(err) { can.misc.Log(err) }):
|
||||
can.user.input(event, can, [{type: html.TEXTAREA, name: mdb.TEXT}], function(list) { add(list[0]) })
|
||||
can.user.input(event, can, [{type: html.TEXTAREA, name: mdb.TEXT}], function(list) { add(list[0]) })
|
||||
},
|
||||
getLocation: function(event, can, button) { can.user.agent.getLocation(can, function(data) {
|
||||
can.user.input(can.request(event, data), can, [mdb.TYPE, mdb.NAME, mdb.TEXT, aaa.LATITUDE, aaa.LONGITUDE], function(args) {
|
||||
@ -328,7 +330,7 @@ Volcanos(chat.ONEXPORT, {
|
||||
},
|
||||
statusHeight: function(can) {
|
||||
return can.page.ClassList.has(can, can._target, html.OUTPUT) || !can.page.isDisplay(can._status) || (can._target.offsetHeight > 0 && can._status.offsetHeight == 0) ||
|
||||
can._status.innerHTML == "" && !can.page.ClassList.has(can, can._target, html.PLUG)? 0: html.STATUS_HEIGHT
|
||||
can._status.innerHTML == "" && !can.page.ClassList.has(can, can._target, html.PLUG)? 0: html.STATUS_HEIGHT
|
||||
},
|
||||
session: function(can, key, value) { if (value) { value = JSON.stringify(value) }
|
||||
return can.misc.sessionStorage(can, [can.ConfSpace()||can.misc.Search(can, ice.POD), can.ConfIndex(), key, location.pathname], value)
|
||||
|
@ -1,4 +1,5 @@
|
||||
Volcanos(chat.ONIMPORT, {_init: function(can, msg, target, cb) {
|
||||
Volcanos(chat.ONIMPORT, {
|
||||
_init: function(can, msg, target, cb) {
|
||||
if (msg.index && msg.meta && msg.list) { return cb && cb(msg), can.sup.onimport._field(can.sup, msg) }
|
||||
if (can.isCmdMode() && can.Conf(ctx.STYLE) == html.FORM) { can.onappend.style(can, html.OUTPUT) }
|
||||
if (can.Mode() == html.ZONE) { return can.onimport._vimer_zone(can, msg, target), cb && cb(msg) }
|
||||
@ -40,7 +41,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target, cb) {
|
||||
_zone_icon: function(can, msg, zone, cb) {
|
||||
var action = can.core.List(can.Conf(ctx.INPUTS), function(item) { if (item.type == html.BUTTON && [ice.LIST, ice.BACK].indexOf(item.name) == -1) { return item.name } })
|
||||
var _menu = shy({}, action.concat(can.base.Obj(msg.Option(ice.MSG_ACTION), [])), function(event, button, meta, carte) {
|
||||
cb? cb(event, button): can.Update(event, [ctx.ACTION, button]), carte.close() })
|
||||
cb? cb(event, button): can.Update(event, [ctx.ACTION, button]), carte.close() })
|
||||
if (_menu.list.length == 0) {
|
||||
zone._icon(kit.Dict(web.REFRESH, function(event) { zone.refresh() }))
|
||||
return
|
||||
@ -221,10 +222,10 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target, cb) {
|
||||
index == 0 && can.onappend.plugin(can, value, function(sub) { can.db.value._content_plugin = sub, can.onimport.layout(can) }, can.ui.content)
|
||||
index == 1 && can.onappend.plugin(can, value, function(sub) {
|
||||
can.onmotion.toggle(can, can.ui.display, true)
|
||||
can.db.value._display_plugin = sub, can.onimport.layout(can) }, can.ui.display)
|
||||
can.db.value._display_plugin = sub, can.onimport.layout(can) }, can.ui.display)
|
||||
index == 2 && can.onappend.plugin(can, value, function(sub) {
|
||||
can.onmotion.toggle(can, can.ui.profile, true)
|
||||
can.db.value._profile_plugin = sub, can.onimport.layout(can) }, can.ui.profile)
|
||||
can.db.value._profile_plugin = sub, can.onimport.layout(can) }, can.ui.profile)
|
||||
can.onmotion.delay(can, function() { can.onimport.layout(can) })
|
||||
can.onmotion.delay(can, function() { can.onimport.layout(can) }, 100)
|
||||
can.onmotion.delay(can, function() { can.onimport.layout(can) }, 300)
|
||||
@ -244,7 +245,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target, cb) {
|
||||
}}]), sub._legend._target = sub._target, sub._legend._meta = {index: meta.index}
|
||||
status.appendChild(sub._legend), sub._legend.oncontextmenu = sub._legend.onclick, sub._legend.onclick = function(event) { can.misc.Event(event, can, function(msg) {
|
||||
if (can.page.SelectOne(can, status, "legend.select", function(target) {
|
||||
can.onmotion.hidden(can, target._target), can.page.ClassList.del(can, target, html.SELECT); return target }) == sub._legend) { return }
|
||||
can.onmotion.hidden(can, target._target), can.page.ClassList.del(can, target, html.SELECT); return target }) == sub._legend) { return }
|
||||
can.onmotion.select(can, status, html.LEGEND, sub._legend), can.onmotion.toggle(can, sub._target, true)
|
||||
can.onmotion.select(can, target, html.FIELDSET_PLUG, sub._target)
|
||||
sub.onimport.size(sub, sub.ConfHeight(), sub.ConfWidth(), false)
|
||||
|
15
proto.js
15
proto.js
@ -1,8 +1,8 @@
|
||||
function shy(help, meta, list, cb) { var arg = arguments, i = 0; function next(type) {
|
||||
if (type == code.OBJECT) { if (typeof arg[i] == code.OBJECT && arg[i].length == undefined) { return arg[i++] }
|
||||
} else if (type == code.ARRAY) { if (typeof arg[i] == code.OBJECT && arg[i].length != undefined) { return arg[i++] }
|
||||
} else if (i < arg.length && (!type || type == typeof arg[i])) { return arg[i++] }
|
||||
} return cb = typeof arg[arg.length-1] == code.FUNCTION? arg[arg.length-1]: function() {}, cb.help = next(code.STRING)||"", cb.meta = next(code.OBJECT)||{}, cb.list = next(code.ARRAY)||[], cb
|
||||
if (type == code.OBJECT) { if (typeof arg[i] == code.OBJECT && arg[i].length == undefined) { return arg[i++] }
|
||||
} else if (type == code.ARRAY) { if (typeof arg[i] == code.OBJECT && arg[i].length != undefined) { return arg[i++] }
|
||||
} else if (i < arg.length && (!type || type == typeof arg[i])) { return arg[i++] }
|
||||
} return cb = typeof arg[arg.length-1] == code.FUNCTION? arg[arg.length-1]: function() {}, cb.help = next(code.STRING)||"", cb.meta = next(code.OBJECT)||{}, cb.list = next(code.ARRAY)||[], cb
|
||||
}; var _can_name = "", _can_path = ""
|
||||
var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {}, cache: {}, pack: {}, args: {}}, function(name, can, libs, cb) {
|
||||
var meta = arguments.callee.meta, list = arguments.callee.list; if (typeof name == code.OBJECT) {
|
||||
@ -13,7 +13,8 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {},
|
||||
cb = can||function(can) { can.require([can.frame], function() { can.onengine._init(can, can.Conf(Config), panels, Config._init||meta._init, can._target) }, function(can, key, sub) { can[key] = sub }) }
|
||||
can = Config, can._follow = name, can._target = Config.target||meta.target, can._height = Config.height||meta._height, can._width = Config.width||meta._width, _can_name = ""
|
||||
}
|
||||
can = kit.proto(can||{}, kit.proto({_name: name, _path: _can_name, _load: function(name, cbs) { var cache = meta.cache[name]||[]
|
||||
can = kit.proto(can||{}, kit.proto({_name: name, _path: _can_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), sub._path = sub._path||name } meta.cache[name] = cache
|
||||
cache.forEach(function(sub) { var name = sub._name
|
||||
if (typeof cbs == code.FUNCTION && cbs(can, name, sub)) { return }
|
||||
@ -115,10 +116,10 @@ var Volcanos = shy({iceberg: "", volcano: "", frame: chat.FRAME_JS, _cache: {},
|
||||
ConfDefault: function(value) { can.core.Item(value, function(k, v) { can.Conf(k) || can.Conf(k, v) }) },
|
||||
ConfSpace: function(space) {
|
||||
if (space) { can.Conf(web.SPACE, space) }
|
||||
return can.Conf("_space")||can.Conf(web.SPACE)||"" },
|
||||
return can.Conf("_space")||can.Conf(web.SPACE)||"" },
|
||||
ConfIndex: function(index) {
|
||||
if (index) { can.Conf(ctx.INDEX, index) }
|
||||
return can.Conf("_command")||can.Conf(ctx.INDEX)||can.Conf("_index") },
|
||||
return can.Conf("_command")||can.Conf(ctx.INDEX)||can.Conf("_index") },
|
||||
ConfHeight: function(value) { return can.Conf(html.HEIGHT, value) },
|
||||
ConfWidth: function(value) { return can.Conf(html.WIDTH, value)||can._output.offsetWidth },
|
||||
Conf: function(key, value) { var res = can._conf
|
||||
|
Loading…
x
Reference in New Issue
Block a user