From 8f3c12ee99cabd2102cacd8125c14d6c19416a62 Mon Sep 17 00:00:00 2001 From: shy Date: Fri, 31 May 2024 02:34:52 +0800 Subject: [PATCH] add some --- frame.js | 132 ++++++------ lib/base.js | 6 +- lib/core.js | 12 +- lib/date.js | 18 +- lib/misc.js | 35 ++-- lib/page.js | 416 ++++++++++++++++++++----------------- lib/user.js | 17 +- panel/action.js | 56 ++--- panel/footer.js | 21 +- panel/header.js | 28 +-- panel/river.js | 9 +- panel/search.js | 9 +- plugin/local/code/inner.js | 32 ++- plugin/local/code/vimer.js | 8 +- plugin/local/wiki/draw.js | 7 +- plugin/state.js | 38 ++-- plugin/table.js | 11 +- proto.js | 15 +- 18 files changed, 485 insertions(+), 385 deletions(-) diff --git a/frame.js b/frame.js index 38b29c67..1a04e276 100644 --- a/frame.js +++ b/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 = `` 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] }, diff --git a/lib/base.js b/lib/base.js index 1684c0b3..dab3ce83 100644 --- a/lib/base.js +++ b/lib/base.js @@ -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 }, diff --git a/lib/core.js b/lib/core.js index 7f9c939a..6fc5d176 100644 --- a/lib/core.js +++ b/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 diff --git a/lib/date.js b/lib/date.js index 17f09e51..4a7b7273 100644 --- a/lib/date.js +++ b/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, "&", "&", "<", "<", ">", ">") diff --git a/lib/misc.js b/lib/misc.js index add35c46..f9952fd3 100644 --- a/lib/misc.js +++ b/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, + }) + \ No newline at end of file diff --git a/lib/page.js b/lib/page.js index 2c570a71..30576e15 100644 --- a/lib/page.js +++ b/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 `${arg[2]||arg[1]}` case html.IMG: return arg[3]? ``: arg[2]? ``: `` case html.SPAN: arg[2] && typeof arg[2] == code.OBJECT && arg[2].join && (arg[2] = arg[2].join(lex.SP)) - return arg[2]? `${arg[1]}`: arg[1] + return arg[2]? `${arg[1]}`: 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], "").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], "").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, "
") if (text.indexOf(ice.HTTP) == 0 && text.length > 10) { var ls = text.split(lex.SP); text = ""+decodeURI(ls[0])+""+ls.slice(1).join(lex.SP) } if (text.indexOf("export ctx_dev=") == 0 && text.length > 10) { return "
"+""+text+""+"
" } - if (text.indexOf("\033\[") == -1) { return text } - text = text.replace(/\033\[41m/g, "") - text = text.replace(/\033\[31m/g, "") - text = text.replace(/\033\[32m/g, "") - text = text.replace(/\033\[33m/g, "") - text = text.replace(/\033\[34m/g, "") - text = text.replace(/\033\[36m/g, "") - text = text.replace(/\033\[37m/g, "") - text = text.replace(/\033\[34;1m/g, "") - text = text.replace(/\033\[37;1m/g, "") - text = text.replace(/\033\[1m/g, "") - text = text.replace(/\033\[0m/g, "") - text = text.replace(/\033\[m/g, "") + if (text.indexOf("\033\[") == -1) { return text } + text = text.replace(/\033\[41m/g, "") + text = text.replace(/\033\[31m/g, "") + text = text.replace(/\033\[32m/g, "") + text = text.replace(/\033\[33m/g, "") + text = text.replace(/\033\[34m/g, "") + text = text.replace(/\033\[36m/g, "") + text = text.replace(/\033\[37m/g, "") + text = text.replace(/\033\[34;1m/g, "") + text = text.replace(/\033\[37;1m/g, "") + text = text.replace(/\033\[1m/g, "") + text = text.replace(/\033\[0m/g, "") + text = text.replace(/\033\[m/g, "") 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")) } }) diff --git a/lib/user.js b/lib/user.js index c6d37d28..ae8a8506 100644 --- a/lib/user.js +++ b/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+" 是必选字段, 请重新输入") } diff --git a/panel/action.js b/panel/action.js index 6be2d4b5..278f3028 100644 --- a/panel/action.js +++ b/panel/action.js @@ -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: { diff --git a/panel/footer.js b/panel/footer.js index b4a89627..0a7bb27c 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -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") }), -}) })() +}) +})() diff --git a/panel/header.js b/panel/header.js index 2176c325..03e56e71 100644 --- a/panel/header.js +++ b/panel/header.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, [""]) }, + var src = can.onexport.avatar(can); can.onaction.carte(can.request(event, {_style: "header avatar"}), can, [""]) }, 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", "默认", diff --git a/panel/river.js b/panel/river.js index ca19ff94..8a37f0b0 100644 --- a/panel/river.js +++ b/panel/river.js @@ -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) })}) }) }) }, diff --git a/panel/search.js b/panel/search.js index ee323959..ea67eed5 100644 --- a/panel/search.js +++ b/panel/search.js @@ -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) } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index d5ac965e..7fd7f21b 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -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 diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 8ea0cf80..fa44012a 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -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() }) diff --git a/plugin/local/wiki/draw.js b/plugin/local/wiki/draw.js index 4d6908fb..d6362e5d 100644 --- a/plugin/local/wiki/draw.js +++ b/plugin/local/wiki/draw.js @@ -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) }) }, }) diff --git a/plugin/state.js b/plugin/state.js index 190ec160..aa43335f 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -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) diff --git a/plugin/table.js b/plugin/table.js index 2354209e..0ebae038 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -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) diff --git a/proto.js b/proto.js index 57012e7e..1677f298 100644 --- a/proto.js +++ b/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