diff --git a/frame.js b/frame.js index 7f48ab0c..fd13c89f 100644 --- a/frame.js +++ b/frame.js @@ -1,36 +1,26 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { - if (can.misc.Search(can, ice.MSG_SESSID)) { can.misc.CookieSessid(can, can.misc.Search(can, ice.MSG_SESSID)) - return can.misc.Search(can, ice.MSG_SESSID, "") - } can.user.title(can.misc.Search(can, chat.TITLE)||can.misc.Search(can, ice.POD)||location.host) + if (can.misc.Search(can, ice.MSG_SESSID)) { can.misc.CookieSessid(can, can.misc.Search(can, ice.MSG_SESSID)) return can.misc.Search(can, ice.MSG_SESSID, "") } + can.user.title(can.misc.Search(can, chat.TITLE)||can.misc.Search(can, ice.POD)||location.host) - can.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.require([can.volcano], null, function(can, key, sub) { can[key] = sub }) + can.run = function(event, cmds, cb) { var msg = can.request(event); cmds = cmds||[]; return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, can, cmds, cb) } + can.require([can.volcano], null, function(can, key, sub) { can[key] = sub }) can.core.Next(list, function(item, next) { item.type = chat.PANEL - can.onappend._init(can, can.base.Copy(item, can.core.Value(can, [chat.RIVER, item.name])), item.list, function(sub) { - sub.run = function(event, cmds, cb) { var msg = sub.request(event); cmds = cmds||[] - return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, sub, cmds, cb) - }, can[item.name] = sub - can.core.ItemCB(sub.onaction, function(key, cb) { - can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {can: sub, msg: msg}) }) - }), can.core.CallFunc([sub.onaction, chat._INIT], {can: sub, cb: next, target: sub._target}) - can.core.Item(sub.onplugin, function(key, cmd) { - sub.onplugin.hasOwnProperty(key) && can.base.isFunc(cmd) && can.onengine.plugin(sub, key, cmd) - }) + can.onappend._init(can, can.base.Copy(item, can.core.Value(can, [chat.RIVER, item.name])), item.list, function(sub) { can[item.name] = sub + sub.run = function(event, cmds, cb) { var msg = sub.request(event); cmds = cmds||[]; return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, sub, cmds, cb) } + can.core.Item(sub.onplugin, function(key, cmd) { sub.onplugin.hasOwnProperty(key) && can.base.isFunc(cmd) && can.onengine.plugin(sub, key, cmd) }) + can.core.ItemCB(sub.onaction, function(key, cb) { can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {can: sub, msg: msg}) }) }) + can.core.CallFunc([sub.onaction, chat._INIT], {can: sub, cb: next, target: sub._target}) }, target) - }, function() { can.onmotion._init(can, target), can.onkeymap._init(can), can.misc.Info(can.user.title(), ice.RUN, can) + }, function() { can.onmotion._init(can, target), can.onkeymap._init(can, target), can.misc.Info(can.user.title(), ice.RUN, can) can.onengine.listen(can, chat.ONSEARCH, function(msg, word) { word[0] == ctx.COMMAND && can.run(msg, ["can.command"]) }) can.onengine.signal(can, chat.ONMAIN, can.request()), can.base.isFunc(cb) && cb(can) }) }, _search: function(event, can, msg, panel, cmds, cb) { - var sub, mod = can, fun = can, key = ""; can.core.List(cmds[1].split(ice.PT), function(value) { - fun && (sub = mod, mod = fun, fun = mod[value], key = value) - }); if (!sub || !mod || !fun) { can.misc.Warn(ice.ErrNotFound, cmds); return can.base.isFunc(cb) && cb(msg.Echo(ice.ErrWarn, ice.ErrNotFound, cmds)) } - return can.core.CallFunc(fun, { - event: event, can: sub, msg: msg, cmds: cmds.slice(2), cb: cb, target: sub._target, button: key, cmd: key, arg: cmds.slice(2), list: cmds.slice(2), - }, mod) + var sub, mod = can, fun = can, key = ""; can.core.List(cmds[1].split(ice.PT), function(value) { fun && (sub = mod, mod = fun, fun = mod[value], key = value) }) + if (!sub || !mod || !fun) { can.misc.Warn(ice.ErrNotFound, cmds); return can.base.isFunc(cb) && cb(msg.Echo(ice.ErrWarn, ice.ErrNotFound, cmds)) } + return can.core.CallFunc(fun, {event: event, can: sub, msg: msg, cmds: cmds.slice(2), cb: cb, target: sub._target, button: key, cmd: key, arg: cmds.slice(2), list: cmds.slice(2)}, mod) }, _remote: function(event, can, msg, panel, cmds, cb) { if (panel.onengine._engine(event, can, msg, panel, cmds, cb)) { return } @@ -40,8 +30,7 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { var toast, _toast = msg.Option(chat._TOAST); if (_toast) { can.onmotion.delay(can, function() { toast = toast||can.user.toastProcess(msg._can, _toast) }, 500) } msg.option = can.core.List(msg.option, function(item) { return [chat._TOAST, ice.MSG_HANDLE].indexOf(item) > -1 && delete(msg[item])? undefined: item }) can.getHeader(chat.TOPIC, function(topic) { msg.Option(chat.TOPIC, topic) }) - if (can.base.isUndefined(msg._daemon)) { var sub = msg._can - can.base.isUndefined(sub._daemon) && can.ondaemon._list[0] && (sub._daemon = can.ondaemon._list.push(sub)-1) + if (can.base.isUndefined(msg._daemon)) { var sub = msg._can; can.base.isUndefined(sub._daemon) && can.ondaemon._list[0] && (sub._daemon = can.ondaemon._list.push(sub)-1) if (sub._daemon) { msg.Option(ice.MSG_DAEMON, can.core.Keys(can.ondaemon._list[0], sub._daemon)) } } can.onengine.signal(panel, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds})) @@ -50,32 +39,25 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { can.base.isFunc(cb) && cb(msg), Volcanos.meta.pack[can.core.Keys(panel._name, cmds.join(ice.FS))] = msg }) }, - _static: function(event, can, msg, panel, cmds, cb) { - if (can.user.isLocalFile) { var msg = can.request(event); msg.Clear(ice.MSG_APPEND) - var res = Volcanos.meta.pack[can.core.Keys(panel._name, cmds.join(ice.FS))]; res? msg.Copy(res): can.user.toast(can, "miss data") - return can.base.isFunc(cb) && cb(msg), true - } return false + _static: function(event, can, msg, panel, cmds, cb) { if (!can.user.isLocalFile) { return false } + var msg = can.request(event); msg.Clear(ice.MSG_APPEND) + var res = Volcanos.meta.pack[can.core.Keys(panel._name, cmds.join(ice.FS))]; res? msg.Copy(res): can.user.toast(can, "miss data") + return can.base.isFunc(cb) && cb(msg), true }, _engine: function(event, can, msg, panel, cmds, cb) { return false }, _plugin: function(event, can, msg, panel, cmds, cb) { - if (cmds[0] == ctx.ACTION && cmds[1] == ice.RUN) { - var p = can.onengine.plugin(can, cmds[2]); if (p) { - return can.core.CallFunc(p, {can: p.can||panel, msg: msg, arg: cmds.slice(3), cmds: cmds.slice(3), cb: cb}), true - } + if (cmds[0] == ctx.ACTION && cmds[1] == ice.RUN) { var p = can.onengine.plugin(can, cmds[2]) + if (p) { return can.core.CallFunc(p, {can: p.can||panel, msg: msg, arg: cmds.slice(3), cmds: cmds.slice(3), cb: cb}), true } } - var p = can.onengine.plugin(can, cmds[0]), n = 1; if (p) { - if (p.meta && p.meta[cmds[1]] && cmds[0] == ctx.ACTION) { n = 3 } else if (p.meta && p.meta[cmds[0]]) { n = 2 } + var p = can.onengine.plugin(can, cmds[0]), n = 1; if (p) { if (p.meta && p.meta[cmds[1]] && cmds[0] == ctx.ACTION) { n = 3 } else if (p.meta && p.meta[cmds[0]]) { n = 2 } return can.core.CallFunc(p, {can: p.can||panel, msg: msg, arg: cmds.slice(n), cmds: cmds.slice(n), cb: cb}), true } return false }, plugin: shy(function(can, name, command) { - if (can.base.isUndefined(name)) { return } else if (can.base.isUndefined(command)) { - if (!can.base.isString(name) || name.indexOf("can.") == -1) { return } - return arguments.callee.meta[can.base.trimPrefix(name, "can.")] - } - var type = html.TEXT; command.list = can.core.List(command.list, function(item) { - return can.base.isString(item) && (item = can.core.SplitInput(item, type)), type = item.type, item - }), command.can = can, arguments.callee.meta[can.base.trimPrefix(name, "can.")] = command, command.name = name + if (can.base.isUndefined(name) || !can.base.isString(name) || name.indexOf("can.") == -1) { return } + if (can.base.isUndefined(command)) { return arguments.callee.meta[can.base.trimPrefix(name, "can.")] } + var type = html.TEXT; command.list = can.core.List(command.list, function(item) { return can.base.isString(item) && (item = can.core.SplitInput(item, type)), type = item.type, item }) + command.can = can, command.name = name, arguments.callee.meta[can.base.trimPrefix(name, "can.")] = command }), listen: shy(function(can, name, cb) { arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb) }), signal: function(can, name, msg) { msg = msg||can.request(); var _msg = name == chat.ONREMOTE? msg.Option("_msg"): msg @@ -98,13 +80,7 @@ Volcanos(chat.ONDAEMON, {_init: function(can, name) { if (can.user.isLocalFile) (can.core.Value(sub, chat._OUTPUTS_CURRENT)||sub).runAction(can.request({}, msg), arg[0], arg.slice(1)) }, input: function(can, msg, sub, arg) { can.page.Select(can, sub._target, "input:focus", function(target) { target.value += arg[0] }) }, - grow: function(can, msg, sub, arg) { - if (sub.onimport && sub.onimport._grow) { - sub.onimport._grow(sub, msg, can.page.Color(arg.join(""))) - } if (sub.sup && sub.sup.onimport._grow) { - sub.sup.onimport._grow(sub.sup, msg, can.page.Color(arg.join(""))) - } - }, + grow: function(can, msg, sub, arg) { if (sub.sup && sub.sup.onimport._grow) { return sub.sup.onimport._grow(sub.sup, msg, can.page.Color(arg.join(""))) } }, close: function(can, msg, sub) { can.user.close() }, exit: function(can, msg, sub) { can.user.close() }, }) @@ -310,13 +286,13 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }, target._can = sub, can.base.Copy(sub, can.onfigure[input], true), sub._name = sub._path = path sub.hidden = function() { return sub._target.style.display == html.NONE }, sub.close = function() { can.page.Remove(can, sub._target), delete(target._can) } can.onmotion.delay(can, function() { can.page.style(sub, sub._target, meta.style), show(), can.base.isFunc(meta._init) && meta._init(sub, sub._target) }) - }, document.body) + }, can._root._target) }}) } }), can.onfigure[input]._init && can.onfigure[input]._init(can, meta, target, _cb) }) }, }) -Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||document.body; 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), can.user.isMobile || (width -= field.offsetWidth) @@ -328,7 +304,7 @@ Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||documen can.page.SelectChild(can, field, html.DIV_OUTPUT, function(output) { can.page.styleHeight(can, output, height) }) }), can.onengine.signal(can, chat.ONSIZE, can.request({}, {height: height, width: width})) }, - background: function(can, url, target) { can.page.style(can, target||document.body, "background-image", url == "" || url == "void"? "": 'url("'+url+'")') }, + background: function(can, url, target) { can.page.style(can, target||can._root._target, "background-image", url == "" || url == "void"? "": 'url("'+url+'")') }, figure: function(event, can, target, right) { if (!event || !event.target) { return {} } target = target||can._fields||can._target var rect = event.target == document.body? {left: can.page.width()/2, top: can.page.height()/2, right: can.page.width()/2, bottom: can.page.height()/2}: event.target.getBoundingClientRect() var layout = right? {left: rect.right, top: rect.top}: {left: rect.left, top: rect.bottom} @@ -374,9 +350,9 @@ Volcanos(chat.ONLAYOUT, {_init: function(can, target) { target = target||documen }, }) Volcanos(chat.ONMOTION, {_init: function(can, target) { - document.body.onclick = function(event) { if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } + 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) } - can.page.Select(can, document.body, can.page.Keys("div.carte.float"), function(target) { can.page.Remove(can, target) }) + can.page.Select(can, target, can.page.Keys("div.carte.float"), function(target) { can.page.Remove(can, target) }) } }, story: { @@ -474,7 +450,7 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { }, }) Volcanos(chat.ONKEYMAP, {_init: function(can, target) { - can.onkeymap._build(can), document.body.onkeydown = function(event) { + can.onkeymap._build(can), target.onkeydown = function(event) { if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } var msg = can.request(event, {"model": "normal"}); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } if (can.user.isWebview && event.metaKey) { msg.Option("model", "webview"); if (event.key >= "0" && event.key <= "9") { @@ -482,7 +458,7 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { } } can.onengine.signal(can, chat.ONKEYDOWN, msg); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } can._keylist = can.onkeymap._parse(event, can, msg.Option("model"), can._keylist, can._output) - }, document.body.onkeyup = function(event) { + }, target.onkeyup = function(event) { if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } var msg = can.request(event, {"model": "normal"}); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } can.onengine.signal(can, chat.ONKEYUP, msg); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } diff --git a/lib/page.js b/lib/page.js index 7d6fe8d0..b9cdbf4a 100644 --- a/lib/page.js +++ b/lib/page.js @@ -188,7 +188,7 @@ Volcanos("page", {ClassList: { } return input }, - replace: function(can, text, key, value) { return can.base.replaceAll(text, "<", "<", ">", ">", key, value) }, + replace: function(can, text, key, value) { return can.base.replaceAll(text, "<", "<", ">", ">", key, value) }, Format: function(type) { var args = arguments; switch (type) { case html.A: return ""+(args[2]||args[1])+"" case html.IMG: return args[2]? "": "" diff --git a/lib/user.js b/lib/user.js index 4954719d..8fb34abb 100644 --- a/lib/user.js +++ b/lib/user.js @@ -43,7 +43,7 @@ Volcanos("user", {info: {}, agent: { can.Conf("display") && name.push(can.Conf("display")) can.user.isWebview && name.push("webview") can.user.mod.isCmd && name.push(chat.SIMPLE) - can.page.styleClass(can, document.body, name.join(ice.SP)) + can.page.styleClass(can, can._root._target, name.join(ice.SP)) }, language: function(can) { return can.misc.Search(can, "language") }, trans: function(can, text, list) { if (can.base.isFunc(text)) { text = text.name||"" } @@ -77,7 +77,7 @@ Volcanos("user", {info: {}, agent: { toast: function(can, content, title, duration, progress) { var meta = can.base.isObject(content)? content: {content: content, title: title||can._help, duration: duration, progress: progress} var width = meta.width||400; if (width < 0) { width = window.innerWidth + width } - var ui = can.page.Append(can, document.body, [{view: [[chat.TOAST, chat.FLOAT]], style: { + var ui = can.page.Append(can, can._root._target, [{view: [[chat.TOAST, chat.FLOAT]], style: { width: width, left: (window.innerWidth-width)/2, bottom: 100, }, list: [ {text: [meta.title||"", html.DIV, html.TITLE], title: "点击复制", onclick: function(event) { @@ -116,8 +116,8 @@ Volcanos("user", {info: {}, agent: { carte: function(event, can, meta, list, cb, parent) { meta = meta||can.ondetail||can.onaction||{}, list = can.base.getValid(list, meta.list, can.core.Item(meta))||[]; if (list.length == 0) { return } cb = cb||function(event, button, meta) { var cb = meta[button]||meta[chat._ENGINE]; can.base.isFunc(cb) && cb(event, can, button) } - parent || can.page.Select(can, document.body, can.page.Keys("div.carte.float"), function(target) { can.page.Remove(can, target) }) - var ui = can.page.Append(can, document.body, [{view: [[chat.CARTE, chat.FLOAT]], onmouseleave: function(event) { + parent || can.page.Select(can, can._root._target, can.page.Keys("div.carte.float"), function(target) { can.page.Remove(can, target) }) + var ui = can.page.Append(can, can._root._target, [{view: [[chat.CARTE, chat.FLOAT]], onmouseleave: function(event) { // can.page.Remove(can, ui._target) }, list: can.core.List(list, function(item, index) { return can.base.isString(item)? item ==""? /* space */ {view: html.SPACE}: /* string */ {view: html.ITEM, list: [{text: can.user.trans(can, item), onclick: function(event) { @@ -142,7 +142,7 @@ Volcanos("user", {info: {}, agent: { input: function(event, can, form, cb, button) { if (!form || form.length == 0) { return cb() } var msg = can.request(event); event = event._event||event; var need = {} - var ui = can.page.Append(can, document.body, [{view: [[html.INPUT, chat.FLOAT]], list: [ + var ui = can.page.Append(can, can._root._target, [{view: [[html.INPUT, chat.FLOAT]], list: [ {view: nfs.CONTENT, list: [{view: [html.OPTION, html.TABLE], list: can.core.List(form, function(item) { item = can.base.isString(item)? {type: html.TEXT, name: item}: item.length > 0? {type: html.SELECT, name: item[0], values: item.slice(1)}: item item.type = item.type||(item.values? html.SELECT: item.name == html.TEXT? html.TEXTAREA: html.TEXT), need[item.name] = item.need @@ -174,7 +174,7 @@ Volcanos("user", {info: {}, agent: { }) }, upload: function(event, can, cb, silent) { var begin = new Date() - var ui = can.page.Append(can, document.body, [{view: [[html.UPLOAD, chat.FLOAT]], list: [ + var ui = can.page.Append(can, can._root._target, [{view: [[html.UPLOAD, chat.FLOAT]], list: [ html.ACTION, {view: html.OUTPUT, list: ["progress"]}, {view: html.STATUS, list: [ice.SHOW, cli.COST, nfs.SIZE]}, ]}]); can.onlayout.figure(event, can, ui._target) var action = can.onappend._action(can, [{type: html.UPLOAD, onchange: function(event) { action.show(event, 0, event.target.files[0].size, 0) }}, cli.CLOSE], ui.action, { @@ -196,7 +196,7 @@ Volcanos("user", {info: {}, agent: { }); can.page.Select(can, ui.action, html.INPUT_FILE)[0].click(), silent && can.onmotion.hidden(can, ui._target); return action }, download: function(can, path, name, ext) { - var a = can.page.Append(can, document.body, [{type: html.A, href: path, download: can.core.Keys(name, ext)||path.split(ice.PS).pop()}]).first + var a = can.page.Append(can, can._root._target, [{type: html.A, href: path, download: can.core.Keys(name, ext)||path.split(ice.PS).pop()}]).first return a.click(), can.page.Remove(can, a), path }, downloads: function(can, text, name, ext) { if (!text) { return } diff --git a/panel/action.js b/panel/action.js index 26008bcc..764817f7 100644 --- a/panel/action.js +++ b/panel/action.js @@ -57,7 +57,7 @@ Volcanos(chat.ONKEYMAP, {_init: function(can, target) { can.onkeymap._build(can) ":": function(event, can) { can.onengine.signal(can, chat.ONCOMMAND_FOCUS), can.onkeymap.prevent(event) }, " ": function(event, can) { can.onengine.signal(can, chat.ONSEARCH_FOCUS), can.onkeymap.prevent(event) }, Enter: function(event, can) { can.onengine.signal(can, chat.ONOPENSEARCH, can.request(event)) }, - Escape: function(event, can, target) { can.page.Select(can, document.body, can.page.Keys(html.FIELDSET_FLOAT, html.DIV_FLOAT), function(target) { can.page.Remove(can, target) }) }, + Escape: function(event, can, target) { can.page.Select(can, can._root._target, can.page.Keys(html.FIELDSET_FLOAT, html.DIV_FLOAT), function(target) { can.page.Remove(can, target) }) }, }, }, _engine: {}, }) @@ -121,7 +121,7 @@ Volcanos(chat.ONACTION, {_init: function(can, target) { can.Conf(html.MARGIN_Y, 2*html.ACTION_HEIGHT), can.Conf(html.MARGIN_X, 0) can.ConfHeight(can.page.height()-can.Conf(html.MARGIN_Y)), can.ConfWidth(can.page.width()) can.page.style(can, can._target, html.HEIGHT, can.page.height(), html.WIDTH, can.page.width()) - can.page.ClassList.add(can, can._target, can.Mode(chat.CMD)), can.page.ClassList.add(can, document.body, chat.SIMPLE) + can.page.ClassList.add(can, can._target, can.Mode(chat.CMD)), can.page.ClassList.add(can, can._root._target, chat.SIMPLE) }, onkeydown: function(can, msg) { var event = msg._event if (event.ctrlKey && event.key >= "1" && event.key <= "9") { diff --git a/panel/footer.js b/panel/footer.js index 20b24e5e..8af8c675 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -64,7 +64,7 @@ Volcanos(chat.ONACTION, {help: "交互数据", _init: function(can, cb) { Volcanos(chat.ONEXPORT, {help: "导出数据", height: function(can) { return can._target.offsetHeight }, float: function(can, msg, name, cb) { if (can[name]) { return can[name].close() } - var ui = can.onappend.field(can, "story toast float", {}, document.body); can[name] = ui + var ui = can.onappend.field(can, "story toast float", {}, can._root._target); can[name] = ui ui.close = function() { can.page.Remove(can, ui.first), delete(can[name]) } ui.refresh = function() { ui.close(), can.toast.click() } @@ -90,7 +90,7 @@ Volcanos(chat.ONEXPORT, {help: "导出数据", sub.onimport.size(sub, sub.ConfHeight(height/2), sub.ConfWidth(width)) can.onmotion.move(can, sub._target, {left: left, top: top+height/4}) }), sub.onaction.close = function() { can.page.Remove(can, sub._target) } - }, document.body) + }, can._root._target) }) }, ncmd: function(can) { can.onexport.float(can, can._cmds, "ncmd", function(value, key, index, line) { @@ -107,7 +107,7 @@ Volcanos(chat.ONEXPORT, {help: "导出数据", sub.run = function(event, cmd, cb) { can.runActionCommand(event, cmds[0], cmd, cb) } sub.onimport.size(sub, height-120-2*html.ACTION_HEIGHT-can.onexport.height(can), width, true) sub.onmotion.move(sub, sub._target, {left: left, top: top+120}) - }, document.body) + }, can._root._target) }) }) }, diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 22277020..7c527aac 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -318,11 +318,11 @@ Volcanos(chat.ONACTION, {help: "控件交互", _trans: {link: "链接", width: " can.runAction(can.request(event, {_toast: "执行中..."}), mdb.ENGINE, [can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.display(can, msg) }) }, clear: function(event, can) { - if (can.page.Select(can, document.body, ".input.float", function(item) { return can.page.Remove(can, item) }).length > 0) { return } + if (can.page.Select(can, can._root._target, ".input.float", function(item) { return can.page.Remove(can, item) }).length > 0) { return } if (can.page.Select(can, can._status, "legend.select", function(item) { return item.click(), item }).length > 0) { return } if (can.ui.display.style.display == "") { return can.onmotion.hidden(can, can.ui.display), can.onimport.layout(can) } if (can.ui.profile.style.display == "") { return can.onmotion.hidden(can, can.ui.profile), can.onimport.layout(can) } - if (can.page.Select(can, document.body, "div.vimer.find.float", function(item) { return can.page.Remove(can, item) }).length > 0) { return } + if (can.page.Select(can, can._root._target, "div.vimer.find.float", function(item) { return can.page.Remove(can, item) }).length > 0) { return } can.onmotion.toggle(can, can.ui.project), can.onimport.layout(can) }, }) diff --git a/plugin/local/wiki/feel.js b/plugin/local/wiki/feel.js index 849f46de..2a0c00dd 100644 --- a/plugin/local/wiki/feel.js +++ b/plugin/local/wiki/feel.js @@ -143,7 +143,7 @@ Volcanos(chat.ONDETAIL, {help: "组件菜单", list: ["关闭", "下载", "删 sub.Status(cli.BEGIN, order+1+ice.PS+can.list.length), sub.Status(nfs.FILE, path) }, can.show(can.order) }) - }, document.body) + }, can._root._target) }, "关闭": function(event, can) { can.page.Remove(can, can.sub._target) }, "下载": function(event, can) { can.user.download(can, path = can.onimport._file(can, can.list[can.order].path)) }, diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index 3aa89ea4..ffd5c79a 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -183,7 +183,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", can.keylist = can.onkeymap._parse(event, can, "normal", can.keylist) }})), can.onkeymap._build(can) - sub.page.style(sub, sub._target, html.BACKGROUND, document.body.style.background) + sub.page.style(sub, sub._target, html.BACKGROUND, can._root._target.style.background) sub.page.style(sub, sub._output, html.HEIGHT, can.page.height()-2*html.ACTION_HEIGHT) sub.page.style(sub, sub._output, html.WIDTH, can.page.width()) @@ -207,7 +207,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", var from = new Date(); can.core.Timer({interval: 100}, function() { var now = new Date() sub.Status(cli.COST, can.base.Duration(now-from)) }) - }, document.body) + }, can._root._target) }, view: function(event, can) { if (can._height) { diff --git a/plugin/state.js b/plugin/state.js index 2ead51ec..19437420 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -44,7 +44,7 @@ Volcanos(chat.ONIMPORT, {_process: function(can, msg) { sub.onimport.size(sub, can.base.Max(height, can.page.height())-top-2*html.ACTION_HEIGHT-(can.user.isMobile&&!can.user.isLandscape()? 2*html.ACTION_HEIGHT: 0), width, true) can.onmotion.move(can, sub._target, {left: left, top: top}) }) - }, document.body) }); return true + }, can._root._target) }); return true }, _hold: function(can, msg, _arg) { return _arg && can.user.toast(can, _arg), true }, diff --git a/plugin/story/video.js b/plugin/story/video.js index 32d6fc19..8b51b91f 100644 --- a/plugin/story/video.js +++ b/plugin/story/video.js @@ -8,7 +8,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar }) }, select: function(can, msg) { - msg.Clear(), can.page.Select(can, document.body, can.Option("tags"), function(a, index) { + msg.Clear(), can.page.Select(can, can._root._target, can.Option("tags"), function(a, index) { msg.Push(mdb.INDEX, index) msg.Push(mdb.NAME, a.innerText) msg.Push(mdb.LINK, a.href) @@ -33,7 +33,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", }) }, play: function(event, can) { - can.page.SelectAll(can, document.body, html.VIDEO, function(video) { + can.page.SelectAll(can, can._root._target, html.VIDEO, function(video) { video.playbackRate = parseFloat(can.Option("rate")) video.currentTime = parseInt(can.Option("skip")) video.ontimeupdate = function(event) { diff --git a/proto.js b/proto.js index e6e3840a..f97b6a45 100644 --- a/proto.js +++ b/proto.js @@ -137,6 +137,7 @@ var chat = { STATE: "state", MENUS: "menus", SSO: "sso", LOCATION: "location", SIMPLE: "simple", OUTPUT: "output", FLOAT: "float", FULL: "full", CMD: "cmd", + HEADER: "Header", ACTION: "Action", libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"], panel_list: [ {name: "Header", pos: "head", state: ["time", "usernick", "avatar"]}, @@ -231,7 +232,7 @@ function shy(help, meta, list, cb) { var args = arguments, i = 0 }; var _can_name = "", _can_path = "" var Volcanos = shy({iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {}}, function(name, can, libs, cb) { var meta = arguments.callee.meta, list = arguments.callee.list; if (typeof name == lang.OBJECT) { - if (name.length > 0) { return Volcanos({panels: [{name: "Header", pos: html.HIDE, state: [aaa.USERNICK]}, {name: "Action", pos: html.MAIN, tool: name}]}) } + if (name.length > 0) { return Volcanos({panels: [{name: chat.HEADER, pos: html.HIDE, state: [aaa.USERNICK]}, {name: chat.ACTION, pos: html.MAIN, tool: name}]}) } var Config = name; name = Config.name||ice.CAN, kit.proto(meta, Config), _can_name = "", _can_path = "" meta.iceberg = Config.iceberg||meta.iceberg, meta.libs = Config.libs||chat.libs, panels = Config.panels||chat.panel_list libs = [], panels.forEach(function(p) { p && (libs = libs.concat(p.list = p.list||["/panel/"+p.name+nfs._CSS, "/panel/"+p.name+nfs._JS])) }), libs = libs.concat(Config.plugin||chat.plugin_list) @@ -269,340 +270,6 @@ var Volcanos = shy({iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {} }); return msg }, - runActionCommand: function(event, index, args, cb) { - can.runAction(event, ice.RUN, can.misc.concat(can, [index], args), cb, true) - }, - runAction: function(event, action, args, cb, silent) { - can.run(can.request(event, {_handle: ice.TRUE}, can.Option()), can.misc.concat(can, [ctx.ACTION].concat(action), args), cb, silent) - }, - - search: function(event, cmds, cb) { - if (cmds && typeof cmds == lang.OBJECT && cmds.length > 0 && typeof cmds[0] == lang.OBJECT && cmds[0].length > 0 ) { cmds[0] = cmds[0].join(ice.PT) } - return can.run && can.run(event, [chat._SEARCH].concat(cmds), cb, true) - }, - get: function(name, key, cb) { var value; can.search({}, [can.core.Keys(name, chat.ONEXPORT, key)], cb||function(msg) { value = msg.Result() }); return value }, - set: function(name, key, value) { var msg = can.request(); msg.Option(key, value); return can.search(msg, [[name, chat.ONIMPORT, key]]) }, - setHeaderMenu: function(list, cb) { can._menu && can.page.Remove(can, can._menu) - return can._menu = can.search(can.request({}, {trans: can.onaction._trans}), [["Header", chat.ONIMPORT, html .MENU], can._name].concat(list), cb) - }, - setHeader: function(key, value) { return can.set("Header", key, value) }, - getHeader: function(key, cb) { return can.get("Header", key, cb) }, - setAction: function(key, value) { return can.set("Action", key, value) }, - getAction: function(key, cb) { return can.get("Action", key, cb) }, - getActionSize: function(cb) { return can.get("Action", "size", cb) }, - - isStoryType: function(value) { return can.page.ClassList.has(can, can._fields, "story") }, - isSimpleMode: function(value) { return can.Mode() == chat.SIMPLE }, - isOutputMode: function(value) { return can.Mode() == chat.OUTPUT }, - isFloatMode: function(value) { return can.Mode() == chat.FLOAT }, - isFullMode: function(value) { return can.Mode() == chat.FULL }, - isCmdMode: function(value) { return can.Mode() == chat.CMD }, - isAutoMode: function(value) { return can.Mode() == "" }, - Mode: function(value) { return can.Conf(ice.MODE, value) }, - ConfDefault: function(value) { can.core.Item(value, function(k, v) { can.Conf(k) || can.Conf(k, v) }) }, - ConfHeight: function(value) { return can.Conf(html.HEIGHT, value) }, - ConfWidth: function(value) { return can.Conf(html.WIDTH, value) }, - Conf: function(key, value) { var res = can._conf - for (var i = 0; i < arguments.length; i += 2) { - if (typeof key == lang.OBJECT) { res = can.core.Value(can._conf, arguments[i]), i--; continue } - res = can.core.Value(can._conf, arguments[i], arguments[i+1]) - } return can.base.isUndefined(res) && key.indexOf(ctx.FEATURE+ice.PT) == -1? can.Conf(can.core.Keys(ctx.FEATURE, key)): res - }, _conf: {}, - }; can = kit.proto(can||{}, kit.proto(proto, meta)), _can_path = _can_name||_can_path - - if (_can_name) { meta.cache[_can_name] = meta.cache[_can_name]||[], meta.cache[_can_name].push(can) } else { list.push(can) } - if (libs && libs.length > 0) { for (var i = 0; i < libs.length; i++) { if (libs[i] == undefined) { continue } - if (libs[i] == "") { libs[i] = _can_path.replace(nfs._JS, nfs._CSS) } - if (libs[i][0] != ice.PS && libs[i].indexOf(ice.HTTP) != 0) { libs[i] = _can_path.slice(0, _can_path.lastIndexOf(ice.PS)+1)+libs[i] } - } } if (can._follow) { libs = libs.concat(meta.libs, meta.volcano) } - return can.require(libs, cb), can -}) -try { if (typeof(window) == lang.OBJECT) { // chrome - Volcanos.meta.target = document.body, Volcanos.meta._height = window.innerHeight, Volcanos.meta._width = window.innerWidth - Volcanos.meta._load = function(url, cb) { switch (url.split("?")[0].split(ice.PT).pop().toLowerCase()) { - case nfs.CSS: var item = document.createElement(mdb.LINK); item.rel = "stylesheet", item.href = url, item.onload = cb, document.head.appendChild(item); break - default: var item = document.createElement(nfs.SCRIPT); item.src = url, item.onerror = cb, item.onload = cb, document.body.appendChild(item) - } } -} else { // nodejs - global.kit = kit, global.ice = ice - global.ctx = ctx, global.cli = cli, global.aaa = aaa, global.web = web - global.mdb = mdb, global.ssh = ssh, global.nfs = nfs, global.tcp = tcp - global.code = code, global.wiki = wiki, global.chat = chat, global.team = team, global.mall = mall - global.svg = svg, global.html = html, global.lang = lang - global.shy = shy, global.Volcanos = Volcanos -} } catch (e) { console.log(e) } - -var kit = {proto: function(sub, sup) { return sub.__proto__ = sup, sub }, - Dict: function() { var res = {}, args = arguments; for (var i = 0; i < args.length; i += 2) { - if (typeof args[i] == "object") { for (var k in args[i]) { res[k] = args[i][k] } i-- } else if (typeof args[i] == "string" && args[i]) { res[args[i]] = args[i+1] } - } return res }, -} -var ice = { - TB: "\t", SP: " ", DF: ":", EQ: "=", AT: "@", PS: "/", PT: ".", FS: ",", NL: "\n", LT: "<", GT: ">", - OK: "ok", TRUE: "true", FALSE: "false", SUCCESS: "success", FAILURE: "failure", PROCESS: "process", - - AUTO: "auto", HTTP: "http", HELP: "help", COPY: "copy", - LIST: "list", BACK: "back", SHOW: "show", HIDE: "hide", - VIEW: "view", MODE: "mode", SHIP: "ship", EXEC: "exec", - - POD: "pod", CTX: "ctx", CMD: "cmd", ARG: "arg", OPT: "opt", - CAN: "can", RUN: "run", RES: "res", ERR: "err", - - MSG_DETAIL: "detail", - MSG_OPTION: "option", - MSG_APPEND: "append", - MSG_RESULT: "result", - MSG_FIELDS: "fields", - MSG_SESSID: "sessid", - - MSG_SOURCE: "_source", - MSG_TARGET: "_target", - MSG_HANDLE: "_handle", - MSG_DAEMON: "_daemon", - MSG_UPLOAD: "_upload", - MSG_ACTION: "_action", - MSG_STATUS: "_status", - MSG_PREFIX: "_prefix", - - MSG_PROCESS: "_process", - MSG_DISPLAY: "_display", - MSG_TOOLKIT: "_toolkit", - PROCESS_AGAIN: "_again", - - MSG_TITLE: "sess.title", - MSG_TOPIC: "sess.topic", - MSG_RIVER: "sess.river", - MSG_STORM: "sess.storm", - MSG_TOAST: "sess.toast", - - MSG_USERNAME: "user.name", - MSG_USERNICK: "user.nick", - - LOG_DISABLE: "log.disable", - - ErrWarn: "warn: ", - ErrNotLogin: "not login: ", - ErrNotRight: "not right: ", - ErrNotFound: "not found: ", - ErrNotValid: "not valid: ", -} - -var ctx = { - CONTEXT: "context", COMMAND: "command", CONFIG: "config", INPUTS: "inputs", FEATURE: "feature", - INDEX: "index", ARGS: "args", STYLE: "style", DISPLAY: "display", ACTION: "action", -} -var cli = { - DAEMON: "daemon", START: "start", STOP: "stop", OPEN: "open", CLOSE: "close", BEGIN: "begin", END: "end", - COLOR: "color", WHITE: "white", BLACK: "black", RED: "red", GREEN: "green", BLUE: "blue", - YELLOW: "yellow", CYAN: "cyan", PURPLE: "purple", MAGENTA: "magenta", - MAKE: "make", MAIN: "main", DONE: "done", COST: "cost", FROM: "from", CLEAR: "clear", -} -var aaa = { - LOGIN: "login", LOGOUT: "logout", INVITE: "invite", TOKEN: "token", - PASSWORD: "password", USERNAME: "username", USERNICK: "usernick", BACKGROUND: "background", AVATAR: "avatar", - LANGUAGE: "language", ENGLISH: "english", CHINESE: "chinese", - VOID: "void", TECH: "tech", -} -var web = { - SPACE: "space", DREAM: "dream", SHARE: "share", - WEBSITE: "website", REFRESH: "refresh", CLEAR: "clear", UPLOAD: "upload", DOWNLOAD: "download", - SHARE_CACHE: "/share/cache/", - - GET: "GET", PUT: "PUT", POST: "POST", DELETE: "DELETE", - Accept: "Accept", ContentType: "Content-Type", - ContentJSON: "application/json", ContentFORM: "application/x-www-form-urlencoded", -} -var mdb = { - DICT: "dict", META: "meta", HASH: "hash", LIST: "list", - - ID: "id", KEY: "key", TIME: "time", ZONE: "zone", TYPE: "type", NAME: "name", TEXT: "text", LINK: "link", SCAN: "scan", HELP: "help", - SHORT: "short", FIELD: "field", TOTAL: "total", COUNT: "count", LIMIT: "limit", - INDEX: "index", VALUE: "value", EXTRA: "extra", ALIAS: "alias", EXPIRE: "expire", - - CREATE: "create", REMOVE: "remove", INSERT: "insert", DELETE: "delete", MODIFY: "modify", SELECT: "select", - INPUTS: "inputs", PRUNES: "prunes", EXPORT: "export", IMPORT: "import", - SEARCH: "search", ENGINE: "engine", RENDER: "render", PLUGIN: "plugin", - - MAIN: "main", PAGE: "page", NEXT: "next", PREV: "prev", LIMIT: "limit", OFFEND: "offend", - FOREACH: "*", RANDOMS: "%", -} -var ssh = { -} -var nfs = { - PATH: "path", FILE: "file", LINE: "line", SIZE: "size", - SAVE: "save", LOAD: "load", FIND: "find", GREP: "grep", TAGS: "tags", - DIR: "dir", CAT: "cat", DEFS: "defs", TRASH: "trash", SCRIPT: "script", CONTENT: "content", DIR_ROOT: "dir_root", PWD: "./", - HTML: "html", CSS: "css", JS: "js", GO: "go", SH: "sh", CSV: "csv", JSON: "json", - ZML: "zml", IML: "iml", TXT: "txt", PNG: "png", - _CSS: ".css", _JS: ".js", -} -var tcp = { - HOST: "host", PORT: "port", -} -var lex = { - SPLIT: "split", PREFIX: "prefix", SUFFIX: "suffix", -} -var gdb = { - SIGNAL: "signal", -} -var log = { - INFO: "info", WARN: "warn", ERROR: "error", DEBUG: "debug", TRACE: "trace", -} - -var code = { - FAVOR: "favor", XTERM: "xterm", INNER: "inner", VIMER: "vimer", - WEBPACK: "webpack", BINPACK: "binpack", AUTOGEN: "autogen", COMPILE: "compile", PUBLISH: "publish", - COMMENT: "comment", KEYWORD: "keyword", CONSTANT: "constant", DATATYPE: "datatype", FUNCTION: "function", - TEMPLATE: "template", COMPLETE: "complete", NAVIGATE: "navigate", -} -var wiki = { - TITLE: "title", BRIEF: "brief", REFER: "refer", SPARK: "spark", - ORDER: "order", TABLE: "table", CHART: "chart", IMAGE: "image", VIDEO: "video", - FIELD: "field", SHELL: "shell", LOCAL: "local", PARSE: "parse", - NAVMENU: "navmenu", PREMENU: "premenu", CONTENT: "content", - STORY_ITEM: ".story", H2: "h2.story", H3: "h3.story", -} -var chat = { - LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", STORY: "story", - TOAST: "toast", CARTE: "carte", INPUT: "input", UPLOAD: "upload", CONTEXTS: "contexts", - LAYOUT: "layout", PROJECT: "project", CONTENT: "content", DISPLAY: "display", PROFILE: "profile", - TITLE: "title", TOPIC: "topic", BLACK: "black", WHITE: "white", PRINT: "print", - SHARE: "share", RIVER: "river", STORM: "storm", FIELD: "field", TOOL: "tool", - STATE: "state", MENUS: "menus", SSO: "sso", LOCATION: "location", - SIMPLE: "simple", OUTPUT: "output", FLOAT: "float", FULL: "full", CMD: "cmd", - - libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"], - panel_list: [ - {name: "Header", pos: "head", state: ["time", "usernick", "avatar"]}, - {name: "River", pos: "left"}, {name: "Action", pos: "main"}, {name: "Search", pos: "auto"}, - {name: "Footer", pos: "foot", state: ["ncmd", "ntip"]}, - ], - plugin_list: [ - "/plugin/state.js", - "/plugin/input.js", - "/plugin/table.js", - "/plugin/input/key.js", - "/plugin/input/date.js", - "/plugin/story/spide.js", - "/plugin/story/trend.js", - "/plugin/local/code/xterm.js", - "/plugin/local/code/vimer.js", - "/plugin/local/code/inner.js", - "/plugin/local/code/inner/syntax.js", - "/plugin/local/wiki/draw/path.js", - "/plugin/local/wiki/draw.js", - "/plugin/local/wiki/word.js", - "/plugin/local/team/plan.js", - "/plugin/local/mall/goods.js", - ], PLUGIN_INPUT: "/plugin/input/", PLUGIN_STORY: "/plugin/story/", PLUGIN_LOCAL: "/plugin/local/", - PLUGIN_STATE_JS: "/plugin/state.js", PLUGIN_INPUT_JS: "/plugin/input.js", PLUGIN_TABLE_JS: "/plugin/table.js", - ONENGINE: "onengine", ONDAEMON: "ondaemon", ONAPPEND: "onappend", ONLAYOUT: "onlayout", ONMOTION: "onmotion", ONKEYMAP: "onkeymap", - ONIMPORT: "onimport", ONSYNTAX: "onsyntax", ONFIGURE: "onfigure", ONACTION: "onaction", ONDETAIL: "ondetail", ONEXPORT: "onexport", ONPLUGIN: "onplugin", - - ONMAIN: "onmain", ONLOGIN: "onlogin", ONREMOTE: "onremote", ONSEARCH: "onsearch", - ONSIZE: "onsize", ONTOAST: "ontoast", ONSHARE: "onshare", ONPRINT: "onprint", - ONRESIZE: "onresize", ONKEYUP: "onkeyup", ONKEYDOWN: "onkeydown", ONMOUSEENTER: "onmouseenter", ORIENTATIONCHANGE: "orientationchange", - ONSTORM_SELECT: "onstorm_select", ONACTION_NOTOOL: "onaction_notool", ONACTION_TOUCH: "onaction_touch", ONACTION_CMD: "onaction_cmd", - ONOPENSEARCH: "onopensearch", ONSEARCH_FOCUS: "onsearch_focus", ONCOMMAND_FOCUS: "oncommand_focus", - - _INIT: "_init", _TRANS: "_trans", _ENGINE: "_engine", _SEARCH: "_search", _OUTPUTS_CURRENT: "_outputs.-1", - _NAMES: "_names", _TOAST: "_toast", -} -var team = { - TASK: "task", PLAN: "plan", -} -var mall = { - COUNT: "count", PRICE: "price", - ASSET: "asset", SALARY: "salary", -} - -var svg = { - GROUP: "group", PID: "pid", GRID: "grid", - SHAPE: "shape", TEXT: "text", RECT: "rect", LINE: "line", CIRCLE: "circle", ELLIPSE: "ellipse", - STROKE_WIDTH: "stroke-width", STROKE: "stroke", FILL: "fill", FONT_SIZE: "font-size", FONT_FAMILY: "font-family", MONOSPACE: "monospace", TEXT_ANCHOR: "text-anchor", - G: "g", X: "x", Y: "y", R: "r", RX: "rx", RY: "ry", CX: "cx", CY: "cy", X1: "x1", Y1: "y1", X2: "x2", Y2: "y2", - PATH: "path", PATH2V: "path2v", PATH2H: "path2h", - M: "M", Q: "Q", T: "T", -} -var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 31, ACTION_MARGIN: 200, - FIELDSET: "fieldset", LEGEND: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status", - FORM_OPTION: "form.option", DIV_ACTION: "div.action", DIV_OUTPUT: "div.output", DIV_STATUS: "div.status", - FIELDSET_PANEL: "fieldset.panel", FIELDSET_PLUGIN: "fieldset.plugin", FIELDSET_STORY: "fieldset.story", FIELDSET_FLOAT: "fieldset.float", - FIELDSET_HEAD: "fieldset.head", FIELDSET_FOOT: "fieldset.foot", FIELDSET_LEFT: "fieldset.left", FIELDSET_MAIN: "fieldset.main", - OPTION_ARGS: "select.args,input.args,textarea.args", INPUT_ARGS: "input.args,textarea.args", INPUT_BUTTON: "input[type=button]", INPUT_FILE: "input[type=file]", - - INPUT: "input", TEXT: "text", TEXTAREA: "textarea", SELECT: "select", BUTTON: "button", - FORM: "form", FILE: "file", CLICK: "click", SUBMIT: "submit", CANCEL: "cancel", UPLOAD: "upload", USERNAME: "username", PASSWORD: "password", - TABLE: "table", THEAD: "thead", TBODY: "tbody", TR: "tr", TH: "th", TD: "td", BR: "br", UL: "ul", LI: "li", - H1: "h1", H2: "h2", H3: "h3", A: "a", LABEL: "label", INNER: "inner", TITLE: "title", - SPAN: "span", CODE: "code", DIV: "div", IMG: "img", VIDEO: "video", SPACE: "space", - WSS: "wss", SVG: "svg", CANVAS: "canvas", IFRAME: "iframe", CHROME: "chrome", - - CLASS: "class", DISPLAY: "display", BLOCK: "block", NONE: "none", HIDDEN: "hidden", TOGGLE: "toggle", - HEIGHT: "height", WIDTH: "width", PADDING: "padding", MARGIN: "margin", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom", - MIN_HEIGHT: "min-height", MAX_HEIGHT: "max-height", MIN_WIDTH: "min-width", MAX_WIDTH: "max-width", MARGIN_TOP: "margin-top", MARGIN_X: "margin-x", MARGIN_Y: "margin-y", - BACKGROUND: "background", OPACITY: "opacity", OVERFLOW: "overflow", SCROLL: "scroll", SPEED: "speed", FLOAT: "float", CLEAR: "clear", BOTH: "both", - - PAGE: "page", TABS: "tabs", MENU: "menu", NODE: "node", - ZONE: "zone", LIST: "list", ITEM: "item", NAME: "name", ICON: "icon", - HEAD: "head", LEFT: "left", MAIN: "main", FOOT: "foot", AUTO: "auto", SHOW: "show", HIDE: "hide", - PLUGIN: "plugin", LAYOUT: "layout", CONTENT: "content", - - DIV_PAGE: "div.page", DIV_TABS: "div.tabs", - DIV_ZONE: "div.zone", DIV_LIST: "div.list", DIV_ITEM: "div.item", DIV_NAME: "div.name", - DIV_LAYOUT_HEAD: "div.layout.head", DIV_LAYOUT_FOOT: "div.layout.foot", DIV_LAYOUT_LEFT: "div.layout.left", - DIV_CODE: "div.code", DIV_FLOAT: "div.float", DIV_CONTENT: "div.content", TABLE_CONTENT: "table.content", -} -var lang = { - UNDEFINED: "undefined", STRING: "string", NUMBER: "number", BOOLEAN: "boolean", FUNCTION: "function", OBJECT: "object", - META: "Meta", ALT: "Alt", CONTROL: "Control", SHIFT: "Shift", TAB: "Tab", ENTER: "Enter", ESCAPE: "Escape", - CMD: "Cmd", CTRL: "Ctrl", SPACE: "Space", BACKSPACE: "Backspace", ESC: "Esc", PS: "/", -} - -function shy(help, meta, list, cb) { var args = arguments, i = 0 - function next(type) { if (i < args.length && (!type || type == typeof args[i])) { return args[i++] } } - return cb = typeof args[args.length-1] == lang.FUNCTION? args[args.length-1]: function() {}, cb.help = next(lang.STRING)||"", cb.meta = next(lang.OBJECT)||{}, cb.list = next(lang.OBJECT)||[], cb -}; var _can_name = "", _can_path = "" -var Volcanos = shy({iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {}}, function(name, can, libs, cb) { - var meta = arguments.callee.meta, list = arguments.callee.list; if (typeof name == lang.OBJECT) { - if (name.length > 0) { return Volcanos({panels: [{name: "Header", pos: html.HIDE, state: [aaa.USERNICK]}, {name: "Action", pos: html.MAIN, tool: name}]}) } - var Config = name; name = Config.name||ice.CAN, kit.proto(meta, Config), _can_name = "", _can_path = "" - meta.iceberg = Config.iceberg||meta.iceberg, meta.libs = Config.libs||chat.libs, panels = Config.panels||chat.panel_list - libs = [], panels.forEach(function(p) { p && (libs = libs.concat(p.list = p.list||["/panel/"+p.name+nfs._CSS, "/panel/"+p.name+nfs._JS])) }), libs = libs.concat(Config.plugin||chat.plugin_list) - cb = can||function(can) { can.onengine._init(can, can.Conf(Config), panels, Config._init||meta._init, can._target) } - can = {_follow: name, _target: Config.target||meta.target, _height: Config.height||meta._height, _width: Config.width||meta._width} - } - var proto = {_path: _can_path, _name: name, _load: function(name, cbs) { var cache = meta.cache[name]||[] - for (list.reverse(); list.length > 0; list) { var sub = list.pop(); sub != can && cache.push(sub) } meta.cache[name] = cache - cache.forEach(function(sub) { var name = sub._name; if (typeof cbs == lang.FUNCTION && cbs(can, name, sub)) { return } - can[name] = can[name]||{}; for (var k in sub) { can[name].hasOwnProperty(k) || sub.hasOwnProperty(k) && (can[name][k] = sub[k]) } - }) - }, - requireModules: function(libs, cb, cbs) { - for (var i = 0; i < libs.length; i++) { if (libs[i].indexOf(ice.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] = "/require/node_modules/"+libs[i] - } can.require(libs, cb, cbs) - }, - require: function(libs, cb, cbs) { - if (!libs || libs.length == 0) { return typeof cb == lang.FUNCTION && setTimeout(function() { cb(can) }, 10) } - if (libs[0] == undefined) { return can.require(libs.slice(1), cb, cbs) } - if (libs[0] == "") { libs[0] = can._name.replace(nfs._JS, nfs._CSS) } - if (libs[0][0] != ice.PS && libs[0].indexOf(ice.HTTP) != 0) { libs[0] = can._name.slice(0, can._name.lastIndexOf(ice.PS)+1)+libs[0] } - var name = (libs[0].indexOf(ice.HTTP) == 0? libs[0]: libs[0].split("?")[0]).toLowerCase() - function next() { can._load(name, cbs), can.require(libs.slice(1), cb, cbs) } - meta.cache[name]? next(): (_can_path = libs[0], meta._load(name, next)) - }, - request: function(event) { event = event||{}, event = event._event||event - var msg = event._msg||can.misc.Message(event, can); event._msg = msg - function set(key, value) { value == "" || msg.Option(key) || msg.Option(key, value) } - can.core.List(arguments, function(item, index) { if (!item || index == 0) { return } - can.base.isFunc(item.Option)? can.core.List(item.Option(), function(key) { - key.indexOf("_") == 0 || key.indexOf("user.") == 0 || set(key, item.Option(key)) - }): can.core.Item(can.base.isFunc(item)? item(): item, set) - }); return msg - }, - runActionCommand: function(event, index, args, cb) { can.runAction(event, ice.RUN, can.misc.concat(can, [index], args), cb, true) }, runAction: function(event, action, args, cb, silent) { can.run(can.request(event, {_handle: ice.TRUE}, can.Option()), can.misc.concat(can, [ctx.ACTION].concat(action), args), cb, silent) @@ -615,7 +282,7 @@ var Volcanos = shy({iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {} get: function(name, key, cb) { var value; can.search({}, [can.core.Keys(name, chat.ONEXPORT, key)], cb||function(msg) { value = msg.Result() }); return value }, set: function(name, key, value) { var msg = can.request(); msg.Option(key, value); return can.search(msg, [[name, chat.ONIMPORT, key]]) }, setHeaderMenu: function(list, cb) { can._menu && can.page.Remove(can, can._menu) - return can._menu = can.search(can.request({}, {trans: can.onaction._trans}), [["Header", chat.ONIMPORT, html .MENU], can._name].concat(list), cb) + return can._menu = can.search(can.request({}, {trans: can.onaction._trans}), [[chat.HEADER, chat.ONIMPORT, html .MENU], can._name].concat(list), cb) }, setHeader: function(key, value) { return can.set("Header", key, value) }, getHeader: function(key, cb) { return can.get("Header", key, cb) }, @@ -623,7 +290,7 @@ var Volcanos = shy({iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {} getAction: function(key, cb) { return can.get("Action", key, cb) }, getActionSize: function(cb) { return can.get("Action", "size", cb) }, - isStoryType: function(value) { return can.page.ClassList.has(can, can._fields, "story") }, + isStoryType: function(value) { return can.page.ClassList.has(can, can._fields, chat.STORY) }, isSimpleMode: function(value) { return can.Mode() == chat.SIMPLE }, isOutputMode: function(value) { return can.Mode() == chat.OUTPUT }, isFloatMode: function(value) { return can.Mode() == chat.FLOAT }, @@ -640,7 +307,7 @@ var Volcanos = shy({iceberg: "/chat/", volcano: "/frame.js", cache: {}, pack: {} res = can.core.Value(can._conf, arguments[i], arguments[i+1]) } return can.base.isUndefined(res) && key.indexOf(ctx.FEATURE+ice.PT) == -1? can.Conf(can.core.Keys(ctx.FEATURE, key)): res }, _conf: {}, - }; can = can||{}, kit.proto(can, proto), kit.proto(proto, meta), _can_path = _can_name||_can_path + }; can = kit.proto(can||{}, kit.proto(proto, meta)), _can_path = _can_name||_can_path if (_can_name) { meta.cache[_can_name] = meta.cache[_can_name]||[], meta.cache[_can_name].push(can) } else { list.push(can) } if (libs && libs.length > 0) { for (var i = 0; i < libs.length; i++) { if (libs[i] == undefined) { continue }