diff --git a/frame.js b/frame.js index 83d0eaad..78a01a36 100644 --- a/frame.js +++ b/frame.js @@ -1,976 +1,976 @@ _can_name = "/frame.js" Volcanos("onengine", {help: "搜索引擎", list: [], _init: function(can, meta, list, cb, target) { - 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) - } - if (can.user.isExtension) { Volcanos.meta.args = JSON.parse(localStorage.getItem(ctx.ARGS))||{} } - can.core.Next(list, function(item, next) { item.type = chat.PANEL - can.onappend._init(can, item, item.list, function(panel) { panel.Conf(item) - panel.run = function(event, cmds, cb) { var msg = panel.request(event); cmds = cmds||[] - return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, panel, cmds, cb) - }, can[item.name] = panel, panel._root = can, panel._trans = panel.onaction && panel.onaction._trans||{} + 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) + } + if (can.user.isExtension) { Volcanos.meta.args = JSON.parse(localStorage.getItem(ctx.ARGS))||{} } + can.core.Next(list, function(item, next) { item.type = chat.PANEL + can.onappend._init(can, item, item.list, function(panel) { panel.Conf(item) + panel.run = function(event, cmds, cb) { var msg = panel.request(event); cmds = cmds||[] + return (can.onengine[cmds[0]]||can.onengine._remote)(event, can, msg, panel, cmds, cb) + }, can[item.name] = panel, panel._root = can, panel._trans = panel.onaction && panel.onaction._trans||{} - can.core.ItemCB(panel.onaction, function(key, cb) { - can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {can: panel, msg: msg}) }) - }), can.core.CallFunc([panel.onaction, "_init"], {can: panel, cb: next, target: panel._target}) - panel.Conf(can.core.Value(can._root, can.core.Keys(chat.RIVER, item.name))) - panel.Conf("style") && can.page.Modify(can, panel._target, {style: panel.Conf("style")}) - }, target) - }, function() { can.misc.Log(can.user.title(), ice.RUN, can) - can.require([can.volcano], null, function(can, name, sub) { can[name] = sub }) - can.onlayout.topic(can), can.onmotion._init(can, target), can.onkeymap._init(can) - can.ondaemon._init(can), can.onengine.signal(can, chat.ONMAIN, can.request()) - can.base.isFunc(cb) && cb() - }), can.onmotion.float.auto(can, document.body) - }, - _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)) - } + can.core.ItemCB(panel.onaction, function(key, cb) { + can.onengine.listen(can, key, function(msg) { can.core.CallFunc(cb, {can: panel, msg: msg}) }) + }), can.core.CallFunc([panel.onaction, "_init"], {can: panel, cb: next, target: panel._target}) + panel.Conf(can.core.Value(can._root, can.core.Keys(chat.RIVER, item.name))) + panel.Conf("style") && can.page.Modify(can, panel._target, {style: panel.Conf("style")}) + }, target) + }, function() { can.misc.Log(can.user.title(), ice.RUN, can) + can.require([can.volcano], null, function(can, name, sub) { can[name] = sub }) + can.onlayout.topic(can), can.onmotion._init(can, target), can.onkeymap._init(can) + can.ondaemon._init(can), can.onengine.signal(can, chat.ONMAIN, can.request()) + can.base.isFunc(cb) && cb() + }), can.onmotion.float.auto(can, document.body) + }, + _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, - "button": key, "cmd": key, "arg": cmds.slice(2), "cmds": cmds.slice(2), - "list": cmds.slice(2), "cb": cb, "target": sub._target, - }, mod) - }, - _engine: function(event, can, msg, panel, cmds, cb) { return false }, - _plugin: function(event, can, msg, panel, cmds, cb) { - if (can.onengine.plugin.meta[cmds[0]]) { - can.core.CallFunc(can.onengine.plugin.meta[cmds[0]], {msg: msg, cmds: cmds.slice(1), cb: cb}) - return true - } - if (cmds[0] == ctx.ACTION && cmds[1] == ice.RUN && can.onengine.plugin.meta[cmds[2]]) { - can.core.CallFunc(can.onengine.plugin.meta[cmds[2]], {msg: msg, cmds: cmds.slice(3), cb: cb}) - return true - } - return false - }, - _remote: function(event, can, msg, panel, cmds, cb) { - if (panel.onengine._engine(event, can, msg, panel, cmds, cb)) { return } - if (panel.onengine._plugin(event, can, msg, panel, cmds, cb)) { return } - can.onengine.signal(can, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds})) + return can.core.CallFunc(fun, { + "event": event, "can": sub, "msg": msg, + "button": key, "cmd": key, "arg": cmds.slice(2), "cmds": cmds.slice(2), + "list": cmds.slice(2), "cb": cb, "target": sub._target, + }, mod) + }, + _engine: function(event, can, msg, panel, cmds, cb) { return false }, + _plugin: function(event, can, msg, panel, cmds, cb) { + if (can.onengine.plugin.meta[cmds[0]]) { + can.core.CallFunc(can.onengine.plugin.meta[cmds[0]], {msg: msg, cmds: cmds.slice(1), cb: cb}) + return true + } + if (cmds[0] == ctx.ACTION && cmds[1] == ice.RUN && can.onengine.plugin.meta[cmds[2]]) { + can.core.CallFunc(can.onengine.plugin.meta[cmds[2]], {msg: msg, cmds: cmds.slice(3), cb: cb}) + return true + } + return false + }, + _remote: function(event, can, msg, panel, cmds, cb) { + if (panel.onengine._engine(event, can, msg, panel, cmds, cb)) { return } + if (panel.onengine._plugin(event, can, msg, panel, cmds, cb)) { return } + can.onengine.signal(can, chat.ONREMOTE, can.request({}, {_follow: panel._follow, _msg: msg, _cmds: cmds})) - var key = can.core.Keys(panel._name, cmds.join(ice.FS)) - if (can.user.isLocalFile) { var msg = can.request(event); msg.Clear(ice.MSG_APPEND) - var res = Volcanos.meta.pack[key]; res? msg.Copy(res): can.user.toast(can, "缺失数据") - return can.base.isFunc(cb) && cb(msg) - } + var key = can.core.Keys(panel._name, cmds.join(ice.FS)) + if (can.user.isLocalFile) { var msg = can.request(event); msg.Clear(ice.MSG_APPEND) + var res = Volcanos.meta.pack[key]; res? msg.Copy(res): can.user.toast(can, "缺失数据") + return can.base.isFunc(cb) && cb(msg) + } - var names = msg.Option("_names")||panel._names||((can.Conf("iceberg")||"/chat/")+panel._name) - can.misc.Run(event, can, {names: names, daemon: can.core.Keys(can.ondaemon._list[0], msg._daemon)}, cmds, function(msg) { - Volcanos.meta.pack[key] = msg, delete(msg._handle), delete(msg._toast) - // if (msg.result && msg.result[0] == ice.ErrWarn) { can.user.toast(can, msg.Result(), "", 10000); return } - can.base.isFunc(cb) && cb(msg) - }) - }, + var names = msg.Option("_names")||panel._names||((can.Conf("iceberg")||"/chat/")+panel._name) + can.misc.Run(event, can, {names: names, daemon: can.core.Keys(can.ondaemon._list[0], msg._daemon)}, cmds, function(msg) { + Volcanos.meta.pack[key] = msg, delete(msg._handle), delete(msg._toast) + // if (msg.result && msg.result[0] == ice.ErrWarn) { can.user.toast(can, msg.Result(), "", 10000); return } + can.base.isFunc(cb) && cb(msg) + }) + }, - listen: shy("监听事件", {}, [], function(can, name, cb) { - arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb) - }), - signal: shy("触发事件", function(can, name, msg) { msg = msg||can.request() - name == chat.ONREMOTE? can.misc.Log("signal", name, msg.Option("_msg")): can.misc.Log("signal", name, msg) - can.core.List(can.onengine.listen.meta[name], function(cb) { - can.core.CallFunc(cb, {msg: msg, event: msg._event}) - }) - }), - plugin: shy("添加插件", {}, [], function(can, name, command) { name = can.base.trimPrefix(name, "can.") - var type = html.TEXT; command.list = can.core.List(command.list, function(item) { - switch (typeof item) { - case lang.OBJECT: return type = item.type||type, item - case lang.STRING: - switch (item) { - case mdb.LIST: - case cli.BACK: return {type: type = html.BUTTON, name: item} - case mdb.NAME: return {type: type = html.TEXT, name: item} - case mdb.TEXT: return {type: type = html.TEXTAREA, name: item} - default: return {type: type, name: item} - } - } - }) - arguments.callee.meta[can.core.Keys("can", name)] = command - }), + listen: shy("监听事件", {}, [], function(can, name, cb) { + arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb) + }), + signal: shy("触发事件", function(can, name, msg) { msg = msg||can.request() + name == chat.ONREMOTE? can.misc.Log("signal", name, msg.Option("_msg")): can.misc.Log("signal", name, msg) + can.core.List(can.onengine.listen.meta[name], function(cb) { + can.core.CallFunc(cb, {msg: msg, event: msg._event}) + }) + }), + plugin: shy("添加插件", {}, [], function(can, name, command) { name = can.base.trimPrefix(name, "can.") + var type = html.TEXT; command.list = can.core.List(command.list, function(item) { + switch (typeof item) { + case lang.OBJECT: return type = item.type||type, item + case lang.STRING: + switch (item) { + case mdb.LIST: + case cli.BACK: return {type: type = html.BUTTON, name: item} + case mdb.NAME: return {type: type = html.TEXT, name: item} + case mdb.TEXT: return {type: type = html.TEXTAREA, name: item} + default: return {type: type, name: item} + } + } + }) + arguments.callee.meta[can.core.Keys("can", name)] = command + }), }) Volcanos("ondaemon", {help: "推荐引擎", list: [], _init: function(can, name) { if (can.user.isLocalFile) { return } - can.misc.WSS(can, {type: html.CHROME, name: can.misc.Search(can, "daemon")||name||""}, function(event, msg, cmd, arg) { if (!msg) { return } - can.base.isFunc(can.ondaemon[cmd])? can.core.CallFunc(can.ondaemon[cmd], { - "can": can, "msg": msg, "cmd": cmd, "arg": arg, "cb": function() { msg.Reply() }, - }): can.onengine._search({}, can, msg, can, ["_search", cmd].concat(arg), function() { - msg.Reply() - }) - }) - can.onengine.listen(can, chat.ONSEARCH, function(msg, word) { var meta = can.onengine.plugin.meta - if (word[0] != "*" && word[0] != ctx.COMMAND) { return } - var list = word[1] == ""? meta: meta[word[1]]? kit.Dict(word[1], meta[word[1]]): {} - can.core.Item(list, function(name, command) { name = can.base.trimPrefix(name, "can.") - can.core.List(msg.Option(ice.MSG_FIELDS).split(ice.FS), function(item) { - msg.Push(item, kit.Dict( - ice.CTX, "onengine", ice.CMD, "command", - mdb.TYPE, "can", mdb.NAME, name, mdb.TEXT, command.help, - ctx.CONTEXT, "can", ctx.COMMAND, name, - )[item]||"") - }) - }) - }) - }, _list: [""], - pwd: function(can, msg, arg) { - can.ondaemon._list[0] = arg[0] - }, - grow: function(can, msg, arg) { - var sub = can.ondaemon._list[msg.Option(ice.MSG_TARGET)] - sub.onimport._grow(sub, can.page.Color(arg.join(""))) - }, - toast: function(can, msg, arg) { - can.onmotion.float.add(can, chat.FLOAT, can.core.CallFunc(can.user.toast, {can: can, msg: msg, cmds: arg})) - }, - confirm: function(can, msg, arg) { - if (can.user.confirm(arg[0])) { msg.Echo(ice.TRUE) } - }, + can.misc.WSS(can, {type: html.CHROME, name: can.misc.Search(can, "daemon")||name||""}, function(event, msg, cmd, arg) { if (!msg) { return } + can.base.isFunc(can.ondaemon[cmd])? can.core.CallFunc(can.ondaemon[cmd], { + "can": can, "msg": msg, "cmd": cmd, "arg": arg, "cb": function() { msg.Reply() }, + }): can.onengine._search({}, can, msg, can, ["_search", cmd].concat(arg), function() { + msg.Reply() + }) + }) + can.onengine.listen(can, chat.ONSEARCH, function(msg, word) { var meta = can.onengine.plugin.meta + if (word[0] != "*" && word[0] != ctx.COMMAND) { return } + var list = word[1] == ""? meta: meta[word[1]]? kit.Dict(word[1], meta[word[1]]): {} + can.core.Item(list, function(name, command) { name = can.base.trimPrefix(name, "can.") + can.core.List(msg.Option(ice.MSG_FIELDS).split(ice.FS), function(item) { + msg.Push(item, kit.Dict( + ice.CTX, "onengine", ice.CMD, "command", + mdb.TYPE, "can", mdb.NAME, name, mdb.TEXT, command.help, + ctx.CONTEXT, "can", ctx.COMMAND, name, + )[item]||"") + }) + }) + }) + }, _list: [""], + pwd: function(can, msg, arg) { + can.ondaemon._list[0] = arg[0] + }, + grow: function(can, msg, arg) { + var sub = can.ondaemon._list[msg.Option(ice.MSG_TARGET)] + sub.onimport._grow(sub, can.page.Color(arg.join(""))) + }, + toast: function(can, msg, arg) { + can.onmotion.float.add(can, chat.FLOAT, can.core.CallFunc(can.user.toast, {can: can, msg: msg, cmds: arg})) + }, + confirm: function(can, msg, arg) { + if (can.user.confirm(arg[0])) { msg.Echo(ice.TRUE) } + }, }) Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, list, cb, target, field) { - meta.name = (meta.name||"").split(ice.SP)[0].split(ice.PT).pop() - field = field||can.onappend.field(can, meta.type, meta, target).first - var legend = can.page.Select(can, field, ice.PT+html.LEGEND)[0]||can.page.Select(can, field, html.LEGEND)[0] - var option = can.page.Select(can, field, html.FORM_OPTION)[0] - var action = can.page.Select(can, field, html.DIV_ACTION)[0] - var output = can.page.Select(can, field, html.DIV_OUTPUT)[0] - var status = can.page.Select(can, field, html.DIV_STATUS)[0] + meta.name = (meta.name||"").split(ice.SP)[0].split(ice.PT).pop() + field = field||can.onappend.field(can, meta.type, meta, target).first + var legend = can.page.Select(can, field, ice.PT+html.LEGEND)[0]||can.page.Select(can, field, html.LEGEND)[0] + var option = can.page.Select(can, field, html.FORM_OPTION)[0] + var action = can.page.Select(can, field, html.DIV_ACTION)[0] + var output = can.page.Select(can, field, html.DIV_OUTPUT)[0] + var status = can.page.Select(can, field, html.DIV_STATUS)[0] - var sub = Volcanos(meta.name, {_follow: can.core.Keys(can._follow, meta.name), _target: field, - _legend: legend, _option: option, _action: action, _output: output, _status: status, - _inputs: {}, _outputs: [], _history: [], + var sub = Volcanos(meta.name, {_follow: can.core.Keys(can._follow, meta.name), _target: field, + _legend: legend, _option: option, _action: action, _output: output, _status: status, + _inputs: {}, _outputs: [], _history: [], - Status: function(key, value) { - if (sub.base.isObject(key)) { return sub.core.Item(key, sub.Status), key } - sub.page.Select(sub, status, [[[html.DIV, key], html.SPAN]], function(item) { - return value == undefined? (value = item.innerHTML): (item.innerHTML = value) - }); return value - }, - Action: function(key, value) { return sub.page.SelectArgs(sub, action, key, value)[0] }, - Option: function(key, value) { return sub.page.SelectArgs(sub, option, key, value)[0] }, - Update: function(event, cmds, cb, silent) { sub.onappend._output0(sub, sub.Conf(), event||{}, cmds||sub.Input(), cb, silent); return true }, - Input: function(cmds, silent) { - cmds = cmds && cmds.length > 0? cmds: sub.page.SelectArgs(sub, option, ""), cmds = can.base.trim(cmds) - silent || cmds[0] == ctx.ACTION || sub.base.Eq(sub._history[sub._history.length-1], cmds) || sub._history.push(cmds) - return cmds - }, - Clone: function() { meta.args = sub.page.SelectArgs(sub, option, "") - can.onappend._init(can, meta, list, function(sub) { can.base.isFunc(cb) && cb(sub, true) - can.core.Timer(10, function() { for (var k in sub._inputs) { can.onmotion.focus(can, sub._inputs[k]._target); break } }) - }, target) - }, - }, list, function(sub) { sub.Conf(meta), meta.feature = sub.base.Obj(meta.feature, {}) - sub.page.ClassList.add(sub, field, meta.index? meta.index.split(ice.PT).pop(): meta.name) - sub.page.ClassList.add(sub, field, meta.style||meta.feature.style||"") + Status: function(key, value) { + if (sub.base.isObject(key)) { return sub.core.Item(key, sub.Status), key } + sub.page.Select(sub, status, [[[html.DIV, key], html.SPAN]], function(item) { + return value == undefined? (value = item.innerHTML): (item.innerHTML = value) + }); return value + }, + Action: function(key, value) { return sub.page.SelectArgs(sub, action, key, value)[0] }, + Option: function(key, value) { return sub.page.SelectArgs(sub, option, key, value)[0] }, + Update: function(event, cmds, cb, silent) { sub.onappend._output0(sub, sub.Conf(), event||{}, cmds||sub.Input(), cb, silent); return true }, + Input: function(cmds, silent) { + cmds = cmds && cmds.length > 0? cmds: sub.page.SelectArgs(sub, option, ""), cmds = can.base.trim(cmds) + silent || cmds[0] == ctx.ACTION || sub.base.Eq(sub._history[sub._history.length-1], cmds) || sub._history.push(cmds) + return cmds + }, + Clone: function() { meta.args = sub.page.SelectArgs(sub, option, "") + can.onappend._init(can, meta, list, function(sub) { can.base.isFunc(cb) && cb(sub, true) + can.core.Timer(10, function() { for (var k in sub._inputs) { can.onmotion.focus(can, sub._inputs[k]._target); break } }) + }, target) + }, + }, list, function(sub) { sub.Conf(meta), meta.feature = sub.base.Obj(meta.feature, {}) + sub.page.ClassList.add(sub, field, meta.index? meta.index.split(ice.PT).pop(): meta.name) + sub.page.ClassList.add(sub, field, meta.style||meta.feature.style||"") - sub.page.Modify(sub, sub._legend, {onmouseenter: function(event) { - sub.user.carte(event, sub, sub.onaction, sub.onaction.list.concat([["所有 ->"].concat(can.core.Item(meta.feature._trans))], [cli.CLOSE])) - }}) + sub.page.Modify(sub, sub._legend, {onmouseenter: function(event) { + sub.user.carte(event, sub, sub.onaction, sub.onaction.list.concat([["所有 ->"].concat(can.core.Item(meta.feature._trans))], [cli.CLOSE])) + }}) - if (meta.msg) { var msg = sub.request(); msg.Copy(sub.base.Obj(meta.msg)) - meta.inputs && sub.onappend._option(sub, meta, sub._option, true) - sub.onappend._output(sub, msg, msg.Option(ice.MSG_DISPLAY)) - } else { - meta.inputs && sub.onappend._option(sub, meta, sub._option) - } + if (meta.msg) { var msg = sub.request(); msg.Copy(sub.base.Obj(meta.msg)) + meta.inputs && sub.onappend._option(sub, meta, sub._option, true) + sub.onappend._output(sub, msg, msg.Option(ice.MSG_DISPLAY)) + } else { + meta.inputs && sub.onappend._option(sub, meta, sub._option) + } - can.base.isFunc(cb) && cb(sub) - }); return sub - }, - _option: function(can, meta, option, skip) { meta = meta||{}; var index = -1, args = can.base.Obj(meta.args||meta.arg||meta.opt, []), opts = can.base.Obj(meta.opts, {}) - function add(item, next) { item.type != html.BUTTON && index++ - return Volcanos(item.name, {_follow: can.core.Keys(can._follow, item.name), - _target: can.onappend.input(can, item, args[index]||opts[item.name], option||can._option), - _option: can._option, _action: can._action, _output: can._output, _status: can._status, - Option: can.Option, Action: can.Action, Status: can.Status, CloneField: can.Clone, - CloneInput: function() { can.onmotion.focus(can, add(item)._target) }, - }, [item.display||chat.PLUGIN_INPUT_JS], function(input) { input.Conf(item) - input.run = function(event, cmds, cb, silent) { var msg = can.request(event) - if (msg.RunAction(event, can.core.Value(can, "_outputs.-1"), cmds)) { return } - if (msg.RunAction(event, input, cmds)) { return } - return can.Update(event, can.Input(cmds, silent), cb, silent) - }, can._inputs[item.name] = input, input.sup = can + can.base.isFunc(cb) && cb(sub) + }); return sub + }, + _option: function(can, meta, option, skip) { meta = meta||{}; var index = -1, args = can.base.Obj(meta.args||meta.arg||meta.opt, []), opts = can.base.Obj(meta.opts, {}) + function add(item, next) { item.type != html.BUTTON && index++ + return Volcanos(item.name, {_follow: can.core.Keys(can._follow, item.name), + _target: can.onappend.input(can, item, args[index]||opts[item.name], option||can._option), + _option: can._option, _action: can._action, _output: can._output, _status: can._status, + Option: can.Option, Action: can.Action, Status: can.Status, CloneField: can.Clone, + CloneInput: function() { can.onmotion.focus(can, add(item)._target) }, + }, [item.display||chat.PLUGIN_INPUT_JS], function(input) { input.Conf(item) + input.run = function(event, cmds, cb, silent) { var msg = can.request(event) + if (msg.RunAction(event, can.core.Value(can, "_outputs.-1"), cmds)) { return } + if (msg.RunAction(event, input, cmds)) { return } + return can.Update(event, can.Input(cmds, silent), cb, silent) + }, can._inputs[item.name] = input, input.sup = can - can.core.ItemCB(input.onaction, function(key, cb) { - input._target[key] = function(event) { cb(event, input) } - }), skip? next(): can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target]); - can.core.ItemCB(item, function(key, cb) { - input._target[key] = function(event) { cb(event, input) } - }); - (item.action||can.core.Value(meta, "feature.inputs")) && can.onappend.figure(input, item, input._target) - }) - }; can.core.Next(can.base.Obj(meta.inputs, can.core.Value(can, "onimport.list")).concat(meta.type == chat.FLOAT? [{type: html.BUTTON, name: cli.CLOSE}]: []), add) - }, - _action: function(can, list, action, meta) { meta = meta||can.onaction, action = action||can._action, can.onmotion.clear(can, action) - can.core.List(can.base.Obj(list, can.core.Value(can, "onaction.list")), function(item) { if (item == undefined) { return } can.onappend.input(can, item == ""? /*空白*/ {type: html.SPACE}: - can.base.isString(item)? /*按键*/ {type: html.BUTTON, value: can.user.trans(can, item), onclick: function(event) { - var cb = meta[item]||meta["_engine"] - cb? can.core.CallFunc(cb, {event: event, can: can, button: item}): can.run(event, [ctx.ACTION, item].concat(can.sup.Input())) + can.core.ItemCB(input.onaction, function(key, cb) { + input._target[key] = function(event) { cb(event, input) } + }), skip? next(): can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target]); + can.core.ItemCB(item, function(key, cb) { + input._target[key] = function(event) { cb(event, input) } + }); + (item.action||can.core.Value(meta, "feature.inputs")) && can.onappend.figure(input, item, input._target) + }) + }; can.core.Next(can.base.Obj(meta.inputs, can.core.Value(can, "onimport.list")).concat(meta.type == chat.FLOAT? [{type: html.BUTTON, name: cli.CLOSE}]: []), add) + }, + _action: function(can, list, action, meta) { meta = meta||can.onaction, action = action||can._action, can.onmotion.clear(can, action) + can.core.List(can.base.Obj(list, can.core.Value(can, "onaction.list")), function(item) { if (item == undefined) { return } can.onappend.input(can, item == ""? /*空白*/ {type: html.SPACE}: + can.base.isString(item)? /*按键*/ {type: html.BUTTON, value: can.user.trans(can, item), onclick: function(event) { + var cb = meta[item]||meta["_engine"] + cb? can.core.CallFunc(cb, {event: event, can: can, button: item}): can.run(event, [ctx.ACTION, item].concat(can.sup.Input())) - }}: item.length > 0? /*列表*/ {type: html.SELECT, name: item[0], values: item.slice(1), onchange: function(event) { - var which = item[event.target.selectedIndex+1] - can.core.CallFunc(meta[which], [event, can, which]) - can.core.CallFunc(meta[item[0]], [event, can, item[0], which]) + }}: item.length > 0? /*列表*/ {type: html.SELECT, name: item[0], values: item.slice(1), onchange: function(event) { + var which = item[event.target.selectedIndex+1] + can.core.CallFunc(meta[which], [event, can, which]) + can.core.CallFunc(meta[item[0]], [event, can, item[0], which]) - }}: /*其它*/ item - , "", action)}) - return meta - }, - _output0: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event) - if (msg.RunAction(event, can, cmds)) { return } + }}: /*其它*/ item + , "", action)}) + return meta + }, + _output0: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event) + if (msg.RunAction(event, can, cmds)) { return } - if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { can.request(event, {action: cmds[1]}) - return can.user.input(event, can, meta.feature[cmds[1]], function(ev, button, data, list, args) { var msg = can.request(event, {_handle: ice.TRUE}, can.Option()) - can.Update(event, cmds.slice(0, 2).concat(args), function(msg) { can.Update({}, can.Input(), cb) }, true) - }) - } + if (msg.Option(ice.MSG_HANDLE) != ice.TRUE && cmds && cmds[0] == ctx.ACTION && meta.feature[cmds[1]]) { can.request(event, {action: cmds[1]}) + return can.user.input(event, can, meta.feature[cmds[1]], function(ev, button, data, list, args) { var msg = can.request(event, {_handle: ice.TRUE}, can.Option()) + can.Update(event, cmds.slice(0, 2).concat(args), function(msg) { can.Update({}, can.Input(), cb) }, true) + }) + } - if (can.base.isUndefined(msg._daemon)) { - can.base.isUndefined(can._daemon) && can.ondaemon._list[0] && (can._daemon = can.ondaemon._list.push(can)-1) - if (can._daemon) { msg._daemon = can._daemon } - } + if (can.base.isUndefined(msg._daemon)) { + can.base.isUndefined(can._daemon) && can.ondaemon._list[0] && (can._daemon = can.ondaemon._list.push(can)-1) + if (can._daemon) { msg._daemon = can._daemon } + } - if (msg.Option("_toast")) { var toast = can.user.toast(can, msg.Option("_toast"), "", -1) } - return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")||{}; can._msg = msg, sub._msg = msg - toast && toast.close() - var process = msg._can == can || msg._can == sub - if (can.base.isFunc(cb)) { can.core.CallFunc(cb, {can: can, msg: msg}); return } - if (process && can.core.CallFunc([sub, "onimport._process"], {can: sub, msg: msg})) { return } - if (process && can.core.CallFunc([can, "onimport._process"], {can: can, msg: msg})) { return } - if (silent) { return } + if (msg.Option("_toast")) { var toast = can.user.toast(can, msg.Option("_toast"), "", -1) } + return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")||{}; can._msg = msg, sub._msg = msg + toast && toast.close() + var process = msg._can == can || msg._can == sub + if (can.base.isFunc(cb)) { can.core.CallFunc(cb, {can: can, msg: msg}); return } + if (process && can.core.CallFunc([sub, "onimport._process"], {can: sub, msg: msg})) { return } + if (process && can.core.CallFunc([can, "onimport._process"], {can: can, msg: msg})) { return } + if (silent) { return } - can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY)||meta.display||meta.feature.display) - }) - }, - _output: function(can, msg, display, output) { display = display||chat.PLUGIN_TABLE_JS, output = output||can._output - Volcanos(display, {_follow: can.core.Keys(can._follow, display), _display: display, _target: output, _fields: can._target, - _option: can._option, _action: can._action, _output: can._output, _status: can._status, _legend: can._legend, - Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status, - _inputs: {}, - }, [display, chat.PLUGIN_TABLE_JS], function(table) { table.Conf(can.Conf()) - table.run = function(event, cmds, cb, silent) { var msg = can.request(event) - if (msg.RunAction(event, table, cmds)) { return } - return can.Update(event, can.Input(cmds, silent), cb, silent) - }, can._outputs.push(table), table.sup = can, table._msg = msg + can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY)||meta.display||meta.feature.display) + }) + }, + _output: function(can, msg, display, output) { display = display||chat.PLUGIN_TABLE_JS, output = output||can._output + Volcanos(display, {_follow: can.core.Keys(can._follow, display), _display: display, _target: output, _fields: can._target, + _option: can._option, _action: can._action, _output: can._output, _status: can._status, _legend: can._legend, + Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status, + _inputs: {}, + }, [display, chat.PLUGIN_TABLE_JS], function(table) { table.Conf(can.Conf()) + table.run = function(event, cmds, cb, silent) { var msg = can.request(event) + if (msg.RunAction(event, table, cmds)) { return } + return can.Update(event, can.Input(cmds, silent), cb, silent) + }, can._outputs.push(table), table.sup = can, table._msg = msg - if (msg.result && msg.result[0] == "can.code.inner.plugin" && table.onimport && table.onimport.list.length > 0) { - can.onmotion.clear(can, can._option) - can.onappend._option(can, {inputs: table.onimport.list, args: msg.result.slice(1)}) - } - table.onimport && can.core.CallFunc(table.onimport._init, {can: table, msg: msg, list: msg.result||msg.append||[], cb: function(msg) { - table.onappend._action(table, msg.Option(ice.MSG_ACTION)||can.Conf(ice.MSG_ACTION)) - table.onappend._status(table, msg.Option(ice.MSG_STATUS)) - }, target: output}) - }) - }, - _status: function(can, list, status) { status = status||can._status, can.onmotion.clear(can, status) - can.core.List(can.base.Obj(list, can.core.Value(can, "onexport.list")), function(item) { item = can.base.isObject(item)? item: {name: item} - can.page.Append(can, status, [{view: can.base.join([html.ITEM, item.name]), title: item.name, list: [ - {text: [item.name, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [(item.value||"")+"", html.SPAN, item.name]}, - ], }]) - }) - }, + if (msg.result && msg.result[0] == "can.code.inner.plugin" && table.onimport && table.onimport.list.length > 0) { + can.onmotion.clear(can, can._option) + can.onappend._option(can, {inputs: table.onimport.list, args: msg.result.slice(1)}) + } + table.onimport && can.core.CallFunc(table.onimport._init, {can: table, msg: msg, list: msg.result||msg.append||[], cb: function(msg) { + table.onappend._action(table, msg.Option(ice.MSG_ACTION)||can.Conf(ice.MSG_ACTION)) + table.onappend._status(table, msg.Option(ice.MSG_STATUS)) + }, target: output}) + }) + }, + _status: function(can, list, status) { status = status||can._status, can.onmotion.clear(can, status) + can.core.List(can.base.Obj(list, can.core.Value(can, "onexport.list")), function(item) { item = can.base.isObject(item)? item: {name: item} + can.page.Append(can, status, [{view: can.base.join([html.ITEM, item.name]), title: item.name, list: [ + {text: [item.name, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [(item.value||"")+"", html.SPAN, item.name]}, + ], }]) + }) + }, - tabs: function(can, list, cb, cbs, action) { action = action||can._action - return can.page.Append(can, action, can.core.List(list, function(meta) { - return {text: [meta.name, html.DIV, chat.TABS], title: meta.text, onclick: function(event) { - can.base.isFunc(cb) && cb(event, meta) - }, _init: function(item) { const OVER = "over" - function close(item) { var next = item.nextSibling || item.previousSibling - item._close(item) || can.page.Remove(can, item), next && next.click() - } - can.core.Timer(10, function() { item.click() }) - can.page.Modify(can, item, {draggable: true, _close: cbs, - onmouseenter: function(event) { - can.user.carte(event, can, kit.Dict( - "close tab", function(event) { close(item) }, - "close other", function(event) { - can.page.Select(can, action, chat.DIV_TABS, function(_item) { - _item == item || close(_item) - }) - }, - "close all", function(event) { can.page.Select(can, action, chat.DIV_TABS, close) }, - ), ["close tab", "close other", "close all"]) - }, - ondragstart: function(event) { var target = event.target; target.click() - action._drop = function(event, before) { action.insertBefore(target, before) } - }, - ondragover: function(event) { event.preventDefault(), action._drop(event, event.target) }, - ondrop: function(event) { event.preventDefault(), action._drop(event, event.target) }, - }) - }} - })).first - }, - list: function(can, root, cb, target) { target = target||can._output - can.core.List(root.list, function(item) { - var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, item.meta.name], onclick: function(event) { - can.base.isFunc(cb) && cb(event, item) || can.onmotion.toggle(can, ui.list) - can.onmotion.select(can, target, html.DIV_ITEM, event.target) - }}, {view: html.LIST}]); can.onappend.list(can, item, cb, ui.list) - }) - }, - item: function(can, type, item, cb, cbs, target) { target = target||can._output - var ui = can.page.Append(can, target, [{view: [type, html.DIV, item.nick||item.name], - onclick: function(event) { cb(event, ui.first) - can.onmotion.select(can, target, can.core.Keys(html.DIV, type), ui.first) - }, onmouseenter: function(event) { cbs(event, ui.first) }, - }]); return ui.first - }, - tree: function(can, list, field, split, cb, target, node) { - node = node||{"": target}; can.core.List(list, function(item) { - item[field] && can.core.List(item[field].split(split), function(value, index, array) { if (!value) { return } - var last = array.slice(0, index).join(split), name = array.slice(0, index+1).join(split) + tabs: function(can, list, cb, cbs, action) { action = action||can._action + return can.page.Append(can, action, can.core.List(list, function(meta) { + return {text: [meta.name, html.DIV, chat.TABS], title: meta.text, onclick: function(event) { + can.base.isFunc(cb) && cb(event, meta) + }, _init: function(item) { const OVER = "over" + function close(item) { var next = item.nextSibling || item.previousSibling + item._close(item) || can.page.Remove(can, item), next && next.click() + } + can.core.Timer(10, function() { item.click() }) + can.page.Modify(can, item, {draggable: true, _close: cbs, + onmouseenter: function(event) { + can.user.carte(event, can, kit.Dict( + "close tab", function(event) { close(item) }, + "close other", function(event) { + can.page.Select(can, action, chat.DIV_TABS, function(_item) { + _item == item || close(_item) + }) + }, + "close all", function(event) { can.page.Select(can, action, chat.DIV_TABS, close) }, + ), ["close tab", "close other", "close all"]) + }, + ondragstart: function(event) { var target = event.target; target.click() + action._drop = function(event, before) { action.insertBefore(target, before) } + }, + ondragover: function(event) { event.preventDefault(), action._drop(event, event.target) }, + ondrop: function(event) { event.preventDefault(), action._drop(event, event.target) }, + }) + }} + })).first + }, + list: function(can, root, cb, target) { target = target||can._output + can.core.List(root.list, function(item) { + var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, item.meta.name], onclick: function(event) { + can.base.isFunc(cb) && cb(event, item) || can.onmotion.toggle(can, ui.list) + can.onmotion.select(can, target, html.DIV_ITEM, event.target) + }}, {view: html.LIST}]); can.onappend.list(can, item, cb, ui.list) + }) + }, + item: function(can, type, item, cb, cbs, target) { target = target||can._output + var ui = can.page.Append(can, target, [{view: [type, html.DIV, item.nick||item.name], + onclick: function(event) { cb(event, ui.first) + can.onmotion.select(can, target, can.core.Keys(html.DIV, type), ui.first) + }, onmouseenter: function(event) { cbs(event, ui.first) }, + }]); return ui.first + }, + tree: function(can, list, field, split, cb, target, node) { + node = node||{"": target}; can.core.List(list, function(item) { + item[field] && can.core.List(item[field].split(split), function(value, index, array) { if (!value) { return } + var last = array.slice(0, index).join(split), name = array.slice(0, index+1).join(split) - node[name] || (node[name] = can.page.Append(can, node[last], [{view: [html.ITEM, html.DIV, value+(index==array.length-1?"":split)], onclick: function(event) { - index < array.length - 1? can.onmotion.toggle(can, node[name]): can.base.isFunc(cb) && cb(event, item) - }}, {view: html.LIST, style: {display: html.NONE}}]).last) - }) - }); return node - }, - field: function(can, type, item, target) { type = type||html.PLUGIN, item = item||{} - var name = (item.nick||item.name||"").split(ice.SP)[0] - var title = !item.help || can.user.language(can) == "en"? name: name+"("+item.help.split(ice.SP)[0]+")" - return can.page.Append(can, target||can._output, [{view: [can.base.join([type||"", item.name||"", item.pos||""]), html.FIELDSET], list: [ - name && {text: [title, html.LEGEND]}, {view: [html.OPTION, html.FORM]}, {view: [html.ACTION]}, {view: [html.OUTPUT]}, {view: [html.STATUS]}, - ]}]) - }, - input: function(can, item, value, target, style) { - switch (item.type) { - case "": return can.page.Append(can, target, [item]) - case html.SPACE: return can.page.Append(can, target, [{view: can.base.join([html.ITEM, html.SPACE])}]) - } + node[name] || (node[name] = can.page.Append(can, node[last], [{view: [html.ITEM, html.DIV, value+(index==array.length-1?"":split)], onclick: function(event) { + index < array.length - 1? can.onmotion.toggle(can, node[name]): can.base.isFunc(cb) && cb(event, item) + }}, {view: html.LIST, style: {display: html.NONE}}]).last) + }) + }); return node + }, + field: function(can, type, item, target) { type = type||html.PLUGIN, item = item||{} + var name = (item.nick||item.name||"").split(ice.SP)[0] + var title = !item.help || can.user.language(can) == "en"? name: name+"("+item.help.split(ice.SP)[0]+")" + return can.page.Append(can, target||can._output, [{view: [can.base.join([type||"", item.name||"", item.pos||""]), html.FIELDSET], list: [ + name && {text: [title, html.LEGEND]}, {view: [html.OPTION, html.FORM]}, {view: [html.ACTION]}, {view: [html.OUTPUT]}, {view: [html.STATUS]}, + ]}]) + }, + input: function(can, item, value, target, style) { + switch (item.type) { + case "": return can.page.Append(can, target, [item]) + case html.SPACE: return can.page.Append(can, target, [{view: can.base.join([html.ITEM, html.SPACE])}]) + } - var input = can.page.input(can, item, value) - var br = input.type == html.TEXTAREA? [{type: html.BR, style: {clear: html.BOTH}}]: [] - var title = can.Conf([ctx.FEATURE, chat.TITLE, item.name].join(ice.PT))||""; title && (input.title = title) - return can.page.Append(can, target, ([{view: style||can.base.join([html.ITEM, item.type]), onkeydown: function(event) { - item.type == "textarea" && event.key == "Tab" && can.onkeymap.insertText(event.target, "\t") - item.type == "text" && can.onkeymap.input(event, can), can.onmotion.selectField(event, can) - }, list: [input]}]).concat(br))[item.name] - }, - table: function(can, msg, cb, target, sort) { - var table = can.page.AppendTable(can, msg, target||can._output, msg.append, cb||function(value, key, index, line, array) { - if (msg.append.length == 2 && msg.append[0] == mdb.KEY && msg.append[1] == mdb.VALUE) { - if (key == mdb.VALUE) { key = line.key } - line = {}, can.core.List(array, function(item) { line[item.key] = item.value }) - } + var input = can.page.input(can, item, value) + var br = input.type == html.TEXTAREA? [{type: html.BR, style: {clear: html.BOTH}}]: [] + var title = can.Conf([ctx.FEATURE, chat.TITLE, item.name].join(ice.PT))||""; title && (input.title = title) + return can.page.Append(can, target, ([{view: style||can.base.join([html.ITEM, item.type]), onkeydown: function(event) { + item.type == "textarea" && event.key == "Tab" && can.onkeymap.insertText(event.target, "\t") + item.type == "text" && can.onkeymap.input(event, can), can.onmotion.selectField(event, can) + }, list: [input]}]).concat(br))[item.name] + }, + table: function(can, msg, cb, target, sort) { + var table = can.page.AppendTable(can, msg, target||can._output, msg.append, cb||function(value, key, index, line, array) { + if (msg.append.length == 2 && msg.append[0] == mdb.KEY && msg.append[1] == mdb.VALUE) { + if (key == mdb.VALUE) { key = line.key } + line = {}, can.core.List(array, function(item) { line[item.key] = item.value }) + } - if (key == "extra.cmd") { - can.onappend.plugin(can, {ctx: line["extra.ctx"], cmd: line["extra.cmd"], arg: line["extra.arg"]}, function(sub) { - sub.run = function(event, cmds, cb) { var msg = can.request(event, line, can.Option()) - can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, can.core.Keys(line["extra.ctx"], line["extra.cmd"])], cmds), cb, true) - } - }, target) - } + if (key == "extra.cmd") { + can.onappend.plugin(can, {ctx: line["extra.ctx"], cmd: line["extra.cmd"], arg: line["extra.arg"]}, function(sub) { + sub.run = function(event, cmds, cb) { var msg = can.request(event, line, can.Option()) + can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, can.core.Keys(line["extra.ctx"], line["extra.cmd"])], cmds), cb, true) + } + }, target) + } - return {text: [value, html.TD], onclick: function(event) { var target = event.target - if (target.tagName == "INPUT" && target.type == html.BUTTON) { var msg = can.sup.request(event, line, can.Option()) - return can.run(event, [ctx.ACTION, target.name], function(msg) { can.run() }, true) - } - if (key == mdb.HASH && can.user.mod.isDiv) { return can.user.jumps("/chat/div/"+value) } - can.sup.onaction.change(event, can.sup, key, value) - }, ondblclick: function(event) { if ([mdb.KEY].indexOf(key) > -1) { return } - var item = can.core.List(can.Conf("feature.insert"), function(item) { - if (item.name == key) { return item } - })[0]||{name: key, value: value} + return {text: [value, html.TD], onclick: function(event) { var target = event.target + if (target.tagName == "INPUT" && target.type == html.BUTTON) { var msg = can.sup.request(event, line, can.Option()) + return can.run(event, [ctx.ACTION, target.name], function(msg) { can.run() }, true) + } + if (key == mdb.HASH && can.user.mod.isDiv) { return can.user.jumps("/chat/div/"+value) } + can.sup.onaction.change(event, can.sup, key, value) + }, ondblclick: function(event) { if ([mdb.KEY].indexOf(key) > -1) { return } + var item = can.core.List(can.Conf("feature.insert"), function(item) { + if (item.name == key) { return item } + })[0]||{name: key, value: value} - item.run = function(event, cmds, cb) { can.run(can.request(event, line)._event, cmds, cb, true) } + item.run = function(event, cmds, cb) { can.run(can.request(event, line)._event, cmds, cb, true) } - can.onmotion.modifys(can, event.target, function(event, value, old) { var msg = can.sup.request(event, line, can.Option()) - can.run(event, [ctx.ACTION, mdb.MODIFY, key, value], function(msg) { can.run() }, true) - }, item) - }} - }); table && can.page.Modify(can, table, {className: chat.CONTENT}) - return sort && can.page.RangeTable(can, table, sort), table - }, - board: function(can, text, target) { text && text.Result && (text = text.Result()); if (!text) { return } - var code = can.page.Append(can, target||can._output, [{text: [can.page.Color(text), html.DIV, html.CODE]}]).code - can.page.Select(can, code, html.INPUT_BUTTON, function(target) { - target.onclick = function(event) { var msg = can.sup.request(event, can.Option()) - return can.run(event, [ctx.ACTION, target.name], function(msg) { can.run() }, true) - } - }) - return code.scrollBy(0, 10000), code - }, + can.onmotion.modifys(can, event.target, function(event, value, old) { var msg = can.sup.request(event, line, can.Option()) + can.run(event, [ctx.ACTION, mdb.MODIFY, key, value], function(msg) { can.run() }, true) + }, item) + }} + }); table && can.page.Modify(can, table, {className: chat.CONTENT}) + return sort && can.page.RangeTable(can, table, sort), table + }, + board: function(can, text, target) { text && text.Result && (text = text.Result()); if (!text) { return } + var code = can.page.Append(can, target||can._output, [{text: [can.page.Color(text), html.DIV, html.CODE]}]).code + can.page.Select(can, code, html.INPUT_BUTTON, function(target) { + target.onclick = function(event) { var msg = can.sup.request(event, can.Option()) + return can.run(event, [ctx.ACTION, target.name], function(msg) { can.run() }, true) + } + }) + return code.scrollBy(0, 10000), code + }, - _plugin: function(can, value, meta, cb, target) { - meta.feature = meta.feature||can.base.Obj(value.meta, {}) - meta.inputs = meta.inputs||can.base.Obj(value.list, []) + _plugin: function(can, value, meta, cb, target) { + meta.feature = meta.feature||can.base.Obj(value.meta, {}) + meta.inputs = meta.inputs||can.base.Obj(value.list, []) - meta.height = meta.height||can.Conf(html.HEIGHT) - meta.width = meta.width||can.Conf(html.WIDTH) + meta.height = meta.height||can.Conf(html.HEIGHT) + meta.width = meta.width||can.Conf(html.WIDTH) - meta.name = meta.name||value.name||chat.PLUGIN - meta.help = meta.help||value.help||chat.PLUGIN - meta.type = meta.type||chat.PLUGIN + meta.name = meta.name||value.name||chat.PLUGIN + meta.help = meta.help||value.help||chat.PLUGIN + meta.type = meta.type||chat.PLUGIN - can.onappend._init(can, meta, [chat.PLUGIN_STATE_JS], function(sub, skip) { - sub.run = function(event, cmds, cb) { can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb) } - can.base.isFunc(cb) && cb(sub, meta, skip) - }, target||can._output) - }, - plugin: function(can, meta, cb, target) { meta = meta||{}, meta.index = meta.index||can.core.Keys(meta.ctx, meta.cmd) - var p = can.onengine.plugin.meta[meta.index], res = {}; function cbs(sub, meta, skip) { res.__proto__ = sub, cb(sub, meta, skip) } - (meta.meta || meta.inputs && meta.inputs.length > 0)? /* 局部命令 */ can.onappend._plugin(can, {meta: meta.meta, list: meta.list}, meta, cbs, target): - p? /* 前端命令 */ can.onappend._plugin(can, {name: meta.index, help: p.help, meta: p.meta, list: p.list}, meta, function(sub, meta, skip) { - sub.run = function(event, cmds, cb) { can.core.CallFunc(p, {msg: can.request(event), cmds: cmds, cb: cb}) } - can.base.isFunc(cbs) && cbs(sub, meta, skip) - }, target): /* 后端命令 */ can.run(can.request({}, meta)._event, [ctx.ACTION, ctx.COMMAND, meta.index], function(msg) { msg.Table(function(value) { - can.onappend._plugin(can, value, meta, cbs, target) - }) }, true) - return res - }, - figure: function(can, meta, target, cbs) { if ([html.BUTTON, html.SELECT].indexOf(meta.type) > -1) { return } - var input = meta.action||mdb.KEY; input != ice.AUTO && can.require(["/plugin/input/"+input+".js"], function(can) { - can.core.ItemCB(can.onfigure[input], function(key, on) { var last = target[key]; target[key] = function(event) { on(event, can, meta, function(cb) { - can.sub? can.base.isFunc(cb) && cb(can.sub, cbs): can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT}, ["/plugin/input/"+input+".js"], function(sub) { sub.Conf(meta) - can.onmotion.hidden(can, sub._target) - sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option()); (meta.run||can.run)(event, cmds, cb, true) }, can.sub = sub - sub.close = function() { sub.page.Remove(sub, sub._target), delete(can.sub) } + can.onappend._init(can, meta, [chat.PLUGIN_STATE_JS], function(sub, skip) { + sub.run = function(event, cmds, cb) { can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb) } + can.base.isFunc(cb) && cb(sub, meta, skip) + }, target||can._output) + }, + plugin: function(can, meta, cb, target) { meta = meta||{}, meta.index = meta.index||can.core.Keys(meta.ctx, meta.cmd) + var p = can.onengine.plugin.meta[meta.index], res = {}; function cbs(sub, meta, skip) { res.__proto__ = sub, cb(sub, meta, skip) } + (meta.meta || meta.inputs && meta.inputs.length > 0)? /* 局部命令 */ can.onappend._plugin(can, {meta: meta.meta, list: meta.list}, meta, cbs, target): + p? /* 前端命令 */ can.onappend._plugin(can, {name: meta.index, help: p.help, meta: p.meta, list: p.list}, meta, function(sub, meta, skip) { + sub.run = function(event, cmds, cb) { can.core.CallFunc(p, {msg: can.request(event), cmds: cmds, cb: cb}) } + can.base.isFunc(cbs) && cbs(sub, meta, skip) + }, target): /* 后端命令 */ can.run(can.request({}, meta)._event, [ctx.ACTION, ctx.COMMAND, meta.index], function(msg) { msg.Table(function(value) { + can.onappend._plugin(can, value, meta, cbs, target) + }) }, true) + return res + }, + figure: function(can, meta, target, cbs) { if ([html.BUTTON, html.SELECT].indexOf(meta.type) > -1) { return } + var input = meta.action||mdb.KEY; input != ice.AUTO && can.require(["/plugin/input/"+input+".js"], function(can) { + can.core.ItemCB(can.onfigure[input], function(key, on) { var last = target[key]; target[key] = function(event) { on(event, can, meta, function(cb) { + can.sub? can.base.isFunc(cb) && cb(can.sub, cbs): can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT}, ["/plugin/input/"+input+".js"], function(sub) { sub.Conf(meta) + can.onmotion.hidden(can, sub._target) + sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option()); (meta.run||can.run)(event, cmds, cb, true) }, can.sub = sub + sub.close = function() { sub.page.Remove(sub, sub._target), delete(can.sub) } - sub.onappend._action(sub, [cli.CLOSE, cli.CLEAR, cli.REFRESH], sub._action, kit.Dict( - cli.CLOSE, function(event) { sub.close() }, - cli.CLEAR, function(event) { target.value = "" }, - cli.REFRESH, function(event) { can.base.isFunc(cb) && cb(sub) }, - )), sub.onappend._status(sub, [mdb.TOTAL, mdb.INDEX]) + sub.onappend._action(sub, [cli.CLOSE, cli.CLEAR, cli.REFRESH], sub._action, kit.Dict( + cli.CLOSE, function(event) { sub.close() }, + cli.CLEAR, function(event) { target.value = "" }, + cli.REFRESH, function(event) { can.base.isFunc(cb) && cb(sub) }, + )), sub.onappend._status(sub, [mdb.TOTAL, mdb.INDEX]) - meta.style && sub.page.Modify(sub, sub._target, {style: meta.style}) - can.base.isFunc(cb) && cb(sub, function() { - can.onmotion.hidden(can, sub._target, true) - can.base.isFunc(cbs) && cbs(sub) - }) - }, document.body) - }, target, last) } }) - }) - }, - float: function(can, msg, cb) { - var ui = can.onappend.field(can, "story toast float", {}, document.body) - ui.close = function() { can.page.Remove(can, ui.first) } + meta.style && sub.page.Modify(sub, sub._target, {style: meta.style}) + can.base.isFunc(cb) && cb(sub, function() { + can.onmotion.hidden(can, sub._target, true) + can.base.isFunc(cbs) && cbs(sub) + }) + }, document.body) + }, target, last) } }) + }) + }, + float: function(can, msg, cb) { + var ui = can.onappend.field(can, "story toast float", {}, document.body) + ui.close = function() { can.page.Remove(can, ui.first) } - can.getActionSize(function(left, top, height, width) { - can.page.Modify(can, ui.output, {style: kit.Dict(html.MAX_HEIGHT, height-28, html.MAX_WIDTH, width)}) - can.page.Modify(can, ui.first, {style: {left: left, top: top}}) - }) + can.getActionSize(function(left, top, height, width) { + can.page.Modify(can, ui.output, {style: kit.Dict(html.MAX_HEIGHT, height-28, html.MAX_WIDTH, width)}) + can.page.Modify(can, ui.first, {style: {left: left, top: top}}) + }) - can.onappend._action(can, [cli.CLOSE, cli.REFRESH, {input: html.TEXT, placeholder: "filter", _init: function(input) { - can.onengine.signal(can, "keymap.focus", can.request({}, {cb: function(event) { - if (event.target.tagName == "INPUT") { return } - if (event.key == lang.ESCAPE) { ui.close(); return } - if (event.key == ice.SP) { input.focus(), can.onkeymap.prevent(event) } - }})) - }, onkeydown: function(event) { can.onkeymap.input(event, can) - if (event.key != lang.ENTER) { return } - event.target.setSelectionRange(0, -1) + can.onappend._action(can, [cli.CLOSE, cli.REFRESH, {input: html.TEXT, placeholder: "filter", _init: function(input) { + can.onengine.signal(can, "keymap.focus", can.request({}, {cb: function(event) { + if (event.target.tagName == "INPUT") { return } + if (event.key == lang.ESCAPE) { ui.close(); return } + if (event.key == ice.SP) { input.focus(), can.onkeymap.prevent(event) } + }})) + }, onkeydown: function(event) { can.onkeymap.input(event, can) + if (event.key != lang.ENTER) { return } + event.target.setSelectionRange(0, -1) - can.page.Select(can, ui.output, html.TR, function(tr, index) { if (index == 0) { return } - can.page.ClassList.add(can, tr, html.HIDDEN) - can.page.Select(can, tr, html.TD, function(td) { if (td.innerText.indexOf(event.target.value) > -1) { - can.page.ClassList.del(can, tr, html.HIDDEN) - } }) - }) - }}], ui.action, kit.Dict(cli.CLOSE, ui.close, cli.REFRESH, function(event) { ui.close(), can.toast.click()})) + can.page.Select(can, ui.output, html.TR, function(tr, index) { if (index == 0) { return } + can.page.ClassList.add(can, tr, html.HIDDEN) + can.page.Select(can, tr, html.TD, function(td) { if (td.innerText.indexOf(event.target.value) > -1) { + can.page.ClassList.del(can, tr, html.HIDDEN) + } }) + }) + }}], ui.action, kit.Dict(cli.CLOSE, ui.close, cli.REFRESH, function(event) { ui.close(), can.toast.click()})) - can.onappend.table(can, msg, function(value, key, index, line, list) { - return {text: [value, html.TD], onclick: function(event) { - can.base.isFunc(cb) && cb(value, key, index, line, list) - }} - }, ui.output), can.onappend.board(can, msg.Result(), ui.output) - return ui - }, + can.onappend.table(can, msg, function(value, key, index, line, list) { + return {text: [value, html.TD], onclick: function(event) { + can.base.isFunc(cb) && cb(value, key, index, line, list) + }} + }, ui.output), can.onappend.board(can, msg.Result(), ui.output) + return ui + }, }, [], function(can) {}) Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, target) { target = target||document.body - // var list = []; document.body.onresize = function() { - // can.core.Delay(list, 1000, function() { can.onlayout._init(can, target) }) - // } - // - if (can.page.Select(can, target, html.FIELDSET_MAIN+".page").length > 0) { - can.page.Select(can, target, html.FIELDSET_LEFT, function(field, index) { - can.page.Modify(can, field, {style: {height: ""}}) - can.page.Select(can, target, [[html.FIELDSET_LEFT, html.DIV_OUTPUT]], function(output) { - can.page.Modify(can, output, {style: {height: ""}}) - }) - }) - can.page.Select(can, target, html.FIELDSET_MAIN, function(field, index) { - can.page.style(can, field, html.HEIGHT, "") - can.page.Select(can, target, [[html.FIELDSET_MAIN, html.DIV_OUTPUT]], function(output) { - can.page.style(can, output, html.HEIGHT, "") - }) - }) - return - } - var width = window.innerWidth, height = window.innerHeight - can.page.Select(can, target, can.page.Keys(html.FIELDSET_HEAD, html.FIELDSET_FOOT), function(field) { - height -= field.offsetHeight - }) + // var list = []; document.body.onresize = function() { + // can.core.Delay(list, 1000, function() { can.onlayout._init(can, target) }) + // } + // + if (can.page.Select(can, target, html.FIELDSET_MAIN+".page").length > 0) { + can.page.Select(can, target, html.FIELDSET_LEFT, function(field, index) { + can.page.Modify(can, field, {style: {height: ""}}) + can.page.Select(can, target, [[html.FIELDSET_LEFT, html.DIV_OUTPUT]], function(output) { + can.page.Modify(can, output, {style: {height: ""}}) + }) + }) + can.page.Select(can, target, html.FIELDSET_MAIN, function(field, index) { + can.page.style(can, field, html.HEIGHT, "") + can.page.Select(can, target, [[html.FIELDSET_MAIN, html.DIV_OUTPUT]], function(output) { + can.page.style(can, output, html.HEIGHT, "") + }) + }) + return + } + var width = window.innerWidth, height = window.innerHeight + can.page.Select(can, target, can.page.Keys(html.FIELDSET_HEAD, html.FIELDSET_FOOT), function(field) { + height -= field.offsetHeight + }) - can.page.Select(can, target, html.FIELDSET_LEFT, function(field, index) { - can.user.isMobile || (width -= field.offsetWidth) - can.page.Modify(can, field, {style: {height: height}}) - can.page.Select(can, target, [[html.FIELDSET_LEFT, html.DIV_OUTPUT]], function(output) { - can.page.Modify(can, output, {style: {height: height-32}}) - }) - }) + can.page.Select(can, target, html.FIELDSET_LEFT, function(field, index) { + can.user.isMobile || (width -= field.offsetWidth) + can.page.Modify(can, field, {style: {height: height}}) + can.page.Select(can, target, [[html.FIELDSET_LEFT, html.DIV_OUTPUT]], function(output) { + can.page.Modify(can, output, {style: {height: height-32}}) + }) + }) - can.page.Select(can, target, html.FIELDSET_MAIN, function(field, index) { - if (can.user.isMobile) { - can.page.style(can, field, "padding-top", can.user.isLandscape()? "0px": "") - } else { - can.page.style(can, field, html.HEIGHT, height, html.WIDTH, width-1) - can.page.Select(can, target, [[html.FIELDSET_MAIN, html.DIV_OUTPUT]], function(output) { - height -= can.page.Select(can, field, html.DIV_ACTION)[0].offsetHeight - can.page.style(can, output, html.HEIGHT, height) - }) - } - }) + can.page.Select(can, target, html.FIELDSET_MAIN, function(field, index) { + if (can.user.isMobile) { + can.page.style(can, field, "padding-top", can.user.isLandscape()? "0px": "") + } else { + can.page.style(can, field, html.HEIGHT, height, html.WIDTH, width-1) + can.page.Select(can, target, [[html.FIELDSET_MAIN, html.DIV_OUTPUT]], function(output) { + height -= can.page.Select(can, field, html.DIV_ACTION)[0].offsetHeight + can.page.style(can, output, html.HEIGHT, height) + }) + } + }) - can.onengine.signal(can, chat.ONSIZE, can.request({}, {width: width, height: height})) - }, - topic: function(can, topic) { topic && (can._topic = topic) - can.user.topic(can, can._topic || can.misc.Search(can, chat.TOPIC) || ((can.base.isNight()||can.user.mod.isPod)? chat.BLACK: chat.WHITE)) - can.page.ClassList.add(can, document.body, can.user.language(can)) - }, - background: function(can, url, target) { - can.page.Modify(can, target||document.body, {style: {background: url == "" || url == "void"? "": 'url("'+url+'")'}}) - }, - figure: function(event, can, target, right, layout) { target = target||can._target - if (layout) { return can.page.Modify(can, target, {style: layout}), can.onmotion.move(can, target, layout), layout } + can.onengine.signal(can, chat.ONSIZE, can.request({}, {width: width, height: height})) + }, + topic: function(can, topic) { topic && (can._topic = topic) + can.user.topic(can, can._topic || can.misc.Search(can, chat.TOPIC) || ((can.base.isNight()||can.user.mod.isPod)? chat.BLACK: chat.WHITE)) + can.page.ClassList.add(can, document.body, can.user.language(can)) + }, + background: function(can, url, target) { + can.page.Modify(can, target||document.body, {style: {background: url == "" || url == "void"? "": 'url("'+url+'")'}}) + }, + figure: function(event, can, target, right, layout) { target = target||can._target + if (layout) { return can.page.Modify(can, target, {style: layout}), can.onmotion.move(can, target, layout), layout } - if (!event || !event.target || !event.clientX) { return {} } + if (!event || !event.target || !event.clientX) { return {} } - var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight-5; if (right) { - var left = event.clientX-event.offsetX+event.target.offsetWidth, top = event.clientY-event.offsetY - } + var left = event.clientX-event.offsetX, top = event.clientY-event.offsetY+event.target.offsetHeight-5; if (right) { + var left = event.clientX-event.offsetX+event.target.offsetWidth, top = event.clientY-event.offsetY + } - layout = {left: left, top: top} - if (layout.top < 0) { layout.top = 0 } - if (layout.left < 0) { layout.left = 0 } - if (layout.left+target.offsetWidth>window.innerWidth) { - layout.right = 0, layout.left = "" - } - if (top+target.offsetHeight>window.innerHeight-100) { - layout.bottom = window.innerHeight - event.clientY+event.offsetY, layout.top = "" - } - return can.page.Modify(can, target, {style: layout}), can.onmotion.move(can, target, layout), layout - }, + layout = {left: left, top: top} + if (layout.top < 0) { layout.top = 0 } + if (layout.left < 0) { layout.left = 0 } + if (layout.left+target.offsetWidth>window.innerWidth) { + layout.right = 0, layout.left = "" + } + if (top+target.offsetHeight>window.innerHeight-100) { + layout.bottom = window.innerHeight - event.clientY+event.offsetY, layout.top = "" + } + return can.page.Modify(can, target, {style: layout}), can.onmotion.move(can, target, layout), layout + }, - display: function(can, target) { target = target||can._target - return can.page.Appends(can, target, [{view: [chat.LAYOUT, html.TABLE], list: [ - {type: html.TR, list: [{view: chat.CONTENT}]}, - {type: html.TR, list: [{view: chat.DISPLAY}]}, - ]}]) - }, - project: function(can, target) { target = target||can._target - return can.page.Append(can, target, [{view: [chat.LAYOUT, html.TABLE], list: [{type: html.TR, list: [ - {type: html.TD, list: [{view: chat.PROJECT, style: {display: html.NONE}}]}, {type: html.TD, list: [ - {view: [chat.LAYOUT, html.TABLE], list: [ - {type: html.TR, list: [{view: chat.CONTENT}]}, - {type: html.TR, list: [{view: chat.DISPLAY}]}, - ]} - ]} - ]}] }]) - }, - profile: function(can, target) { target = target||can._output - var gt = "❯", lt = "❮", down = "˅", up = "˄" - function toggle(view) { - view._toggle? view._toggle(event, view.style.display == html.NONE): can.onmotion.toggle(can, view) - return view.style.display == html.NONE - } + display: function(can, target) { target = target||can._target + return can.page.Appends(can, target, [{view: [chat.LAYOUT, html.TABLE], list: [ + {type: html.TR, list: [{view: chat.CONTENT}]}, + {type: html.TR, list: [{view: chat.DISPLAY}]}, + ]}]) + }, + project: function(can, target) { target = target||can._target + return can.page.Append(can, target, [{view: [chat.LAYOUT, html.TABLE], list: [{type: html.TR, list: [ + {type: html.TD, list: [{view: chat.PROJECT, style: {display: html.NONE}}]}, {type: html.TD, list: [ + {view: [chat.LAYOUT, html.TABLE], list: [ + {type: html.TR, list: [{view: chat.CONTENT}]}, + {type: html.TR, list: [{view: chat.DISPLAY}]}, + ]} + ]} + ]}] }]) + }, + profile: function(can, target) { target = target||can._output + var gt = "❯", lt = "❮", down = "˅", up = "˄" + function toggle(view) { + view._toggle? view._toggle(event, view.style.display == html.NONE): can.onmotion.toggle(can, view) + return view.style.display == html.NONE + } - var ui = can.page.Append(can, target, [{view: [chat.LAYOUT, html.TABLE], list: [ - {view: [chat.PROJECT, html.TD], list: [{view: [chat.PROJECT]}]}, - {type: html.TD, list: [ - {type: html.TR, list: [{type: html.TR, list: [ - {view: [chat.CONTENT, html.TD], list: [{view: [chat.CONTENT]}, - {view: ["toggle project"], list: [{text: [gt, html.DIV]}], onclick: function(event) { - event.target.innerHTML = toggle(can.ui.project)? gt: lt - }}, - {view: ["toggle profile"], list: [{text: [lt, html.DIV]}], onclick: function(event) { - event.target.innerHTML = toggle(can.ui.profile)? lt: gt - }}, - {view: ["toggle display"], list: [{text: [up, html.DIV]}], onclick: function(event) { - event.target.innerHTML = toggle(can.ui.display)? up: down - }}, - ]}, - {view: [chat.PROFILE, html.TD], list: [{view: [chat.PROFILE], style: {display: html.NONE}}]}, - ]}]}, - {view: [chat.DISPLAY, html.TR], list: [{view: [chat.DISPLAY], style: {display: html.NONE}}]} - ]} - ] }]); return can.ui = ui - }, + var ui = can.page.Append(can, target, [{view: [chat.LAYOUT, html.TABLE], list: [ + {view: [chat.PROJECT, html.TD], list: [{view: [chat.PROJECT]}]}, + {type: html.TD, list: [ + {type: html.TR, list: [{type: html.TR, list: [ + {view: [chat.CONTENT, html.TD], list: [{view: [chat.CONTENT]}, + {view: ["toggle project"], list: [{text: [gt, html.DIV]}], onclick: function(event) { + event.target.innerHTML = toggle(can.ui.project)? gt: lt + }}, + {view: ["toggle profile"], list: [{text: [lt, html.DIV]}], onclick: function(event) { + event.target.innerHTML = toggle(can.ui.profile)? lt: gt + }}, + {view: ["toggle display"], list: [{text: [up, html.DIV]}], onclick: function(event) { + event.target.innerHTML = toggle(can.ui.display)? up: down + }}, + ]}, + {view: [chat.PROFILE, html.TD], list: [{view: [chat.PROFILE], style: {display: html.NONE}}]}, + ]}]}, + {view: [chat.DISPLAY, html.TR], list: [{view: [chat.DISPLAY], style: {display: html.NONE}}]} + ]} + ] }]); return can.ui = ui + }, }) Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, target) { - }, - focus: function(can, target) { if (!target) { return } - target.setSelectionRange && target.setSelectionRange(0, -1), target.focus() - }, - clear: function(can, target) { - return can.page.Modify(can, target||can._output, ""), true - }, - share: function(event, can, input, args) { - return can.user.input(event, can, input, function(ev, button, data, list, _args) { - can.search(can.request(event, {args: [mdb.TYPE, chat.FIELD].concat(args||[], _args||[])})._event, ["Header.onaction.share"]) - }) - }, - story: { - _hash: { - spark: function(can, meta, target) { - if (meta[mdb.NAME] == html.INNER) { - target.title = "点击复制", target.onclick = function(event) { - can.user.copy(event, can, target.innerText) - } - } else { - can.page.Select(can, target, html.SPAN, function(item) { - item.title = "点击复制", item.onclick = function(event) { - can.user.copy(event, can, item.innerText) - } - }) - } - }, - }, - auto: function(can, target) { var that = this - can.page.Select(can, target||can._output, ".story", function(item) { var meta = item.dataset - can.page.Modify(can, item, {style: can.base.Obj(meta.style)}) - can.core.CallFunc(that._hash[meta.type], [can, meta, target||can._output]) - }) - can.page.Select(can, target||can._output, html.IFRAME, function(item) { - can.page.Modify(can, item, {style: {height: can.Conf(html.HEIGHT)-88, width: can.Conf(html.WIDTH)-30}}) - }) - can.page.Select(can, target||can._output, html.SVG, function(item) { - item.oncontextmenu = function(event) { - can.user.carte(event, can, {"导出": function(event, can, button) { + }, + focus: function(can, target) { if (!target) { return } + target.setSelectionRange && target.setSelectionRange(0, -1), target.focus() + }, + clear: function(can, target) { + return can.page.Modify(can, target||can._output, ""), true + }, + share: function(event, can, input, args) { + return can.user.input(event, can, input, function(ev, button, data, list, _args) { + can.search(can.request(event, {args: [mdb.TYPE, chat.FIELD].concat(args||[], _args||[])})._event, ["Header.onaction.share"]) + }) + }, + story: { + _hash: { + spark: function(can, meta, target) { + if (meta[mdb.NAME] == html.INNER) { + target.title = "点击复制", target.onclick = function(event) { + can.user.copy(event, can, target.innerText) + } + } else { + can.page.Select(can, target, html.SPAN, function(item) { + item.title = "点击复制", item.onclick = function(event) { + can.user.copy(event, can, item.innerText) + } + }) + } + }, + }, + auto: function(can, target) { var that = this + can.page.Select(can, target||can._output, ".story", function(item) { var meta = item.dataset + can.page.Modify(can, item, {style: can.base.Obj(meta.style)}) + can.core.CallFunc(that._hash[meta.type], [can, meta, target||can._output]) + }) + can.page.Select(can, target||can._output, html.IFRAME, function(item) { + can.page.Modify(can, item, {style: {height: can.Conf(html.HEIGHT)-88, width: can.Conf(html.WIDTH)-30}}) + }) + can.page.Select(can, target||can._output, html.SVG, function(item) { + item.oncontextmenu = function(event) { + can.user.carte(event, can, {"导出": function(event, can, button) { - }}, ["导出"]) - } - // can.page.Modify(can, item, {style: {height: can.Conf(html.HEIGHT)-88, width: can.Conf(html.WIDTH)-30}}) - }) - }, - }, - float: {_hash: {}, - del: function(can, key) { - if (key == chat.CARTE) { - can.page.Select(can, document.body, can.core.Keys(html.DIV, chat.CARTE), function(item) { - can.page.Remove(can, item) - }) - } - this._hash[key] && can.page.Remove(can, this._hash[key]._target) - }, - add: function(can, key, value) { - this.del(can, key), this._hash[key] = value - }, + }}, ["导出"]) + } + // can.page.Modify(can, item, {style: {height: can.Conf(html.HEIGHT)-88, width: can.Conf(html.WIDTH)-30}}) + }) + }, + }, + float: {_hash: {}, + del: function(can, key) { + if (key == chat.CARTE) { + can.page.Select(can, document.body, can.core.Keys(html.DIV, chat.CARTE), function(item) { + can.page.Remove(can, item) + }) + } + this._hash[key] && can.page.Remove(can, this._hash[key]._target) + }, + add: function(can, key, value) { + this.del(can, key), this._hash[key] = value + }, - auto: function(can, target, key) { var that = this - var list = can.core.List(arguments).slice(2) - if (list.length == 0) { list = [chat.CARTE, chat.INPUT] } - can.page.Modify(can, target, {onmouseover: function(event) { - if (event.target.tagName == "IMG") { return } - can.core.List(list, function(key, index) { that.del(can, key) }) - }}) - }, - }, - cache: function(can, next) { var list = can.base.Obj(can.core.List(arguments).slice(2), [can._output]) - can.core.List(list, function(item) { can.page.Cache(item._cache_key, item, item.scrollTop+1) }) - var key = next(can._cache_data = can._cache_data||{}) - return can.core.List(list, function(item) { var pos = can.page.Cache(item._cache_key = key, item) - if (pos) { item.scrollTo(0, pos-1); return item } - }).length > 0 - }, - delay: function(can, cb) { - can.core.Timer(50, cb) - }, - toimage: function(event, can, name, target) { - can.user.input(event, can, [{name: "name", value: name}], function(ev, button, data) { - can.require(["https://cdn.jsdelivr.net/npm/html2canvas@1.0.0-rc.5/dist/html2canvas.min.js"], function() { - html2canvas(target||can._target).then(function (canvas) { - can.page.Create(can, html.A, {href: canvas.toDataURL("image/png"), download: data.name}).click() - }) - }) - }) - }, + auto: function(can, target, key) { var that = this + var list = can.core.List(arguments).slice(2) + if (list.length == 0) { list = [chat.CARTE, chat.INPUT] } + can.page.Modify(can, target, {onmouseover: function(event) { + if (event.target.tagName == "IMG") { return } + can.core.List(list, function(key, index) { that.del(can, key) }) + }}) + }, + }, + cache: function(can, next) { var list = can.base.Obj(can.core.List(arguments).slice(2), [can._output]) + can.core.List(list, function(item) { can.page.Cache(item._cache_key, item, item.scrollTop+1) }) + var key = next(can._cache_data = can._cache_data||{}) + return can.core.List(list, function(item) { var pos = can.page.Cache(item._cache_key = key, item) + if (pos) { item.scrollTo(0, pos-1); return item } + }).length > 0 + }, + delay: function(can, cb) { + can.core.Timer(50, cb) + }, + toimage: function(event, can, name, target) { + can.user.input(event, can, [{name: "name", value: name}], function(ev, button, data) { + can.require(["https://cdn.jsdelivr.net/npm/html2canvas@1.0.0-rc.5/dist/html2canvas.min.js"], function() { + html2canvas(target||can._target).then(function (canvas) { + can.page.Create(can, html.A, {href: canvas.toDataURL("image/png"), download: data.name}).click() + }) + }) + }) + }, - hidden: function(can, target, show) { - can.page.Modify(can, target||can._target, {style: {display: show? "": html.NONE}}) - }, - toggle: function(can, target, show, hide) { target = target||can._target - var status = target.style.display == html.NONE - can.page.Modify(can, target, {style: {display: status? "": html.NONE}}) - status? can.base.isFunc(show) && show(): can.base.isFunc(hide) && hide() - return status - }, - select: function(can, target, name, which) { - can.page.Select(can, target, name, function(item, index) { - if (item == which || which == index) { - can.page.ClassList.add(can, item, html.SELECT) - } else { - can.page.ClassList.del(can, item, html.SELECT) - } - }) - }, - modify: function(can, target, cb, item) { var back = target.innerHTML, text = target.innerText - if (back.length > 120 || back.indexOf(ice.NL) > -1) { - return can.onmotion.modifys(can, target, cb) - } - var ui = can.page.Appends(can, target, [{type: html.INPUT, value: target.innerText, style: { - width: target.offsetWidth > 400? 400: target.offsetWidth-20, - }, onkeydown: function(event) { - switch (event.key) { - case lang.ENTER: target.innerHTML = event.target.value - event.target.value == back || cb(event, event.target.value, back) - break - case lang.ESCAPE: target.innerHTML = back; break - default: can.onkeymap.input(event, can) - } - }, _init: function(target) { - item && can.onappend.figure(can, item, target), target.value = text - can.onmotion.focus(can, target) - }}]) - }, - modifys: function(can, target, cb, item) { var back = target.innerHTML - var ui = can.page.Appends(can, target, [{type: html.TEXTAREA, value: target.innerText, style: { - width: target.offsetWidth > 400? 400: target.offsetWidth-20, height: target.offsetHeight < 60? 60: target.offsetHeight-20, - }, onkeydown: function(event) { - switch (event.key) { - case lang.ENTER: - if (event.ctrlKey) { - target.innerHTML = event.target.value - event.target.value == back || cb(event, event.target.value, back) - } - break - case lang.ESCAPE: target.innerHTML = back; break - default: can.onkeymap.input(event, can) - } - }, _init: function(target) { - item && can.onappend.figure(can, item, target) - can.onmotion.focus(can, target) - }}]) - }, + hidden: function(can, target, show) { + can.page.Modify(can, target||can._target, {style: {display: show? "": html.NONE}}) + }, + toggle: function(can, target, show, hide) { target = target||can._target + var status = target.style.display == html.NONE + can.page.Modify(can, target, {style: {display: status? "": html.NONE}}) + status? can.base.isFunc(show) && show(): can.base.isFunc(hide) && hide() + return status + }, + select: function(can, target, name, which) { + can.page.Select(can, target, name, function(item, index) { + if (item == which || which == index) { + can.page.ClassList.add(can, item, html.SELECT) + } else { + can.page.ClassList.del(can, item, html.SELECT) + } + }) + }, + modify: function(can, target, cb, item) { var back = target.innerHTML, text = target.innerText + if (back.length > 120 || back.indexOf(ice.NL) > -1) { + return can.onmotion.modifys(can, target, cb) + } + var ui = can.page.Appends(can, target, [{type: html.INPUT, value: target.innerText, style: { + width: target.offsetWidth > 400? 400: target.offsetWidth-20, + }, onkeydown: function(event) { + switch (event.key) { + case lang.ENTER: target.innerHTML = event.target.value + event.target.value == back || cb(event, event.target.value, back) + break + case lang.ESCAPE: target.innerHTML = back; break + default: can.onkeymap.input(event, can) + } + }, _init: function(target) { + item && can.onappend.figure(can, item, target), target.value = text + can.onmotion.focus(can, target) + }}]) + }, + modifys: function(can, target, cb, item) { var back = target.innerHTML + var ui = can.page.Appends(can, target, [{type: html.TEXTAREA, value: target.innerText, style: { + width: target.offsetWidth > 400? 400: target.offsetWidth-20, height: target.offsetHeight < 60? 60: target.offsetHeight-20, + }, onkeydown: function(event) { + switch (event.key) { + case lang.ENTER: + if (event.ctrlKey) { + target.innerHTML = event.target.value + event.target.value == back || cb(event, event.target.value, back) + } + break + case lang.ESCAPE: target.innerHTML = back; break + default: can.onkeymap.input(event, can) + } + }, _init: function(target) { + item && can.onappend.figure(can, item, target) + can.onmotion.focus(can, target) + }}]) + }, - link: function(can, target, text) { - if (target.innerText == "") { target.innerText = target.href } - can.page.Modify(can, target, {target: "_blank"}) - }, - copy: function(can, target, text) { - target.title = "点击复制", target.onclick = function(event) { - can.user.copy(event, can, text||target.innerText) - } - }, - move: function(can, target, layout, cb) { var begin - can.page.Modify(can, target, {style: layout}) - target.onmousedown = function(event) { - layout.height = target.offsetHeight, layout.width = target.offsetWidth - layout.left = target.offsetLeft, layout.top = target.offsetTop - begin = can.base.Copy({x: event.x, y: event.y}, layout) - }, target.onmouseup = function(event) { begin = null } + link: function(can, target, text) { + if (target.innerText == "") { target.innerText = target.href } + can.page.Modify(can, target, {target: "_blank"}) + }, + copy: function(can, target, text) { + target.title = "点击复制", target.onclick = function(event) { + can.user.copy(event, can, text||target.innerText) + } + }, + move: function(can, target, layout, cb) { var begin + can.page.Modify(can, target, {style: layout}) + target.onmousedown = function(event) { + layout.height = target.offsetHeight, layout.width = target.offsetWidth + layout.left = target.offsetLeft, layout.top = target.offsetTop + begin = can.base.Copy({x: event.x, y: event.y}, layout) + }, target.onmouseup = function(event) { begin = null } - target.onmousemove = function(event) { if (!begin || !event.ctrlKey) { return } - if (event.shiftKey) { - layout.width = layout.width + event.x - begin.x - layout.height = layout.height + event.y - begin.y - can.page.Modify(can, target, {style: {width: layout.width, height: layout.height}}) - } else { - layout.top = begin.top + event.y - begin.y - layout.left = begin.left + event.x - begin.x - can.page.Modify(can, target, {style: {left: layout.left, top: layout.top}}) - } - can.base.isFunc(cb) && cb(target) - can.onkeymap.prevent(event) - } - can.base.isFunc(cb) && cb(target) - }, - show: function(can, time, cb, target) { target = target||can._target - time = can.base.isObject(time)? time: {interval: 10, length: time||30} + target.onmousemove = function(event) { if (!begin || !event.ctrlKey) { return } + if (event.shiftKey) { + layout.width = layout.width + event.x - begin.x + layout.height = layout.height + event.y - begin.y + can.page.Modify(can, target, {style: {width: layout.width, height: layout.height}}) + } else { + layout.top = begin.top + event.y - begin.y + layout.left = begin.left + event.x - begin.x + can.page.Modify(can, target, {style: {left: layout.left, top: layout.top}}) + } + can.base.isFunc(cb) && cb(target) + can.onkeymap.prevent(event) + } + can.base.isFunc(cb) && cb(target) + }, + show: function(can, time, cb, target) { target = target||can._target + time = can.base.isObject(time)? time: {interval: 10, length: time||30} - can.page.Modify(can, target, {style: {opacity: 0, display: html.BLOCK}}) - can.core.Timer(time, function(event, value, index) { - can.page.Modify(can, target, {style: {opacity: (index+1)/time.length}}) - }, cb) - }, - hide: function(can, time, cb, target) { target = target||can._target - time = can.base.isObject(time)? time: {value: 10, length: time||20} + can.page.Modify(can, target, {style: {opacity: 0, display: html.BLOCK}}) + can.core.Timer(time, function(event, value, index) { + can.page.Modify(can, target, {style: {opacity: (index+1)/time.length}}) + }, cb) + }, + hide: function(can, time, cb, target) { target = target||can._target + time = can.base.isObject(time)? time: {value: 10, length: time||20} - can.page.Modify(can, target, {style: {opacity: 1}}) - can.core.Timer(time, function(event, value, index) { - can.page.Modify(can, target, {style: {opacity: 1-(index+1)/time.length}}) - }, function() { - can.page.Modify(can, target, {style: {display: html.NONE}}) - can.base.isFunc(cb) && cb() - }) - }, + can.page.Modify(can, target, {style: {opacity: 1}}) + can.core.Timer(time, function(event, value, index) { + can.page.Modify(can, target, {style: {opacity: 1-(index+1)/time.length}}) + }, function() { + can.page.Modify(can, target, {style: {display: html.NONE}}) + can.base.isFunc(cb) && cb() + }) + }, - selectField: function(event, can) { - if (event.ctrlKey && event.key >= "0" && event.key <= "9") { - if (event.shiftKey) { - can.page.Select(can, can._option, "input[type=button]", function(item, index) { - index == event.key && (item.click()) - }) - return - } - if (event.key == "0") { return can.onimport._back(can) } + selectField: function(event, can) { + if (event.ctrlKey && event.key >= "0" && event.key <= "9") { + if (event.shiftKey) { + can.page.Select(can, can._option, "input[type=button]", function(item, index) { + index == event.key && (item.click()) + }) + return + } + if (event.key == "0") { return can.onimport._back(can) } - can.page.Select(can, can._output, html.TR, function(tr, index) { if (index == event.key) { - var head = can.page.Select(can, can._output, html.TH, function(th, order) { return th.innerText }) - can.page.Select(can, tr, html.TD, function(td, index) { can.Option(head[index], td.innerText) }) - can.Update(event) - } }) - } - }, - selectTable: function(event, can, target, cb) { - if (event.ctrlKey) { - function select(order) { - var index = 0; return can.page.Select(can, can._output, html.TR, function(tr) { - if (can.page.ClassList.has(can, tr, html.HIDDEN)) { return } - if (!can.page.ClassList.set(can, tr, html.SELECT, order == index++)) { return tr} - can.base.isFunc(cb) && cb(tr) - can.Status("index", index-1) - return tr - }).length - } - switch (event.key) { - case "n": - var total = select(target._index) - select(target._index = ((target._index)+1) % total) - can.onkeymap.prevent(event) - break - case "p": - var total = select(target._index) - select(target._index = (target._index-1) < 0? total-1: (target._index-1)) - can.onkeymap.prevent(event) - break - default: target._index = 0 - } - } - }, - selectTableInput: function(event, can, target, cb) { - if (event.ctrlKey) { - function select(order) { if (order == 0) { target.value = target._value } - var index = 0; return can.page.Select(can, can._output, html.TR, function(tr) { - if (can.page.ClassList.has(can, tr, html.HIDDEN)) { return } - can.page.ClassList.del(can, tr, html.SELECT); if (order != index++) { return tr } - can.page.ClassList.add(can, tr, html.SELECT), can.page.Select(can, tr, html.TD, function(td, index) { - target._value = target._value||target.value, index == 0 && (target.value = td.innerText) - }); return tr - }).length - } - switch (event.key) { - case "n": - var total = select(target._index) - select(target._index = ((target._index)+1) % total) - break - case "p": - var total = select(target._index) - select(target._index = (target._index-1) < 0? total-1: (target._index-1)) - break - default: target._index = 0, target._value = ""; return - } - return can.onkeymap.prevent(event) - } + can.page.Select(can, can._output, html.TR, function(tr, index) { if (index == event.key) { + var head = can.page.Select(can, can._output, html.TH, function(th, order) { return th.innerText }) + can.page.Select(can, tr, html.TD, function(td, index) { can.Option(head[index], td.innerText) }) + can.Update(event) + } }) + } + }, + selectTable: function(event, can, target, cb) { + if (event.ctrlKey) { + function select(order) { + var index = 0; return can.page.Select(can, can._output, html.TR, function(tr) { + if (can.page.ClassList.has(can, tr, html.HIDDEN)) { return } + if (!can.page.ClassList.set(can, tr, html.SELECT, order == index++)) { return tr} + can.base.isFunc(cb) && cb(tr) + can.Status("index", index-1) + return tr + }).length + } + switch (event.key) { + case "n": + var total = select(target._index) + select(target._index = ((target._index)+1) % total) + can.onkeymap.prevent(event) + break + case "p": + var total = select(target._index) + select(target._index = (target._index-1) < 0? total-1: (target._index-1)) + can.onkeymap.prevent(event) + break + default: target._index = 0 + } + } + }, + selectTableInput: function(event, can, target, cb) { + if (event.ctrlKey) { + function select(order) { if (order == 0) { target.value = target._value } + var index = 0; return can.page.Select(can, can._output, html.TR, function(tr) { + if (can.page.ClassList.has(can, tr, html.HIDDEN)) { return } + can.page.ClassList.del(can, tr, html.SELECT); if (order != index++) { return tr } + can.page.ClassList.add(can, tr, html.SELECT), can.page.Select(can, tr, html.TD, function(td, index) { + target._value = target._value||target.value, index == 0 && (target.value = td.innerText) + }); return tr + }).length + } + switch (event.key) { + case "n": + var total = select(target._index) + select(target._index = ((target._index)+1) % total) + break + case "p": + var total = select(target._index) + select(target._index = (target._index-1) < 0? total-1: (target._index-1)) + break + default: target._index = 0, target._value = ""; return + } + return can.onkeymap.prevent(event) + } - target._index = 0, target._value = "" - can.page.Select(can, can._output, html.TR, function(tr, index) { - var has = false; can.page.Select(can, tr, html.TD, function(td) { - has = has || td.innerText.indexOf(target.value)>-1 - }), can.page.ClassList.set(can, tr, html.HIDDEN, !has && index != 0) - }) + target._index = 0, target._value = "" + can.page.Select(can, can._output, html.TR, function(tr, index) { + var has = false; can.page.Select(can, tr, html.TD, function(td) { + has = has || td.innerText.indexOf(target.value)>-1 + }), can.page.ClassList.set(can, tr, html.HIDDEN, !has && index != 0) + }) - var total = can.page.Select(can, can._output, html.TR, function(tr) { - if (!can.page.ClassList.has(can, tr, html.HIDDEN)) { return tr} - }).length-1 - total == 0 && can.base.isFunc(cb) && cb() - can.Status(kit.Dict(mdb.TOTAL, total, mdb.INDEX, target._index)) - }, + var total = can.page.Select(can, can._output, html.TR, function(tr) { + if (!can.page.ClassList.has(can, tr, html.HIDDEN)) { return tr} + }).length-1 + total == 0 && can.base.isFunc(cb) && cb() + can.Status(kit.Dict(mdb.TOTAL, total, mdb.INDEX, target._index)) + }, }) Volcanos("onkeymap", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) { - can.onkeymap._build(can), document.body.onkeydown = function(event) { if (event.metaKey) { return } - if (event.target.tagName == "SELECT" || event.target.tagName == "INPUT" || event.target.tagName == "TEXTAREA") { return } - var msg = can.request(event, {"model": "normal"}); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } - can.onengine.signal(can, "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) - } - }, - _build: function(can) { - can.core.Item(can.onkeymap._mode, function(item, value) { var engine = {list: {}} - can.core.Item(value, function(key, cb) { var map = engine - for (var i = 0; i < key.length; i++) { - if (!map.list[key[i]]) { map.list[key[i]] = {list: {}} } - map = map.list[key[i]]; if (i == key.length-1) { map.cb = cb } - } - }), can.onkeymap._engine[item] = engine - }) - }, - _parse: function(event, can, mode, list, target) { list = list||[] - if (["Control", "Shift"].indexOf(event.key) > -1) { return list } - list.push(event.key); for (var pre = 0; pre < list.length; pre++) { - if ("0" <= list[pre] && list[pre] <= "9") { continue } break - }; var count = parseInt(list.slice(0, pre).join(""))||1 + can.onkeymap._build(can), document.body.onkeydown = function(event) { if (event.metaKey) { return } + if (event.target.tagName == "SELECT" || event.target.tagName == "INPUT" || event.target.tagName == "TEXTAREA") { return } + var msg = can.request(event, {"model": "normal"}); if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } + can.onengine.signal(can, "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) + } + }, + _build: function(can) { + can.core.Item(can.onkeymap._mode, function(item, value) { var engine = {list: {}} + can.core.Item(value, function(key, cb) { var map = engine + for (var i = 0; i < key.length; i++) { + if (!map.list[key[i]]) { map.list[key[i]] = {list: {}} } + map = map.list[key[i]]; if (i == key.length-1) { map.cb = cb } + } + }), can.onkeymap._engine[item] = engine + }) + }, + _parse: function(event, can, mode, list, target) { list = list||[] + if (["Control", "Shift"].indexOf(event.key) > -1) { return list } + list.push(event.key); for (var pre = 0; pre < list.length; pre++) { + if ("0" <= list[pre] && list[pre] <= "9") { continue } break + }; var count = parseInt(list.slice(0, pre).join(""))||1 - var map = can.onkeymap._mode[mode] - function repeat(cb, count) { list = []; for (var i = 1; i <= count; i++) { if (cb(event, can, target, count)) { break } } } - var cb = map && map[event.key]; if (can.base.isFunc(cb) && event.key.length > 1) { repeat(cb, count); return list } - var cb = map && map[event.key.toLowerCase()]; if (can.base.isFunc(cb) && event.key.length > 1) { repeat(cb, count); return list } + var map = can.onkeymap._mode[mode] + function repeat(cb, count) { list = []; for (var i = 1; i <= count; i++) { if (cb(event, can, target, count)) { break } } } + var cb = map && map[event.key]; if (can.base.isFunc(cb) && event.key.length > 1) { repeat(cb, count); return list } + var cb = map && map[event.key.toLowerCase()]; if (can.base.isFunc(cb) && event.key.length > 1) { repeat(cb, count); return list } - can.misc.Log("keys", count, list) - var map = can.onkeymap._engine[mode]; if (!map) { return [] } - for (var i = pre; i < list.length; i++ ) { - var map = map.list[list[i]]; if (!map) { return [] } - if (i == list.length-1 && can.base.isFunc(map.cb)) { repeat(map.cb, count); return [] } - } - return list - }, - _mode: { - insert: { - jk: function(event, can, target) { target.blur(), can.onkeymap.deleteText(target, target.selectionStart-1, target.selectionStart) }, - Escape: function(event, can, target) { target.blur() }, - Enter: function(event, can, target) { - var his = target._history||[]; his.push(target.value) - event.target.tagName == "INPUT" && can.onmotion.focus(can, target) - target._history = his, target._current = his.length - }, - }, - insert_ctrl: { - p: function(event, can, target) { - var his = target._history||[], pos = target._current||0 - pos = --pos % (his.length+1); if (pos < 0) { pos = his.length } - target._current = pos, target.value = his[pos]||"" - }, - n: function(event, can, target) { - var his = target._history||[], pos = target._current||0 - pos = ++pos % (his.length+1) - target._current = pos, target.value = his[pos]||"" - }, + can.misc.Log("keys", count, list) + var map = can.onkeymap._engine[mode]; if (!map) { return [] } + for (var i = pre; i < list.length; i++ ) { + var map = map.list[list[i]]; if (!map) { return [] } + if (i == list.length-1 && can.base.isFunc(map.cb)) { repeat(map.cb, count); return [] } + } + return list + }, + _mode: { + insert: { + jk: function(event, can, target) { target.blur(), can.onkeymap.deleteText(target, target.selectionStart-1, target.selectionStart) }, + Escape: function(event, can, target) { target.blur() }, + Enter: function(event, can, target) { + var his = target._history||[]; his.push(target.value) + event.target.tagName == "INPUT" && can.onmotion.focus(can, target) + target._history = his, target._current = his.length + }, + }, + insert_ctrl: { + p: function(event, can, target) { + var his = target._history||[], pos = target._current||0 + pos = --pos % (his.length+1); if (pos < 0) { pos = his.length } + target._current = pos, target.value = his[pos]||"" + }, + n: function(event, can, target) { + var his = target._history||[], pos = target._current||0 + pos = ++pos % (his.length+1) + target._current = pos, target.value = his[pos]||"" + }, - u: function(event, can, target) { can.onkeymap.deleteText(target, 0, target.selectionEnd) }, - k: function(event, can, target) { can.onkeymap.deleteText(target, target.selectionStart) }, - h: function(event, can, target) { can.onkeymap.deleteText(target, target.selectionStart-1, 1) }, - d: function(event, can, target) { can.onkeymap.deleteText(target, 0, target.selectionStart) }, - w: function(event, can, target) { var start = target.selectionStart-2, end = target.selectionEnd-1 - for (var i = start; i >= 0; i--) { - if (target.value[end] == ice.SP && target.value[i] != ice.SP) { break } - if (target.value[end] != ice.SP && target.value[i] == ice.SP) { break } - } can.onkeymap.deleteText(target, i+1, end-i) - }, - }, - }, _engine: {}, + u: function(event, can, target) { can.onkeymap.deleteText(target, 0, target.selectionEnd) }, + k: function(event, can, target) { can.onkeymap.deleteText(target, target.selectionStart) }, + h: function(event, can, target) { can.onkeymap.deleteText(target, target.selectionStart-1, 1) }, + d: function(event, can, target) { can.onkeymap.deleteText(target, 0, target.selectionStart) }, + w: function(event, can, target) { var start = target.selectionStart-2, end = target.selectionEnd-1 + for (var i = start; i >= 0; i--) { + if (target.value[end] == ice.SP && target.value[i] != ice.SP) { break } + if (target.value[end] != ice.SP && target.value[i] == ice.SP) { break } + } can.onkeymap.deleteText(target, i+1, end-i) + }, + }, + }, _engine: {}, - input: function(event, can) { if (event.metakey) { return } var target = event.target - target._keys = can.onkeymap._parse(event, can, event.ctrlKey? "insert_ctrl": mdb.INSERT, target._keys, target) - }, - prevent: function(event) { event.stopPropagation(), event.preventDefault() }, - deleteText: function(target, start, count) { var end = count? start+count: target.value.length - var cut = target.value.slice(start, end) - target.value = target.value.substring(0, start)+target.value.substring(end, target.value.length) - return target.setSelectionRange(start, start), cut - }, - insertText: function(target, text) { var start = target.selectionStart - var before = target.value.slice(0, target.selectionStart) - var after = target.value.slice(target.selectionEnd) - target.value = before+text+after - return target.setSelectionRange(start+1, start+1) - }, - cursorMove: function(can, target, count, begin) { begin != undefined && target.setSelectionRange(begin, begin) - target.setSelectionRange(target.selectionStart+count, target.selectionStart+count) - }, + input: function(event, can) { if (event.metakey) { return } var target = event.target + target._keys = can.onkeymap._parse(event, can, event.ctrlKey? "insert_ctrl": mdb.INSERT, target._keys, target) + }, + prevent: function(event) { event.stopPropagation(), event.preventDefault() }, + deleteText: function(target, start, count) { var end = count? start+count: target.value.length + var cut = target.value.slice(start, end) + target.value = target.value.substring(0, start)+target.value.substring(end, target.value.length) + return target.setSelectionRange(start, start), cut + }, + insertText: function(target, text) { var start = target.selectionStart + var before = target.value.slice(0, target.selectionStart) + var after = target.value.slice(target.selectionEnd) + target.value = before+text+after + return target.setSelectionRange(start+1, start+1) + }, + cursorMove: function(can, target, count, begin) { begin != undefined && target.setSelectionRange(begin, begin) + target.setSelectionRange(target.selectionStart+count, target.selectionStart+count) + }, }) _can_name = "" diff --git a/lib/base.js b/lib/base.js index d0a26f2a..eda6a504 100644 --- a/lib/base.js +++ b/lib/base.js @@ -1,264 +1,264 @@ Volcanos("base", {help: "数据类型", - Int: function(val, def) { - return parseInt(val)||def||0 - }, - Obj: function(val, def) { - try { - val = typeof val == lang.STRING && val != ""? JSON.parse(val): val - if (val && val.length == 0 && def && def.length > 0) { return def } - return val||def - } catch (e) { - return [val] - } - }, - Copy: function(to, from) { - if (arguments.length == 2) { - for (var k in from) { to[k] = from[k] } - return to - } - for (var i = 2; i < arguments.length; i++) { - var k = arguments[i]; to[k] = from[k] - } - return to - }, - Eq: function(to, from) { var call = arguments.callee - if (typeof to != typeof from) { return false } + Int: function(val, def) { + return parseInt(val)||def||0 + }, + Obj: function(val, def) { + try { + val = typeof val == lang.STRING && val != ""? JSON.parse(val): val + if (val && val.length == 0 && def && def.length > 0) { return def } + return val||def + } catch (e) { + return [val] + } + }, + Copy: function(to, from) { + if (arguments.length == 2) { + for (var k in from) { to[k] = from[k] } + return to + } + for (var i = 2; i < arguments.length; i++) { + var k = arguments[i]; to[k] = from[k] + } + return to + }, + Eq: function(to, from) { var call = arguments.callee + if (typeof to != typeof from) { return false } - if (typeof to == lang.OBJECT) { - if (to.length != from.length) { return false } - for (var i = 0; i < to.length; i++) { - if (!call(to[i], from[i])) { return false } - } - for (var k in to) { - if (!call(to[k], from[k])) { return false } - } - return true - } - return to === from - }, + if (typeof to == lang.OBJECT) { + if (to.length != from.length) { return false } + for (var i = 0; i < to.length; i++) { + if (!call(to[i], from[i])) { return false } + } + for (var k in to) { + if (!call(to[k], from[k])) { return false } + } + return true + } + return to === from + }, - Ext: function(path) { - return (path.split(ice.PS).pop().split(ice.PT).pop()).toLowerCase() - }, - Path: function(path) { var res = "" - for (var i = 0; i < arguments.length; i++) { - res += (arguments[i][0]==ice.PS || res=="" || res[res.length-1]==ice.PS? "": ice.PS) + arguments[i].trim() - } - return res - }, - Args: function(obj) { var res = [] - for (var k in obj) { - res.push(encodeURIComponent(k)+"="+encodeURIComponent(obj[k])) - } - return res.join("&") - }, - MergeURL: function(url) { - var args = {}; (url.split("?")[1]||"").split("&").forEach(function(item) { if (!item) { return } - var ls = item.split("="); args[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1]) - }) - for (var i = 1; i < arguments.length; i++) { - switch (typeof arguments[i]) { - case lang.STRING: - args[arguments[i]] = arguments[i+1], i++ - break - case lang.OBJECT: - if (arguments[i].length > 0) { - for (var j = 0; j < arguments[i].length; j += 2) { - args[arguments[i][j]] = arguments[i][j] - } - } else { - for (var k in arguments[i]) { - args[k] = arguments[i][k] - } - } - break - } - } - var list = []; for (var k in args) { - list.push(encodeURIComponent(k)+"="+encodeURIComponent(args[k])) - } - return url.split("?")[0]+(list.length>0? "?"+list.join("&"): "") - }, - ParseURL: function(url) { var res = {link: url} - var list = url.split("?"); res["origin"] = list[0] - list[1] && list[1].split("&").forEach(function(item) { - var ls = item.split("="); res[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1]) - }) - return res - }, - ParseJSON: function(str) { var res - if (typeof str == lang.OBJECT) { return str } - if (str.indexOf("http") == 0) { var ls = str.split("?") - res = {type: mdb.LINK, name: "", text: str} - res.name = ls[0].split("://").pop().split(ice.PS)[0] - ls[1] && ls[1].split("&").forEach(function(item) { var ls = item.split("=") - res[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1]) - }) - return res - } - try { res = JSON.parse(str) - res.text = res.text||str - res.type = res.type||nfs.JSON - } catch (e) { - res = {type: mdb.TEXT, text: str} - } - return res - }, - ParseSize: function(size) { size = size.toLowerCase() - if (size.endsWith("tb") || size.endsWith("t")) { - return parseInt(size) * 1024 * 1024 * 1024 * 1024 - } - if (size.endsWith("gb") || size.endsWith("g")) { - return parseInt(size) * 1024 * 1024 * 1024 - } - if (size.endsWith("mb") || size.endsWith("m")) { - return parseInt(size) * 1024 * 1024 - } - if (size.endsWith("kb") || size.endsWith("k")) { - return parseInt(size) * 1024 - } - return parseInt(size) - }, + Ext: function(path) { + return (path.split(ice.PS).pop().split(ice.PT).pop()).toLowerCase() + }, + Path: function(path) { var res = "" + for (var i = 0; i < arguments.length; i++) { + res += (arguments[i][0]==ice.PS || res=="" || res[res.length-1]==ice.PS? "": ice.PS) + arguments[i].trim() + } + return res + }, + Args: function(obj) { var res = [] + for (var k in obj) { + res.push(encodeURIComponent(k)+"="+encodeURIComponent(obj[k])) + } + return res.join("&") + }, + MergeURL: function(url) { + var args = {}; (url.split("?")[1]||"").split("&").forEach(function(item) { if (!item) { return } + var ls = item.split("="); args[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1]) + }) + for (var i = 1; i < arguments.length; i++) { + switch (typeof arguments[i]) { + case lang.STRING: + args[arguments[i]] = arguments[i+1], i++ + break + case lang.OBJECT: + if (arguments[i].length > 0) { + for (var j = 0; j < arguments[i].length; j += 2) { + args[arguments[i][j]] = arguments[i][j] + } + } else { + for (var k in arguments[i]) { + args[k] = arguments[i][k] + } + } + break + } + } + var list = []; for (var k in args) { + list.push(encodeURIComponent(k)+"="+encodeURIComponent(args[k])) + } + return url.split("?")[0]+(list.length>0? "?"+list.join("&"): "") + }, + ParseURL: function(url) { var res = {link: url} + var list = url.split("?"); res["origin"] = list[0] + list[1] && list[1].split("&").forEach(function(item) { + var ls = item.split("="); res[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1]) + }) + return res + }, + ParseJSON: function(str) { var res + if (typeof str == lang.OBJECT) { return str } + if (str.indexOf("http") == 0) { var ls = str.split("?") + res = {type: mdb.LINK, name: "", text: str} + res.name = ls[0].split("://").pop().split(ice.PS)[0] + ls[1] && ls[1].split("&").forEach(function(item) { var ls = item.split("=") + res[decodeURIComponent(ls[0])] = decodeURIComponent(ls[1]) + }) + return res + } + try { res = JSON.parse(str) + res.text = res.text||str + res.type = res.type||nfs.JSON + } catch (e) { + res = {type: mdb.TEXT, text: str} + } + return res + }, + ParseSize: function(size) { size = size.toLowerCase() + if (size.endsWith("tb") || size.endsWith("t")) { + return parseInt(size) * 1024 * 1024 * 1024 * 1024 + } + if (size.endsWith("gb") || size.endsWith("g")) { + return parseInt(size) * 1024 * 1024 * 1024 + } + if (size.endsWith("mb") || size.endsWith("m")) { + return parseInt(size) * 1024 * 1024 + } + if (size.endsWith("kb") || size.endsWith("k")) { + return parseInt(size) * 1024 + } + return parseInt(size) + }, - Size: function(size) { size = parseInt(size) - if (size > 1000000000) { - return parseInt(size/1000000000) + ice.PT + parseInt(size/10000000%100) + "G" - } - if (size > 1000000) { - return parseInt(size/1000000) + ice.PT + parseInt(size/10000%100) + "M" - } - if (size > 1000) { - return parseInt(size/1000) + ice.PT + parseInt(size/10%100) + "K" - } - return size + "B" - }, - Number: function(d, n) { var result = [] - while (d > 0) { result.push(d%10); d = parseInt(d/10); n-- } - while (n > 0) { result.push("0"); n-- } - return result.reverse(), result.join("") - }, - Format: function(obj) { - return JSON.stringify(obj) - }, - Simple: function() { var res = [] - for (var i = 0; i < arguments.length; i++) { - var arg = arguments[i]; switch (typeof arguments[i]) { - case lang.NUMBER: res.push(arg); break - case lang.STRING: res.push(arg); break - case lang.OBJECT: - if (arg.length > 0) { res = res.concat(arg); break } - for (var k in arg) { k && arg[k] && res.push(k, arg[k]) } - break - default: res.push(arg); - } - } - return res - }, - AddUniq: function(list, value) { list = list||[] - return list.indexOf(value) == -1 && list.push(value), list - }, + Size: function(size) { size = parseInt(size) + if (size > 1000000000) { + return parseInt(size/1000000000) + ice.PT + parseInt(size/10000000%100) + "G" + } + if (size > 1000000) { + return parseInt(size/1000000) + ice.PT + parseInt(size/10000%100) + "M" + } + if (size > 1000) { + return parseInt(size/1000) + ice.PT + parseInt(size/10%100) + "K" + } + return size + "B" + }, + Number: function(d, n) { var result = [] + while (d > 0) { result.push(d%10); d = parseInt(d/10); n-- } + while (n > 0) { result.push("0"); n-- } + return result.reverse(), result.join("") + }, + Format: function(obj) { + return JSON.stringify(obj) + }, + Simple: function() { var res = [] + for (var i = 0; i < arguments.length; i++) { + var arg = arguments[i]; switch (typeof arguments[i]) { + case lang.NUMBER: res.push(arg); break + case lang.STRING: res.push(arg); break + case lang.OBJECT: + if (arg.length > 0) { res = res.concat(arg); break } + for (var k in arg) { k && arg[k] && res.push(k, arg[k]) } + break + default: res.push(arg); + } + } + return res + }, + AddUniq: function(list, value) { list = list||[] + return list.indexOf(value) == -1 && list.push(value), list + }, - Date: function(time) { var now = new Date() - if (typeof time == lang.STRING && time != "") { var ls = time.split(ice.SP) - var vs = ls[0].split("-") - now.setFullYear(parseInt(vs[0])) - now.setMonth(parseInt(vs[1])-1) - now.setDate(parseInt(vs[2])) + Date: function(time) { var now = new Date() + if (typeof time == lang.STRING && time != "") { var ls = time.split(ice.SP) + var vs = ls[0].split("-") + now.setFullYear(parseInt(vs[0])) + now.setMonth(parseInt(vs[1])-1) + now.setDate(parseInt(vs[2])) - var vs = ls[1].split(":") - now.setHours(parseInt(vs[0])) - now.setMinutes(parseInt(vs[1])) - now.setSeconds(parseInt(vs[2])) - } else if (time) { - now = time - } - return now - }, - Time: function(time, fmt) { var now = this.Date(time) - var list = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] - fmt = fmt||"%H:%M:%S" - fmt = fmt.replace("%y", now.getFullYear()) - fmt = fmt.replace("%m", this.Number(now.getMonth()+1, 2)) - fmt = fmt.replace("%d", this.Number(now.getDate(), 2)) - fmt = fmt.replace("%w", list[now.getDay()]) - fmt = fmt.replace("%H", this.Number(now.getHours(), 2)) - fmt = fmt.replace("%M", this.Number(now.getMinutes(), 2)) - fmt = fmt.replace("%S", this.Number(now.getSeconds(), 2)) - return fmt - }, - TimeAdd: function(t, d) { - return new Date(t - t%(24*3600*1000) - 8*3600*1000 + d*24*3600*1000) - }, - Duration: function(n) { var res = "", h = 0 - h = parseInt(n/3600000/24), h > 0 && (res += h+"d"), n = n % (3600000*24) - h = parseInt(n/3600000), h > 0 && (res += h+"h"), n = n % 3600000 - h = parseInt(n/60000), h > 0 && (res += h+"m"), n = n % 60000 - h = parseInt(n/1000), h > 0 && (res += h), n = n % 1000 - return res + (n > 0? ice.PT+parseInt(n/10): "") + "s" - }, + var vs = ls[1].split(":") + now.setHours(parseInt(vs[0])) + now.setMinutes(parseInt(vs[1])) + now.setSeconds(parseInt(vs[2])) + } else if (time) { + now = time + } + return now + }, + Time: function(time, fmt) { var now = this.Date(time) + var list = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"] + fmt = fmt||"%H:%M:%S" + fmt = fmt.replace("%y", now.getFullYear()) + fmt = fmt.replace("%m", this.Number(now.getMonth()+1, 2)) + fmt = fmt.replace("%d", this.Number(now.getDate(), 2)) + fmt = fmt.replace("%w", list[now.getDay()]) + fmt = fmt.replace("%H", this.Number(now.getHours(), 2)) + fmt = fmt.replace("%M", this.Number(now.getMinutes(), 2)) + fmt = fmt.replace("%S", this.Number(now.getSeconds(), 2)) + return fmt + }, + TimeAdd: function(t, d) { + return new Date(t - t%(24*3600*1000) - 8*3600*1000 + d*24*3600*1000) + }, + Duration: function(n) { var res = "", h = 0 + h = parseInt(n/3600000/24), h > 0 && (res += h+"d"), n = n % (3600000*24) + h = parseInt(n/3600000), h > 0 && (res += h+"h"), n = n % 3600000 + h = parseInt(n/60000), h > 0 && (res += h+"m"), n = n % 60000 + h = parseInt(n/1000), h > 0 && (res += h), n = n % 1000 + return res + (n > 0? ice.PT+parseInt(n/10): "") + "s" + }, - getValid: function() { - for (var i = 0; i < arguments.length; i++) { var v = arguments[i] - if (typeof v == lang.OBJECT) { - if (v == null) { continue } - for (var k in v) { return v } - if (v.length > 0) { return v } - } else if (typeof v == lang.STRING && v) { - return v - } else if (v == undefined) { - continue - } else { - return v - } - } - }, - isNumber: function(val) { return typeof val == lang.NUMBER }, - isString: function(val) { return typeof val == lang.STRING }, - isObject: function(val) { return typeof val == lang.OBJECT }, - isArray: function(val) { return typeof val == lang.OBJECT && val.length != undefined }, - isFunc: function(val) { return typeof val == lang.FUNCTION }, - isFunction: function(val) { return typeof val == lang.FUNCTION }, - isCallback: function(key, value) { return key.indexOf("on") == 0 && typeof value == lang.FUNCTION }, - isUndefined: function(val) { return val == undefined }, - isNull: function(val) { return val == null }, - replaceAll: function(str) { - for (var i = 1; i < arguments.length; i += 2) { - str = str.replaceAll(arguments[i], arguments[i+1]) - } - return str - }, + getValid: function() { + for (var i = 0; i < arguments.length; i++) { var v = arguments[i] + if (typeof v == lang.OBJECT) { + if (v == null) { continue } + for (var k in v) { return v } + if (v.length > 0) { return v } + } else if (typeof v == lang.STRING && v) { + return v + } else if (v == undefined) { + continue + } else { + return v + } + } + }, + isNumber: function(val) { return typeof val == lang.NUMBER }, + isString: function(val) { return typeof val == lang.STRING }, + isObject: function(val) { return typeof val == lang.OBJECT }, + isArray: function(val) { return typeof val == lang.OBJECT && val.length != undefined }, + isFunc: function(val) { return typeof val == lang.FUNCTION }, + isFunction: function(val) { return typeof val == lang.FUNCTION }, + isCallback: function(key, value) { return key.indexOf("on") == 0 && typeof value == lang.FUNCTION }, + isUndefined: function(val) { return val == undefined }, + isNull: function(val) { return val == null }, + replaceAll: function(str) { + for (var i = 1; i < arguments.length; i += 2) { + str = str.replaceAll(arguments[i], arguments[i+1]) + } + return str + }, - isNight: function() { var now = new Date() - return now.getHours() < 7 || now.getHours() > 17 - }, - beginWith: function(str, begin) { - return str.trim().indexOf(begin) == 0 - }, - endWith: function(str, end) { - return str.lastIndexOf(end) + end.length == str.length - }, - trim: function(args) { if (this.isString(args)) { return args.trim() } - if (this.isArray(args)) { for (var i = args.length-1; i >= 0; i--) { if (!args[i]) { args.pop() } else { break } } } - return args - }, - trimPrefix: function(str, pre) { - if (str.indexOf(pre) == -1) { - return str - } - return str.slice(pre.length) - }, - trimSuffix: function(str, end) { - if (str.indexOf(end) == -1) { - return str - } - return str.slice(0, str.indexOf(end)) - }, - join: function(list, sp) { return (list||[]).join(sp||ice.SP) }, - joins: function(list, inner, outer) { - for (var i = 0; i < list.length; i++) { - list[i] = typeof list[i] == lang.STRING? list[i]: list[i].join(inner||ice.FS) - } - return list.join(outer||ice.SP) - }, + isNight: function() { var now = new Date() + return now.getHours() < 7 || now.getHours() > 17 + }, + beginWith: function(str, begin) { + return str.trim().indexOf(begin) == 0 + }, + endWith: function(str, end) { + return str.lastIndexOf(end) + end.length == str.length + }, + trim: function(args) { if (this.isString(args)) { return args.trim() } + if (this.isArray(args)) { for (var i = args.length-1; i >= 0; i--) { if (!args[i]) { args.pop() } else { break } } } + return args + }, + trimPrefix: function(str, pre) { + if (str.indexOf(pre) == -1) { + return str + } + return str.slice(pre.length) + }, + trimSuffix: function(str, end) { + if (str.indexOf(end) == -1) { + return str + } + return str.slice(0, str.indexOf(end)) + }, + join: function(list, sp) { return (list||[]).join(sp||ice.SP) }, + joins: function(list, inner, outer) { + for (var i = 0; i < list.length; i++) { + list[i] = typeof list[i] == lang.STRING? list[i]: list[i].join(inner||ice.FS) + } + return list.join(outer||ice.SP) + }, }) diff --git a/lib/core.js b/lib/core.js index 9215ccbf..57949b32 100644 --- a/lib/core.js +++ b/lib/core.js @@ -1,191 +1,191 @@ Volcanos("core", {help: "数据结构", - Keys: shy("连接器", function() { var list = [] - for (var i = 0; i < arguments.length; i++) { var v = arguments[i] - switch (typeof v) { - case lang.OBJECT: - for (var j = 0; j < v.length; j++) { - list.push(v[j]) - } - break - case lang.FUNCTION: v = v() - default: v && list.push(v+"") - } - } - return list.join(ice.PT) - }), - Value: shy("存储器", function(data, key, value) { - if (data == undefined) { return } - if (key == undefined) { return data } + Keys: shy("连接器", function() { var list = [] + for (var i = 0; i < arguments.length; i++) { var v = arguments[i] + switch (typeof v) { + case lang.OBJECT: + for (var j = 0; j < v.length; j++) { + list.push(v[j]) + } + break + case lang.FUNCTION: v = v() + default: v && list.push(v+"") + } + } + return list.join(ice.PT) + }), + Value: shy("存储器", function(data, key, value) { + if (data == undefined) { return } + if (key == undefined) { return data } - if (typeof key == lang.OBJECT) { for (var k in key) { - arguments.callee.call(this, data, k, key[k]) - }; return data } + if (typeof key == lang.OBJECT) { for (var k in key) { + arguments.callee.call(this, data, k, key[k]) + }; return data } - if (value != undefined) { data[key] = value } - if (data[key] != undefined) { return data[key] } + if (value != undefined) { data[key] = value } + if (data[key] != undefined) { return data[key] } - var p = data, ls = key.split(ice.PT); while (p && ls.length > 0) { - if (ls[0] == "-1") { ls[0] = p.length-1 } - p = p[ls[0]], ls = ls.slice(1) - }; return p - }), - Split: shy("分词器", function(str) { if (!str || !str.length) { return [] } - var opt = {detail: false}, arg = []; for (var i = 1; i < arguments.length; i++) { - typeof arguments[i] == lang.OBJECT? opt = arguments[i]: arg.push(arguments[i]) - } + var p = data, ls = key.split(ice.PT); while (p && ls.length > 0) { + if (ls[0] == "-1") { ls[0] = p.length-1 } + p = p[ls[0]], ls = ls.slice(1) + }; return p + }), + Split: shy("分词器", function(str) { if (!str || !str.length) { return [] } + var opt = {detail: false}, arg = []; for (var i = 1; i < arguments.length; i++) { + typeof arguments[i] == lang.OBJECT? opt = arguments[i]: arg.push(arguments[i]) + } - // 字符定义 - function _list(str) { var res = {}; for (var i = 0; i < str.length; i++) { res[str[i]] = true }; return res } - var space = _list(arg[0]||"\t ,;\n") // 空白符 - var block = _list(arg[1]||"{[()]}") // 分隔符 - var quote = _list(arg[2]||"'\"`") // 引用符 - var trans = _list(arg[3]||"\\") // 转义符 + // 字符定义 + function _list(str) { var res = {}; for (var i = 0; i < str.length; i++) { res[str[i]] = true }; return res } + var space = _list(arg[0]||"\t ,;\n") // 空白符 + var block = _list(arg[1]||"{[()]}") // 分隔符 + var quote = _list(arg[2]||"'\"`") // 引用符 + var trans = _list(arg[3]||"\\") // 转义符 - var res = [], begin = 0; function push(obj) { - obj && res.push(typeof obj == lang.STRING || opt.detail? obj: obj.text), begin = -1 - } + var res = [], begin = 0; function push(obj) { + obj && res.push(typeof obj == lang.STRING || opt.detail? obj: obj.text), begin = -1 + } - // 开始分词 - for (var s = "", i = 0; i < str.length; i++) { - if (space[str[i]]) { // 空白符 - if (s) { continue } - begin > -1 && push(str.slice(begin, i)) - opt.detail && push({type: "space", text: str.slice(i, i+1)}) + // 开始分词 + for (var s = "", i = 0; i < str.length; i++) { + if (space[str[i]]) { // 空白符 + if (s) { continue } + begin > -1 && push(str.slice(begin, i)) + opt.detail && push({type: "space", text: str.slice(i, i+1)}) - } else if (block[str[i]]) { // 分隔符 - if (s) { continue } - begin > -1 && push(str.slice(begin, i)) - push(str.slice(i, i+1)) + } else if (block[str[i]]) { // 分隔符 + if (s) { continue } + begin > -1 && push(str.slice(begin, i)) + push(str.slice(i, i+1)) - } else if (quote[str[i]]) { // 引用符 - if (s == "") { - s = str[i], begin = i+1 - } else if (s == str[i]) { - push({type: lang.STRING, text: str.slice(begin, i), left: s, right: str[i]}) - s = "", begin = -1 - } + } else if (quote[str[i]]) { // 引用符 + if (s == "") { + s = str[i], begin = i+1 + } else if (s == str[i]) { + push({type: lang.STRING, text: str.slice(begin, i), left: s, right: str[i]}) + s = "", begin = -1 + } - } else if (trans[str[i]]) { // 转义符 - begin == -1 && (begin = i++) + } else if (trans[str[i]]) { // 转义符 + begin == -1 && (begin = i++) - } else { // 普通符 - begin == -1 && (begin = i) - } - } + } else { // 普通符 + begin == -1 && (begin = i) + } + } - // 剩余字符 - begin >= 0 && (s? push({type: lang.STRING, text: str.slice(begin), left: s, right: ""}): push(str.slice(begin))) - return res - }), - CallFunc: shy("调用器", function(func, args, mod) { args = args||{} - var can = args["can"]||args[0], msg = args["msg"]||args[1], cmds = args["cmds"]||[], event = args["event"]||{} + // 剩余字符 + begin >= 0 && (s? push({type: lang.STRING, text: str.slice(begin), left: s, right: ""}): push(str.slice(begin))) + return res + }), + CallFunc: shy("调用器", function(func, args, mod) { args = args||{} + var can = args["can"]||args[0], msg = args["msg"]||args[1], cmds = args["cmds"]||[], event = args["event"]||{} - // 查找调用 - func = typeof func == lang.FUNCTION? func: typeof func == lang.STRING? this.Value(mod||can, func): - typeof func == lang.OBJECT && func.length > 0? this.Value(func[0], this.Keys(func.slice(1))): null - if (typeof func != lang.FUNCTION) { return } + // 查找调用 + func = typeof func == lang.FUNCTION? func: typeof func == lang.STRING? this.Value(mod||can, func): + typeof func == lang.OBJECT && func.length > 0? this.Value(func[0], this.Keys(func.slice(1))): null + if (typeof func != lang.FUNCTION) { return } - // 解析参数 - var list = [], echo = false, cb = args["cb"] - this.List(func.toString().split(")")[0].split("(")[1].split(ice.FS), function(item, index) { item = item.trim(); if (item == "") { return } - var arg = args[item] || msg&&msg.Option&&msg.Option(item) || can&&can.Conf&&can.Conf(item) || - event&&!(event instanceof Event)&&event[item] || args[index] || cmds[index] || null - if (item == "cb") { echo = true } - list.push(arg) - }) + // 解析参数 + var list = [], echo = false, cb = args["cb"] + this.List(func.toString().split(")")[0].split("(")[1].split(ice.FS), function(item, index) { item = item.trim(); if (item == "") { return } + var arg = args[item] || msg&&msg.Option&&msg.Option(item) || can&&can.Conf&&can.Conf(item) || + event&&!(event instanceof Event)&&event[item] || args[index] || cmds[index] || null + if (item == "cb") { echo = true } + list.push(arg) + }) - // 执行调用 - var res = func.apply(mod||can, list) - if (!echo && typeof cb == lang.FUNCTION) { res && msg && msg.Echo(res), arguments.callee.apply(this, [cb, {msg: msg, res: res}]) } - return res - }), + // 执行调用 + var res = func.apply(mod||can, list) + if (!echo && typeof cb == lang.FUNCTION) { res && msg && msg.Echo(res), arguments.callee.apply(this, [cb, {msg: msg, res: res}]) } + return res + }), - List: shy("迭代器", function(list, cb, interval, cbs) { - if (typeof list == lang.STRING) { // 默认序列 - list = [list] - } else if (typeof list == lang.NUMBER) { // 等差序列 [end cb interval]|[begin end interval] - var begin = 0, end = list, step = typeof interval == lang.NUMBER? interval: 1 - if (typeof cb == lang.NUMBER) { begin = list, end = cb, cb = null } - list = []; for (var i = begin; i < end; i += step) { list.push(i) } - } + List: shy("迭代器", function(list, cb, interval, cbs) { + if (typeof list == lang.STRING) { // 默认序列 + list = [list] + } else if (typeof list == lang.NUMBER) { // 等差序列 [end cb interval]|[begin end interval] + var begin = 0, end = list, step = typeof interval == lang.NUMBER? interval: 1 + if (typeof cb == lang.NUMBER) { begin = list, end = cb, cb = null } + list = []; for (var i = begin; i < end; i += step) { list.push(i) } + } - list = list||[] + list = list||[] - if (interval > 0) { // 时间序列 - function loop(i) { if (i >= list.length) { return typeof cbs == lang.FUNCTION && cbs(list) } - cb(list[i], i, list), setTimeout(function() { loop(i+1) }, interval) - } - typeof cb == lang.FUNCTION && list.length > 0 && setTimeout(function() { loop(0) }, interval/4) - } else { // 选择序列 - var slice = [], res - for (var i = 0; i < list.length; i++) { - typeof cb == lang.FUNCTION? (res = cb(list[i], i, list)) != undefined && slice.push(res): slice.push(list[i]) - }; list = slice - } - return list - }), - Next: shy("迭代器", function(list, cb, cbs) { - switch (typeof list) { - case lang.OBJECT: if (list == null) { list = []; break } - if (list.length == undefined) { var ls = []; for (var k in list) { ls.push(k) } list = ls } break - default: if (list == undefined) { list = []; break } - list = [list] - } + if (interval > 0) { // 时间序列 + function loop(i) { if (i >= list.length) { return typeof cbs == lang.FUNCTION && cbs(list) } + cb(list[i], i, list), setTimeout(function() { loop(i+1) }, interval) + } + typeof cb == lang.FUNCTION && list.length > 0 && setTimeout(function() { loop(0) }, interval/4) + } else { // 选择序列 + var slice = [], res + for (var i = 0; i < list.length; i++) { + typeof cb == lang.FUNCTION? (res = cb(list[i], i, list)) != undefined && slice.push(res): slice.push(list[i]) + }; list = slice + } + return list + }), + Next: shy("迭代器", function(list, cb, cbs) { + switch (typeof list) { + case lang.OBJECT: if (list == null) { list = []; break } + if (list.length == undefined) { var ls = []; for (var k in list) { ls.push(k) } list = ls } break + default: if (list == undefined) { list = []; break } + list = [list] + } - function next(i) { i < list.length? typeof cb == lang.FUNCTION && cb(list[i], function() { next(i+1) }, i, list): - typeof cbs == lang.FUNCTION && cbs(list) } - return next(0), list - }), - Items: shy("迭代器", function(obj, cb) { var list = [] - for (var k in obj) { - list = list.concat(this.List(obj[k], function(v, i) { - return typeof cb == lang.FUNCTION && cb(v, i, k, obj) - })) - } - return list - }), - Item: shy("迭代器", function(obj, cb) { var list = [] - for (var k in obj) { - var res = typeof cb == lang.FUNCTION? cb(k, obj[k]): k - res != undefined && list.push(res) - } - return list - }), - ItemCB: shy("迭代器", function(meta, cb, can, item) { var list = [] - for (var k in meta) { (function(k) { - if (k.indexOf("on") == 0 && typeof meta[k] == lang.FUNCTION) { - if (typeof cb == lang.FUNCTION) { - cb(k, meta[k]) - } else { - cb[k] = function(event) { meta[k](event, can, item) } - } - list.push(k) - } - })(k) } - return list - }), + function next(i) { i < list.length? typeof cb == lang.FUNCTION && cb(list[i], function() { next(i+1) }, i, list): + typeof cbs == lang.FUNCTION && cbs(list) } + return next(0), list + }), + Items: shy("迭代器", function(obj, cb) { var list = [] + for (var k in obj) { + list = list.concat(this.List(obj[k], function(v, i) { + return typeof cb == lang.FUNCTION && cb(v, i, k, obj) + })) + } + return list + }), + Item: shy("迭代器", function(obj, cb) { var list = [] + for (var k in obj) { + var res = typeof cb == lang.FUNCTION? cb(k, obj[k]): k + res != undefined && list.push(res) + } + return list + }), + ItemCB: shy("迭代器", function(meta, cb, can, item) { var list = [] + for (var k in meta) { (function(k) { + if (k.indexOf("on") == 0 && typeof meta[k] == lang.FUNCTION) { + if (typeof cb == lang.FUNCTION) { + cb(k, meta[k]) + } else { + cb[k] = function(event) { meta[k](event, can, item) } + } + list.push(k) + } + })(k) } + return list + }), - Timer300ms: function(cb) { this.Timer(300, cb) }, - Timer300: function(cb) { this.Timer(300, cb) }, - Timer3s: function(cb) { this.Timer(3000, cb) }, - Timer: shy("定时器, value, [1,2,3,4], {interval, length}", function(interval, cb, cbs) { - var timer = {stop: false}; function loop(i) { - timer.stop || i >= interval.length && interval.length >= 0 || cb(timer, interval.interval||interval[i], i, interval)? - typeof cbs == lang.FUNCTION && cbs(timer, interval): setTimeout(function() { loop(i+1) }, interval.interval||interval[i+1]) - } + Timer300ms: function(cb) { this.Timer(300, cb) }, + Timer300: function(cb) { this.Timer(300, cb) }, + Timer3s: function(cb) { this.Timer(3000, cb) }, + Timer: shy("定时器, value, [1,2,3,4], {interval, length}", function(interval, cb, cbs) { + var timer = {stop: false}; function loop(i) { + timer.stop || i >= interval.length && interval.length >= 0 || cb(timer, interval.interval||interval[i], i, interval)? + typeof cbs == lang.FUNCTION && cbs(timer, interval): setTimeout(function() { loop(i+1) }, interval.interval||interval[i+1]) + } - interval = typeof interval == lang.OBJECT? interval: [interval] - if (interval.interval == 0) { cb(); return timer } + interval = typeof interval == lang.OBJECT? interval: [interval] + if (interval.interval == 0) { cb(); return timer } - typeof cb == lang.FUNCTION && setTimeout(function() { loop(0) }, interval.interval||interval[0]) - return timer - }), - Delay: shy("延时器", function(list, interval, cb, cbs) { list = list || [] - list.push(cb); this.Timer(interval, function() { - var cb = list.pop(); list.length = 0 - typeof cb == lang.FUNCTION && cb() - }, cbs) - return list - }), + typeof cb == lang.FUNCTION && setTimeout(function() { loop(0) }, interval.interval||interval[0]) + return timer + }), + Delay: shy("延时器", function(list, interval, cb, cbs) { list = list || [] + list.push(cb); this.Timer(interval, function() { + var cb = list.pop(); list.length = 0 + typeof cb == lang.FUNCTION && cb() + }, cbs) + return list + }), }) diff --git a/lib/misc.js b/lib/misc.js index 65067933..846848ed 100644 --- a/lib/misc.js +++ b/lib/misc.js @@ -1,296 +1,296 @@ Volcanos("misc", {help: "通信协议", Message: function(event, can) { var msg = {} - var proto = {_event: event, _can: can, - RunAction: function(event, sub, cmds) { var msg = can.request(event) - if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } - if (cmds && cmds[0] == ctx.ACTION && sub && can.base.isFunc(sub.onaction[cmds[1]])) { - return msg.Option(ice.MSG_HANDLE, ice.TRUE), can.core.CallFunc(sub.onaction[cmds[1]], {event: event, can: sub, msg: msg, button: cmds[1], cmd: cmds[1]}), true - } - return false - }, - OptionStatus: function() { return msg.Option(ice.MSG_STATUS) }, - OptionProcess: function() { return msg.Option(ice.MSG_PROCESS) }, - OptionOrSearch: function(key) { return can.misc.Search(can, key)||msg.Option(key) }, - Option: function(key, val) { - if (key == undefined) { return msg && msg.option || [] } - if (can.base.isObject(key)) { can.core.Item(key, msg.Option) } - if (val == undefined) { return msg && msg[key] && msg[key][0] || "" } - return msg.option = can.base.AddUniq(msg.option, key), msg[key] = can.core.List(arguments).slice(1), val - }, - Append: function(key, val) { - if (key == undefined) { return msg && msg.append || [] } - if (can.base.isObject(key)) { can.core.Item(key, msg.Append) } - if (val == undefined) { return msg && msg[key] && msg[key][0] || "" } - return msg.append = can.base.AddUniq(msg.append, key), msg[key] = can.core.List(arguments).slice(1), val - }, - Result: function() { return msg.result && msg.result.join("") || "" }, + var proto = {_event: event, _can: can, + RunAction: function(event, sub, cmds) { var msg = can.request(event) + if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return } + if (cmds && cmds[0] == ctx.ACTION && sub && can.base.isFunc(sub.onaction[cmds[1]])) { + return msg.Option(ice.MSG_HANDLE, ice.TRUE), can.core.CallFunc(sub.onaction[cmds[1]], {event: event, can: sub, msg: msg, button: cmds[1], cmd: cmds[1]}), true + } + return false + }, + OptionStatus: function() { return msg.Option(ice.MSG_STATUS) }, + OptionProcess: function() { return msg.Option(ice.MSG_PROCESS) }, + OptionOrSearch: function(key) { return can.misc.Search(can, key)||msg.Option(key) }, + Option: function(key, val) { + if (key == undefined) { return msg && msg.option || [] } + if (can.base.isObject(key)) { can.core.Item(key, msg.Option) } + if (val == undefined) { return msg && msg[key] && msg[key][0] || "" } + return msg.option = can.base.AddUniq(msg.option, key), msg[key] = can.core.List(arguments).slice(1), val + }, + Append: function(key, val) { + if (key == undefined) { return msg && msg.append || [] } + if (can.base.isObject(key)) { can.core.Item(key, msg.Append) } + if (val == undefined) { return msg && msg[key] && msg[key][0] || "" } + return msg.append = can.base.AddUniq(msg.append, key), msg[key] = can.core.List(arguments).slice(1), val + }, + Result: function() { return msg.result && msg.result.join("") || "" }, - Length: function() { - var max = "", len = 0; can.core.List(msg.append, function(key, index) { - if (msg[key] && msg[key].length > len) { max = key, len = msg[key].length } - }) - return len - }, - Table: function(cb) { if (!msg.append || msg.append.length == 0) { return } - var max = "", len = 0; can.core.List(msg.append, function(key, index) { - if (msg[key] && msg[key].length > len) { max = key, len = msg[key].length } - }) + Length: function() { + var max = "", len = 0; can.core.List(msg.append, function(key, index) { + if (msg[key] && msg[key].length > len) { max = key, len = msg[key].length } + }) + return len + }, + Table: function(cb) { if (!msg.append || msg.append.length == 0) { return } + var max = "", len = 0; can.core.List(msg.append, function(key, index) { + if (msg[key] && msg[key].length > len) { max = key, len = msg[key].length } + }) - return can.core.List(msg[max], function(value, index, array) { var one = {}, res - can.core.List(msg.append, function(key) { one[key] = (msg[key]&&msg[key][index]||"") }) - return can.base.isFunc(cb) && (res = cb(one, index, array)) && res != undefined && res || one - }) - }, - Clear: function(key) { switch (key||ice.MSG_APPEND) { - case ice.MSG_APPEND: - case ice.MSG_OPTION: - can.core.List(msg[key], function(item) { delete(msg[item]) }) - default: msg[key] = [] - } }, - Copy: function(res) { if (!res) { return msg } - res.result && (msg.result = (msg.result||[]).concat(res.result)) - res.append && (msg.append = res.append) && res.append.forEach(function(item) { - var i = msg.option && msg.option.indexOf(item); if (i > -1) { - msg.option[i] = "", delete(msg[item]) - } - res[item] && (msg[item] = (msg[item]||[]).concat(res[item])) - }) - res.option && (msg.option = res.option) && res.option.forEach(function(item) { - res[item] && (msg[item] = res[item]) - }) - res._option && (msg._option = res._option) && res._option.forEach(function(item) { - res[item] && (msg[item] = res[item]) - }) - return msg - }, - Push: function(key, value, detail) { - if (can.base.isObject(key)) { - value = value||can.core.Item(key), can.core.List(value, function(item) { - detail? msg.Push(mdb.KEY, item).Push(mdb.VALUE, key[item]||""): - msg.Push(item, key[item]||"") - }) - return msg - } + return can.core.List(msg[max], function(value, index, array) { var one = {}, res + can.core.List(msg.append, function(key) { one[key] = (msg[key]&&msg[key][index]||"") }) + return can.base.isFunc(cb) && (res = cb(one, index, array)) && res != undefined && res || one + }) + }, + Clear: function(key) { switch (key||ice.MSG_APPEND) { + case ice.MSG_APPEND: + case ice.MSG_OPTION: + can.core.List(msg[key], function(item) { delete(msg[item]) }) + default: msg[key] = [] + } }, + Copy: function(res) { if (!res) { return msg } + res.result && (msg.result = (msg.result||[]).concat(res.result)) + res.append && (msg.append = res.append) && res.append.forEach(function(item) { + var i = msg.option && msg.option.indexOf(item); if (i > -1) { + msg.option[i] = "", delete(msg[item]) + } + res[item] && (msg[item] = (msg[item]||[]).concat(res[item])) + }) + res.option && (msg.option = res.option) && res.option.forEach(function(item) { + res[item] && (msg[item] = res[item]) + }) + res._option && (msg._option = res._option) && res._option.forEach(function(item) { + res[item] && (msg[item] = res[item]) + }) + return msg + }, + Push: function(key, value, detail) { + if (can.base.isObject(key)) { + value = value||can.core.Item(key), can.core.List(value, function(item) { + detail? msg.Push(mdb.KEY, item).Push(mdb.VALUE, key[item]||""): + msg.Push(item, key[item]||"") + }) + return msg + } - msg.append = can.base.AddUniq(msg.append, key), msg[key] = msg[key] || [] - msg[key].push(can.base.isString(value)||can.base.isFunction(value)? value: JSON.stringify(value)) - return msg - }, - Echo: function(res) { msg.result = msg.result || [] - for (var i = 0; i < arguments.length; i++) { msg.result.push(arguments[i]) } - return msg._hand = true, msg - }, - }; - return can.misc.proto(msg, proto) - }, - POST: function(can, msg, url, form, cb) { // _method _accept _upload _progress - var xhr = new XMLHttpRequest(); msg._xhr = xhr - xhr.open(msg._method||"POST", url), xhr.onreadystatechange = function() { - if (xhr.readyState != 4) { return } + msg.append = can.base.AddUniq(msg.append, key), msg[key] = msg[key] || [] + msg[key].push(can.base.isString(value)||can.base.isFunction(value)? value: JSON.stringify(value)) + return msg + }, + Echo: function(res) { msg.result = msg.result || [] + for (var i = 0; i < arguments.length; i++) { msg.result.push(arguments[i]) } + return msg._hand = true, msg + }, + }; + return can.misc.proto(msg, proto) +}, + POST: function(can, msg, url, form, cb) { // _method _accept _upload _progress + var xhr = new XMLHttpRequest(); msg._xhr = xhr + xhr.open(msg._method||"POST", url), xhr.onreadystatechange = function() { + if (xhr.readyState != 4) { return } - try { // 解析响应 - var res = JSON.parse(xhr.responseText) - } catch (e) { - var res = {result: [xhr.responseText]} - } - if (xhr.status == 200) { - return can.base.isFunc(cb) && cb(msg.Copy(res)) - } - can.user.toast(can, res, xhr.status) - } + try { // 解析响应 + var res = JSON.parse(xhr.responseText) + } catch (e) { + var res = {result: [xhr.responseText]} + } + if (xhr.status == 200) { + return can.base.isFunc(cb) && cb(msg.Copy(res)) + } + can.user.toast(can, res, xhr.status) + } - if (msg._upload) { // 上传文件 - var data = new FormData(); can.core.Items(form, function(value, index, key) { - data.append(key, value) - }), data.append(html.UPLOAD, msg._upload), data.append(ice.MSG_UPLOAD, "upload") + if (msg._upload) { // 上传文件 + var data = new FormData(); can.core.Items(form, function(value, index, key) { + data.append(key, value) + }), data.append(html.UPLOAD, msg._upload), data.append(ice.MSG_UPLOAD, "upload") - xhr.upload.onprogress = function(event) { - can.base.isFunc(msg._progress) && msg._progress(event, parseInt(event.loaded*100/event.total), event.total, event.loaded) - } - } else { // 请求数据 - var data = can.core.Items(form, function(value, index, key) { return key+"="+encodeURIComponent(value) }).join("&") - xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") - } + xhr.upload.onprogress = function(event) { + can.base.isFunc(msg._progress) && msg._progress(event, parseInt(event.loaded*100/event.total), event.total, event.loaded) + } + } else { // 请求数据 + var data = can.core.Items(form, function(value, index, key) { return key+"="+encodeURIComponent(value) }).join("&") + xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded") + } - // 发送请求 - xhr.setRequestHeader("Accept", msg._accept||"application/json") - try { xhr.send(data) } catch(e) { can.misc.Log(e) } - }, - Run: function(event, can, dataset, cmds, cb) { - var msg = can.request(event||{}), skip = {_handle: true} - var form = {cmds: cmds||msg.cmd}; msg.option && msg.option.forEach(function(item) { - !skip[item] && msg[item] && (form[item] = msg[item]) - }) + // 发送请求 + xhr.setRequestHeader("Accept", msg._accept||"application/json") + try { xhr.send(data) } catch(e) { can.misc.Log(e) } + }, + Run: function(event, can, dataset, cmds, cb) { + var msg = can.request(event||{}), skip = {_handle: true} + var form = {cmds: cmds||msg.cmd}; msg.option && msg.option.forEach(function(item) { + !skip[item] && msg[item] && (form[item] = msg[item]) + }) - can.misc.POST(can, msg, can.base.MergeURL(dataset.names.toLowerCase(), - "_", (msg._can.sup||msg._can)._name, ice.MSG_DAEMON, msg.__daemon||dataset.daemon||"" - ), form, cb) - }, - WSS: function(can, args, cb, onopen, onclose, onerror) { if (can.user.isIE) { return } - var url = location.protocol.replace("http", "ws")+"//"+location.host+"/space/" - if (url.indexOf("chrome") == 0) { url = "ws://localhost:9020/space/" } + can.misc.POST(can, msg, can.base.MergeURL(dataset.names.toLowerCase(), + "_", (msg._can.sup||msg._can)._name, ice.MSG_DAEMON, msg.__daemon||dataset.daemon||"" + ), form, cb) + }, + WSS: function(can, args, cb, onopen, onclose, onerror) { if (can.user.isIE) { return } + var url = location.protocol.replace("http", "ws")+"//"+location.host+"/space/" + if (url.indexOf("chrome") == 0) { url = "ws://localhost:9020/space/" } - var socket = new WebSocket(can.base.MergeURL(url, args)) - socket.onclose = function() { can.misc.Log(html.WSS, cli.CLOSE, args) - can.base.isFunc(onclose)? onclose(socket): can.core.Timer(1000, function() { - can.misc.WSS(can, args, cb, onopen, onerror, onclose) - }) - }, socket.onerror = function() { can.misc.Log(html.WSS, cli.ERROR, args) - can.base.isFunc(onerror)? onerror(socket): socket.close() + var socket = new WebSocket(can.base.MergeURL(url, args)) + socket.onclose = function() { can.misc.Log(html.WSS, cli.CLOSE, args) + can.base.isFunc(onclose)? onclose(socket): can.core.Timer(1000, function() { + can.misc.WSS(can, args, cb, onopen, onerror, onclose) + }) + }, socket.onerror = function() { can.misc.Log(html.WSS, cli.ERROR, args) + can.base.isFunc(onerror)? onerror(socket): socket.close() - }, socket.onopen = function() { can.misc.Log(html.WSS, cli.OPEN, args) - can.base.isFunc(onopen) && onopen(socket) - } + }, socket.onopen = function() { can.misc.Log(html.WSS, cli.OPEN, args) + can.base.isFunc(onopen) && onopen(socket) + } - socket.onmessage = function(event) { - try { // 解析命令 - var data = JSON.parse(event.data) - } catch (e) { - var data = {detail: [event.data]} - } + socket.onmessage = function(event) { + try { // 解析命令 + var data = JSON.parse(event.data) + } catch (e) { + var data = {detail: [event.data]} + } - var msg = can.request(event); msg.Reply = function() { // 回复命令 - msg.result = (msg.result||[]).concat(can.core.List(arguments)) + var msg = can.request(event); msg.Reply = function() { // 回复命令 + msg.result = (msg.result||[]).concat(can.core.List(arguments)) - msg.Option({_handle: true, _source: (msg[ice.MSG_TARGET]||[]).reverse().slice(1).join(ice.PT)||"",_target: (msg[ice.MSG_SOURCE]||[]).reverse().join(".")}) - can.misc.Log(html.WSS, ice.MSG_RESULT, msg.result, msg) + msg.Option({_handle: true, _source: (msg[ice.MSG_TARGET]||[]).reverse().slice(1).join(ice.PT)||"",_target: (msg[ice.MSG_SOURCE]||[]).reverse().join(".")}) + can.misc.Log(html.WSS, ice.MSG_RESULT, msg.result, msg) - delete(msg._event), delete(msg._can) - socket.send(JSON.stringify(msg)) - }, msg.detail = data.detail, msg.Copy(data) + delete(msg._event), delete(msg._can) + socket.send(JSON.stringify(msg)) + }, msg.detail = data.detail, msg.Copy(data) - // 执行命令 - try { - can.misc.Log(html.WSS, ice.MSG_DETAIL, msg.detail, msg) - can.base.isFunc(cb) && cb(event, msg, msg.detail[0], msg.detail.slice(1)) - } catch (e) { // 执行失败 - can.misc.Log(e), msg.Reply() - } - } - }, + // 执行命令 + try { + can.misc.Log(html.WSS, ice.MSG_DETAIL, msg.detail, msg) + can.base.isFunc(cb) && cb(event, msg, msg.detail[0], msg.detail.slice(1)) + } catch (e) { // 执行失败 + can.misc.Log(e), msg.Reply() + } + } + }, - CookieSessid: shy("会话变量", function(can, value, path) { - var name = ice.MSG_SESSID+"_"+location.host.replaceAll(".", "_").replaceAll(":", "_") - return can.misc.Cookie(can, name, value, path) - }), - Cookie: shy("会话变量", function(can, key, value, path) { - function set(k, v) { document.cookie = k+"="+v+";path="+(path||ice.PS) } + CookieSessid: shy("会话变量", function(can, value, path) { + var name = ice.MSG_SESSID+"_"+location.host.replaceAll(".", "_").replaceAll(":", "_") + return can.misc.Cookie(can, name, value, path) + }), + Cookie: shy("会话变量", function(can, key, value, path) { + function set(k, v) { document.cookie = k+"="+v+";path="+(path||ice.PS) } - if (can.base.isObject(key)) { - for (var k in key) { set(k, key[k]) } - key = undefined - } - if (key == undefined) { var cs = {} - document.cookie.split("; ").forEach(function(item) { - var ls = item.split("="); cs[ls[0]] = ls[1] - }) - return cs - } + if (can.base.isObject(key)) { + for (var k in key) { set(k, key[k]) } + key = undefined + } + if (key == undefined) { var cs = {} + document.cookie.split("; ").forEach(function(item) { + var ls = item.split("="); cs[ls[0]] = ls[1] + }) + return cs + } - value != undefined && set(key, value) - var val = (new RegExp(key+"=([^;]*);?")).exec(document.cookie) - return val && val.length > 0? val[1]: "" - }), - SearchOrConf: function(can, key, def) { - can.base.getValid(can.misc.Search(can, key), can.Conf(key), def) - }, - Search: shy("请求参数", function(can, key, value) { var args = {} - if (value == undefined && can.base.isString(key)) { - var ls = location.pathname.split(ice.PS) - if (ls[1] == chat.SHARE) { args[chat.SHARE] = ls[2] } - if (ls[1] == "chat" && ls[2] == ice.POD) { args[ice.POD] = ls[3] } - } + value != undefined && set(key, value) + var val = (new RegExp(key+"=([^;]*);?")).exec(document.cookie) + return val && val.length > 0? val[1]: "" + }), + SearchOrConf: function(can, key, def) { + can.base.getValid(can.misc.Search(can, key), can.Conf(key), def) + }, + Search: shy("请求参数", function(can, key, value) { var args = {} + if (value == undefined && can.base.isString(key)) { + var ls = location.pathname.split(ice.PS) + if (ls[1] == chat.SHARE) { args[chat.SHARE] = ls[2] } + if (ls[1] == "chat" && ls[2] == ice.POD) { args[ice.POD] = ls[3] } + } - location.search && location.search.slice(1).split("&").forEach(function(item) { var x = item.split("=") - x[1] != "" && (args[x[0]] = decodeURIComponent(x[1])) - }) + location.search && location.search.slice(1).split("&").forEach(function(item) { var x = item.split("=") + x[1] != "" && (args[x[0]] = decodeURIComponent(x[1])) + }) - if (can.base.isObject(key)) { - can.core.Item(key, function(key, value) { - if (value != undefined) {args[key] = value} - args[key] == "" && delete(args[key]) - }) - } else if (key == undefined) { - return args - } else if (value == undefined) { - return args[key] - } else { - args[key] = value, args[key] == "" && delete(args[key]) - } + if (can.base.isObject(key)) { + can.core.Item(key, function(key, value) { + if (value != undefined) {args[key] = value} + args[key] == "" && delete(args[key]) + }) + } else if (key == undefined) { + return args + } else if (value == undefined) { + return args[key] + } else { + args[key] = value, args[key] == "" && delete(args[key]) + } - return location.search = can.core.Item(args, function(key, value) { - return key+"="+encodeURIComponent(value) - }).join("&") - }), - MergeURL: shy("地址链接", function(can, objs, clear) { - var path = location.pathname; objs._path && (path = objs._path, delete(objs._path)) - objs && objs.pod && (path = "/chat/pod/"+objs.pod, delete(objs.pod)) - return can.base.MergeURL(location.origin+path+(clear?"":location.search), objs) - }), + return location.search = can.core.Item(args, function(key, value) { + return key+"="+encodeURIComponent(value) + }).join("&") + }), + MergeURL: shy("地址链接", function(can, objs, clear) { + var path = location.pathname; objs._path && (path = objs._path, delete(objs._path)) + objs && objs.pod && (path = "/chat/pod/"+objs.pod, delete(objs.pod)) + return can.base.MergeURL(location.origin+path+(clear?"":location.search), objs) + }), - runAction: function(can, msg, cmds, cb, list) { - if (cmds[0] == ctx.ACTION && list[cmds[1]]) { return list[cmds[1]](cmds.slice(2)), true } - if (list[cmds[0]]) { return list[cmds[0]](cmds.slice(1)), true } - }, - concat: function(can, to, from) { to = to||[], from = from||[] - if (from[0] == ctx.ACTION && from[1] == ice.RUN && can.onengine.plugin.meta[from[2]]) { - return from - } - if (can.onengine.plugin.meta[from[0]]) { - return from - } - if (from[0] == "_search") { return from } - return to.concat(from) - }, - proto: function(sub, sup) { - if (navigator.userAgent.indexOf("MSIE") > -1) { - for (var k in sup) { sub[k] = sub[k]||sup[k] } - } else { - sub.__proto__ = sup - } - return sub - }, + runAction: function(can, msg, cmds, cb, list) { + if (cmds[0] == ctx.ACTION && list[cmds[1]]) { return list[cmds[1]](cmds.slice(2)), true } + if (list[cmds[0]]) { return list[cmds[0]](cmds.slice(1)), true } + }, + concat: function(can, to, from) { to = to||[], from = from||[] + if (from[0] == ctx.ACTION && from[1] == ice.RUN && can.onengine.plugin.meta[from[2]]) { + return from + } + if (can.onengine.plugin.meta[from[0]]) { + return from + } + if (from[0] == "_search") { return from } + return to.concat(from) + }, + proto: function(sub, sup) { + if (navigator.userAgent.indexOf("MSIE") > -1) { + for (var k in sup) { sub[k] = sub[k]||sup[k] } + } else { + sub.__proto__ = sup + } + return sub + }, - Log: function() { - var args = [this._time(), this.FileLine(2, 3)] - for (var i in arguments) { args.push(arguments[i]) } - console.log.apply(console, args) - }, - Info: function() { - var args = [this._time(), this.FileLine(2, 3)] - for (var i in arguments) { args.push(arguments[i]) } - console.log.apply(console, args) - }, - Warn: function() { - var args = [this._time(), this.FileLine(2, 3), "warn"] - for (var i in arguments) { args.push(arguments[i]) } - args.push(ice.NL, this._fileLine().split(ice.NL).slice(2).join(ice.NL)) - console.log.apply(console, args) - }, - Debug: function() { - var args = [this._time(), this.FileLine(2, 3), "debug"] - for (var i in arguments) { args.push(arguments[i]) } - args.push(this.fileLine(2, 3)) - console.log.apply(console, args) - navigator.userAgent.indexOf("Mobile") > -1 && alert(JSON.stringify(args.join(ice.SP))) - }, - FileLine: function(depth, length) { - return this.fileLine(depth+1).split(ice.PS).slice(3).slice(-length).join(ice.PS).split(")")[0] - }, - fileLine: function(depth) { - return (this._fileLine().split(ice.NL)[1+depth]||"").trim() - }, - _fileLine: function() { var obj = {} - Error.captureStackTrace && Error.captureStackTrace(obj, arguments.callee) - return obj.stack || "" - }, - _time: function() { var now = new Date() - var hour = now.getHours() - if (hour < 10) { hour = "0"+hour } - var minute = now.getMinutes() - if (minute < 10) { minute = "0"+minute } - var second = now.getSeconds() - if (second < 10) { second = "0"+second } - return hour+":"+minute+":"+second - }, + Log: function() { + var args = [this._time(), this.FileLine(2, 3)] + for (var i in arguments) { args.push(arguments[i]) } + console.log.apply(console, args) + }, + Info: function() { + var args = [this._time(), this.FileLine(2, 3)] + for (var i in arguments) { args.push(arguments[i]) } + console.log.apply(console, args) + }, + Warn: function() { + var args = [this._time(), this.FileLine(2, 3), "warn"] + for (var i in arguments) { args.push(arguments[i]) } + args.push(ice.NL, this._fileLine().split(ice.NL).slice(2).join(ice.NL)) + console.log.apply(console, args) + }, + Debug: function() { + var args = [this._time(), this.FileLine(2, 3), "debug"] + for (var i in arguments) { args.push(arguments[i]) } + args.push(this.fileLine(2, 3)) + console.log.apply(console, args) + navigator.userAgent.indexOf("Mobile") > -1 && alert(JSON.stringify(args.join(ice.SP))) + }, + FileLine: function(depth, length) { + return this.fileLine(depth+1).split(ice.PS).slice(3).slice(-length).join(ice.PS).split(")")[0] + }, + fileLine: function(depth) { + return (this._fileLine().split(ice.NL)[1+depth]||"").trim() + }, + _fileLine: function() { var obj = {} + Error.captureStackTrace && Error.captureStackTrace(obj, arguments.callee) + return obj.stack || "" + }, + _time: function() { var now = new Date() + var hour = now.getHours() + if (hour < 10) { hour = "0"+hour } + var minute = now.getMinutes() + if (minute < 10) { minute = "0"+minute } + var second = now.getSeconds() + if (second < 10) { second = "0"+second } + return hour+":"+minute+":"+second + }, }) diff --git a/lib/page.js b/lib/page.js index 384340b7..8485822d 100644 --- a/lib/page.js +++ b/lib/page.js @@ -1,417 +1,417 @@ Volcanos("page", {help: "用户界面", ClassList: { - has: function(can, obj, key) { var list = obj.className? obj.className.split(ice.SP): [] - return list.indexOf(key) > -1 - }, - add: function(can, obj, key) { var list = obj.className? obj.className.split(ice.SP): [] - var value = can.base.AddUniq(list, key).join(ice.SP).trim() - return value != obj.className && (obj.className = value), value - }, - del: function(can, obj, key) { var list = obj.className? obj.className.split(ice.SP): [] - return obj.className = can.core.List(list, function(value) { - return value == key? undefined: value - }).join(ice.SP).trim() - }, - set: function(can, obj, key, condition) { - return (condition? this.add(can, obj, key): this.del(can, obj, key)).indexOf(key) > -1 - }, - neg: function(can, obj, key) { - return (this.has(can, obj, key)? this.del(can, obj, key): this.add(can, obj, key)).indexOf(key) > -1 - }, - }, - SelectArgs: function(can, option, key, cb) { - if (can.base.isUndefined(key)) { var value = {} - can.page.SelectArgs(can, option, "", function(item) { - item.name && item.value && (value[item.name] = item.value) - }); return [value] - } - if (can.base.isObject(key)) { - return can.core.Item(key, function(key, value) { can.page.SelectArgs(can, option, key, value) }), [key] - } - if (!can.base.isFunc(cb)) { var value = cb; cb = function(item) { if (item.type == html.BUTTON) { return } - return item.name && (can.base.isUndefined(value)? item.value: (item.value = value))||"" - } } - if (key.indexOf(ice.PT) > -1) { return [""]} - return can.page.Select(can, option, key? "textarea[name="+key+"],"+"input[name="+key+"],"+"select[name="+key+"]": ".args", cb) - }, - SelectAll: shy("选择节点", function(can, target, key, cb, interval, cbs) { - can.page.Select(can, target, html.IFRAME, function(item) { - can.page.SelectAll(can, item.contentWindow.document.body, key, cb, interval, cbs) - }) - return can.core.List(target && target.querySelectorAll(key), cb, interval, cbs) - }), - Select: shy("选择节点", function(can, target, key, cb, interval, cbs) { if (key == ice.PT) { cb(target); return [] } - return can.core.List(target && target.querySelectorAll(can.page.Keys(key)), cb, interval, cbs) - }), - Modify: shy("修改节点", function(can, target, value) { target = target||{} - target = can.base.isObject(target)? target: document.querySelector(target) - can.base.isString(value)? (target.innerHTML = value): can.core.Item(value, function(key, val) { - !can.base.isObject(val)? (target[key] = val): can.core.Item(val, function(k, v) { - var size = { - "height": true, "max-height": true, "min-height": true, - "width": true, "max-width": true, "min-width": true, - } - if (size[k] && parseInt(v) < 0) { return target[key] && (target[key][k] = "") } + has: function(can, obj, key) { var list = obj.className? obj.className.split(ice.SP): [] + return list.indexOf(key) > -1 + }, + add: function(can, obj, key) { var list = obj.className? obj.className.split(ice.SP): [] + var value = can.base.AddUniq(list, key).join(ice.SP).trim() + return value != obj.className && (obj.className = value), value + }, + del: function(can, obj, key) { var list = obj.className? obj.className.split(ice.SP): [] + return obj.className = can.core.List(list, function(value) { + return value == key? undefined: value + }).join(ice.SP).trim() + }, + set: function(can, obj, key, condition) { + return (condition? this.add(can, obj, key): this.del(can, obj, key)).indexOf(key) > -1 + }, + neg: function(can, obj, key) { + return (this.has(can, obj, key)? this.del(can, obj, key): this.add(can, obj, key)).indexOf(key) > -1 + }, + }, + SelectArgs: function(can, option, key, cb) { + if (can.base.isUndefined(key)) { var value = {} + can.page.SelectArgs(can, option, "", function(item) { + item.name && item.value && (value[item.name] = item.value) + }); return [value] + } + if (can.base.isObject(key)) { + return can.core.Item(key, function(key, value) { can.page.SelectArgs(can, option, key, value) }), [key] + } + if (!can.base.isFunc(cb)) { var value = cb; cb = function(item) { if (item.type == html.BUTTON) { return } + return item.name && (can.base.isUndefined(value)? item.value: (item.value = value))||"" + } } + if (key.indexOf(ice.PT) > -1) { return [""]} + return can.page.Select(can, option, key? "textarea[name="+key+"],"+"input[name="+key+"],"+"select[name="+key+"]": ".args", cb) + }, + SelectAll: shy("选择节点", function(can, target, key, cb, interval, cbs) { + can.page.Select(can, target, html.IFRAME, function(item) { + can.page.SelectAll(can, item.contentWindow.document.body, key, cb, interval, cbs) + }) + return can.core.List(target && target.querySelectorAll(key), cb, interval, cbs) + }), + Select: shy("选择节点", function(can, target, key, cb, interval, cbs) { if (key == ice.PT) { cb(target); return [] } + return can.core.List(target && target.querySelectorAll(can.page.Keys(key)), cb, interval, cbs) + }), + Modify: shy("修改节点", function(can, target, value) { target = target||{} + target = can.base.isObject(target)? target: document.querySelector(target) + can.base.isString(value)? (target.innerHTML = value): can.core.Item(value, function(key, val) { + !can.base.isObject(val)? (target[key] = val): can.core.Item(val, function(k, v) { + var size = { + "height": true, "max-height": true, "min-height": true, + "width": true, "max-width": true, "min-width": true, + } + if (size[k] && parseInt(v) < 0) { return target[key] && (target[key][k] = "") } - var size = { - "margin-top": true, "margin-left": true, "font-size": true, - "left": true, "right": true, "top": true, "bottom": true, - "height": true, "max-height": true, "min-height": true, - "width": true, "max-width": true, "min-width": true, - } + var size = { + "margin-top": true, "margin-left": true, "font-size": true, + "left": true, "right": true, "top": true, "bottom": true, + "height": true, "max-height": true, "min-height": true, + "width": true, "max-width": true, "min-width": true, + } - if (size[k] && v && (can.base.isNumber(v) || v.indexOf && v.indexOf("px") == -1)) { - v += "px" - } - target[key] && (target[key][k] = v) - }) - }) - return target - }), - Remove: shy("删除节点", function(can, target) { - return target && target.parentNode && target.parentNode.removeChild(target), target - }), - Create: shy("创建节点", function(can, key, value) { - return can.page.Modify(can, document.createElement(key), value) - }), - Append: shy("添加节点", function(can, target, key, value) { value = value||{} - if (can.base.isString(key)) { var res = can.page.Create(can, key, value); return target.appendChild(res), res } + if (size[k] && v && (can.base.isNumber(v) || v.indexOf && v.indexOf("px") == -1)) { + v += "px" + } + target[key] && (target[key][k] = v) + }) + }) + return target + }), + Remove: shy("删除节点", function(can, target) { + return target && target.parentNode && target.parentNode.removeChild(target), target + }), + Create: shy("创建节点", function(can, key, value) { + return can.page.Modify(can, document.createElement(key), value) + }), + Append: shy("添加节点", function(can, target, key, value) { value = value||{} + if (can.base.isString(key)) { var res = can.page.Create(can, key, value); return target.appendChild(res), res } - can.core.List(key, function(item, index) { if (!item) { return } - if (can.base.isString(item)) { target.innerHTML = item; return } - if (item.nodeName) { target.appendChild(item); return } + can.core.List(key, function(item, index) { if (!item) { return } + if (can.base.isString(item)) { target.innerHTML = item; return } + if (item.nodeName) { target.appendChild(item); return } - // 基本结构: type name data list - var type = item.type||html.DIV, data = item.data||{} - var name = item.name||data.name||"" + // 基本结构: type name data list + var type = item.type||html.DIV, data = item.data||{} + var name = item.name||data.name||"" - // 数据调整 - can.core.Item(item, function(key, value) { - switch (key) { - case mdb.TYPE: break - case mdb.NAME: break - case mdb.DATA: break - case mdb.LIST: break - case html.INNER: data.innerHTML = item.inner; break - case html.CLICK: data.onclick = item.click; break - default: data[key] = item[key] - } - }) + // 数据调整 + can.core.Item(item, function(key, value) { + switch (key) { + case mdb.TYPE: break + case mdb.NAME: break + case mdb.DATA: break + case mdb.LIST: break + case html.INNER: data.innerHTML = item.inner; break + case html.CLICK: data.onclick = item.click; break + default: data[key] = item[key] + } + }) - // 基本类型: view text button select input username password - // 基本类型: img row th td - if (item.view) { var list = can.core.List(item.view) - list.length > 0 && list[0] && can.page.ClassList.add(can, data, list[0]) - type = list[1]||html.DIV - data.innerHTML = list[2]||data.innerHTML||"" - name = name||list[3]||"" + // 基本类型: view text button select input username password + // 基本类型: img row th td + if (item.view) { var list = can.core.List(item.view) + list.length > 0 && list[0] && can.page.ClassList.add(can, data, list[0]) + type = list[1]||html.DIV + data.innerHTML = list[2]||data.innerHTML||"" + name = name||list[3]||"" - } else if (item.text) { var list = can.core.List(item.text) - data.innerHTML = list[0]||data.innerHTML||"" - type = list[1]||html.SPAN - list[2] && can.page.ClassList.add(can, data, list[2]) + } else if (item.text) { var list = can.core.List(item.text) + data.innerHTML = list[0]||data.innerHTML||"" + type = list[1]||html.SPAN + list[2] && can.page.ClassList.add(can, data, list[2]) - } else if (item.button) { var list = can.core.List(item.button) - type = html.BUTTON, name = name||list[0] - data.innerText = can.user.trans(can, list[0]), data.onclick = function(event) { - can.base.isFunction(list[1]) && list[1](event, name) - can.onkeymap.prevent(event) - return true - } + } else if (item.button) { var list = can.core.List(item.button) + type = html.BUTTON, name = name||list[0] + data.innerText = can.user.trans(can, list[0]), data.onclick = function(event) { + can.base.isFunction(list[1]) && list[1](event, name) + can.onkeymap.prevent(event) + return true + } - } else if (item.select) { var list = item.select - type = html.SELECT, data.name = name = name||list[0][0] - data.title = can.user.trans(can, data.title||name) - data.className = data.className||list[0][0]||"" + } else if (item.select) { var list = item.select + type = html.SELECT, data.name = name = name||list[0][0] + data.title = can.user.trans(can, data.title||name) + data.className = data.className||list[0][0]||"" - item.list = list[0].slice(1).map(function(value) { - return {type: html.OPTION, value: value, inner: can.user.trans(can, value)} - }) - data.onchange = function(event) { - can.base.isFunction(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)} + }) + data.onchange = function(event) { + can.base.isFunction(list[1]) && list[1](event, event.target.value, name) + } - } else if (item.input) { var list = can.core.List(item.input) - type = html.INPUT, name = name||list[0]||"", data.name = data.name||name - data.className = data.className||data.name - data.autocomplete = "off" + } else if (item.input) { var list = can.core.List(item.input) + type = html.INPUT, name = name||list[0]||"", data.name = data.name||name + data.className = data.className||data.name + data.autocomplete = "off" - data.onfocus = data.onfocus||function(event) { - event.target.setSelectionRange(0, -1) - } - data.onkeydown = function(event) { - can.base.isFunction(list[1]) && list[1](event) - } - data.onkeyup = function(event) { - can.base.isFunction(list[2]) && list[2](event) - } - } else if (item.username) { var list = can.core.List(item.username) - type = html.INPUT, name = name||list[0]||html.USERNAME, data.name = data.name||name - data.className = list[1]||data.className||data.name - data.autocomplete = data.autocomplete||html.USERNAME + data.onfocus = data.onfocus||function(event) { + event.target.setSelectionRange(0, -1) + } + data.onkeydown = function(event) { + can.base.isFunction(list[1]) && list[1](event) + } + data.onkeyup = function(event) { + can.base.isFunction(list[2]) && list[2](event) + } + } else if (item.username) { var list = can.core.List(item.username) + type = html.INPUT, name = name||list[0]||html.USERNAME, data.name = data.name||name + data.className = list[1]||data.className||data.name + data.autocomplete = data.autocomplete||html.USERNAME - } else if (item.password) { var list = can.core.List(item.password) - type = html.INPUT, name = name||list[0]||html.PASSWORD, data.name = data.name||name - data.className = list[1]||data.className||data.name - data.autocomplete = data.autocomplete||"current-password" - data.type = html.PASSWORD + } else if (item.password) { var list = can.core.List(item.password) + type = html.INPUT, name = name||list[0]||html.PASSWORD, data.name = data.name||name + data.className = list[1]||data.className||data.name + data.autocomplete = data.autocomplete||"current-password" + data.type = html.PASSWORD - } else if (item.img) { var list = can.core.List(item.img) - type = html.IMG, data.src = list[0] + } else if (item.img) { var list = can.core.List(item.img) + type = html.IMG, data.src = list[0] - } 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 {text: [text, html.TD]} }) - } + } 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 {text: [text, html.TD]} }) + } - // 语言转换 - if (type == html.INPUT) { data.type == html.BUTTON && (data.value = can.user.trans(can, data.value)) - if (data.type == html.TEXT||data.type == html.PASSWORD||!data.type) { data.autocomplete = data.autocomplete||"off" - data.placeholder = can.user.trans(can, (data.placeholder||data.name||"").split(ice.PT).pop()) - data.title = can.user.trans(can, data.title||data.placeholder) - } - } - if (type == html.TEXTAREA) { - data.placeholder = can.user.trans(can, (data.placeholder||data.name||"").split(ice.PT).pop()) - } + // 语言转换 + if (type == html.INPUT) { data.type == html.BUTTON && (data.value = can.user.trans(can, data.value)) + if (data.type == html.TEXT||data.type == html.PASSWORD||!data.type) { data.autocomplete = data.autocomplete||"off" + data.placeholder = can.user.trans(can, (data.placeholder||data.name||"").split(ice.PT).pop()) + data.title = can.user.trans(can, data.title||data.placeholder) + } + } + if (type == html.TEXTAREA) { + data.placeholder = can.user.trans(can, (data.placeholder||data.name||"").split(ice.PT).pop()) + } - // 创建节点 - !data.name && item.name && (data.name = item.name) - var node = can.page.Create(can, type, data) + // 创建节点 + !data.name && item.name && (data.name = item.name) + var node = can.page.Create(can, type, data) - // 创建索引 - name = name||data.className||type||"" - value[name||""] = value[data.className||""] = value[type] = node - value.first = value.first||node, value.last = node - value._target = value._target||node + // 创建索引 + name = name||data.className||type||"" + value[name||""] = value[data.className||""] = value[type] = node + value.first = value.first||node, value.last = node + value._target = value._target||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) - }) - return value - }), - Appends: shy("添加节点", function(can, target, key, value) { - return target.innerHTML = "", can.page.Append(can, target, key, value) - }), + // 递归节点 + item.list && can.page.Append(can, node, item.list, value) + target && target.appendChild && target.appendChild(node) + can.base.isFunc(item._init) && item._init(node) + }) + return value + }), + Appends: shy("添加节点", function(can, target, key, value) { + return target.innerHTML = "", can.page.Append(can, target, key, value) + }), - AppendTable: shy("添加表格", function(can, msg, target, list, cb) { - if (!msg.append||msg.append.length == 0) {return} + AppendTable: shy("添加表格", function(can, msg, target, list, cb) { + if (!msg.append||msg.append.length == 0) {return} - var table = can.page.Append(can, target, html.TABLE) - can.page.Append(can, table, [{type: html.TR, data: {dataset: {index: -1}}, list: - can.core.List(list, function(key) { - return key[0] == "_"? undefined: {text: [key.trim(), html.TH]} - }) - }]) - can.page.Append(can, table, can.core.List(msg.Table(), function(line, index, array) { - var _list = can.core.List(list, function(key) { if (key.indexOf("_") == 0) { return } - return cb(can.page.Color(line[key]).trim(), key, index, line, array) - }) - return _list.length > 0? {type: html.TR, dataset: {index: index}, list: _list}: undefined - })) - return can.page.OrderTable(can, table) - }), - OrderTable: function(can, table) { - can.page.Select(can, table, html.TH, function(th, index) { - th.onclick = function(event) { var dataset = event.target.dataset - dataset["sort_asc"] = (dataset["sort_asc"] == "1") ? 0: 1 - can.page.RangeTable(can, table, index, dataset["sort_asc"] == "1") - } - }) - return table - }, - RangeTable: function(can, table, index, sort_asc) { - var list = can.page.Select(can, table, html.TR, function(tr) { - return tr.style.display == html.NONE||can.page.ClassList.has(can, tr, "hide")? null: tr - }).slice(1) + var table = can.page.Append(can, target, html.TABLE) + can.page.Append(can, table, [{type: html.TR, data: {dataset: {index: -1}}, list: + can.core.List(list, function(key) { + return key[0] == "_"? undefined: {text: [key.trim(), html.TH]} + }) + }]) + can.page.Append(can, table, can.core.List(msg.Table(), function(line, index, array) { + var _list = can.core.List(list, function(key) { if (key.indexOf("_") == 0) { return } + return cb(can.page.Color(line[key]).trim(), key, index, line, array) + }) + return _list.length > 0? {type: html.TR, dataset: {index: index}, list: _list}: undefined + })) + return can.page.OrderTable(can, table) + }), + OrderTable: function(can, table) { + can.page.Select(can, table, html.TH, function(th, index) { + th.onclick = function(event) { var dataset = event.target.dataset + dataset["sort_asc"] = (dataset["sort_asc"] == "1") ? 0: 1 + can.page.RangeTable(can, table, index, dataset["sort_asc"] == "1") + } + }) + return table + }, + RangeTable: function(can, table, index, sort_asc) { + var list = can.page.Select(can, table, html.TR, function(tr) { + return tr.style.display == html.NONE||can.page.ClassList.has(can, tr, "hide")? null: tr + }).slice(1) - index = can.base.isObject(index)? index: [index] - index = can.core.List(index, function(item) { if (item > -1) { return item} }) - if (index.length == 0) { return } + index = can.base.isObject(index)? index: [index] + index = can.core.List(index, function(item) { if (item > -1) { return item} }) + if (index.length == 0) { return } - var is_time = true, is_number = true - can.core.List(list, function(tr) { - var text = tr.childNodes[index[0]].innerText - is_time = is_time && Date.parse(text) > 0 - is_number = is_number && !isNaN(parseInt(text)) - }) + var is_time = true, is_number = true + can.core.List(list, function(tr) { + var text = tr.childNodes[index[0]].innerText + is_time = is_time && Date.parse(text) > 0 + is_number = is_number && !isNaN(parseInt(text)) + }) - var num_list = can.core.List(list, function(tr) { - var text = tr.childNodes[index[0]].innerText - return is_time? Date.parse(text): - is_number? can.base.ParseSize(text): text - }) - function isless(a, b, index) { - if (a.childNodes[index[0]] && b.childNodes[index[0]]) { - if (a.childNodes[index[0]].innerText < b.childNodes[index[0]].innerText) { return true } - if (a.childNodes[index[0]].innerText > b.childNodes[index[0]].innerText) { return false } - } - return index.length > 1 && isless(a, b, index.slice(1)) - } + var num_list = can.core.List(list, function(tr) { + var text = tr.childNodes[index[0]].innerText + return is_time? Date.parse(text): + is_number? can.base.ParseSize(text): text + }) + function isless(a, b, index) { + if (a.childNodes[index[0]] && b.childNodes[index[0]]) { + if (a.childNodes[index[0]].innerText < b.childNodes[index[0]].innerText) { return true } + if (a.childNodes[index[0]].innerText > b.childNodes[index[0]].innerText) { return false } + } + return index.length > 1 && isless(a, b, index.slice(1)) + } - // 选择排序 - for (var i = 0; i < num_list.length; i++) { var min = i - for (var j = i+1; j < num_list.length; j++) { - if (num_list[min] == num_list[j] && index.length > 1 && list[index[1]]) { - if (sort_asc? isless(list[min], list[j], index.slice(1)): isless(list[j], list[min], index.slice(1))) { - min = j - } - } else if (sort_asc? num_list[min] < num_list[j]: num_list[j] < num_list[min]) { - min = j - } - } + // 选择排序 + for (var i = 0; i < num_list.length; i++) { var min = i + for (var j = i+1; j < num_list.length; j++) { + if (num_list[min] == num_list[j] && index.length > 1 && list[index[1]]) { + if (sort_asc? isless(list[min], list[j], index.slice(1)): isless(list[j], list[min], index.slice(1))) { + min = j + } + } else if (sort_asc? num_list[min] < num_list[j]: num_list[j] < num_list[min]) { + min = j + } + } - if (min != i) { - var temp = num_list[i]; num_list[i] = num_list[min]; num_list[min] = temp - var temp = list[i]; list[i] = list[min]; list[min] = temp - } + if (min != i) { + var temp = num_list[i]; num_list[i] = num_list[min]; num_list[min] = temp + var temp = list[i]; list[i] = list[min]; list[min] = temp + } - var tbody = list[i].parentElement - list[i].parentElement && tbody.removeChild(list[i]) - tbody.appendChild(list[i]) - } - }, + var tbody = list[i].parentElement + list[i].parentElement && tbody.removeChild(list[i]) + tbody.appendChild(list[i]) + } + }, - Cache: function(name, output, data) { if (!name) { return } - var cache = output._cache||{}; output._cache = cache - if (data) { if (output.children.length == 0) { return } - var temp = document.createDocumentFragment() - while (output.childNodes.length > 0) { // 写缓存 - var item = output.childNodes[0] - item.parentNode.removeChild(item), - temp.appendChild(item) - } - return cache[name] = {node: temp, data: data}, name - } - output.innerHTML = "" + Cache: function(name, output, data) { if (!name) { return } + var cache = output._cache||{}; output._cache = cache + if (data) { if (output.children.length == 0) { return } + var temp = document.createDocumentFragment() + while (output.childNodes.length > 0) { // 写缓存 + var item = output.childNodes[0] + item.parentNode.removeChild(item), + temp.appendChild(item) + } + return cache[name] = {node: temp, data: data}, name + } + output.innerHTML = "" - var list = cache[name]; if (!list) { return } - while (list.node.childNodes.length > 0) { // 读缓存 - var item = list.node.childNodes[0] - item.parentNode.removeChild(item) - output.appendChild(item) - } - return delete(cache[name]), list.data - }, - Format: function(type) { - switch (type) { - case html.A: return ""+(arguments[2]||arguments[1])+"" - case html.IMG: return arguments[2]? "": "" - } - }, - replace: function(can, text, key, value) { - text = can.base.replaceAll(text, "<", "<", ">", ">", key, value) - return text - }, - Color: function(text) { if (typeof text != lang.STRING) { return "" } - if (text.indexOf("http://") == 0 || text.indexOf("https://") == 0 || text.indexOf("ftp://") == 0) { - var ls = text.split(ice.SP); - text = ""+ls[0]+""+ls.slice(1).join(ice.SP) - }; text = text.replace(/\\n/g, "
") + var list = cache[name]; if (!list) { return } + while (list.node.childNodes.length > 0) { // 读缓存 + var item = list.node.childNodes[0] + item.parentNode.removeChild(item) + output.appendChild(item) + } + return delete(cache[name]), list.data + }, + Format: function(type) { + switch (type) { + case html.A: return ""+(arguments[2]||arguments[1])+"" + case html.IMG: return arguments[2]? "": "" + } + }, + replace: function(can, text, key, value) { + text = can.base.replaceAll(text, "<", "<", ">", ">", key, value) + return text + }, + Color: function(text) { if (typeof text != lang.STRING) { return "" } + if (text.indexOf("http://") == 0 || text.indexOf("https://") == 0 || text.indexOf("ftp://") == 0) { + var ls = text.split(ice.SP); + text = ""+ls[0]+""+ls.slice(1).join(ice.SP) + }; text = text.replace(/\\n/g, "
") - if (text.indexOf("\033\[") == -1) { return text } - 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\[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 - }, - input: function(can, item, value) { - var input = {type: html.INPUT, name: item.name, data: item, dataset: {}, _init: item._init, style: item.style||{}} - item.value == ice.AUTO && (item.value = "", item.action = ice.AUTO), item.action == ice.AUTO && (input.dataset.action = ice.AUTO) + if (text.indexOf("\033\[") == -1) { return text } + 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\[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 + }, + input: function(can, item, value) { + var input = {type: html.INPUT, name: item.name, data: item, dataset: {}, _init: item._init, style: item.style||{}} + 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.TEXTAREA: input.type = html.TEXTAREA - input.style.height = input.style.height||can.Conf(["feature", html.TEXTAREA, item.name, html.HEIGHT].join(ice.PT))||can.Conf(["feature", html.TEXTAREA, html.HEIGHT].join(ice.PT)) - input.style.width = input.style.width||can.Conf(["feature", html.TEXTAREA, item.name, html.WIDTH].join(ice.PT))||can.Conf(["feature", html.TEXTAREA, html.WIDTH].join(ice.PT)) - // no break - case html.USERNAME: - case html.PASSWORD: - // no break - case html.TEXT: - item.autocomplete = "off" - item.name = item.name||item.type - item.value = value||item.value||"" - item.placeholder = item.placeholder||item.name||item.type - item.title = item.title||item.placeholder||item.name||item.type - item.className || can.page.ClassList.add(can, item, ctx.ARGS) - break - case html.SELECT: input.type = html.SELECT - 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] } + switch (item.type = item.type||html.TEXT) { + case html.TEXTAREA: input.type = html.TEXTAREA + input.style.height = input.style.height||can.Conf(["feature", html.TEXTAREA, item.name, html.HEIGHT].join(ice.PT))||can.Conf(["feature", html.TEXTAREA, html.HEIGHT].join(ice.PT)) + input.style.width = input.style.width||can.Conf(["feature", html.TEXTAREA, item.name, html.WIDTH].join(ice.PT))||can.Conf(["feature", html.TEXTAREA, html.WIDTH].join(ice.PT)) + // no break + case html.USERNAME: + case html.PASSWORD: + // no break + case html.TEXT: + item.autocomplete = "off" + item.name = item.name||item.type + item.value = value||item.value||"" + item.placeholder = item.placeholder||item.name||item.type + item.title = item.title||item.placeholder||item.name||item.type + item.className || can.page.ClassList.add(can, item, ctx.ARGS) + break + case html.SELECT: input.type = html.SELECT + 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] } - item.value = value||item.value, input.list = item.values.map(function(value) { - return {type: html.OPTION, value: value, inner: value} - }), item.className || can.page.ClassList.add(can, item, ctx.ARGS) - break - case html.BUTTON: item.value = item.value||item.name||"list"; break - case "upfile": item.type = html.FILE; break - case html.UPLOAD: item.type = html.FILE, input.name = html.UPLOAD; break - default: - } - return input - }, + item.value = value||item.value, input.list = item.values.map(function(value) { + return {type: html.OPTION, value: value, inner: value} + }), item.className || can.page.ClassList.add(can, item, ctx.ARGS) + break + case html.BUTTON: item.value = item.value||item.name||"list"; break + case "upfile": item.type = html.FILE; break + case html.UPLOAD: item.type = html.FILE, input.name = html.UPLOAD; break + default: + } + return input + }, - styleHeight: function(can, target, value) { - can.page.style(can, target, html.HEIGHT, value) - return target.offsetHeight - }, - styleWidth: function(can, target, value) { - can.page.style(can, target, html.WIDTH, value) - return target.offsetWidth - }, - style: function(can, target, style) { var value = {} - for (var i = 2; i < arguments.length; i += 2) { - if (typeof arguments[i] == lang.OBJECT) { - can.base.Copy(value, arguments[i--]) - } else { - value[arguments[i]] = arguments[i+1] - } - } - can.page.Modify(can, target, {style: value}) - return value - }, - Keys: function() { var list = [] - for (var i = 0; i < arguments.length; i++) { var v = arguments[i] - if (typeof v == lang.OBJECT) { - for (var j = 0; j < v.length; j++) { - if (typeof v[j] == lang.OBJECT) { - for (var k = 0; k < v[j].length; k++) { - if (typeof v[j][k] == lang.OBJECT) { v[j][k] = v[j][k].join(ice.PT) } - } - v[j] = v[j].join(ice.GT) - } - } - list.push(v.join(ice.SP)) - } else { - list.push(v+"") - } - } - return list.join(ice.FS) - }, - css: function(text) { - var styleSheet = document.createElement("style") - styleSheet.type = "text/css", styleSheet.innerText = text - document.head.appendChild(styleSheet) - }, - offsetTop: function(item) { var res = 0 - while (item) { res += item.offsetTop||0, item = item.parentNode } - return res - }, - offsetLeft: function(item) { var res = 0 - // if (item.offsetLeft) { return item.offsetLeft } - while (item) { res += item.offsetLeft||0, item = item.parentNode } - return res - }, + styleHeight: function(can, target, value) { + can.page.style(can, target, html.HEIGHT, value) + return target.offsetHeight + }, + styleWidth: function(can, target, value) { + can.page.style(can, target, html.WIDTH, value) + return target.offsetWidth + }, + style: function(can, target, style) { var value = {} + for (var i = 2; i < arguments.length; i += 2) { + if (typeof arguments[i] == lang.OBJECT) { + can.base.Copy(value, arguments[i--]) + } else { + value[arguments[i]] = arguments[i+1] + } + } + can.page.Modify(can, target, {style: value}) + return value + }, + Keys: function() { var list = [] + for (var i = 0; i < arguments.length; i++) { var v = arguments[i] + if (typeof v == lang.OBJECT) { + for (var j = 0; j < v.length; j++) { + if (typeof v[j] == lang.OBJECT) { + for (var k = 0; k < v[j].length; k++) { + if (typeof v[j][k] == lang.OBJECT) { v[j][k] = v[j][k].join(ice.PT) } + } + v[j] = v[j].join(ice.GT) + } + } + list.push(v.join(ice.SP)) + } else { + list.push(v+"") + } + } + return list.join(ice.FS) + }, + css: function(text) { + var styleSheet = document.createElement("style") + styleSheet.type = "text/css", styleSheet.innerText = text + document.head.appendChild(styleSheet) + }, + offsetTop: function(item) { var res = 0 + while (item) { res += item.offsetTop||0, item = item.parentNode } + return res + }, + offsetLeft: function(item) { var res = 0 + // if (item.offsetLeft) { return item.offsetLeft } + while (item) { res += item.offsetLeft||0, item = item.parentNode } + return res + }, }) diff --git a/lib/user.js b/lib/user.js index 42ed2a6a..6bacc9cc 100644 --- a/lib/user.js +++ b/lib/user.js @@ -1,346 +1,346 @@ Volcanos("user", {help: "用户操作", agent: { - scanQRCode: function(cb, can) { - can.user.input(event, can, [{type: html.TEXTAREA, name: "text", text: ""}], function(ev, button, data, list, args) { - cb(list[0], can.base.ParseJSON(list[0])) - }) - }, - getLocation: function(cb) { - navigator.geolocation.getCurrentPosition(function(res) { - cb({latitude: parseInt(res.coords.latitude*100000), longitude: parseInt(res.coords.longitude*100000)}) - }, function(some) { - typeof cb == lang.FUNCTION && cb({name: "some"}) - } ); - }, - openLocation: function(msg) { - window.open("https://map.baidu.com/search/"+encodeURIComponent(msg.Option(mdb.TEXT)) - +"/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd="+encodeURIComponent(msg.Option(mdb.TEXT))) - }, - chooseImage: function(cb) { - typeof cb == lang.FUNCTION && cb([]) - }, - }, - isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1, - isIPhone: navigator.userAgent.indexOf("iPhone") > -1, - isMobile: navigator.userAgent.indexOf("Mobile") > -1, - isMacOSX: navigator.userAgent.indexOf("Mac OS X") > -1, - isWindows: navigator.userAgent.indexOf("Windows") > -1, - isIE: navigator.userAgent.indexOf("MSIE") > -1, - isExtension: location && location.protocol && location.protocol == "chrome-extension:", - isLocalFile: location && location.protocol && location.protocol == "file:", - isLandscape: function() { return window.innerWidth > window.innerHeight }, - mod: { - isPod: location && location.pathname && (location.pathname.indexOf("/chat/pod/") == 0), - isDiv: location && location.pathname && (location.pathname.indexOf("/chat/div/") == 0), - isCmd: location && location.pathname && (location.pathname.indexOf("/chat/pod/") == 0 && location.pathname.indexOf("/cmd/") > 0 || - location.pathname.indexOf("/chat/cmd/") == 0 || location.pathname.indexOf("/help/") == 0), - }, + scanQRCode: function(cb, can) { + can.user.input(event, can, [{type: html.TEXTAREA, name: "text", text: ""}], function(ev, button, data, list, args) { + cb(list[0], can.base.ParseJSON(list[0])) + }) + }, + getLocation: function(cb) { + navigator.geolocation.getCurrentPosition(function(res) { + cb({latitude: parseInt(res.coords.latitude*100000), longitude: parseInt(res.coords.longitude*100000)}) + }, function(some) { + typeof cb == lang.FUNCTION && cb({name: "some"}) + } ); + }, + openLocation: function(msg) { + window.open("https://map.baidu.com/search/"+encodeURIComponent(msg.Option(mdb.TEXT)) + +"/@12958750.085,4825785.55,16z?querytype=s&da_src=shareurl&wd="+encodeURIComponent(msg.Option(mdb.TEXT))) + }, + chooseImage: function(cb) { + typeof cb == lang.FUNCTION && cb([]) + }, + }, + isWeiXin: navigator.userAgent.indexOf("MicroMessenger") > -1, + isIPhone: navigator.userAgent.indexOf("iPhone") > -1, + isMobile: navigator.userAgent.indexOf("Mobile") > -1, + isMacOSX: navigator.userAgent.indexOf("Mac OS X") > -1, + isWindows: navigator.userAgent.indexOf("Windows") > -1, + isIE: navigator.userAgent.indexOf("MSIE") > -1, + isExtension: location && location.protocol && location.protocol == "chrome-extension:", + isLocalFile: location && location.protocol && location.protocol == "file:", + isLandscape: function() { return window.innerWidth > window.innerHeight }, + mod: { + isPod: location && location.pathname && (location.pathname.indexOf("/chat/pod/") == 0), + isDiv: location && location.pathname && (location.pathname.indexOf("/chat/div/") == 0), + isCmd: location && location.pathname && (location.pathname.indexOf("/chat/pod/") == 0 && location.pathname.indexOf("/cmd/") > 0 || + location.pathname.indexOf("/chat/cmd/") == 0 || location.pathname.indexOf("/help/") == 0), + }, - alert: function(text) { alert(JSON.stringify(text)) }, - confirm: function(text) { return confirm(JSON.stringify(text)) }, - prompt: function(tip, def, cb, silent) { (text = silent? def: prompt(tip, def||"")) != undefined && typeof cb == lang.FUNCTION && cb(text); return text }, - reload: function(force) { (force || confirm("重新加载页面?")) && location.reload() }, - jumps: function(url) { location.href = url }, - open: function(url) { window.open(url) }, - time: function(can, time, fmt) { var now = can.base.Date(time) - var list = can.user.language(can) == "en"? ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"] - return can.base.Time(time, (fmt||"%y-%m-%d %H:%M:%S").replace("%w", list[now.getDay()])) - }, + alert: function(text) { alert(JSON.stringify(text)) }, + confirm: function(text) { return confirm(JSON.stringify(text)) }, + prompt: function(tip, def, cb, silent) { (text = silent? def: prompt(tip, def||"")) != undefined && typeof cb == lang.FUNCTION && cb(text); return text }, + reload: function(force) { (force || confirm("重新加载页面?")) && location.reload() }, + jumps: function(url) { location.href = url }, + open: function(url) { window.open(url) }, + time: function(can, time, fmt) { var now = can.base.Date(time) + var list = can.user.language(can) == "en"? ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]: ["周日", "周一", "周二", "周三", "周四", "周五", "周六"] + return can.base.Time(time, (fmt||"%y-%m-%d %H:%M:%S").replace("%w", list[now.getDay()])) + }, - title: function(text) { - return text && (document.title = text), document.title - }, - topic: function(can, name) { - can.user.isMobile && (name += " mobile") && can.user.isLandscape() && (name += " landscape") - can.page.Modify(can, document.body, {className: name}) - }, - language: function(can) { - return can.misc.Search(can, "language") - }, - trans: function(can, text, list) { if (can.base.isObject(text)) { - return can.core.Item(text, function(k, v) { can.core.Value(can._trans, k, v) }) - } + title: function(text) { + return text && (document.title = text), document.title + }, + topic: function(can, name) { + can.user.isMobile && (name += " mobile") && can.user.isLandscape() && (name += " landscape") + can.page.Modify(can, document.body, {className: name}) + }, + language: function(can) { + return can.misc.Search(can, "language") + }, + trans: function(can, text, list) { if (can.base.isObject(text)) { + return can.core.Item(text, function(k, v) { can.core.Value(can._trans, k, v) }) + } - if (can.user.language(can) == "en") { return text } - if (can.base.isFunction(text)) { text = text.name||"" } - return list&&list[text] || can.Conf("trans."+text) || can.Conf("feature._trans."+text) || can._trans&&can._trans[text] || { - "create": "创建", "remove": "删除", "insert": "添加", "delete": "删除", "modify": "编辑", - "inputs": "补全", "prunes": "清理", "export": "导出", "import": "导入", - "list": "查看", "back": "返回", "run": "执行", "done": "完成", "share": "共享", - "edit": "编辑", "save": "保存", "copy": "复制", "show": "显示", "hide": "隐藏", - "project": "项目", "profile": "详情", "actions": "参数", - "plugin": "插件", + if (can.user.language(can) == "en") { return text } + if (can.base.isFunction(text)) { text = text.name||"" } + return list&&list[text] || can.Conf("trans."+text) || can.Conf("feature._trans."+text) || can._trans&&can._trans[text] || { + "create": "创建", "remove": "删除", "insert": "添加", "delete": "删除", "modify": "编辑", + "inputs": "补全", "prunes": "清理", "export": "导出", "import": "导入", + "list": "查看", "back": "返回", "run": "执行", "done": "完成", "share": "共享", + "edit": "编辑", "save": "保存", "copy": "复制", "show": "显示", "hide": "隐藏", + "project": "项目", "profile": "详情", "actions": "参数", + "plugin": "插件", - "open": "打开", "close": "关闭", - "start": "启动", "stop": "停止", - "begin": "开始", "end": "结束", - "clear": "清空", "refresh": "刷新", - "submit": "提交", "cancel": "取消", - "label": "标签", "exec": "执行", - }[text]||text - }, - toastProcess: function(can, title) { - return can.user.toast(can, ice.PROCESS, title) - }, - toastSuccess: function(can, title) { - return can.user.toast(can, ice.SUCCESS, title) - }, - 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, height = meta.height||100; if (width < 0) { width = window.innerWidth + width } + "open": "打开", "close": "关闭", + "start": "启动", "stop": "停止", + "begin": "开始", "end": "结束", + "clear": "清空", "refresh": "刷新", + "submit": "提交", "cancel": "取消", + "label": "标签", "exec": "执行", + }[text]||text + }, + toastProcess: function(can, title) { + return can.user.toast(can, ice.PROCESS, title) + }, + toastSuccess: function(can, title) { + return can.user.toast(can, ice.SUCCESS, title) + }, + 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, height = meta.height||100; if (width < 0) { width = window.innerWidth + width } - var ui = can.page.Append(can, document.body, [{view: chat.TOAST, style: { - left: (window.innerWidth-width)/2, width: width, bottom: 100, - }, list: [ - {text: [meta.title||"", html.DIV, html.TITLE], title: "点击复制", onclick: function(event) { - can.user.copy(event, can, meta.title) - }}, - {view: "duration", title: "点击关闭", onclick: function() { action.close() }}, - can.base.isObject(meta.content)? meta.content: {text: [meta.content||"执行成功", html.DIV, "content"]}, + var ui = can.page.Append(can, document.body, [{view: chat.TOAST, style: { + left: (window.innerWidth-width)/2, width: width, bottom: 100, + }, list: [ + {text: [meta.title||"", html.DIV, html.TITLE], title: "点击复制", onclick: function(event) { + can.user.copy(event, can, meta.title) + }}, + {view: "duration", title: "点击关闭", onclick: function() { action.close() }}, + can.base.isObject(meta.content)? meta.content: {text: [meta.content||"执行成功", html.DIV, "content"]}, - {view: chat.ACTION}, meta.progress != undefined && {view: "progress", style: {width: width}, list: [ - {view: "current", style: {width: (meta.progress||0)/100*width}}, - ]}, - ] }]) + {view: chat.ACTION}, meta.progress != undefined && {view: "progress", style: {width: width}, list: [ + {view: "current", style: {width: (meta.progress||0)/100*width}}, + ]}, + ] }]) - var action = can.onappend._action(can, meta.action||[""], ui.action, { - close: function(event) { can.page.Remove(can, action._target), action.timer.stop = true }, - timer: can.core.Timer({interval: 100, length: (parseInt(meta.duration||1000))/100}, function(event, interval, index) { - if (index > 30) { ui.duration.innerHTML = parseInt(index/10)+ice.PT+(index%10)+"s..." } - }, function() { action.close() }), _target: ui._target, ui: ui, - }); can.onmotion.story.auto(can, ui._target) + var action = can.onappend._action(can, meta.action||[""], ui.action, { + close: function(event) { can.page.Remove(can, action._target), action.timer.stop = true }, + timer: can.core.Timer({interval: 100, length: (parseInt(meta.duration||1000))/100}, function(event, interval, index) { + if (index > 30) { ui.duration.innerHTML = parseInt(index/10)+ice.PT+(index%10)+"s..." } + }, function() { action.close() }), _target: ui._target, ui: ui, + }); can.onmotion.story.auto(can, ui._target) - can.onengine.signal(can, chat.ONTOAST, can.request({}, { - title: meta.title, content: meta.content, - time: can.base.Time(), fileline: can.misc.FileLine(2, 2), - })) - return action - }, - share: function(can, msg, cmd) { - can.run(msg._event, cmd||[ctx.ACTION, chat.SHARE], function(msg) { - can.user.toast(can, {height: 300, width: 500, - title: msg.Append(mdb.NAME), duration: -1, - content: msg.Append(mdb.TEXT), action: [cli.CLOSE], - }), can.user.copy(msg._event, can, msg.Append(mdb.NAME)) - }) - }, - login: function(can, cb, method) { - var ui = can.user.input({}, can, [ - {type: html.USERNAME}, {type: html.PASSWORD}, - ], function(event, button, data, list) { return { - "登录": function() { - can.run({}, [aaa.LOGIN, data[html.USERNAME], data[html.PASSWORD]], function(msg) { - if (msg.Option(ice.MSG_USERNAME)) { - can.page.Remove(can, ui._target), can.base.isFunc(cb) && cb() - } else { - can.user.toast(can, "用户名或密码错误") - } - }) - return true - }, - "扫码": function() { - can.misc.WSS(can, {type: html.CHROME, cmd: "pwd"}, function(event, msg, cmd, arg) { if (!msg) { return } - if (cmd == "pwd") { - return can.user.toast(can, arg[2], arg[1], -1), msg.Reply() - } - if (cmd == ice.MSG_SESSID) { - return can.misc.CookieSessid(can, arg[0]), msg.Reply(), can.user.reload(true) - } - can.search(event, msg[ice.MSG_DETAIL]||[], function(msg) { msg.Reply() }) - }) - }, - "授权": function() { - can.misc.WSS(can, {type: html.CHROME, cmd: "sso", "user.web": location.href}, function(event, msg, cmd, arg) { if (!msg) { return } - if (cmd == "pwd") { - return location.href = arg[1] - } - if (cmd == ice.MSG_SESSID) { - return can.misc.CookieSessid(can, arg[0]), msg.Reply(), can.user.reload(true) - } - can.search(event, msg[ice.MSG_DETAIL]||[], function(msg) { msg.Reply() }) - }) - }, - "飞书": function() { location.href = "/chat/lark/sso" }, - }[button]() }, can.base.Obj(method, ["登录", "扫码", "授权"])) + can.onengine.signal(can, chat.ONTOAST, can.request({}, { + title: meta.title, content: meta.content, + time: can.base.Time(), fileline: can.misc.FileLine(2, 2), + })) + return action + }, + share: function(can, msg, cmd) { + can.run(msg._event, cmd||[ctx.ACTION, chat.SHARE], function(msg) { + can.user.toast(can, {height: 300, width: 500, + title: msg.Append(mdb.NAME), duration: -1, + content: msg.Append(mdb.TEXT), action: [cli.CLOSE], + }), can.user.copy(msg._event, can, msg.Append(mdb.NAME)) + }) + }, + login: function(can, cb, method) { + var ui = can.user.input({}, can, [ + {type: html.USERNAME}, {type: html.PASSWORD}, + ], function(event, button, data, list) { return { + "登录": function() { + can.run({}, [aaa.LOGIN, data[html.USERNAME], data[html.PASSWORD]], function(msg) { + if (msg.Option(ice.MSG_USERNAME)) { + can.page.Remove(can, ui._target), can.base.isFunc(cb) && cb() + } else { + can.user.toast(can, "用户名或密码错误") + } + }) + return true + }, + "扫码": function() { + can.misc.WSS(can, {type: html.CHROME, cmd: "pwd"}, function(event, msg, cmd, arg) { if (!msg) { return } + if (cmd == "pwd") { + return can.user.toast(can, arg[2], arg[1], -1), msg.Reply() + } + if (cmd == ice.MSG_SESSID) { + return can.misc.CookieSessid(can, arg[0]), msg.Reply(), can.user.reload(true) + } + can.search(event, msg[ice.MSG_DETAIL]||[], function(msg) { msg.Reply() }) + }) + }, + "授权": function() { + can.misc.WSS(can, {type: html.CHROME, cmd: "sso", "user.web": location.href}, function(event, msg, cmd, arg) { if (!msg) { return } + if (cmd == "pwd") { + return location.href = arg[1] + } + if (cmd == ice.MSG_SESSID) { + return can.misc.CookieSessid(can, arg[0]), msg.Reply(), can.user.reload(true) + } + can.search(event, msg[ice.MSG_DETAIL]||[], function(msg) { msg.Reply() }) + }) + }, + "飞书": function() { location.href = "/chat/lark/sso" }, + }[button]() }, can.base.Obj(method, ["登录", "扫码", "授权"])) - can.page.Modify(can, ui._target, {className: "input login", style: {left: (window.innerWidth-ui._target.offsetWidth)/2, top: window.innerHeight/6}}) - }, - logout: function(can, force) { if (force||can.user.confirm("logout?")) { - can.run({}, [ctx.ACTION, aaa.LOGOUT], function(msg) { - can.misc.Search(can, chat.SHARE)? can.misc.Search(can, chat.SHARE, ""): can.user.reload(true) - }) - } }, + can.page.Modify(can, ui._target, {className: "input login", style: {left: (window.innerWidth-ui._target.offsetWidth)/2, top: window.innerHeight/6}}) + }, + logout: function(can, force) { if (force||can.user.confirm("logout?")) { + can.run({}, [ctx.ACTION, aaa.LOGOUT], function(msg) { + can.misc.Search(can, chat.SHARE)? can.misc.Search(can, chat.SHARE, ""): can.user.reload(true) + }) + } }, - toPNG: function(can, name, text, height, width) { - if (text.indexOf("" - } - var img = document.createElement(html.IMG) - img.onload = function() { - var canvas = document.createElement("canvas") - canvas.height = height, canvas.width = width - canvas.getContext("2d").drawImage(img, 0, 0) + toPNG: function(can, name, text, height, width) { + if (text.indexOf("" + } + var img = document.createElement(html.IMG) + img.onload = function() { + var canvas = document.createElement("canvas") + canvas.height = height, canvas.width = width + canvas.getContext("2d").drawImage(img, 0, 0) - var a = document.createElement("a") - a.href = canvas.toDataURL("image/png") - a.download = name, a.click() - }, img.src = "data:image/svg+xml,"+encodeURIComponent(text) - }, - copy: function(event, can, text) { - if (navigator.clipboard) { var ok = false - navigator.clipboard.writeText(text).then(function() { ok = true }) - if (ok) { return can.user.toastSuccess(can) } - } + var a = document.createElement("a") + a.href = canvas.toDataURL("image/png") + a.download = name, a.click() + }, img.src = "data:image/svg+xml,"+encodeURIComponent(text) + }, + copy: function(event, can, text) { + if (navigator.clipboard) { var ok = false + navigator.clipboard.writeText(text).then(function() { ok = true }) + if (ok) { return can.user.toastSuccess(can) } + } - var input = can.page.Append(can, event.target.parentNode, [{type: html.TEXTAREA, value: text}]).first - can.onmotion.focus(can, input), document.execCommand("Copy") - can.page.Remove(can, input), can.user.toastSuccess(can) - can.onkeymap.prevent(event) - can.misc.Log("copy", text) - return text - }, - carte: function(event, can, meta, list, cb, parent) { - meta = meta||can.ondetail||can.onaction||{}, list = list&&list.length > 0? list: meta.list||[]; if (list.length == 0) { return } - cb = cb||function(event, item, meta) { var cb = meta[item]||meta["_engine"]; can.base.isFunc(cb) && cb(event, can, item) } + var input = can.page.Append(can, event.target.parentNode, [{type: html.TEXTAREA, value: text}]).first + can.onmotion.focus(can, input), document.execCommand("Copy") + can.page.Remove(can, input), can.user.toastSuccess(can) + can.onkeymap.prevent(event) + can.misc.Log("copy", text) + return text + }, + carte: function(event, can, meta, list, cb, parent) { + meta = meta||can.ondetail||can.onaction||{}, list = list&&list.length > 0? list: meta.list||[]; if (list.length == 0) { return } + cb = cb||function(event, item, meta) { var cb = meta[item]||meta["_engine"]; can.base.isFunc(cb) && cb(event, can, item) } - var ui = can.page.Append(can, document.body, [{view: chat.CARTE, style: {left: 0, top: 0}, onmouseleave: function(event) { - // can.page.Remove(can, ui._target) - }, list: can.core.List(list, function(item, index) { - return can.base.isString(item)? {view: html.ITEM, list: [{text: can.user.trans(can, item), click: function(event) { - can.user.isMobile && can.page.Remove(can, ui._target) - can.base.isFunc(cb) && cb(event, item, meta, index) - }, onmouseenter: function(event) { - carte._float && can.page.Remove(can, carte._float._target) - } }] }: {view: html.ITEM, list: [{text: can.user.trans(can, item[0])}], onmouseenter: function(event) { - var sub = can.user.carte(event, can, meta, item.slice(1), cb, carte) - carte._float && can.page.Remove(can, carte._float._target), carte._float = sub - can.onlayout.figure(event, can, sub._target, true) - } } - }) }] ); can.onlayout.figure(event, can, ui._target) + var ui = can.page.Append(can, document.body, [{view: chat.CARTE, style: {left: 0, top: 0}, onmouseleave: function(event) { + // can.page.Remove(can, ui._target) + }, list: can.core.List(list, function(item, index) { + return can.base.isString(item)? {view: html.ITEM, list: [{text: can.user.trans(can, item), click: function(event) { + can.user.isMobile && can.page.Remove(can, ui._target) + can.base.isFunc(cb) && cb(event, item, meta, index) + }, onmouseenter: function(event) { + carte._float && can.page.Remove(can, carte._float._target) + } }] }: {view: html.ITEM, list: [{text: can.user.trans(can, item[0])}], onmouseenter: function(event) { + var sub = can.user.carte(event, can, meta, item.slice(1), cb, carte) + carte._float && can.page.Remove(can, carte._float._target), carte._float = sub + can.onlayout.figure(event, can, sub._target, true) + } } + }) }] ); can.onlayout.figure(event, can, ui._target) - var carte = {_target: ui._target, _parent: parent} - null && can.onmotion.float.add(can, chat.CARTE, carte) - ui._target.onmouseover = function(event) { - can.onkeymap.prevent(event) - } - return can.onkeymap.prevent(event), carte - }, - carteRight: function(event, can, meta, list, cb, parent) { - var carte = can.user.carte(event, can, meta, list, cb, parent) - can.page.Modify(can, carte._target, {style: { - left: event.clientX-event.offsetX+event.target.offsetWidth-3, - top: carte._target.offsetTop-event.target.offsetHeight+5, - }}) - return carte - }, - carteClient: function(event, can, meta, list, cb, parent) { - var ui = can.user.carte(event, can, meta, list, cb, parent) - can.page.Modify(can, ui._target, {style: {left: event.clientX, top: event.clientY}}) - }, + var carte = {_target: ui._target, _parent: parent} + null && can.onmotion.float.add(can, chat.CARTE, carte) + ui._target.onmouseover = function(event) { + can.onkeymap.prevent(event) + } + return can.onkeymap.prevent(event), carte + }, + carteRight: function(event, can, meta, list, cb, parent) { + var carte = can.user.carte(event, can, meta, list, cb, parent) + can.page.Modify(can, carte._target, {style: { + left: event.clientX-event.offsetX+event.target.offsetWidth-3, + top: carte._target.offsetTop-event.target.offsetHeight+5, + }}) + return carte + }, + carteClient: function(event, can, meta, list, cb, parent) { + var ui = can.user.carte(event, can, meta, list, cb, parent) + can.page.Modify(can, ui._target, {style: {left: event.clientX, top: event.clientY}}) + }, - input: function(event, can, form, cb, button) { if (!form || form.length == 0) { return cb() } - var msg = can.request(event) - var ui = can.page.Append(can, document.body, [{view: [html.INPUT], style: {left: 0, top: 0}, list: [ - {view: [chat.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) + input: function(event, can, form, cb, button) { if (!form || form.length == 0) { return cb() } + var msg = can.request(event) + var ui = can.page.Append(can, document.body, [{view: [html.INPUT], style: {left: 0, top: 0}, list: [ + {view: [chat.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) - item._init = function(target) { - item.run = function(event, cmds, cb) { - can.request(event, function() { var value = {_handle: ice.TRUE, action: msg.Option(chat.ACTION)} - can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) { - item.name && item.value && (value[item.name] = item.value) - }); return value - }, msg, can.Option()), can.run(event, cmds, cb, true) - } + item._init = function(target) { + item.run = function(event, cmds, cb) { + can.request(event, function() { var value = {_handle: ice.TRUE, action: msg.Option(chat.ACTION)} + can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) { + item.name && item.value && (value[item.name] = item.value) + }); return value + }, msg, can.Option()), can.run(event, cmds, cb, true) + } - target.value = target.value||(item.name&&(msg.Option(item.name)||can.Option(item.name)))||"" - can.onappend.figure(can, item, target) - } + target.value = target.value||(item.name&&(msg.Option(item.name)||can.Option(item.name)))||"" + can.onappend.figure(can, item, target) + } - return {type: html.TR, list: [{type: html.TD, list: [{text: item._trans||can.user.trans(can, item.name)||""}]}, {type: html.TD, list: [can.page.input(can, item)]} ]} - })}, {view: chat.ACTION}, - ]}]); - var layout = can.onlayout.figure(event, can, ui._target) - if (layout.left == undefined) { if (!layout.top) { layout.top = 32 } - layout.left = window.innerWidth/2-ui._target.offsetWidth/2 - layout.right = "" - can.page.style(can, ui._target, layout) - } - can.page.ClassList.add(can, ui._target, chat.FLOAT) + return {type: html.TR, list: [{type: html.TD, list: [{text: item._trans||can.user.trans(can, item.name)||""}]}, {type: html.TD, list: [can.page.input(can, item)]} ]} + })}, {view: chat.ACTION}, + ]}]); + var layout = can.onlayout.figure(event, can, ui._target) + if (layout.left == undefined) { if (!layout.top) { layout.top = 32 } + layout.left = window.innerWidth/2-ui._target.offsetWidth/2 + layout.right = "" + can.page.style(can, ui._target, layout) + } + can.page.ClassList.add(can, ui._target, chat.FLOAT) - var action = can.onappend._action(can, button||[html.SUBMIT, html.CANCEL], ui.action, { - cancel: function(event) { can.page.Remove(can, ui._target) }, - _engine: function(event, can, button) { action.submit(event, can, button) }, - submit: function(event, can, button) { var data = {}, args = [], list = [] - list = can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) { - return item.name && item.value && args.push(item.name, item.value), data[item.name] = item.value - }) - var msg = can.request(event, {_handle: ice.TRUE}) - can.base.isFunc(cb) && !cb(event, button, data, list, args) && action.cancel() - }, _target: ui._target, - }) - if (button === true) { - action.submit(event, can, "submit") - return action - } + var action = can.onappend._action(can, button||[html.SUBMIT, html.CANCEL], ui.action, { + cancel: function(event) { can.page.Remove(can, ui._target) }, + _engine: function(event, can, button) { action.submit(event, can, button) }, + submit: function(event, can, button) { var data = {}, args = [], list = [] + list = can.page.Select(can, ui.table, html.OPTION_ARGS, function(item) { + return item.name && item.value && args.push(item.name, item.value), data[item.name] = item.value + }) + var msg = can.request(event, {_handle: ice.TRUE}) + can.base.isFunc(cb) && !cb(event, button, data, list, args) && action.cancel() + }, _target: ui._target, + }) + if (button === true) { + action.submit(event, can, "submit") + return action + } - can.page.Select(can, ui._target, html.INPUT_ARGS, function(item, index) { - index == 0 && can.core.Timer(100, function() { can.onmotion.focus(can, item) }) - }) - return action - }, - select: function(event, can, type, fields, cb, cbs) { - var msg = can.request(event, {fields: fields||"type,name,text"}) - can.search(msg._event, ["Search.onimport.select", type, "", ""], function(list) { - can.core.Next(list, cb, cbs||function() { - can.user.toastSuccess(can) - }) - }) - }, - upload: function(event, can) { var begin = new Date() - var ui = can.page.Append(can, document.body, [{view: html.UPLOAD, style: {left: 0, top: 0}, list: [ - {view: html.ACTION}, {view: html.OUTPUT, list: [{view: "progress"}]}, - {view: html.STATUS, list: [{view: html.SHOW}, {view: "cost"}, {view: "size"}]}, - ]}]); can.onlayout.figure(event, can, ui._target) + can.page.Select(can, ui._target, html.INPUT_ARGS, function(item, index) { + index == 0 && can.core.Timer(100, function() { can.onmotion.focus(can, item) }) + }) + return action + }, + select: function(event, can, type, fields, cb, cbs) { + var msg = can.request(event, {fields: fields||"type,name,text"}) + can.search(msg._event, ["Search.onimport.select", type, "", ""], function(list) { + can.core.Next(list, cb, cbs||function() { + can.user.toastSuccess(can) + }) + }) + }, + upload: function(event, can) { var begin = new Date() + var ui = can.page.Append(can, document.body, [{view: html.UPLOAD, style: {left: 0, top: 0}, list: [ + {view: html.ACTION}, {view: html.OUTPUT, list: [{view: "progress"}]}, + {view: html.STATUS, list: [{view: html.SHOW}, {view: "cost"}, {view: "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, { - close: function(event) { can.page.Remove(can, ui._target) }, - begin: function(event) { begin = new Date() - var upload = can.page.Select(can, ui.action, "input[type=file]") - if (upload[0].files.length == 0) { return upload[0].focus() } + var action = can.onappend._action(can, [ + {type: html.UPLOAD, onchange: function(event) { + action.show(event, 0, event.target.files[0].size, 0) + }}, cli.CLOSE, + ], ui.action, { + close: function(event) { can.page.Remove(can, ui._target) }, + begin: function(event) { begin = new Date() + var upload = can.page.Select(can, ui.action, "input[type=file]") + if (upload[0].files.length == 0) { return upload[0].focus() } - var msg = can.request(event, can.Option(), {_handle: "true"}) - msg._upload = upload[0].files[0], msg._progress = action.show + var msg = can.request(event, can.Option(), {_handle: "true"}) + msg._upload = upload[0].files[0], msg._progress = action.show - can.run(event, [ctx.ACTION, html.UPLOAD], function(msg) { - can.user.toastSuccess(can), can.Update(), action.close() - }, true) - }, - show: function (event, value, total, loaded) { now = new Date() - value == 0 && action.begin(event) + can.run(event, [ctx.ACTION, html.UPLOAD], function(msg) { + can.user.toastSuccess(can), can.Update(), action.close() + }, true) + }, + show: function (event, value, total, loaded) { now = new Date() + value == 0 && action.begin(event) - ui.show.innerHTML = value+"%" - ui.cost.innerHTML = can.base.Duration(now - begin) - ui.size.innerHTML = can.base.Size(loaded)+ice.PS+can.base.Size(total) - can.page.Modify(can, ui.progress, {style: {width: value*(ui.output.offsetWidth-2)/100}}) - }, - }); can.page.Select(can, ui.action, "input[type=file]")[0].click() + ui.show.innerHTML = value+"%" + ui.cost.innerHTML = can.base.Duration(now - begin) + ui.size.innerHTML = can.base.Size(loaded)+ice.PS+can.base.Size(total) + can.page.Modify(can, ui.progress, {style: {width: value*(ui.output.offsetWidth-2)/100}}) + }, + }); can.page.Select(can, ui.action, "input[type=file]")[0].click() - return action - }, - download: function(can, path, name) { - var a = can.page.Append(can, document.body, [{type: html.A, href: path, download: name||path.split(ice.PS).pop()}]).first - a.click(), can.page.Remove(can, a) - }, - downloads: function(can, text, name) { can.user.download(can, URL.createObjectURL(new Blob([text])), name) }, - camera: function(can, msg, cb) { - navigator.getUserMedia({video: true}, cb, function(error) { - can.misc.Log(error) - }) - }, + return action + }, + download: function(can, path, name) { + var a = can.page.Append(can, document.body, [{type: html.A, href: path, download: name||path.split(ice.PS).pop()}]).first + a.click(), can.page.Remove(can, a) + }, + downloads: function(can, text, name) { can.user.download(can, URL.createObjectURL(new Blob([text])), name) }, + camera: function(can, msg, cb) { + navigator.getUserMedia({video: true}, cb, function(error) { + can.misc.Log(error) + }) + }, }) diff --git a/page/index.css b/page/index.css index bd61dd70..e4fed4f8 100644 --- a/page/index.css +++ b/page/index.css @@ -235,9 +235,9 @@ body.white table.content tr:hover { background-color:green; } body.white fieldset.Action fieldset.plugin legend:hover { background-color:#6ee4e4; } body.print fieldset.River>div.output div.item.select { background-color:white; border:solid 2px red; } -body.mobile select { font-size:1.6rem; height:1.6em; } +body.mobile select { font-size:1.4rem; height:1.4em; margin-top:3px; } body.mobile legend { font-size:2rem; } -body.mobile input { font-size:1.6rem; } +body.mobile input { font-size:1.2rem; } body.mobile input[type=text] { margin-top:5px; height:1.2em; } body.mobile fieldset.Header.head { width:-webkit-fill-available; } body.mobile fieldset.Header.head { background-color:#000000b8; font-size:2rem; height:2em; position:fixed; top:0; } diff --git a/page/index.js b/page/index.js index a96fc884..7a9168aa 100644 --- a/page/index.js +++ b/page/index.js @@ -1,119 +1,118 @@ Volcanos({name: "chat", panels: [ - {name: "Header", help: "标题栏", pos: chat.HEAD, state: ["time", "usernick", "avatar"]}, - {name: "River", help: "群聊组", pos: chat.LEFT, action: ["create", "refresh"]}, - {name: "Action", help: "工作台", pos: chat.MAIN}, - {name: "Footer", help: "状态条", pos: chat.FOOT, state: ["ncmd"]}, - {name: "Search", help: "搜索框", pos: chat.AUTO}, - ], main: {name: "Header", list: ["/publish/order.js"]}, river: { - serivce: {name: "运营群", storm: { - wx: {name: "公众号 wx", list: [ - {name: "微信公众号", help: "wx", index: "web.wiki.word", args: ["usr/icebergs/misc/wx/wx.shy"]}, - ]}, - mp: {name: "小程序 mp", list: [ - {name: "微信小程序", help: "mp", index: "web.wiki.word", args: ["usr/icebergs/misc/mp/mp.shy"]}, - ]}, - lark: {name: "机器人 lark", list: [ - {name: "飞书机器人", help: "lark", index: "web.wiki.word", args: ["usr/icebergs/misc/lark/lark.shy"]}, - ]}, - }}, - product: {name: "产品群", storm: { - office: {name: "办公 office", list: [ - {name: "feel", help: "影音媒体", index: "web.wiki.feel"}, - {name: "draw", help: "思维导图", index: "web.wiki.draw"}, - {name: "data", help: "数据表格", index: "web.wiki.data"}, - {name: "plan", help: "计划任务", index: "web.team.plan"}, - {name: "think", help: "智库", index: "web.wiki.word", args: ["usr/learning/"]}, - {name: "index", help: "索引", index: "web.wiki.word", args: ["usr/learning/index.shy"]}, - {name: "context", help: "编程", index: "web.wiki.word", args: ["src/main.shy"]}, - ]}, - english: {name: "英汉 english", list: [ - {name: "english", help: "英汉", index: "web.wiki.alpha.alpha", args: ["word", "hi"]}, - {name: "chinese", help: "汉英", index: "web.wiki.alpha.alpha", args: ["line", "你好"]}, - {name: "wubi", help: "五笔", index: "web.code.input.wubi", args: ["word", "wqvb"]}, - {name: "wubi", help: "五笔", index: "web.code.input.wubi", args: ["line", "你好"]}, - ]}, - learning: {name: "学习 learning", list: [ - {name: "golang", help: "编程", index: "web.wiki.word", args: ["usr/golang-story/src/main.shy"]}, - {name: "tmux", help: "粘贴", index: "web.code.tmux.text"}, - {name: "study", help: "学习", index: "web.wiki.word", args: ["usr/learning/study.shy"]}, - ]}, - chrome: {name: "爬虫 chrome", list: [ - {name: "feel", help: "网页爬虫", index: "web.wiki.feel", args: ["spide/"], feature: { - display: "/plugin/local/wiki/feel.js", - height: 200, limit: 3, - }}, - {name: "cached", help: "爬虫缓存", index: "web.code.chrome.cache", args: []}, - {name: "spided", help: "网页爬虫", index: "web.code.chrome.spide", args: location && location.protocol && location.protocol=="chrome-extension:"? ["1", "", "spide"]: ["1"]}, - {name: "modify", help: "编辑页面", index: "web.code.chrome.modify", args: []}, - ]}, - }}, - project: {name: "研发群", storm: { - studio: {name: "研发 studio", list: [ - {name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/", "main.go"], _action: ["autogen", "compile", "binpack"]}, - {name: "repos", help: "代码库", index: "web.code.git.status"}, - {name: "plan", help: "任务表", index: "web.team.plan"}, - {name: "ctx", help: "上下文", index: "web.wiki.word", args: ["src/main.shy"]}, - ]}, - web: {name: "网页 web", list: [ - {name: "HTML5", help: "浏览器", index: "web.wiki.word", args: ["usr/icebergs/misc/chrome/chrome.shy"]}, - ]}, - cli: {name: "命令 cli", list: [ - {name: "bash", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/bash/bash.shy"]}, - {name: "git", help: "代码库", index: "web.wiki.word", args: ["usr/icebergs/misc/git/git.shy"]}, - {name: "vim", help: "编辑器", index: "web.wiki.word", args: ["usr/icebergs/misc/vim/vim.shy"]}, - {name: "tmux", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/tmux/tmux.shy"]}, - ]}, - linux: {name: "系统 linux", list: [ - {name: "idc", help: "平台", index: "web.wiki.word", args: ["usr/linux-story/idc/idc.shy"]}, - {name: "iso", help: "系统", index: "web.wiki.word", args: ["usr/linux-story/iso/iso.shy"]}, - {name: "iot", help: "设备", index: "web.wiki.word", args: ["usr/linux-story/iot/iot.shy"]}, - {name: "cli", help: "命令", index: "web.wiki.word", args: ["usr/linux-story/cli/cli.shy"]}, - {name: "linux", help: "系统", index: "web.wiki.word", args: ["usr/linux-story/src/main.shy"]}, - ]}, - nginx: {name: "代理 nginx", list: [ - {name: "nginx", help: "代理", index: "web.wiki.word", args: ["usr/nginx-story/src/main.shy"]}, - ]}, - context: {name: "编程 context", list: [ - {name: "golang", help: "编程", index: "web.wiki.word", args: ["usr/golang-story/src/main.shy"]}, - ]}, - redis: {name: "缓存 redis", list: [ - {name: "redis", help: "缓存", index: "web.wiki.word", args: ["usr/redis-story/src/main.shy"]}, - {name: "kafka", help: "队列", index: "web.wiki.word", args: ["usr/redis-story/src/kafka/kafka.shy"]}, - ]}, - mysql: {name: "存储 mysql", list: [ - {name: "mysql", help: "数据存储", index: "web.wiki.word", args: ["usr/mysql-story/src/main.shy"]}, - {name: "clickhouse", help: "数据存储", index: "web.wiki.word", args: ["usr/mysql-story/src/clickhouse/clickhouse.shy"]}, - ]}, - }}, - profile: {name: "测试群", storm: { - website: {name: "定制 website", index: [ - "web.chat.website", - "web.chat.div", - "web.code.vimer", - "web.dream", - ]}, - release: {name: "发布 release", index: [ - "web.code.publish", "web.code.compile", "web.code.autogen", "web.code.git.server", - ]}, - research: {name: "测试 research", index: [ - "web.code.favor", "web.code.bench", "web.code.pprof", - "web.code.case", - ]}, - }}, - operate: {name: "运维群", storm: { - aaa: {name: "权限 aaa", index: [ - "user", "totp", "sess", "role", - ]}, - web: {name: "应用 web", index: [ - "serve", "space", "dream", "route", - "share", "spide", "cache", "story", - ]}, - cli: {name: "系统 cli", index: [ - "qrcode", "daemon", "system", "runtime", - ]}, - nfs: {name: "文件 nfs", index: [ - "cat", "dir", "tail", "trash", - ]}, - }}, - }, -}) + {name: "Header", help: "标题栏", pos: chat.HEAD, state: ["time", "usernick", "avatar"]}, + {name: "River", help: "群聊组", pos: chat.LEFT, action: ["create", "refresh"]}, + {name: "Action", help: "工作台", pos: chat.MAIN}, + {name: "Footer", help: "状态条", pos: chat.FOOT, state: ["ncmd"]}, + {name: "Search", help: "搜索框", pos: chat.AUTO}, + ], main: {name: "Header", list: ["/publish/order.js"]}, river: { + serivce: {name: "运营群", storm: { + wx: {name: "公众号 wx", list: [ + {name: "微信公众号", help: "wx", index: "web.wiki.word", args: ["usr/icebergs/misc/wx/wx.shy"]}, + ]}, + mp: {name: "小程序 mp", list: [ + {name: "微信小程序", help: "mp", index: "web.wiki.word", args: ["usr/icebergs/misc/mp/mp.shy"]}, + ]}, + lark: {name: "机器人 lark", list: [ + {name: "飞书机器人", help: "lark", index: "web.wiki.word", args: ["usr/icebergs/misc/lark/lark.shy"]}, + ]}, + }}, + product: {name: "产品群", storm: { + office: {name: "办公 office", list: [ + {name: "feel", help: "影音媒体", index: "web.wiki.feel"}, + {name: "draw", help: "思维导图", index: "web.wiki.draw"}, + {name: "data", help: "数据表格", index: "web.wiki.data"}, + {name: "plan", help: "计划任务", index: "web.team.plan"}, + {name: "think", help: "智库", index: "web.wiki.word", args: ["usr/learning/"]}, + {name: "index", help: "索引", index: "web.wiki.word", args: ["usr/learning/index.shy"]}, + {name: "context", help: "编程", index: "web.wiki.word", args: ["src/main.shy"]}, + ]}, + english: {name: "英汉 english", list: [ + {name: "english", help: "英汉", index: "web.wiki.alpha.alpha", args: ["word", "hi"]}, + {name: "chinese", help: "汉英", index: "web.wiki.alpha.alpha", args: ["line", "你好"]}, + {name: "wubi", help: "五笔", index: "web.code.input.wubi", args: ["word", "wqvb"]}, + {name: "wubi", help: "五笔", index: "web.code.input.wubi", args: ["line", "你好"]}, + ]}, + learning: {name: "学习 learning", list: [ + {name: "golang", help: "编程", index: "web.wiki.word", args: ["usr/golang-story/src/main.shy"]}, + {name: "tmux", help: "粘贴", index: "web.code.tmux.text"}, + {name: "study", help: "学习", index: "web.wiki.word", args: ["usr/learning/study.shy"]}, + ]}, + chrome: {name: "爬虫 chrome", list: [ + {name: "feel", help: "网页爬虫", index: "web.wiki.feel", args: ["spide/"], feature: { + display: "/plugin/local/wiki/feel.js", + height: 200, limit: 3, + }}, + {name: "cached", help: "爬虫缓存", index: "web.code.chrome.cache", args: []}, + {name: "spided", help: "网页爬虫", index: "web.code.chrome.spide", args: location && location.protocol && location.protocol=="chrome-extension:"? ["1", "", "spide"]: ["1"]}, + {name: "modify", help: "编辑页面", index: "web.code.chrome.modify", args: []}, + ]}, + }}, + project: {name: "研发群", storm: { + studio: {name: "研发 studio", list: [ + {name: "vimer", help: "编辑器", index: "web.code.vimer", args: ["src/", "main.go"], _action: ["autogen", "compile", "binpack"]}, + {name: "repos", help: "代码库", index: "web.code.git.status"}, + {name: "plan", help: "任务表", index: "web.team.plan"}, + {name: "ctx", help: "上下文", index: "web.wiki.word", args: ["src/main.shy"]}, + ]}, + web: {name: "网页 web", list: [ + {name: "HTML5", help: "浏览器", index: "web.wiki.word", args: ["usr/icebergs/misc/chrome/chrome.shy"]}, + ]}, + cli: {name: "命令 cli", list: [ + {name: "bash", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/bash/bash.shy"]}, + {name: "git", help: "代码库", index: "web.wiki.word", args: ["usr/icebergs/misc/git/git.shy"]}, + {name: "vim", help: "编辑器", index: "web.wiki.word", args: ["usr/icebergs/misc/vim/vim.shy"]}, + {name: "tmux", help: "命令行", index: "web.wiki.word", args: ["usr/icebergs/misc/tmux/tmux.shy"]}, + ]}, + linux: {name: "系统 linux", list: [ + {name: "idc", help: "平台", index: "web.wiki.word", args: ["usr/linux-story/idc/idc.shy"]}, + {name: "iso", help: "系统", index: "web.wiki.word", args: ["usr/linux-story/iso/iso.shy"]}, + {name: "iot", help: "设备", index: "web.wiki.word", args: ["usr/linux-story/iot/iot.shy"]}, + {name: "cli", help: "命令", index: "web.wiki.word", args: ["usr/linux-story/cli/cli.shy"]}, + {name: "linux", help: "系统", index: "web.wiki.word", args: ["usr/linux-story/src/main.shy"]}, + ]}, + nginx: {name: "代理 nginx", list: [ + {name: "nginx", help: "代理", index: "web.wiki.word", args: ["usr/nginx-story/src/main.shy"]}, + ]}, + context: {name: "编程 context", list: [ + {name: "golang", help: "编程", index: "web.wiki.word", args: ["usr/golang-story/src/main.shy"]}, + ]}, + redis: {name: "缓存 redis", list: [ + {name: "redis", help: "缓存", index: "web.wiki.word", args: ["usr/redis-story/src/main.shy"]}, + {name: "kafka", help: "队列", index: "web.wiki.word", args: ["usr/redis-story/src/kafka/kafka.shy"]}, + ]}, + mysql: {name: "存储 mysql", list: [ + {name: "mysql", help: "数据存储", index: "web.wiki.word", args: ["usr/mysql-story/src/main.shy"]}, + {name: "clickhouse", help: "数据存储", index: "web.wiki.word", args: ["usr/mysql-story/src/clickhouse/clickhouse.shy"]}, + ]}, + }}, + profile: {name: "测试群", storm: { + website: {name: "定制 website", index: [ + "web.chat.website", + "web.chat.div", + "web.code.vimer", + "web.dream", + ]}, + release: {name: "发布 release", index: [ + "web.code.publish", "web.code.compile", "web.code.autogen", "web.code.git.server", + ]}, + research: {name: "测试 research", index: [ + "web.code.favor", "web.code.bench", "web.code.pprof", + "web.code.case", + ]}, + }}, + operate: {name: "运维群", storm: { + aaa: {name: "权限 aaa", index: [ + "user", "totp", "sess", "role", + ]}, + web: {name: "应用 web", index: [ + "serve", "space", "dream", "route", + "share", "spide", "cache", "story", + ]}, + cli: {name: "系统 cli", index: [ + "qrcode", "daemon", "system", "runtime", + ]}, + nfs: {name: "文件 nfs", index: [ + "cat", "dir", "tail", "trash", + ]}, + }}, +}}) diff --git a/panel/action.js b/panel/action.js index 122abf7e..7dad3637 100644 --- a/panel/action.js +++ b/panel/action.js @@ -1,250 +1,249 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) { - var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM) - can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) { - item.height = can.Conf(html.HEIGHT)-can.Conf(html.MARGIN_Y) - item.width = can.Conf(html.WIDTH)-can.Conf(html.MARGIN_X) - item.feature = can.base.Obj(item.feature||item.meta) - item.inputs = can.base.Obj(item.inputs||item.list) + var river = can.Conf(chat.RIVER), storm = can.Conf(chat.STORM) + can.onmotion.clear(can), can.core.Next(msg.Table(), function(item, next) { + item.height = can.Conf(html.HEIGHT)-can.Conf(html.MARGIN_Y) + item.width = can.Conf(html.WIDTH)-can.Conf(html.MARGIN_X) + item.feature = can.base.Obj(item.feature||item.meta) + item.inputs = can.base.Obj(item.inputs||item.list) - can.onappend.plugin(can, item, function(sub, meta, skip) { - can.onimport._plugin(can, river, storm, sub, meta), skip || next() - }) - }, function() { can.onimport._menu(can, msg), can.onkeymap._init(can) - can.onaction.onstorm_select(can, msg, river, storm) - }) - }, - _plugin: function(can, river, storm, sub, meta) { sub._target._meta = meta - sub.run = function(event, cmds, cb) { var msg = sub.request(event) - return can.run(event, can.misc.concat(can, [river, storm, meta.id||meta.index], cmds), function(msg) { - can.base.isFunc(cb) && cb(msg) - }) - }, can._plugins = can.misc.concat(can, can._plugins, [sub]) + can.onappend.plugin(can, item, function(sub, meta, skip) { + can.onimport._plugin(can, river, storm, sub, meta), skip || next() + }) + }, function() { can.onimport._menu(can, msg), can.onkeymap._init(can) + can.onaction.onstorm_select(can, msg, river, storm) + }) + }, + _plugin: function(can, river, storm, sub, meta) { sub._target._meta = meta + sub.run = function(event, cmds, cb) { var msg = sub.request(event) + return can.run(event, can.misc.concat(can, [river, storm, meta.id||meta.index], cmds), function(msg) { + can.base.isFunc(cb) && cb(msg) + }) + }, can._plugins = can.misc.concat(can, can._plugins, [sub]) - meta.id && (sub._option.dataset = sub._option.dataset||{}, sub._option.dataset.id = meta.id) + meta.id && (sub._option.dataset = sub._option.dataset||{}, sub._option.dataset.id = meta.id) - can.page.Modify(can, sub._output, {style: kit.Dict(html.MAX_WIDTH, meta.width)}) - can.page.Append(can, can._action, [{view: [chat.TABS, html.DIV, meta.name], onclick: function(event) { - can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, sub._target) - can.onmotion.select(can, can._action, chat.DIV_TABS, event.target) - }, onmouseenter: sub._legend.onmouseenter}]) - }, - _menu: function(can, msg) { if (can.user.mod.isPod||can.user.isMobile) { return } - can.setHeaderMenu(can.base.Obj(msg.Option(chat.MENUS), can.Conf(chat.MENUS)||can.onaction._menus), function(event, button, list) { - can.core.CallFunc([can.onaction, list[0]], [can, button]) - }) - }, + can.page.Modify(can, sub._output, {style: kit.Dict(html.MAX_WIDTH, meta.width)}) + can.page.Append(can, can._action, [{view: [chat.TABS, html.DIV, meta.name], onclick: function(event) { + can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, sub._target) + can.onmotion.select(can, can._action, chat.DIV_TABS, event.target) + }, onmouseenter: sub._legend.onmouseenter}]) + }, + _menu: function(can, msg) { if (can.user.mod.isPod||can.user.isMobile) { return } + can.setHeaderMenu(can.base.Obj(msg.Option(chat.MENUS), can.Conf(chat.MENUS)||can.onaction._menus), function(event, button, list) { + can.core.CallFunc([can.onaction, list[0]], [can, button]) + }) + }, - _share: function(can, share) { share && can.run({}, ["_share", share], function(msg) { - can.user.title(msg.OptionOrSearch(chat.TITLE)) - can.setHeader(chat.TOPIC, msg.OptionOrSearch(chat.TOPIC)) - can.page.Select(can, document.body, html.FIELDSET_PANEL, function(item) { - item != can._target && can.onmotion.hidden(can, item) - }) + _share: function(can, share) { share && can.run({}, ["_share", share], function(msg) { + can.user.title(msg.OptionOrSearch(chat.TITLE)) + can.setHeader(chat.TOPIC, msg.OptionOrSearch(chat.TOPIC)) + // can.page.Select(can, document.body, html.FIELDSET_PANEL, function(item) { + // item != can._target && can.onmotion.hidden(can, item) + // }) - can.Conf(html.MARGIN_X, 0, html.MARGIN_Y, 2*html.ACTION_HEIGHT) - can.page.ClassList.add(can, can._target, ice.CMD) - can.onlayout._init(can) + can.Conf(html.MARGIN_X, 0, html.MARGIN_Y, 2*html.ACTION_HEIGHT) + // can.page.ClassList.add(can, can._target, ice.CMD) + can.onlayout._init(can) - can.Conf(chat.RIVER, "_share", chat.STORM, share) - can.onimport._init(can, msg) - }) }, - _cmd: function(can, item, next) { - can.base.Copy(item, { - height: can.Conf(html.HEIGHT)-can.Conf(html.MARGIN_Y), - width: can.Conf(html.WIDTH)-can.Conf(html.MARGIN_X), - opts: can.misc.Search(can), - }) - can.onappend.plugin(can, item, function(sub, meta, skip) { - can.user.title(meta.name), skip || next() - }) - }, + can.Conf(chat.RIVER, "_share", chat.STORM, share) + can.onimport._init(can, msg) + }) }, + _cmd: function(can, item, next) { + can.base.Copy(item, { + height: can.Conf(html.HEIGHT)-can.Conf(html.MARGIN_Y), + width: can.Conf(html.WIDTH)-can.Conf(html.MARGIN_X), + opts: can.misc.Search(can), + }) + can.onappend.plugin(can, item, function(sub, meta, skip) { + can.user.title(meta.name), skip || next() + }) + }, }) Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, page, 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 } + 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.run(event, [ctx.ACTION, ctx.COMMAND].concat(storm.index), cb) - } else { // 命令列表 - can.core.List(storm.list, function(value) { - msg.Push(mdb.NAME, value.name||"") - msg.Push(mdb.HELP, value.help||"") - msg.Push(ctx.INPUTS, JSON.stringify(value.inputs)) - msg.Push(ctx.FEATURE, JSON.stringify(value.feature)) - msg.Push(ctx.INDEX, value.index||"") - msg.Push(ctx.ARGS, value.args||"[]") - msg.Push(ice.MSG_ACTION, value._action||"") - }), can.base.isFunc(cb) && cb(msg) - } - return true - }, -}) + if (storm.index) { // 命令索引 + can.run(event, [ctx.ACTION, ctx.COMMAND].concat(storm.index), cb) + } else { // 命令列表 + can.core.List(storm.list, function(value) { + msg.Push(mdb.NAME, value.name||"") + msg.Push(mdb.HELP, value.help||"") + msg.Push(ctx.INPUTS, JSON.stringify(value.inputs)) + msg.Push(ctx.FEATURE, JSON.stringify(value.feature)) + msg.Push(ctx.INDEX, value.index||"") + msg.Push(ctx.ARGS, value.args||"[]") + msg.Push(ice.MSG_ACTION, value._action||"") + }), can.base.isFunc(cb) && cb(msg) + } + return true +}}) Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, cb, target) { - can.Conf(html.MARGIN_Y, 4*html.PLUGIN_MARGIN+2*html.ACTION_HEIGHT+html.ACTION_MARGIN) - can.Conf(html.MARGIN_X, 4*html.PLUGIN_MARGIN) - target.ontouchstart = function(event) { - can.onengine.signal(can, "onaction_touch", can.request(event)) - }, can.base.isFunc(cb) && cb() - }, - _menus: [ - [chat.LAYOUT, "auto", "flow", "grid", "tabs", "free", "page", "toimage"], - [ice.HELP, "tutor", "manual", "service", "devops", "refer"], - ], - _trans: { - "layout": "布局", - "auto": "默认布局", - "flow": "流动布局", - "grid": "网格布局", - "tabs": "标签布局", - "free": "自由布局", - "page": "网页布局", - "toimage": "生成图片", + can.Conf(html.MARGIN_Y, 4*html.PLUGIN_MARGIN+2*html.ACTION_HEIGHT+html.ACTION_MARGIN) + can.Conf(html.MARGIN_X, 4*html.PLUGIN_MARGIN) + target.ontouchstart = function(event) { + can.onengine.signal(can, "onaction_touch", can.request(event)) + }, can.base.isFunc(cb) && cb() + }, + _menus: [ + [chat.LAYOUT, "auto", "flow", "grid", "tabs", "free", "page", "toimage"], + [ice.HELP, "tutor", "manual", "service", "devops", "refer"], + ], + _trans: { + "layout": "布局", + "auto": "默认布局", + "flow": "流动布局", + "grid": "网格布局", + "tabs": "标签布局", + "free": "自由布局", + "page": "网页布局", + "toimage": "生成图片", - "help": "帮助", - "tutor": "入门简介", - "manual": "使用手册", - "service": "服务手册", - "devops": "编程手册", - "refer": "参考手册", - }, - onmain: function(can) { - can.onimport._share(can, can.misc.Search(can, web.SHARE)) - }, - onlogin: function(can) { if (!can.user.mod.isCmd) { return } - can.Conf(html.MARGIN_X, 0, html.MARGIN_Y, 2*html.ACTION_HEIGHT) - can.page.ClassList.add(can, can._target, ice.CMD) - can.onlayout._init(can) + "help": "帮助", + "tutor": "入门简介", + "manual": "使用手册", + "service": "服务手册", + "devops": "编程手册", + "refer": "参考手册", + }, + onmain: function(can) { + can.onimport._share(can, can.misc.Search(can, web.SHARE)) + }, + onlogin: function(can) { if (!can.user.mod.isCmd) { return } + can.Conf(html.MARGIN_X, 0, html.MARGIN_Y, 2*html.ACTION_HEIGHT) + can.page.ClassList.add(can, can._target, ice.CMD) + can.onlayout._init(can) - can._names = location.pathname - can.Conf(chat.TOOL)? can.core.Next(can.Conf(chat.TOOL), function(item, next) { - can.onimport._cmd(can, item, next) + can._names = location.pathname + can.Conf(chat.TOOL)? can.core.Next(can.Conf(chat.TOOL), function(item, next) { + can.onimport._cmd(can, item, next) - }): can.run(can.request()._event, [ctx.ACTION, ctx.COMMAND], function(msg) { - can.core.Next(msg.Table(), function(item, next) { - can.onimport._cmd(can, item, next) - }) - }) - }, - onstorm_select: function(can, msg, river, storm) { can.onlayout._init(can) - if (can.onmotion.cache(can, function() { - var key = can.core.Keys(can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm)) - return key - }, can._action, can._output)) { - var conf = can.core.Value(can._root, can.core.Keys(chat.RIVER, river, chat.STORM, storm))||{} - can.onaction.layout(can, conf.layout||can.misc.SearchOrConf(can, chat.LAYOUT)||"auto", true) - return - } + }): can.run(can.request()._event, [ctx.ACTION, ctx.COMMAND], function(msg) { + can.core.Next(msg.Table(), function(item, next) { + can.onimport._cmd(can, item, next) + }) + }) + }, + onstorm_select: function(can, msg, river, storm) { can.onlayout._init(can) + if (can.onmotion.cache(can, function() { + var key = can.core.Keys(can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm)) + return key + }, can._action, can._output)) { + var conf = can.core.Value(can._root, can.core.Keys(chat.RIVER, river, chat.STORM, storm))||{} + can.onaction.layout(can, conf.layout||can.misc.SearchOrConf(can, chat.LAYOUT)||"auto", true) + return + } - can.run({}, [river, storm], function(msg) { if (msg.Length() > 0) { return can.onimport._init(can, msg) } - can.onengine.signal(can, "onaction_notool", can.request({}, {river: river, storm: storm})) - }) - }, - onsearch: function(can, msg, word) { - if (word[0] == mdb.FOREACH || word[0] == mdb.PLUGIN) { can.onexport.plugin(can, msg, word) } - }, - onsize: function(can, msg, height, width) { can.Conf({height: height, width: width}) }, + can.run({}, [river, storm], function(msg) { if (msg.Length() > 0) { return can.onimport._init(can, msg) } + can.onengine.signal(can, "onaction_notool", can.request({}, {river: river, storm: storm})) + }) + }, + onsearch: function(can, msg, word) { + if (word[0] == mdb.FOREACH || word[0] == mdb.PLUGIN) { can.onexport.plugin(can, msg, word) } + }, + onsize: function(can, msg, height, width) { can.Conf({height: height, width: width}) }, - help: function(can, button) { can.user.open("/help/"+button+".shy") }, - layout: function(can, button, slient) { - if (button == "toimage") { - can.onmotion.toimage(event, can, document.title, can._output) - return - } - can.page.ClassList.del(can, can._target, can.Conf(chat.LAYOUT)) - can.page.ClassList.add(can, can._target, can.Conf(chat.LAYOUT, button)) + help: function(can, button) { can.user.open("/help/"+button+".shy") }, + layout: function(can, button, slient) { + if (button == "toimage") { + can.onmotion.toimage(event, can, document.title, can._output) + return + } + can.page.ClassList.del(can, can._target, can.Conf(chat.LAYOUT)) + can.page.ClassList.add(can, can._target, can.Conf(chat.LAYOUT, button)) - if (button == "tabs") { - can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, 0) - can.onmotion.select(can, can._action, chat.DIV_TABS, 0) - } else if (button == "free") { - can.page.Select(can, can._target, [[html.DIV_OUTPUT, html.FIELDSET_PLUGIN]], function(item, index) { - can.page.Modify(can, item, {style: {left: 40*index, top: 40*index}}) - can.onmotion.move(can, item, {left: 40*index, top: 40*index}) - }) - } else if (button == "grid") { - can.user.input(event, can, [{name: "m", value: 2}, {name: "n", value: 2}], function(event, button, data, list, args) { - can.getActionSize(function(height, width) { var m = parseInt(data.m)||2, n = parseInt(data.n)||2 - can.page.css(can.base.replaceAll(chat.ACTION_LAYOUT_FMT, "_width", (width-(4*m+1)*html.PLUGIN_MARGIN)/m+"px", "_height", (height-(4*n+1)*html.PLUGIN_MARGIN)/n+"px")) - }) - }, true) - } - can.onlayout._init(can) - }, + if (button == "tabs") { + can.onmotion.select(can, can._output, html.FIELDSET_PLUGIN, 0) + can.onmotion.select(can, can._action, chat.DIV_TABS, 0) + } else if (button == "free") { + can.page.Select(can, can._target, [[html.DIV_OUTPUT, html.FIELDSET_PLUGIN]], function(item, index) { + can.page.Modify(can, item, {style: {left: 40*index, top: 40*index}}) + can.onmotion.move(can, item, {left: 40*index, top: 40*index}) + }) + } else if (button == "grid") { + can.user.input(event, can, [{name: "m", value: 2}, {name: "n", value: 2}], function(event, button, data, list, args) { + can.getActionSize(function(height, width) { var m = parseInt(data.m)||2, n = parseInt(data.n)||2 + can.page.css(can.base.replaceAll(chat.ACTION_LAYOUT_FMT, "_width", (width-(4*m+1)*html.PLUGIN_MARGIN)/m+"px", "_height", (height-(4*n+1)*html.PLUGIN_MARGIN)/n+"px")) + }) + }, true) + } + can.onlayout._init(can) + }, }) Volcanos("onkeymap", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) { - can.onkeymap._build(can), can.onengine.listen(can, "onkeydown", function(msg, model) { - can._keylist = can.onkeymap._parse(msg._event, can, model, can._keylist||[], can._output) - }) - }, - _mode: { - normal: { - j: function(event, can, target) { target.scrollBy(0, event.ctrlKey? 300: 30) }, - k: function(event, can, target) { target.scrollBy(0, event.ctrlKey? -300: -30) }, + can.onkeymap._build(can), can.onengine.listen(can, "onkeydown", function(msg, model) { + can._keylist = can.onkeymap._parse(msg._event, can, model, can._keylist||[], can._output) + }) + }, + _mode: { + normal: { + j: function(event, can, target) { target.scrollBy(0, event.ctrlKey? 300: 30) }, + k: function(event, can, target) { target.scrollBy(0, event.ctrlKey? -300: -30) }, - b: function(event, can, target) { can.search(event, ["Header.onaction.black"]) }, - w: function(event, can, target) { can.search(event, ["Header.onaction.white"]) }, + b: function(event, can, target) { can.search(event, ["Header.onaction.black"]) }, + w: function(event, can, target) { can.search(event, ["Header.onaction.white"]) }, - g: function(event, can, target) { can.search(event, ["River.ondetail.创建群组"]) }, - s: function(event, can, target) { can.search(event, ["River.ondetail.添加应用"]) }, - t: function(event, can, target) { can.search(event, ["River.ondetail.添加工具"]) }, + g: function(event, can, target) { can.search(event, ["River.ondetail.创建群组"]) }, + s: function(event, can, target) { can.search(event, ["River.ondetail.添加应用"]) }, + t: function(event, can, target) { can.search(event, ["River.ondetail.添加工具"]) }, - " ": function(event, can, target) { - can.onengine.signal(can, "onsearchfocus") - }, - ":": function(event, can, target) { - can.onengine.signal(can, "oncommandfocus") - }, - enter: function(event, can, target) { can.misc.Log("enter") }, - escape: function(event, can, target) { - can.page.Select(can, document.body, html.FIELDSET_AUTO, function(item) { - can.onmotion.hidden(can, item) - }) - can.page.Select(can, document.body, can.page.Keys(html.FIELDSET_FLOAT, html.DIV_FLOAT), function(item) { - can.page.Remove(can, item) - }) - }, - }, - }, _engine: {}, + " ": function(event, can, target) { + can.onengine.signal(can, "onsearchfocus") + }, + ":": function(event, can, target) { + can.onengine.signal(can, "oncommandfocus") + }, + enter: function(event, can, target) { can.misc.Log("enter") }, + escape: function(event, can, target) { + can.page.Select(can, document.body, html.FIELDSET_AUTO, function(item) { + can.onmotion.hidden(can, item) + }) + can.page.Select(can, document.body, can.page.Keys(html.FIELDSET_FLOAT, html.DIV_FLOAT), function(item) { + can.page.Remove(can, item) + }) + }, + }, + }, _engine: {}, }) Volcanos("onexport", {help: "导出数据", list: [], - args: function(can, cb, target) { - can.core.Next(can.page.Select(can, target, [[html.FIELDSET_PLUGIN, html.FORM_OPTION]]), function(item, next, index, array) { - item.dataset.args = JSON.stringify(can.page.Select(can, item, html.OPTION_ARGS, function(item) { return item.value||"" })) - cb(item, next, index, array) - }) - }, - size: function(can, msg) { - msg.Option(html.TOP, can._target.offsetTop) - msg.Option(html.LEFT, can._target.offsetLeft) - msg.Option(html.WIDTH, can._target.offsetWidth) - msg.Option(html.HEIGHT, can._target.offsetHeight-can._action.offsetHeight) - msg.Option(html.SCROLL, can.user.isMobile? can._target.parentNode.parentNode.scrollTop: can._output.scrollTop) - msg.Option(html.MARGIN_X, can.Conf(html.MARGIN_X)) - msg.Option(html.MARGIN_Y, can.Conf(html.MARGIN_Y)) - }, - layout: function(can, msg) { return can.Conf(chat.LAYOUT) }, - plugin: function(can, msg, word) { var fields = can.core.Split(msg.Option(ice.MSG_FIELDS)) - can.page.Select(can, can._output, [[html.FIELDSET_PLUGIN, html.LEGEND]], function(item) { - if (item.innerHTML.indexOf(word[1]) == -1) { return } + args: function(can, cb, target) { + can.core.Next(can.page.Select(can, target, [[html.FIELDSET_PLUGIN, html.FORM_OPTION]]), function(item, next, index, array) { + item.dataset.args = JSON.stringify(can.page.Select(can, item, html.OPTION_ARGS, function(item) { return item.value||"" })) + cb(item, next, index, array) + }) + }, + size: function(can, msg) { + msg.Option(html.TOP, can._target.offsetTop) + msg.Option(html.LEFT, can._target.offsetLeft) + msg.Option(html.WIDTH, can._target.offsetWidth) + msg.Option(html.HEIGHT, can._target.offsetHeight-can._action.offsetHeight) + msg.Option(html.SCROLL, can.user.isMobile? can._target.parentNode.parentNode.scrollTop: can._output.scrollTop) + msg.Option(html.MARGIN_X, can.Conf(html.MARGIN_X)) + msg.Option(html.MARGIN_Y, can.Conf(html.MARGIN_Y)) + }, + layout: function(can, msg) { return can.Conf(chat.LAYOUT) }, + plugin: function(can, msg, word) { var fields = can.core.Split(msg.Option(ice.MSG_FIELDS)) + can.page.Select(can, can._output, [[html.FIELDSET_PLUGIN, html.LEGEND]], function(item) { + if (item.innerHTML.indexOf(word[1]) == -1) { return } - var meta = item.parentNode._meta - var list = can.page.Select(can, item.nextSibling, html.OPTION_ARGS, function(item) { return item.value||"" }) + var meta = item.parentNode._meta + var list = can.page.Select(can, item.nextSibling, html.OPTION_ARGS, function(item) { return item.value||"" }) - var data = {ctx: "web.chat", cmd: ctx.ACTION, - type: mdb.PLUGIN, name: item.innerHTML, text: shy("跳转", function(event) { - var input = can.page.Select(can, item.parentNode, html.INPUT_ARGS)[0] - input && input.focus() - }), argument: JSON.stringify(list), - } - if (meta.index) { - data.context = "", data.command = meta.index - } else if (meta.cmd) { - data.context = meta.ctx, data.command = meta.cmd - } else { - return - } - msg.Push(data, fields) - }) - }, + var data = {ctx: "web.chat", cmd: ctx.ACTION, + type: mdb.PLUGIN, name: item.innerHTML, text: shy("跳转", function(event) { + var input = can.page.Select(can, item.parentNode, html.INPUT_ARGS)[0] + input && input.focus() + }), argument: JSON.stringify(list), + } + if (meta.index) { + data.context = "", data.command = meta.index + } else if (meta.cmd) { + data.context = meta.ctx, data.command = meta.cmd + } else { + return + } + msg.Push(data, fields) + }) + }, }) diff --git a/panel/footer.js b/panel/footer.js index e33003b0..b0530144 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -1,96 +1,96 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.onmotion.clear(can) - can.onimport._title(can, msg, target) - can.onimport._state(can, msg, target) - can.onimport._toast(can, msg, target) - can.onimport._cli(can, msg, target) - can.base.isFunc(cb) && cb(msg) - }, - _title: function(can, msg, target) { - !can.user.isMobile && can.core.List(msg.result, function(item) { - can.page.Append(can, target, [{view: [chat.TITLE, html.DIV, item], title: "联系站长"}]) - }) - }, - _state: function(can, msg, target) { - can.core.List(can.base.Obj(msg.Option(chat.STATE)||can.Conf(chat.STATE), ["ncmd"]), function(item) { - can.page.Append(can, target, [{view: [can.base.join([chat.STATE, item]), html.DIV, can.Conf(item)], list: [ - {text: [item, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [can.Conf(item)||"", html.SPAN, item]}, - ], onclick: function(event) { - can.show = can.show? (can.page.Remove(can, can.show), null): can.onaction._cmd(can) - can.page.Modify(can, can.show, {style: {left: "", top: "", right: 0, bottom: can.onexport.height(can)}}) - }}]) - }) - }, - _toast: function(can, msg, target) { - can.toast = can.page.Append(can, target, [{view: chat.TOAST, onclick: function(event) { - can.show = can.show? (can.page.Remove(can, can.show), null): can.onappend.float(can, can._toast).first - can.page.Modify(can, can.show, {style: {left: "", top: "", right: 0, bottom: can.onexport.height(can)}}) - }}]).first - }, - _cli: function(can, msg, target) { - can.onappend.input(can, {type: html.TEXT, name: "cmd", onkeydown: function(event) { - can.onkeymap.input(event, can); if (event.key != lang.ENTER) { return } - switch (event.target.value) { - case cli.CLEAR: can.cli && can.cli.close(); break - case cli.CLOSE: can.cli && can.cli.close(); break - default: - can.run(event, [ice.RUN].concat(can.core.Split(event.target.value, ice.SP)), function(msg) { - can.cli && can.cli.close() - can.cli = can.onappend.float(can, msg, function(value, key, index, line, list) { + can.onmotion.clear(can) + can.onimport._title(can, msg, target) + can.onimport._state(can, msg, target) + can.onimport._toast(can, msg, target) + can.onimport._cli(can, msg, target) + can.base.isFunc(cb) && cb(msg) + }, + _title: function(can, msg, target) { + !can.user.isMobile && can.core.List(msg.result, function(item) { + can.page.Append(can, target, [{view: [chat.TITLE, html.DIV, item], title: "联系站长"}]) + }) + }, + _state: function(can, msg, target) { + can.core.List(can.base.Obj(msg.Option(chat.STATE)||can.Conf(chat.STATE), ["ncmd"]), function(item) { + can.page.Append(can, target, [{view: [can.base.join([chat.STATE, item]), html.DIV, can.Conf(item)], list: [ + {text: [item, html.LABEL]}, {text: [": ", html.LABEL]}, {text: [can.Conf(item)||"", html.SPAN, item]}, + ], onclick: function(event) { + can.show = can.show? (can.page.Remove(can, can.show), null): can.onaction._cmd(can) + can.page.Modify(can, can.show, {style: {left: "", top: "", right: 0, bottom: can.onexport.height(can)}}) + }}]) + }) + }, + _toast: function(can, msg, target) { + can.toast = can.page.Append(can, target, [{view: chat.TOAST, onclick: function(event) { + can.show = can.show? (can.page.Remove(can, can.show), null): can.onappend.float(can, can._toast).first + can.page.Modify(can, can.show, {style: {left: "", top: "", right: 0, bottom: can.onexport.height(can)}}) + }}]).first + }, + _cli: function(can, msg, target) { + can.onappend.input(can, {type: html.TEXT, name: "cmd", onkeydown: function(event) { + can.onkeymap.input(event, can); if (event.key != lang.ENTER) { return } + switch (event.target.value) { + case cli.CLEAR: can.cli && can.cli.close(); break + case cli.CLOSE: can.cli && can.cli.close(); break + default: + can.run(event, [ice.RUN].concat(can.core.Split(event.target.value, ice.SP)), function(msg) { + can.cli && can.cli.close() + can.cli = can.onappend.float(can, msg, function(value, key, index, line, list) { - }), can.page.Modify(can, can.cli.first, {style: {bottom: can.onexport.height(can), top: ""}}) - }) - } - }}, "", target, "title cmd") - }, + }), can.page.Modify(can, can.cli.first, {style: {bottom: can.onexport.height(can), top: ""}}) + }) + } + }}, "", target, "title cmd") + }, - toast: function(can, msg, title, content, fileline, time) { can._toast = can._toast||can.request() - can.page.Modify(can, can.toast, [time.split(ice.SP).pop(), title, content].join(ice.SP)) - can._toast.Push({time: time, fileline: fileline, title: title, content: content}) - }, - ncmd: function(can, msg, _follow, _cmds) { var NCMD = "ncmd"; can._cmds = can._cmds||can.request() - can._cmds.Push({time: can.base.Time(), follow: _follow, cmds: _cmds}) - can.page.Select(can, can._output, can.core.Keys(html.SPAN, NCMD), function(item) { - item.innerHTML = can.Conf(NCMD, parseInt(can.Conf(NCMD)||"0")+1+"")+"" - }) - }, + toast: function(can, msg, title, content, fileline, time) { can._toast = can._toast||can.request() + can.page.Modify(can, can.toast, [time.split(ice.SP).pop(), title, content].join(ice.SP)) + can._toast.Push({time: time, fileline: fileline, title: title, content: content}) + }, + ncmd: function(can, msg, _follow, _cmds) { var NCMD = "ncmd"; can._cmds = can._cmds||can.request() + can._cmds.Push({time: can.base.Time(), follow: _follow, cmds: _cmds}) + can.page.Select(can, can._output, can.core.Keys(html.SPAN, NCMD), function(item) { + item.innerHTML = can.Conf(NCMD, parseInt(can.Conf(NCMD)||"0")+1+"")+"" + }) + }, }) Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, cb, target) { - can.base.isFunc(cb) && cb() - }, - onlogin: function(can, msg) { can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) }) }, - ontoast: function(can, msg) { can.core.CallFunc(can.onimport.toast, {can: can, msg: msg}) }, - onremote: function(can, msg) { can.core.CallFunc(can.onimport.ncmd, {can: can, msg: msg}) }, - oncommandfocus: function(can) { - can.page.Select(can, can._output, "div.cmd input", function(target) { target.focus() }) - }, + can.base.isFunc(cb) && cb() + }, + onlogin: function(can, msg) { can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) }) }, + ontoast: function(can, msg) { can.core.CallFunc(can.onimport.toast, {can: can, msg: msg}) }, + onremote: function(can, msg) { can.core.CallFunc(can.onimport.ncmd, {can: can, msg: msg}) }, + oncommandfocus: function(can) { + can.page.Select(can, can._output, "div.cmd input", function(target) { target.focus() }) + }, - _cmd: function(can) { - return can.onappend.float(can, can._cmds, function(value, key, index, line, list) { - var cmds = can.base.Obj(line.cmds); switch (line.follow) { - case "chat.Action": cmds = cmds.slice(2); break - case "chat.Footer": cmds = cmds.slice(2); break - } - switch (cmds[0]) { - case "web.wiki.word": cmds = cmds.slice(5); break - } + _cmd: function(can) { + return can.onappend.float(can, can._cmds, function(value, key, index, line, list) { + var cmds = can.base.Obj(line.cmds); switch (line.follow) { + case "chat.Action": cmds = cmds.slice(2); break + case "chat.Footer": cmds = cmds.slice(2); break + } + switch (cmds[0]) { + case "web.wiki.word": cmds = cmds.slice(5); break + } - can.get("Action", "size", function(msg, top, left, width, height) { - can.onappend.plugin(can, {index: cmds[0], args: cmds.slice(1), height: height-100, width: width}, function(sub) { - sub.run = function(event, cmd, cb) { - can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, cmds[0]], cmd), cb) - } + can.get("Action", "size", function(msg, top, left, width, height) { + can.onappend.plugin(can, {index: cmds[0], args: cmds.slice(1), height: height-100, width: width}, function(sub) { + sub.run = function(event, cmd, cb) { + can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, cmds[0]], cmd), cb) + } - can.page.Modify(can, sub._target, {style: {top: top+100, left: left}}) - can.page.Modify(can, sub._legend, {style: {display: html.BLOCK}}) - can.page.Modify(can, sub._output, {style: {"max-width": width}}) - can.page.ClassList.add(can, sub._target, chat.FLOAT) - }, document.body) - }) - }).first - }, + can.page.Modify(can, sub._target, {style: {top: top+100, left: left}}) + can.page.Modify(can, sub._legend, {style: {display: html.BLOCK}}) + can.page.Modify(can, sub._output, {style: {"max-width": width}}) + can.page.ClassList.add(can, sub._target, chat.FLOAT) + }, document.body) + }) + }).first + }, }) Volcanos("onexport", {help: "导出数据", list: [], - height: function(can) { return can._target.offsetHeight }, + height: function(can) { return can._target.offsetHeight }, }) diff --git a/panel/header.js b/panel/header.js index 108ec506..ee89b67b 100644 --- a/panel/header.js +++ b/panel/header.js @@ -1,235 +1,235 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, cb, target) { - can.Conf(aaa.USERNICK, msg.Option(aaa.USERNICK)||msg.Option(ice.MSG_USERNAME)||can.Conf(aaa.USERNICK)) + can.Conf(aaa.USERNICK, msg.Option(aaa.USERNICK)||msg.Option(ice.MSG_USERNAME)||can.Conf(aaa.USERNICK)) - can.onmotion.clear(can) - can.onimport._agent(can, msg, target) - can.onimport._grant(can, msg, target) - can.onimport._title(can, msg, target) - can.onimport._state(can, msg, target) - can.onimport._search(can, msg, target) - can.onimport._background(can, msg, target) - can.onimport._avatar(can, msg, target) - can.onimport._menus(can, msg, target) - can.base.isFunc(cb) && cb(msg) - }, - _agent: function(can, msg, target) { - if (can.user.mod.isPod) { - can.onaction.River(can) - can.onaction.Footer(can) - } else if (can.user.isMobile) { - can.onaction.River(can) - can.onaction.Footer(can) - } else if (can.user.isExtension) { - can.onaction.River(can) - } - can.run({}, [chat.AGENT], function(msg) { if (!msg.Option(ssh.SCRIPT)) { return } - can.require(can.base.Obj(msg.Option(ssh.SCRIPT)), function(can) { can.onaction.source(can, msg) }) - }) - }, - _grant: function(can, msg, target) { - if (can.misc.Search(can, chat.GRANT)) { - if (can.user.confirm(chat.GRANT+ice.SP+can.misc.Search(can, chat.GRANT))) { - can.run(event, [ctx.ACTION, chat.GRANT, web.SPACE, can.misc.Search(can, chat.GRANT)]) - } - can.misc.Search(can, chat.GRANT, "") - } - }, - _title: function(can, msg, target) { - can.user.title(can.misc.Search(can, chat.TITLE)||can.misc.Search(can, ice.POD)) - !can.user.isMobile && can.core.List(can.base.getValid(msg.result, can.Conf(chat.TITLE)||["shylinux.com/x/contexts"]), function(item) { - can.page.Append(can, target, [{view: [chat.TITLE, html.DIV, item], title: "返回主页", onclick: function(event) { - can.onaction.title(event, can) - }, onmouseenter: function(event) { var list = msg.Table() - can.user.carte(event, can, {}, can.core.List(list, function(item) { return item.name }), function(event, item, meta, index) { - event.shiftKey? can.user.open(list[index].path): can.user.jumps(list[index].path) - }) - }}]) - }) - }, - _state: function(can, msg, target) { - can.core.List(can.base.Obj(msg.Option(chat.STATE)||can.Conf(chat.STATE), [mdb.TIME, aaa.USERNICK]), function(item) { - if (item == aaa.AVATAR ) { if (can.user.isLocalFile) { return } - can.page.Append(can, target, [{view: can.base.join([chat.STATE, item]), list: [{img: ice.SP}], onmouseenter: function(event) { - can.onaction.carte(event, can, [can.page.Format(html.IMG, "/share/local/avatar", 160)]) - }}]); return - } + can.onmotion.clear(can) + can.onimport._agent(can, msg, target) + can.onimport._grant(can, msg, target) + can.onimport._title(can, msg, target) + can.onimport._state(can, msg, target) + can.onimport._search(can, msg, target) + can.onimport._background(can, msg, target) + can.onimport._avatar(can, msg, target) + can.onimport._menus(can, msg, target) + can.base.isFunc(cb) && cb(msg) + }, + _agent: function(can, msg, target) { + if (can.user.mod.isPod) { + can.onaction.River(can) + can.onaction.Footer(can) + } else if (can.user.isMobile) { + can.onaction.River(can) + can.onaction.Footer(can) + } else if (can.user.isExtension) { + can.onaction.River(can) + } + can.run({}, [chat.AGENT], function(msg) { if (!msg.Option(ssh.SCRIPT)) { return } + can.require(can.base.Obj(msg.Option(ssh.SCRIPT)), function(can) { can.onaction.source(can, msg) }) + }) + }, + _grant: function(can, msg, target) { + if (can.misc.Search(can, chat.GRANT)) { + if (can.user.confirm(chat.GRANT+ice.SP+can.misc.Search(can, chat.GRANT))) { + can.run(event, [ctx.ACTION, chat.GRANT, web.SPACE, can.misc.Search(can, chat.GRANT)]) + } + can.misc.Search(can, chat.GRANT, "") + } + }, + _title: function(can, msg, target) { + can.user.title(can.misc.Search(can, chat.TITLE)||can.misc.Search(can, ice.POD)) + !can.user.isMobile && can.core.List(can.base.getValid(msg.result, can.Conf(chat.TITLE)||["shylinux.com/x/contexts"]), function(item) { + can.page.Append(can, target, [{view: [chat.TITLE, html.DIV, item], title: "返回主页", onclick: function(event) { + can.onaction.title(event, can) + }, onmouseenter: function(event) { var list = msg.Table() + can.user.carte(event, can, {}, can.core.List(list, function(item) { return item.name }), function(event, item, meta, index) { + event.shiftKey? can.user.open(list[index].path): can.user.jumps(list[index].path) + }) + }}]) + }) + }, + _state: function(can, msg, target) { + can.core.List(can.base.Obj(msg.Option(chat.STATE)||can.Conf(chat.STATE), [mdb.TIME, aaa.USERNICK]), function(item) { + if (item == aaa.AVATAR ) { if (can.user.isLocalFile) { return } + can.page.Append(can, target, [{view: can.base.join([chat.STATE, item]), list: [{img: ice.SP}], onmouseenter: function(event) { + can.onaction.carte(event, can, [can.page.Format(html.IMG, "/share/local/avatar", 160)]) + }}]); return + } - can.page.Append(can, target, [{view: [can.base.join([chat.STATE, item]), html.DIV, (can.Conf(item)||"").slice(0, 10)], onmouseenter: function(event) { - can.core.CallFunc([can.onaction, item], [event, can, item]) - }, _init: function(target) { item == mdb.TIME && can.onimport._time(can, target) }}]) - }) - }, - _search: function(can, msg, target) { - var ui = can.onappend.input(can, {type: html.TEXT, name: mdb.SEARCH, onkeydown: function(event) { - can.onkeymap.input(event, can); switch (event.key) { - case lang.ENTER: can.onengine.signal(can, "onopensearch", can.request(event, {type: "*", word: event.target.value})) - } - }}, "", target, "title search").parentNode - can.user.isMobile && can.page.Modify(can, ui, {style: {float: html.RIGHT}}) - }, - _background: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return } - msg.Option(aaa.BACKGROUND) && can.onlayout.background(can, "/share/local/background", document.body) - }, - _avatar: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return } - // can.page.Modify(can, "div.state.avatar>img", {src: "/share/local/avatar/"}) - msg.Option(aaa.AVATAR) && can.page.Modify(can, "div.state.avatar>img", {src: "/share/local/avatar"}) - }, - _menus: function(can, msg, target) { - can.setHeaderMenu(can.user.mod.isPod||can.user.isMobile||can.user.isExtension? [chat.RIVER]: - can.base.Obj(msg.Option(chat.MENUS)||can.Conf(chat.MENUS), can.onaction._menus), function(event, button) { - can.core.CallFunc(can.onaction[button]||function(event, can) { - can.run(event, [button], function(msg) { can.user.toast(can, "执行成功", can.user.trans(can, button)) }) - }, {event: event, can: can, button: button}) - }) - }, + can.page.Append(can, target, [{view: [can.base.join([chat.STATE, item]), html.DIV, (can.Conf(item)||"").slice(0, 10)], onmouseenter: function(event) { + can.core.CallFunc([can.onaction, item], [event, can, item]) + }, _init: function(target) { item == mdb.TIME && can.onimport._time(can, target) }}]) + }) + }, + _search: function(can, msg, target) { + var ui = can.onappend.input(can, {type: html.TEXT, name: mdb.SEARCH, onkeydown: function(event) { + can.onkeymap.input(event, can); switch (event.key) { + case lang.ENTER: can.onengine.signal(can, "onopensearch", can.request(event, {type: "*", word: event.target.value})) + } + }}, "", target, "title search").parentNode + can.user.isMobile && can.page.Modify(can, ui, {style: {float: html.RIGHT}}) + }, + _background: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return } + msg.Option(aaa.BACKGROUND) && can.onlayout.background(can, "/share/local/background", document.body) + }, + _avatar: function(can, msg) { if (can.user.isExtension || can.user.isLocalFile) { return } + // can.page.Modify(can, "div.state.avatar>img", {src: "/share/local/avatar/"}) + msg.Option(aaa.AVATAR) && can.page.Modify(can, "div.state.avatar>img", {src: "/share/local/avatar"}) + }, + _menus: function(can, msg, target) { + can.setHeaderMenu(can.user.mod.isPod||can.user.isMobile||can.user.isExtension? [chat.RIVER]: + can.base.Obj(msg.Option(chat.MENUS)||can.Conf(chat.MENUS), can.onaction._menus), function(event, button) { + can.core.CallFunc(can.onaction[button]||function(event, can) { + can.run(event, [button], function(msg) { can.user.toast(can, "执行成功", can.user.trans(can, button)) }) + }, {event: event, can: can, button: button}) + }) + }, - _time: function(can, target) { - can.core.Timer({interval: 500}, function() { can.onimport.time(can, target) }) - can.onappend.figure(can, {action: "date", style: {"min-width": 306}}, target, function(sub) { - can.get("Action", "size", function(msg, top) { - can.page.Modify(can, sub._target, {style: {top: top, right: 0, left: null}}) - }) - }), target.onmouseenter = target.click - }, - time: function(can, target) { can.onlayout.topic(can) - target.innerHTML = can.user.time(can, null, "%w %H:%M:%S") - }, - topic: function(can, topic) { can.onlayout.topic(can, can._topic = topic) }, - background: function(event, can, url) { if (can.user.isExtension || can.user.isLocalFile) { return } - can.run(event, [ctx.ACTION, aaa.BACKGROUND, url], function(msg) { can.onimport._background(can, msg) }) - }, - avatar: function(event, can, url) { if (can.user.isExtension || can.user.isLocalFile) { return } - can.run(event, [ctx.ACTION, aaa.AVATAR, url], function(msg) { can.onimport._avatar(can, msg) }) - }, - menu: function(can, cmds, cb, trans) { - return can.page.Append(can, can._output, [{type: cmds[0], list: can.core.List(cmds.slice(1), function(item) { - if (can.base.isString(item)) { - return {view: [html.MENU, html.DIV, can.user.trans(can, item, trans)], onclick: function(event) { - can.base.isFunc(cb) && cb(event, item, cmds) - }} + _time: function(can, target) { + can.core.Timer({interval: 500}, function() { can.onimport.time(can, target) }) + can.onappend.figure(can, {action: "date", style: {"min-width": 306}}, target, function(sub) { + can.get("Action", "size", function(msg, top) { + can.page.Modify(can, sub._target, {style: {top: top, right: 0, left: null}}) + }) + }), target.onmouseenter = target.click + }, + time: function(can, target) { can.onlayout.topic(can) + target.innerHTML = can.user.time(can, null, "%w %H:%M:%S") + }, + topic: function(can, topic) { can.onlayout.topic(can, can._topic = topic) }, + background: function(event, can, url) { if (can.user.isExtension || can.user.isLocalFile) { return } + can.run(event, [ctx.ACTION, aaa.BACKGROUND, url], function(msg) { can.onimport._background(can, msg) }) + }, + avatar: function(event, can, url) { if (can.user.isExtension || can.user.isLocalFile) { return } + can.run(event, [ctx.ACTION, aaa.AVATAR, url], function(msg) { can.onimport._avatar(can, msg) }) + }, + menu: function(can, cmds, cb, trans) { + return can.page.Append(can, can._output, [{type: cmds[0], list: can.core.List(cmds.slice(1), function(item) { + if (can.base.isString(item)) { + return {view: [html.MENU, html.DIV, can.user.trans(can, item, trans)], onclick: function(event) { + can.base.isFunc(cb) && cb(event, item, cmds) + }} - } else if (can.base.isArray(item)) { - var list = can.core.List(item, function(value, index) { return can.user.trans(can, value, trans) }) - return {view: [html.MENU, html.DIV, can.user.trans(can, list[0], trans)], onmouseenter: function(event) { - can.onaction.carte(event, can, list.slice(1), function(event, button, meta, index) { - can.base.isFunc(cb) && cb(event, item[index+1], item) - }, trans) - }} + } else if (can.base.isArray(item)) { + var list = can.core.List(item, function(value, index) { return can.user.trans(can, value, trans) }) + return {view: [html.MENU, html.DIV, can.user.trans(can, list[0], trans)], onmouseenter: function(event) { + can.onaction.carte(event, can, list.slice(1), function(event, button, meta, index) { + can.base.isFunc(cb) && cb(event, item[index+1], item) + }, trans) + }} - } else if (can.base.isObject(item)) { - return item - } - }) }]).first - }, + } else if (can.base.isObject(item)) { + return item + } + }) }]).first + }, }) Volcanos("onaction", {help: "交互数据", list: [], _init: function(can, cb, target) { - can.base.isFunc(cb) && cb() - }, - _menus: [["setting", chat.BLACK, chat.WHITE, chat.PRINT, "webpack", "devpack", "toimage"]], - _trans: { - "river": "菜单", - "search": "搜索", - "create": "创建", - "share": "共享", + can.base.isFunc(cb) && cb() + }, + _menus: [["setting", chat.BLACK, chat.WHITE, chat.PRINT, "webpack", "devpack", "toimage"]], + _trans: { + "river": "菜单", + "search": "搜索", + "create": "创建", + "share": "共享", - "setting": "设置", - "black": "黑色主题", - "white": "白色主题", - "print": "打印主题", - "toimage": "生成图片", + "setting": "设置", + "black": "黑色主题", + "white": "白色主题", + "print": "打印主题", + "toimage": "生成图片", - "shareuser": "共享用户", - "setnick": "设置昵称", - "language": "语言地区", - "chinese": "中文", - "clear": "清除背景", - }, - onmain: function(can, msg) { - function init() { can.run({}, [], function(msg) { - can.base.Copy(can.onaction._trans, can.base.Obj(msg.Option(chat.TRANS), {})) - can.onimport._init(can, msg, function(msg) { can.onengine.signal(can, chat.ONLOGIN, msg) }, can._output) + "shareuser": "共享用户", + "setnick": "设置昵称", + "language": "语言地区", + "chinese": "中文", + "clear": "清除背景", + }, + onmain: function(can, msg) { + function init() { can.run({}, [], function(msg) { + can.base.Copy(can.onaction._trans, can.base.Obj(msg.Option(chat.TRANS), {})) + can.onimport._init(can, msg, function(msg) { can.onengine.signal(can, chat.ONLOGIN, msg) }, can._output) - can.search({}, ["River.onmotion.toggle"]) - }) }; can.search({}, ["River.onmotion.hidden"]) - 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.search({}, ["River.onmotion.toggle"]) + }) }; can.search({}, ["River.onmotion.hidden"]) + 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.isLocalFile? init(): can.run({}, [chat.CHECK], function(msg) { - can.Conf(aaa.USERNICK, msg.Option(ice.MSG_USERNICK)||msg.Option(ice.MSG_USERNAME))? init(): - msg.Option(chat.SSO)? can.user.jumps(msg.Option(chat.SSO)): - can.user.login(can, init, msg.Option(aaa.LOGIN)) - }) - }, - onstorm_select: function(can, msg, river, storm) { can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm) }, - onsearchfocus: function(can) { - can.page.Select(can, can._output, "div.search input", function(target) { target.focus() }) - }, + // 登录检查 + can.user.isLocalFile? init(): can.run({}, [chat.CHECK], function(msg) { + can.Conf(aaa.USERNICK, msg.Option(ice.MSG_USERNICK)||msg.Option(ice.MSG_USERNAME))? init(): + msg.Option(chat.SSO)? can.user.jumps(msg.Option(chat.SSO)): + can.user.login(can, init, msg.Option(aaa.LOGIN)) + }) + }, + onstorm_select: function(can, msg, river, storm) { can.Conf(chat.RIVER, river), can.Conf(chat.STORM, storm) }, + onsearchfocus: function(can) { + can.page.Select(can, can._output, "div.search input", function(target) { target.focus() }) + }, - title: function(event, can) { - var args = {}; can.core.List([chat.TITLE, chat.TOPIC, chat.LAYOUT], function(key) { - var value = can.misc.Search(can, key); value && (args[key] = value) - }) - can.user.jumps(can.misc.MergeURL(can, args, true)) - }, - river: function(event, can) { can.onaction.River(can) }, + title: function(event, can) { + var args = {}; can.core.List([chat.TITLE, chat.TOPIC, chat.LAYOUT], function(key) { + var value = can.misc.Search(can, key); value && (args[key] = value) + }) + can.user.jumps(can.misc.MergeURL(can, args, true)) + }, + river: function(event, can) { can.onaction.River(can) }, - black: function(event, can, button) { can.onlayout.topic(can, button), can.onlayout._init(can) }, - white: function(event, can, button) { can.onlayout.topic(can, button), can.onlayout._init(can) }, - print: function(event, can, button) { can.onlayout.topic(can, can.base.join([chat.WHITE, button])) - can.set("River", html.HEIGHT, -1), can.set("Action", html.HEIGHT, -1) - }, - webpack: function(event, can) { - can.user.input(event, can, [{name: mdb.NAME, value: can.user.title()}], function(ev, button, meta, list) { - can.core.Item(Volcanos.meta.pack, function(key, msg) { - can.core.List(["_event", "_can", "_xhr", ice.MSG_SESSID, ""], function(key) { delete(msg[key]) }) - }) - var msg = can.request(event, { - name: meta.name, content: JSON.stringify(Volcanos.meta.pack), - river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM), - }) + black: function(event, can, button) { can.onlayout.topic(can, button), can.onlayout._init(can) }, + white: function(event, can, button) { can.onlayout.topic(can, button), can.onlayout._init(can) }, + print: function(event, can, button) { can.onlayout.topic(can, can.base.join([chat.WHITE, button])) + can.set("River", html.HEIGHT, -1), can.set("Action", html.HEIGHT, -1) + }, + webpack: function(event, can) { + can.user.input(event, can, [{name: mdb.NAME, value: can.user.title()}], function(ev, button, meta, list) { + can.core.Item(Volcanos.meta.pack, function(key, msg) { + can.core.List(["_event", "_can", "_xhr", ice.MSG_SESSID, ""], function(key) { delete(msg[key]) }) + }) + var msg = can.request(event, { + name: meta.name, content: JSON.stringify(Volcanos.meta.pack), + river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM), + }) - var toast = can.user.toast(can, "打包中...", code.WEBPACK, 1000000) - can.run(event, [code.WEBPACK], function(msg) { - toast.close(), can.user.toast(can, "打包成功", code.WEBPACK) - can.user.download(can, "/share/local/"+msg.Result(), name+".html") - }) - }) - }, - toimage: function(event, can, button) { can.onmotion.toimage(event, can, document.title, document.body) }, + var toast = can.user.toast(can, "打包中...", code.WEBPACK, 1000000) + can.run(event, [code.WEBPACK], function(msg) { + toast.close(), can.user.toast(can, "打包成功", code.WEBPACK) + can.user.download(can, "/share/local/"+msg.Result(), name+".html") + }) + }) + }, + toimage: function(event, can, button) { can.onmotion.toimage(event, can, document.title, document.body) }, - carte: function(event, can, list, cb, trans) { can.user.carte(event, can, can.onaction, list, cb) }, - share: function(event, can, args) { - can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE].concat(args||[], - [chat.RIVER, can.Conf(chat.RIVER), chat.STORM, can.Conf(chat.STORM)])) - }, + carte: function(event, can, list, cb, trans) { can.user.carte(event, can, can.onaction, list, cb) }, + share: function(event, can, args) { + can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE].concat(args||[], + [chat.RIVER, can.Conf(chat.RIVER), chat.STORM, can.Conf(chat.STORM)])) + }, - usernick: function(event, can) { - can.onaction.carte(event, can, ["shareuser", "setnick", [aaa.LANGUAGE, aaa.CHINESE, aaa.ENGLISH], cli.CLEAR, aaa.LOGOUT]) - }, - shareuser: function(event, can) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE, mdb.TYPE, aaa.LOGIN]) }, - setnick: function(event, can) { - var ui = can.user.input(event, can, [{name: aaa.USERNICK, value: can.Conf(aaa.USERNICK)}], function(ev, button, data, list, args) { - can.run(event, [aaa.USERNICK, list[0]], function(msg) { - can.page.Select(can, can._output, can.core.Keys(html.DIV, aaa.USERNICK), function(item) { - can.page.Modify(can, item, can.Conf(aaa.USERNICK, list[0])) - }), can.user.toastSuccess(can) - }, true) - }) - can.user.isMobile && can.page.Modify(can, ui._target, {style: {top: 40, right: 0, left: ""}}) - }, - chinese: function(event, can) { can.misc.Search(can, aaa.LANGUAGE, "zh") }, - english: function(event, can) { can.misc.Search(can, aaa.LANGUAGE, "en") }, - clear: function(event, can) { can.onimport.background(event, can, ""), can.onimport.avatar(event, can, ""), can.user.reload(true) }, - logout: function(event, can) { can.user.logout(can) }, + usernick: function(event, can) { + can.onaction.carte(event, can, ["shareuser", "setnick", [aaa.LANGUAGE, aaa.CHINESE, aaa.ENGLISH], cli.CLEAR, aaa.LOGOUT]) + }, + shareuser: function(event, can) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE, mdb.TYPE, aaa.LOGIN]) }, + setnick: function(event, can) { + var ui = can.user.input(event, can, [{name: aaa.USERNICK, value: can.Conf(aaa.USERNICK)}], function(ev, button, data, list, args) { + can.run(event, [aaa.USERNICK, list[0]], function(msg) { + can.page.Select(can, can._output, can.core.Keys(html.DIV, aaa.USERNICK), function(item) { + can.page.Modify(can, item, can.Conf(aaa.USERNICK, list[0])) + }), can.user.toastSuccess(can) + }, true) + }) + can.user.isMobile && can.page.Modify(can, ui._target, {style: {top: 40, right: 0, left: ""}}) + }, + chinese: function(event, can) { can.misc.Search(can, aaa.LANGUAGE, "zh") }, + english: function(event, can) { can.misc.Search(can, aaa.LANGUAGE, "en") }, + clear: function(event, can) { can.onimport.background(event, can, ""), can.onimport.avatar(event, can, ""), can.user.reload(true) }, + logout: function(event, can) { can.user.logout(can) }, - River: function(can) { can.search({}, ["River.onmotion.toggle"]) }, - Footer: function(can) { can.search({}, ["Footer.onmotion.toggle"]) }, + River: function(can) { can.search({}, ["River.onmotion.toggle"]) }, + Footer: function(can) { can.search({}, ["Footer.onmotion.toggle"]) }, }) Volcanos("onexport", {help: "导出数据", list: [], - height: function(can) { return can._target.offsetHeight }, - topic: function(can) { return can._topic }, + height: function(can) { return can._target.offsetHeight }, + topic: function(can) { return can._topic }, }) diff --git a/panel/river.js b/panel/river.js index 5e24e210..a7787efc 100644 --- a/panel/river.js +++ b/panel/river.js @@ -1,284 +1,283 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - if (msg.Option(ice.MSG_RIVER) == "_share") { return can.onmotion.hidden(can) } - can.onmotion.clear(can), can.river_list = {}, can.storm_list = {} + if (msg.Option(ice.MSG_RIVER) == "_share") { return can.onmotion.hidden(can) } + can.onmotion.clear(can), can.river_list = {}, can.storm_list = {} - can.onimport._main(can, msg), can.onimport._menu(can, msg) - var select; can.page.Append(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() - }, - _main: function(can, msg) { can._main_river = "project", can._main_storm = "studio" - if (can.user.isExtension) { var args = Volcanos.meta.args - can._main_river = args.river||"product", can._main_storm = args.storm||"chrome" - } - if (can.user.isMobile) { can._main_river = "product", can._main_storm = "office" } - if (can.user.isWeiXin) { can._main_river = "service", can._main_storm = "wx" } + can.onimport._main(can, msg), can.onimport._menu(can, msg) + var select; can.page.Append(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() + }, + _main: function(can, msg) { can._main_river = "project", can._main_storm = "studio" + if (can.user.isExtension) { var args = Volcanos.meta.args + can._main_river = args.river||"product", can._main_storm = args.storm||"chrome" + } + if (can.user.isMobile) { can._main_river = "product", can._main_storm = "office" } + if (can.user.isWeiXin) { can._main_river = "service", can._main_storm = "wx" } - can._main_title = can.misc.Search(can, chat.TITLE)||msg.Option(ice.MSG_TITLE)||Volcanos.meta.args.title||can.misc.Search(can, ice.POD)||can._main_title - can._main_river = can.misc.Search(can, chat.RIVER)||msg.Option(ice.MSG_RIVER)||Volcanos.meta.args.river||can._main_river - can._main_storm = can.misc.Search(can, chat.STORM)||msg.Option(ice.MSG_STORM)||Volcanos.meta.args.storm||can._main_storm - }, - _menu: function(can, msg) { if (can.user.mod.isPod) { return } - can.setHeaderMenu(can.base.Obj(msg.Option(chat.MENUS), can.Conf(chat.MENUS)||can.ondetail._menus), function(event, button) { - can.core.CallFunc([can.ondetail, button], [event, can, button, can.Conf(chat.RIVER), can.Conf(chat.STORM)]) - }) - }, - _carte: function(can, list, river, storm) { if (can.user.isMobile) { return } - if (can.core.Value(can._root, can.core.Keys(chat.RIVER, river))) { return } + can._main_title = can.misc.Search(can, chat.TITLE)||msg.Option(ice.MSG_TITLE)||Volcanos.meta.args.title||can.misc.Search(can, ice.POD)||can._main_title + can._main_river = can.misc.Search(can, chat.RIVER)||msg.Option(ice.MSG_RIVER)||Volcanos.meta.args.river||can._main_river + can._main_storm = can.misc.Search(can, chat.STORM)||msg.Option(ice.MSG_STORM)||Volcanos.meta.args.storm||can._main_storm + }, + _menu: function(can, msg) { if (can.user.mod.isPod) { return } + can.setHeaderMenu(can.base.Obj(msg.Option(chat.MENUS), can.Conf(chat.MENUS)||can.ondetail._menus), function(event, button) { + can.core.CallFunc([can.ondetail, button], [event, can, button, can.Conf(chat.RIVER), can.Conf(chat.STORM)]) + }) + }, + _carte: function(can, list, river, storm) { if (can.user.isMobile) { return } + if (can.core.Value(can._root, can.core.Keys(chat.RIVER, river))) { return } - can.onaction.carte(event, can, list, function(event, button, module) { - module[button](event, can, button, river, storm) - }) - }, - _river: function(can, meta, cb) { - return {text: [meta.name, html.DIV, html.ITEM], onclick: function(event) { - can.onaction.storm(event, can, meta.hash) + can.onaction.carte(event, can, list, function(event, button, module) { + module[button](event, can, button, river, storm) + }) + }, + _river: function(can, meta, cb) { + return {text: [meta.name, html.DIV, html.ITEM], onclick: function(event) { + can.onaction.storm(event, can, meta.hash) - }, onmouseenter: function(event) { - can.onimport._carte(can, can.ondetail.list, meta.hash) + }, onmouseenter: function(event) { + can.onimport._carte(can, can.ondetail.list, meta.hash) - }, _init: function(target) { cb(target) - can.river_list[meta.hash] = target - }} - }, - _storm: function(can, meta, river) { - return {text: [meta.name, html.DIV, html.ITEM], onclick: function(event) { - can.onaction.action(event, can, river, meta.hash) - can.user.title(can._main_title||meta.name) + }, _init: function(target) { cb(target) + can.river_list[meta.hash] = target + }} + }, + _storm: function(can, meta, river) { + return {text: [meta.name, html.DIV, html.ITEM], onclick: function(event) { + can.onaction.action(event, can, river, meta.hash) + can.user.title(can._main_title||meta.name) - }, onmouseenter: function(event) { - can.onimport._carte(can, can.ondetail.sublist, river, meta.hash) + }, onmouseenter: function(event) { + can.onimport._carte(can, can.ondetail.sublist, river, meta.hash) - }, _init: function(target) { - can.storm_list[can.core.Keys(river, meta.hash)] = target - }} - }, + }, _init: function(target) { + can.storm_list[can.core.Keys(river, meta.hash)] = target + }} + }, }) Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, can, msg, panel, cmds, cb) { - var list = can._root.river - cmds.length == 0 && can.core.Item(list, function(key, value) { - if (can.core.Item(value.storm).length == 0) { return } - msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name}) // 群组列表 - }); if (cmds.length != 1 && cmds[1] != chat.STORM) { return false } + var list = can._root.river + cmds.length == 0 && can.core.Item(list, function(key, value) { + if (can.core.Item(value.storm).length == 0) { return } + msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name}) // 群组列表 + }); if (cmds.length != 1 && cmds[1] != chat.STORM) { return false } - var river = list[cmds[0]]; if (!river) { return false } - can.core.Item(river.storm, function(key, value) { - msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name}) // 应用列表 - }), can.base.isFunc(cb) && cb(msg); return true - }, -}) + var river = list[cmds[0]]; if (!river) { return false } + can.core.Item(river.storm, function(key, value) { + msg.Push({hash: key, name: can.user.language(can) == "en"? key: value.name}) // 应用列表 + }), can.base.isFunc(cb) && cb(msg); return true +}}) Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, cb, target) { - can.onengine.plugin(can, "info", shy("信息", {}, ["text", "list", "back"], function(msg, cmds) { - msg.Echo(JSON.stringify(can)) - })) - can.onengine.plugin(can, "log", shy("日志", {}, ["text", "list", "back"], function(msg, cmds) { - console.log(cmds[0]) - msg.Option(ice.MSG_DISPLAY, "/plugin/story/pie.js") - })) - can.onengine.plugin(can, "pie", shy("比例图", {}, ["list", "back"], function(msg, cmds) { - msg.Option(ice.MSG_DISPLAY, "/plugin/story/pie.js") - msg.Push("value", 200) - msg.Push("value", 300) - msg.Push("value", 400) - })) - can.base.isFunc(cb) && cb() - }, - onlogin: function(can, msg) { - can.onappend._action(can, can.Conf(ctx.ACTION)||can.onaction.list) - can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) }) - }, - onsearch: function(can, msg, word) { - if (word[0] == "*" || word[0] == chat.STORM) { can.onexport.storm(can, msg, word) } - }, - onstorm_select: function(can, msg, river, storm) { var args = {river: river, storm: storm} - if (can.user.isExtension) { localStorage.setItem(ctx.ARGS, JSON.stringify(args)) } - }, - onaction_touch: function(can, msg) { - can.onmotion.float.del(can, chat.CARTE) - can.user.isMobile && can.onmotion.hidden(can) - }, - onaction_notool: function(can, msg, river, storm) { - can.ondetail["添加工具"](msg._event, can, "添加工具", river, storm) - }, + can.onengine.plugin(can, "info", shy("信息", {}, ["text", "list", "back"], function(msg, cmds) { + msg.Echo(JSON.stringify(can)) + })) + can.onengine.plugin(can, "log", shy("日志", {}, ["text", "list", "back"], function(msg, cmds) { + console.log(cmds[0]) + msg.Option(ice.MSG_DISPLAY, "/plugin/story/pie.js") + })) + can.onengine.plugin(can, "pie", shy("比例图", {}, ["list", "back"], function(msg, cmds) { + msg.Option(ice.MSG_DISPLAY, "/plugin/story/pie.js") + msg.Push("value", 200) + msg.Push("value", 300) + msg.Push("value", 400) + })) + can.base.isFunc(cb) && cb() + }, + onlogin: function(can, msg) { + can.onappend._action(can, can.Conf(ctx.ACTION)||can.onaction.list) + can.run({}, [], function(msg) { can.onimport._init(can, msg, [], null, can._output) }) + }, + onsearch: function(can, msg, word) { + if (word[0] == "*" || word[0] == chat.STORM) { can.onexport.storm(can, msg, word) } + }, + onstorm_select: function(can, msg, river, storm) { var args = {river: river, storm: storm} + if (can.user.isExtension) { localStorage.setItem(ctx.ARGS, JSON.stringify(args)) } + }, + onaction_touch: function(can, msg) { + can.onmotion.float.del(can, chat.CARTE) + can.user.isMobile && can.onmotion.hidden(can) + }, + onaction_notool: function(can, msg, river, storm) { + can.ondetail["添加工具"](msg._event, can, "添加工具", river, storm) + }, - carte: function(event, can, list, cb) { - can.user.carteRight(event, can, can.ondetail, list, cb) - }, - storm: function(event, can, river) { can.sublist = can.sublist||{} - can.onmotion.select(can, can._output, "div.item", can.river_list[river]) - var list = can.sublist[river]; if (list) { return can.onmotion.toggle(can, list) } + carte: function(event, can, list, cb) { + can.user.carteRight(event, can, can.ondetail, list, cb) + }, + storm: function(event, can, river) { can.sublist = can.sublist||{} + can.onmotion.select(can, can._output, "div.item", can.river_list[river]) + var list = can.sublist[river]; if (list) { return can.onmotion.toggle(can, list) } - can.run({}, [river, chat.STORM], function(msg) { - var select = 0; list = can.page.Append(can, can._output, [{view: html.LIST, list: msg.Table(function(item, index) { - river == can._main_river && item.hash == can._main_storm && (select = index) - return can.onimport._storm(can, item, river) - }) }]).first, list.children.length > 0 && list.children[select].click() + can.run({}, [river, chat.STORM], function(msg) { + var select = 0; list = can.page.Append(can, can._output, [{view: html.LIST, list: msg.Table(function(item, index) { + river == can._main_river && item.hash == can._main_storm && (select = index) + return can.onimport._storm(can, item, river) + }) }]).first, list.children.length > 0 && list.children[select].click() - event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling) - can.sublist[river] = list - }) - }, - action: function(event, can, river, storm) { - can.page.Modify(can, can.sublist[river], {style: {display: html.BLOCK}}) - can.onmotion.select(can, can._output, "div.item", can.river_list[river]) - can.onmotion.select(can, can._output, "div.list div.item", can.storm_list[can.core.Keys(river, storm)]) + event.target.nextSibling && can._output.insertBefore(list, event.target.nextSibling) + can.sublist[river] = list + }) + }, + action: function(event, can, river, storm) { + can.page.Modify(can, can.sublist[river], {style: {display: html.BLOCK}}) + can.onmotion.select(can, can._output, "div.item", can.river_list[river]) + can.onmotion.select(can, can._output, "div.list div.item", can.storm_list[can.core.Keys(river, storm)]) - can.onengine.signal(can, "onstorm_select", can.request(event, { - river: can.Conf(chat.RIVER, river), storm: can.Conf(chat.STORM, storm), - })) - }, + can.onengine.signal(can, "onstorm_select", can.request(event, { + river: can.Conf(chat.RIVER, river), storm: can.Conf(chat.STORM, storm), + })) + }, - create: function(event, can) { - can.user.trans(can, {"public": "公开群", "protected": "内部群", "private": "私有群"}) - can.user.input(event, can, [ - {name: mdb.TYPE, values: [chat.PUBLIC, chat.PROTECTED, chat.PRIVATE], _trans: "类型"}, - {name: mdb.NAME, value: "hi", _trans: "群名"}, {name: mdb.TEXT, value: "hello", _trans: "简介"}, - ], function(event, button, meta, list, args) { - can.run(event, [ctx.ACTION, mdb.CREATE].concat(args), function(msg) { - can.misc.Search(can, {river: msg.Result()}) - }) - }) - }, - refresh: function(event, can) { - var args = {river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM), - topic: can.getHeader(chat.TOPIC), layout: can.getAction(chat.LAYOUT), - } - if (can.user.isExtension) { localStorage.setItem(ctx.ARGS, JSON.stringify(args)) } - can.misc.Search(can, args) - }, + create: function(event, can) { + can.user.trans(can, {"public": "公开群", "protected": "内部群", "private": "私有群"}) + can.user.input(event, can, [ + {name: mdb.TYPE, values: [chat.PUBLIC, chat.PROTECTED, chat.PRIVATE], _trans: "类型"}, + {name: mdb.NAME, value: "hi", _trans: "群名"}, {name: mdb.TEXT, value: "hello", _trans: "简介"}, + ], function(event, button, meta, list, args) { + can.run(event, [ctx.ACTION, mdb.CREATE].concat(args), function(msg) { + can.misc.Search(can, {river: msg.Result()}) + }) + }) + }, + refresh: function(event, can) { + var args = {river: can.Conf(chat.RIVER), storm: can.Conf(chat.STORM), + topic: can.getHeader(chat.TOPIC), layout: can.getAction(chat.LAYOUT), + } + if (can.user.isExtension) { localStorage.setItem(ctx.ARGS, JSON.stringify(args)) } + can.misc.Search(can, args) + }, }) Volcanos("ondetail", {help: "菜单交互", - list: ["共享群组", "添加应用", "添加设备", "添加用户", "重命名群组", "删除群组"], - sublist: ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], - _menus: [ - ["create", "创建群组", "添加应用", "添加工具", "添加设备", "创建空间"], - ["share", "共享群组", "共享应用", "共享工具", "共享主机", "访问空间"], - ], + list: ["共享群组", "添加应用", "添加设备", "添加用户", "重命名群组", "删除群组"], + sublist: ["共享应用", "添加工具", "保存参数", "重命名应用", "删除应用"], + _menus: [ + ["create", "创建群组", "添加应用", "添加工具", "添加设备", "创建空间"], + ["share", "共享群组", "共享应用", "共享工具", "共享主机", "访问空间"], + ], - "创建群组": function(event, can) { can.onaction.create(event, can) }, - "共享群组": function(event, can, button, river) { - can.onmotion.share(event, can, [{name: chat.TITLE, value: river}], [mdb.TYPE, chat.RIVER]) - }, - "添加应用": function(event, can, button, river) { can.ondetail.create(event, can, button, river) }, - "共享应用": function(event, can, button, river, storm) { - can.onmotion.share(event, can, [{name: chat.TITLE, value: storm}], [mdb.TYPE, chat.STORM]) - }, - "添加工具": function(event, can, button, river, storm) { - can.user.select(event, can, ctx.COMMAND, "context,command", function(item, next) { - can.run({}, [river, chat.STORM, ctx.ACTION, mdb.INSERT, mdb.HASH, storm].concat([ice.POD, "", ice.CTX, item[0], ice.CMD, item[1]]), function(msg) { - next() - }) - }, function() { - can.misc.Search(can, {river: river, storm: storm}) - }) - }, - "共享工具": function(event, can, button, river, storm) { - can.user.select(event, can, mdb.PLUGIN, "name,context,command,argument", function(item, next) { - can.user.share(can, can.request(event), [river, ctx.ACTION, chat.SHARE, mdb.TYPE, chat.FIELD, - mdb.NAME, item[2], mdb.TEXT, item[3], chat.TITLE, item[0], chat.RIVER, river, chat.STORM, storm, - ]) - }) - }, + "创建群组": function(event, can) { can.onaction.create(event, can) }, + "共享群组": function(event, can, button, river) { + can.onmotion.share(event, can, [{name: chat.TITLE, value: river}], [mdb.TYPE, chat.RIVER]) + }, + "添加应用": function(event, can, button, river) { can.ondetail.create(event, can, button, river) }, + "共享应用": function(event, can, button, river, storm) { + can.onmotion.share(event, can, [{name: chat.TITLE, value: storm}], [mdb.TYPE, chat.STORM]) + }, + "添加工具": function(event, can, button, river, storm) { + can.user.select(event, can, ctx.COMMAND, "context,command", function(item, next) { + can.run({}, [river, chat.STORM, ctx.ACTION, mdb.INSERT, mdb.HASH, storm].concat([ice.POD, "", ice.CTX, item[0], ice.CMD, item[1]]), function(msg) { + next() + }) + }, function() { + can.misc.Search(can, {river: river, storm: storm}) + }) + }, + "共享工具": function(event, can, button, river, storm) { + can.user.select(event, can, mdb.PLUGIN, "name,context,command,argument", function(item, next) { + can.user.share(can, can.request(event), [river, ctx.ACTION, chat.SHARE, mdb.TYPE, chat.FIELD, + mdb.NAME, item[2], mdb.TEXT, item[3], chat.TITLE, item[0], chat.RIVER, river, chat.STORM, storm, + ]) + }) + }, - "添加设备": function(event, can, button, river) { - can.user.select(event, can, web.SPACE, "type,name,text", function(item, next) { - can.run({}, [river, chat.NODE, ctx.ACTION, mdb.INSERT, mdb.TYPE, item[0], mdb.NAME, item[1]], function(msg) { - next() - }) - }) - }, - "共享主机": function(event, can, button, river, storm) { - can.run(event, [ctx.ACTION, aaa.INVITE], function(msg) { - can.user.toast(can, { - title: "共享主机", duration: -1, width: -300, - content: msg.Result(), action: [cli.CLOSE], - }) - }) - }, - "创建空间": function(event, can, button, river, storm) { can.request(event, {action: button}) - can.user.input(event, can, [{name: "name", value: "hi"}, {name: "repos"}, {name: "template"}], function(event, button, data, list, args) { - can.run(event, [ctx.ACTION, cli.START].concat(args, chat.RIVER, river), function(msg) { - var link = can.misc.MergeURL(can, {_path: "/chat/pod/"+can.core.Keys(can.misc.Search(can, ice.POD), msg.Option(mdb.NAME))}) - can.user.toast(can, link), can.user.open(link) - }) - }) - }, - "访问空间": function(event, can, button, river, storm) { - can.user.select({river: river}, can, web.SPACE, "time,type,name,text") - }, + "添加设备": function(event, can, button, river) { + can.user.select(event, can, web.SPACE, "type,name,text", function(item, next) { + can.run({}, [river, chat.NODE, ctx.ACTION, mdb.INSERT, mdb.TYPE, item[0], mdb.NAME, item[1]], function(msg) { + next() + }) + }) + }, + "共享主机": function(event, can, button, river, storm) { + can.run(event, [ctx.ACTION, aaa.INVITE], function(msg) { + can.user.toast(can, { + title: "共享主机", duration: -1, width: -300, + content: msg.Result(), action: [cli.CLOSE], + }) + }) + }, + "创建空间": function(event, can, button, river, storm) { can.request(event, {action: button}) + can.user.input(event, can, [{name: "name", value: "hi"}, {name: "repos"}, {name: "template"}], function(event, button, data, list, args) { + can.run(event, [ctx.ACTION, cli.START].concat(args, chat.RIVER, river), function(msg) { + var link = can.misc.MergeURL(can, {_path: "/chat/pod/"+can.core.Keys(can.misc.Search(can, ice.POD), msg.Option(mdb.NAME))}) + can.user.toast(can, link), can.user.open(link) + }) + }) + }, + "访问空间": function(event, can, button, river, storm) { + can.user.select({river: river}, can, web.SPACE, "time,type,name,text") + }, - "添加用户": function(event, can, button, river) { - can.user.select(event, can, chat.USER, "usernick,username", function(item, next) { - can.run({}, [river, chat.USER, ctx.ACTION, mdb.INSERT, aaa.USERNAME, item[0]], function(msg) { - next() - }) - }) - }, - "重命名群组": function(event, can, button, river) { - can.user.input(event, can, [mdb.NAME], function(event, button, meta, list) { - can.run(can.request(event, {hash: river})._event, [ctx.ACTION, mdb.MODIFY, mdb.NAME, meta.name], function(msg) { - can.misc.Search(can, {river: river}) - }) - }) - }, - "删除群组": function(event, can, button, river) { - can.run(can.request(event, {hash: river})._event, [ctx.ACTION, mdb.REMOVE], function(msg) { can.misc.Search(can, {}) }) - }, + "添加用户": function(event, can, button, river) { + can.user.select(event, can, chat.USER, "usernick,username", function(item, next) { + can.run({}, [river, chat.USER, ctx.ACTION, mdb.INSERT, aaa.USERNAME, item[0]], function(msg) { + next() + }) + }) + }, + "重命名群组": function(event, can, button, river) { + can.user.input(event, can, [mdb.NAME], function(event, button, meta, list) { + can.run(can.request(event, {hash: river})._event, [ctx.ACTION, mdb.MODIFY, mdb.NAME, meta.name], function(msg) { + can.misc.Search(can, {river: river}) + }) + }) + }, + "删除群组": function(event, can, button, river) { + can.run(can.request(event, {hash: river})._event, [ctx.ACTION, mdb.REMOVE], function(msg) { can.misc.Search(can, {}) }) + }, - "保存参数": function(event, can, button, river, storm) { - can.getAction(ctx.ARGS, function(item, next, index, array) { var msg = can.request({}, {hash: storm, id: item.dataset.id}) - var toast = can.user.toast(can, (index+1)+ice.PS+array.length, button, 10000, (index+1)*100/array.length) - can.run(msg._event, [river, chat.STORM, ctx.ACTION, mdb.MODIFY, ice.ARG, item.dataset.args], function(msg) { - can.core.Timer(200, function() { - toast.close(), next(), index == array.length-1 && can.user.toastSuccess(can, button) - }) - }) - }) - }, - "重命名应用": function(event, can, button, river, storm) { - can.user.input(event, can, [mdb.NAME], function(ev, button, meta, list, args) { - can.run(can.request(event, {hash: storm})._event, [river, chat.STORM, ctx.ACTION, mdb.MODIFY].concat(args), function(msg) { - can.misc.Search(can, {river: river, storm: storm}) - }) - }) - }, - "删除应用": function(event, can, button, river, storm) { - can.run(can.request(event, {hash: storm})._event, [river, chat.STORM, ctx.ACTION, mdb.REMOVE], function(msg) { - can.misc.Search(can, {river: river}) - }) - }, + "保存参数": function(event, can, button, river, storm) { + can.getAction(ctx.ARGS, function(item, next, index, array) { var msg = can.request({}, {hash: storm, id: item.dataset.id}) + var toast = can.user.toast(can, (index+1)+ice.PS+array.length, button, 10000, (index+1)*100/array.length) + can.run(msg._event, [river, chat.STORM, ctx.ACTION, mdb.MODIFY, ice.ARG, item.dataset.args], function(msg) { + can.core.Timer(200, function() { + toast.close(), next(), index == array.length-1 && can.user.toastSuccess(can, button) + }) + }) + }) + }, + "重命名应用": function(event, can, button, river, storm) { + can.user.input(event, can, [mdb.NAME], function(ev, button, meta, list, args) { + can.run(can.request(event, {hash: storm})._event, [river, chat.STORM, ctx.ACTION, mdb.MODIFY].concat(args), function(msg) { + can.misc.Search(can, {river: river, storm: storm}) + }) + }) + }, + "删除应用": function(event, can, button, river, storm) { + can.run(can.request(event, {hash: storm})._event, [river, chat.STORM, ctx.ACTION, mdb.REMOVE], function(msg) { + can.misc.Search(can, {river: river}) + }) + }, - create: function(event, can, button, river) { - can.user.trans(can, {"public": "公开应用", "protected": "群组应用", "private": "个人应用"}) - can.user.input(event, can, [ - {name: mdb.TYPE, values: [chat.PUBLIC, chat.PROTECTED, chat.PRIVATE], _trans: "类型"}, - {name: mdb.NAME, value: "hi", _trans: "名称"}, {name: mdb.TEXT, value: "hello", _trans: "简介"}, - ], function(event, button, meta, list, args) { - can.run({}, [river, chat.STORM, ctx.ACTION, mdb.CREATE].concat(args), function(msg) { - can.misc.Search(can, {river: river, storm: msg.Result()}) - }) - }) - }, + create: function(event, can, button, river) { + can.user.trans(can, {"public": "公开应用", "protected": "群组应用", "private": "个人应用"}) + can.user.input(event, can, [ + {name: mdb.TYPE, values: [chat.PUBLIC, chat.PROTECTED, chat.PRIVATE], _trans: "类型"}, + {name: mdb.NAME, value: "hi", _trans: "名称"}, {name: mdb.TEXT, value: "hello", _trans: "简介"}, + ], function(event, button, meta, list, args) { + can.run({}, [river, chat.STORM, ctx.ACTION, mdb.CREATE].concat(args), function(msg) { + can.misc.Search(can, {river: river, storm: msg.Result()}) + }) + }) + }, }) Volcanos("onexport", {help: "导出数据", list: [], - width: function(can) { return can._target.offsetWidth }, - storm: function(can, msg, word) { - var fields = (msg.Option(ice.MSG_FIELDS)||"ctx,cmd,type,name,text").split(",") - can.core.Item(can._root.river, function(river, value) { - can.core.Item(value.storm, function(storm, item) { - if (word[1] != "" && word[1] != storm && word[1] != item.name) { return } + width: function(can) { return can._target.offsetWidth }, + storm: function(can, msg, word) { + var fields = (msg.Option(ice.MSG_FIELDS)||"ctx,cmd,type,name,text").split(",") + can.core.Item(can._root.river, function(river, value) { + can.core.Item(value.storm, function(storm, item) { + if (word[1] != "" && word[1] != storm && word[1] != item.name) { return } - var data = {ctx: "web.chat", cmd: chat.STORM, - type: river, name: storm, text: shy("跳转", function(event) { - can.onaction.action(event, can, river, storm) - }), - }; can.core.List(fields, function(key) { msg.Push(key, data[key]||"") }) - }) - }) - }, + var data = {ctx: "web.chat", cmd: chat.STORM, + type: river, name: storm, text: shy("跳转", function(event) { + can.onaction.action(event, can, river, storm) + }), + }; can.core.List(fields, function(key) { msg.Push(key, data[key]||"") }) + }) + }) + }, }) diff --git a/panel/search.js b/panel/search.js index 1de1689c..5fca44ca 100644 --- a/panel/search.js +++ b/panel/search.js @@ -1,117 +1,118 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.list = msg.Table(), can.onmotion.clear(can, can.ui.content) - var table = can.onappend.table(can, msg, function(value, key, index, line, array) { can.Status(mdb.TOTAL, index+1) - return {text: [key == mdb.TEXT && can.base.isFunc(line.text) && line.text.help || value, html.TD], onclick: function(event) { - can.onaction[can.type == "*"||event.ctrlKey? chat.PLUGIN: mdb.SELECT](event, can, index) - }} - }, can.ui.content, can.core.List((msg.Option("sort")||"ctx,cmd,type,name,text").split(ice.FS), function(item) { - return list.indexOf(item) - })); table && can.page.Modify(can, can.ui.display, {style: {width: table.offsetWidth}}) + can.list = msg.Table(), can.onmotion.clear(can, can.ui.content) + var table = can.onappend.table(can, msg, function(value, key, index, line, array) { can.Status(mdb.TOTAL, index+1) + return {text: [key == mdb.TEXT && can.base.isFunc(line.text) && line.text.help || value, html.TD], onclick: function(event) { + can.onaction[can.type == "*"||event.ctrlKey? chat.PLUGIN: mdb.SELECT](event, can, index) + }} + }, can.ui.content, can.core.List((msg.Option("sort")||"ctx,cmd,type,name,text").split(ice.FS), function(item) { + return list.indexOf(item) + })); table && can.page.Modify(can, can.ui.display, {style: {width: table.offsetWidth}}) - can.onappend._status(can, can.base.Obj(msg.Option("_status"), []).concat({name: "selected", value: "0"})) - can.getActionSize(function(msg, height) { - can.page.Modify(can, can.ui.profile, kit.Dict(html.MAX_HEIGHT, height-(table&&table.offsetHeight||0))) - }) - msg.Length() == 1 && can.page.Select(can, table, html.TD)[0].click() - }, - _word: function(can, msg, cmds, fields) { can.type = cmds[0] - var cb = can.onaction[cmds[1]]; if (cb) { cb({}, can); return } + can.onappend._status(can, can.base.Obj(msg.Option("_status"), []).concat({name: "selected", value: "0"})) + can.getActionSize(function(msg, height) { + can.page.Modify(can, can.ui.profile, kit.Dict(html.MAX_HEIGHT, height-(table&&table.offsetHeight||0))) + }) + msg.Length() == 1 && can.page.Select(can, table, html.TD)[0].click() + }, + _word: function(can, msg, cmds, fields) { can.type = cmds[0] + var cb = can.onaction[cmds[1]]; if (cb) { cb({}, can); return } - var res = can.request({}, { - word: cmds, fields: fields.join(ice.FS), sort: msg.Option("sort"), - river: msg.Option(chat.RIVER), index: msg.Option("index"), - }) + var res = can.request({}, { + word: cmds, fields: fields.join(ice.FS), sort: msg.Option("sort"), + river: msg.Option(chat.RIVER), index: msg.Option("index"), + }) - can.onengine.signal(can, chat.ONSEARCH, res) - can.run(res._event, cmds, function(res) { can.onimport._init(can, res, fields) }) - can.onmotion.show(can), can.onmotion.focus(can, can.ui.word) - }, + can.onengine.signal(can, chat.ONSEARCH, res) + can.run(res._event, cmds, function(res) { can.onimport._init(can, res, fields) }) + can.onmotion.show(can), can.onmotion.focus(can, can.ui.word) + }, - select: function(can, msg, cmds, cb) { can.ui.word.value = cmds[1] - var fields = (cmds[2]||msg.Option(ice.MSG_FIELDS)||"ctx,cmd,type,name,text").split(ice.FS) - can.page.Appends(can, can.ui.display, [{th: fields}]), can.cb = function() { - can.base.isFunc(cb) && cb(can.onexport.select(can)), can.onmotion.hide(can) - } + select: function(can, msg, cmds, cb) { can.ui.word.value = cmds[1] + var fields = (cmds[2]||msg.Option(ice.MSG_FIELDS)||"ctx,cmd,type,name,text").split(ice.FS) + can.page.Appends(can, can.ui.display, [{th: fields}]), can.cb = function() { + can.base.isFunc(cb) && cb(can.onexport.select(can)), can.onmotion.hide(can) + } - can.input = function(event, word) { cmds[1] = word||cmds[1] - can.onimport._word(can, msg, cmds, fields) - }, can.onimport._word(can, msg, cmds, fields) + can.input = function(event, word) { cmds[1] = word||cmds[1] + can.onimport._word(can, msg, cmds, fields) + }, can.onimport._word(can, msg, cmds, fields) - can.getActionSize(function(msg, top, left, width, height) { - can.page.Modify(can, can._target, {style: {top: top, left: left}}) - can.page.Modify(can, can._output, {style: kit.Dict(html.MAX_HEIGHT, height-71, html.MAX_WIDTH, width)}) - }) - }, + can.getActionSize(function(msg, top, left, width, height) { + can.page.Modify(can, can._target, {style: {top: top, left: left}}) + can.page.Modify(can, can._output, {style: kit.Dict(html.MAX_HEIGHT, height-71, html.MAX_WIDTH, width)}) + }) + }, }) Volcanos("onaction", {help: "交互操作", list: [cli.CLEAR, cli.CLOSE, cli.DONE], _init: function(can, cb, target) { - can.base.isFunc(cb) && cb() - }, - onlogin: function(can, msg) { - can.onappend._action(can, can.Conf(html.ACTION)||can.onaction.list) - can.ui = can.page.Append(can, can._output, [ - {input: ["word", function(event) { can.onkeymap.input(event, can) - if (event.key == lang.ESCAPE) { can.onmotion.hide(can) } + can.onmotion.hidden(can, can._target) + can.base.isFunc(cb) && cb() + }, + onlogin: function(can, msg) { + can.onappend._action(can, can.Conf(html.ACTION)||can.onaction.list) + can.ui = can.page.Append(can, can._output, [ + {input: ["word", function(event) { can.onkeymap.input(event, can) + if (event.key == lang.ESCAPE) { can.onmotion.hide(can) } - if (event.key == lang.ENTER) { can.onkeymap.prevent(event) - if (event.shiftKey) { var first = can.page.Select(can, can.ui.content, html.TR)[1] - return can.onaction[can.type == "*"? chat.PLUGIN: html.SELECT](event, can, first.dataset.index) - } - if (event.ctrlKey) { return can.onaction[cli.DONE](event, can) } - can.input(event, event.target.value) - } - can.page.Select(can, can.ui.content, html.TR, function(tr, index) { - if (index == 0) { return } - var has = false; can.page.Select(can, tr, html.TD, function(td) { - has = has || td.innerText.indexOf(event.target.value) > -1 - }) - can.page.ClassList.set(can, tr, html.HIDDEN, !has) - }) - }]}, - {view: chat.CONTENT}, {view: html.STATUS}, {view: [chat.DISPLAY, html.TABLE]},{view: chat.PROFILE}, - ]), can.page.ClassList.add(can, can.ui.display, chat.CONTENT) - }, - onopensearch: function(can, msg, type, word) { can.onimport.select(can, msg, [type||"*", word||""]) }, + if (event.key == lang.ENTER) { can.onkeymap.prevent(event) + if (event.shiftKey) { var first = can.page.Select(can, can.ui.content, html.TR)[1] + return can.onaction[can.type == "*"? chat.PLUGIN: html.SELECT](event, can, first.dataset.index) + } + if (event.ctrlKey) { return can.onaction[cli.DONE](event, can) } + can.input(event, event.target.value) + } + can.page.Select(can, can.ui.content, html.TR, function(tr, index) { + if (index == 0) { return } + var has = false; can.page.Select(can, tr, html.TD, function(td) { + has = has || td.innerText.indexOf(event.target.value) > -1 + }) + can.page.ClassList.set(can, tr, html.HIDDEN, !has) + }) + }]}, + {view: chat.CONTENT}, {view: html.STATUS}, {view: [chat.DISPLAY, html.TABLE]},{view: chat.PROFILE}, + ]), can.page.ClassList.add(can, can.ui.display, chat.CONTENT) + }, + onopensearch: function(can, msg, type, word) { can.onimport.select(can, msg, [type||"*", word||""]) }, - clear: function(event, can) { can.onmotion.clear(can, can.ui.profile) }, - done: function(event, can) { can.base.isFunc(can.cb) && can.cb() }, - close: function(event, can) { can.onmotion.hide(can) }, + clear: function(event, can) { can.onmotion.clear(can, can.ui.profile) }, + done: function(event, can) { can.base.isFunc(can.cb) && can.cb() }, + close: function(event, can) { can.onmotion.hide(can) }, - select: function(event, can, index) { var line = can.list[index] - if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) } + select: function(event, can, index) { var line = can.list[index] + if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) } - if (line.ctx == "web.chat" && line.cmd == "/search") { - return can.onimport.select(can, msg, [line.type, line.name, line.text], can.cb) - } + if (line.ctx == "web.chat" && line.cmd == "/search") { + return can.onimport.select(can, msg, [line.type, line.name, line.text], can.cb) + } - var fields = can.page.Select(can, can.ui.display, html.TH, function(item) { return item.innerText }) - can.page.Append(can, can.ui.display, [{td: can.core.List(fields, function(item) { - return line[item] - }), data: {index: index}, onclick: function(event) { can.page.Remove(can, event.target.parentNode) - can.Status("selected", can.page.Select(can, can.ui.display, html.TR).length-1) - }}]), can.Status("selected", can.page.Select(can, can.ui.display, html.TR).length-1) - }, + var fields = can.page.Select(can, can.ui.display, html.TH, function(item) { return item.innerText }) + can.page.Append(can, can.ui.display, [{td: can.core.List(fields, function(item) { + return line[item] + }), data: {index: index}, onclick: function(event) { can.page.Remove(can, event.target.parentNode) + can.Status("selected", can.page.Select(can, can.ui.display, html.TR).length-1) + }}]), can.Status("selected", can.page.Select(can, can.ui.display, html.TR).length-1) + }, - plugin: function(event, can, index) { var line = can.list[index] - if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) } + plugin: function(event, can, index) { var line = can.list[index] + if (can.base.isFunc(line.text)) { return can.onmotion.hide(can), line.text(event) } - var cmd = line.cmd == ctx.COMMAND? can.core.Keys(line.type, line.name.split(ice.SP)[0]): can.core.Keys(line.ctx, line.cmd) - can.onappend.plugin(can, {type: chat.PLUGIN, index: cmd||msg.Option(mdb.INDEX)}, function(sub, meta) { - can.getActionSize(function(msg, height, width) { height -= can.ui.content.offsetHeight+204 - can.page.Modify(can, sub._output, {style: kit.Dict(html.MAX_HEIGHT, height-26, html.MAX_WIDTH, width-40)}) - sub.Conf(html.HEIGHT, height+28), sub.Conf(html.WIDTH, width-60) - }) + var cmd = line.cmd == ctx.COMMAND? can.core.Keys(line.type, line.name.split(ice.SP)[0]): can.core.Keys(line.ctx, line.cmd) + can.onappend.plugin(can, {type: chat.PLUGIN, index: cmd||msg.Option(mdb.INDEX)}, function(sub, meta) { + can.getActionSize(function(msg, height, width) { height -= can.ui.content.offsetHeight+204 + can.page.Modify(can, sub._output, {style: kit.Dict(html.MAX_HEIGHT, height-26, html.MAX_WIDTH, width-40)}) + sub.Conf(html.HEIGHT, height+28), sub.Conf(html.WIDTH, width-60) + }) - sub.run = function(event, cmds, cb) { var msg = can.request(event) - can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true) - } - }, can.ui.profile) - }, + sub.run = function(event, cmds, cb) { var msg = can.request(event) + can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true) + } + }, can.ui.profile) + }, }) Volcanos("onexport", {help: "导出数据", list: [], - select: function(can) { - return can.page.Select(can, can.ui.display, html.TR, function(tr) { - return can.page.Select(can, tr, html.TD, function(td) { return td.innerHTML }) - }).slice(1) - }, + select: function(can) { + return can.page.Select(can, can.ui.display, html.TR, function(tr) { + return can.page.Select(can, tr, html.TD, function(td) { return td.innerHTML }) + }).slice(1) + }, }) diff --git a/plugin/input.js b/plugin/input.js index c67f8cbf..7023e2ed 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -1,37 +1,36 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, list, cb, target) { - can.base.isFunc(cb) && cb(); switch (meta.type) { - case html.SELECT: meta.value && (target.value = meta.value); break - case html.BUTTON: meta.action == ice.AUTO && target.click(); break - } - }, + can.base.isFunc(cb) && cb(); switch (meta.type) { + case html.SELECT: meta.value && (target.value = meta.value); break + case html.BUTTON: meta.action == ice.AUTO && target.click(); break + } + }, + run: function(event, can) { + var title = can.sup._name+ice.SP+can.sup.Input([], true) + var toast = can.user.toast(can, "执行中...", title, -1) + can.run(event, [], function() { toast.close(), can.user.toastSuccess(can) }) + }, + list: function(event, can) { can.run(event) }, + back: function(event, can) { can.sup.onimport._back(can.sup) }, + refresh: function(event, can) { can.run(event) }, - run: function(event, can) { - var title = can.sup._name+ice.SP+can.sup.Input([], true) - var toast = can.user.toast(can, "执行中...", title, -1) - can.run(event, [], function() { toast.close(), can.user.toastSuccess(can) }) - }, - list: function(event, can) { can.run(event) }, - back: function(event, can) { can.sup.onimport._back(can.sup) }, - refresh: function(event, can) { can.run(event) }, + onclick: function(event, can) { + if (can.Conf(mdb.TYPE) == html.BUTTON) { can.run(event, [ctx.ACTION, can.Conf(mdb.NAME)].concat(can.sup.Input())) } + }, + onchange: function(event, can) { + if (can.Conf(mdb.TYPE) == html.SELECT) { can.run(event) } + }, + onkeydown: function(event, can) { can.onkeymap.input(event, can, event.target) + if (can.Conf(mdb.TYPE) == html.TEXTAREA) { if (!event.ctrlKey) { return } } + if (event.key == lang.ENTER) { + can.run(event), can.onmotion.focus(can, event.target) + can.onkeymap.prevent(event) + } if (!event.ctrlKey) { return } - onclick: function(event, can) { - if (can.Conf(mdb.TYPE) == html.BUTTON) { can.run(event, [ctx.ACTION, can.Conf(mdb.NAME)].concat(can.sup.Input())) } - }, - onchange: function(event, can) { - if (can.Conf(mdb.TYPE) == html.SELECT) { can.run(event) } - }, - onkeydown: function(event, can) { can.onkeymap.input(event, can, event.target) - if (can.Conf(mdb.TYPE) == html.TEXTAREA) { if (!event.ctrlKey) { return } } - if (event.key == lang.ENTER) { - can.run(event), can.onmotion.focus(can, event.target) - can.onkeymap.prevent(event) - } if (!event.ctrlKey) { return } - - switch (event.key) { - case "b": can.CloneInput(); break - case "m": can.CloneField(); break - default: return - } can.onkeymap.prevent(event) - }, + switch (event.key) { + case "b": can.CloneInput(); break + case "m": can.CloneField(); break + default: return + } can.onkeymap.prevent(event) + }, }) diff --git a/plugin/input/date.js b/plugin/input/date.js index a2617c21..c735d9ef 100644 --- a/plugin/input/date.js +++ b/plugin/input/date.js @@ -1,60 +1,60 @@ Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(event, can, meta, cb, target) { cb(function(can, cbs) { - function set(now) { target.value = can.user.time(can, now), can.close(), meta && meta.action == ice.AUTO && can.run({}) } + function set(now) { target.value = can.user.time(can, now), can.close(), meta && meta.action == ice.AUTO && can.run({}) } - // 添加控件 - var now = target.value? new Date(target.value): new Date() - can.onmotion.clear(can, can._action), can.onappend._action(can, [cli.CLOSE, - ["hour"].concat(can.core.List(24)), ["minute"].concat(can.core.List(0, 60, 5)), ["second"].concat(can.core.List(0, 60, 5)), - "今天", "", "上一月", ["year"].concat(can.core.List(now.getFullYear() - 10, now.getFullYear() + 10)), - ["month"].concat(can.core.List(1, 13)), "下一月", - ], can._action, { close: function(event) { can.close() }, - "hour": function(event, can, key, value) { now.setHours(parseInt(value)||0), show(now) }, - "minute": function(event, can, key, value) { now.setMinutes(parseInt(value)||0), show(now) }, - "second": function(event, can, key, value) { now.setSeconds(parseInt(value)||0), show(now) }, - "今天": function(event) { now = new Date(), set(show(now)) }, + // 添加控件 + var now = target.value? new Date(target.value): new Date() + can.onmotion.clear(can, can._action), can.onappend._action(can, [cli.CLOSE, + ["hour"].concat(can.core.List(24)), ["minute"].concat(can.core.List(0, 60, 5)), ["second"].concat(can.core.List(0, 60, 5)), + "今天", "", "上一月", ["year"].concat(can.core.List(now.getFullYear() - 10, now.getFullYear() + 10)), + ["month"].concat(can.core.List(1, 13)), "下一月", + ], can._action, { close: function(event) { can.close() }, + "hour": function(event, can, key, value) { now.setHours(parseInt(value)||0), show(now) }, + "minute": function(event, can, key, value) { now.setMinutes(parseInt(value)||0), show(now) }, + "second": function(event, can, key, value) { now.setSeconds(parseInt(value)||0), show(now) }, + "今天": function(event) { now = new Date(), set(show(now)) }, - "上一月": function(event) { now.setMonth(now.getMonth()-1), show(now) }, - "year": function(event, can, key, value) { now.setFullYear(parseInt(value)), show(now) }, - "month": function(event, can, key, value) { now.setMonth(parseInt(value)-1), show(now) }, - "下一月": function(event) { now.setMonth(now.getMonth()+1), show(now) }, + "上一月": function(event) { now.setMonth(now.getMonth()-1), show(now) }, + "year": function(event, can, key, value) { now.setFullYear(parseInt(value)), show(now) }, + "month": function(event, can, key, value) { now.setMonth(parseInt(value)-1), show(now) }, + "下一月": function(event) { now.setMonth(now.getMonth()+1), show(now) }, - "随机": function(event) { now.setDate((Math.random() * 100 - 50) + now.getDate()), show(now) }, - "前一年": function(event) { now.setFullYear(now.getFullYear()-1), show(now) }, - "后一年": function(event) { now.setFullYear(now.getFullYear()+1), show(now) }, - }) + "随机": function(event) { now.setDate((Math.random() * 100 - 50) + now.getDate()), show(now) }, + "前一年": function(event) { now.setFullYear(now.getFullYear()-1), show(now) }, + "后一年": function(event) { now.setFullYear(now.getFullYear()+1), show(now) }, + }) - can.onmotion.clear(can, can._status) - can._table = can.page.Appends(can, can._output, [{view: [chat.CONTENT, html.TABLE]}]).first - var today = new Date(); function show(now) { - // 设置控件 - can.Action("year", now.getFullYear()) - can.Action("month", now.getMonth()+1) - can.Action("hour", now.getHours()) - can.Action("minute", parseInt(now.getMinutes()/5)*5) - can.Action("second", parseInt(now.getSeconds()/5)*5) + can.onmotion.clear(can, can._status) + can._table = can.page.Appends(can, can._output, [{view: [chat.CONTENT, html.TABLE]}]).first + var today = new Date(); function show(now) { + // 设置控件 + can.Action("year", now.getFullYear()) + can.Action("month", now.getMonth()+1) + can.Action("hour", now.getHours()) + can.Action("minute", parseInt(now.getMinutes()/5)*5) + can.Action("second", parseInt(now.getSeconds()/5)*5) - // 设置组件 - can.page.Appends(can, can._table, [{th: ["日", "一", "二", "三", "四", "五", "六"]}]) - var tr; function add(day, type) { if (day.getDay() == 0) { tr = can.page.Append(can, can._table, [{type: html.TR}]).last } - can.page.Append(can, tr, [{text: [day.getDate(), html.TD, can.base.Time(today, "%y-%m-%d") == can.base.Time(day, "%y-%m-%d")? html.SELECT: type], - dataset: {date: day.getTime()}, onclick: function(event) { - set(now = new Date(parseInt(event.target.dataset.date))) - }, - }]) - } + // 设置组件 + can.page.Appends(can, can._table, [{th: ["日", "一", "二", "三", "四", "五", "六"]}]) + var tr; function add(day, type) { if (day.getDay() == 0) { tr = can.page.Append(can, can._table, [{type: html.TR}]).last } + can.page.Append(can, tr, [{text: [day.getDate(), html.TD, can.base.Time(today, "%y-%m-%d") == can.base.Time(day, "%y-%m-%d")? html.SELECT: type], + dataset: {date: day.getTime()}, onclick: function(event) { + set(now = new Date(parseInt(event.target.dataset.date))) + }, + }]) + } - // 时间区间 - var one = new Date(now); one.setDate(1) - var end = new Date(now); end.setMonth(now.getMonth()+1), end.setDate(1) - var head = new Date(one); head.setDate(one.getDate()-one.getDay()) - var tail = new Date(end); tail.setDate(end.getDate()+7-end.getDay()) + // 时间区间 + var one = new Date(now); one.setDate(1) + var end = new Date(now); end.setMonth(now.getMonth()+1), end.setDate(1) + var head = new Date(one); head.setDate(one.getDate()-one.getDay()) + var tail = new Date(end); tail.setDate(end.getDate()+7-end.getDay()) - // 时间序列 - for (var day = new Date(head); day < one; day.setDate(day.getDate()+1)) { add(day, mdb.PREV) } - for (var day = new Date(one); day < end; day.setDate(day.getDate()+1)) { add(day, mdb.MAIN) } - for (var day = new Date(end); end.getDay() != 0 && day < tail; day.setDate(day.getDate()+1)) { add(day, mdb.NEXT) } + // 时间序列 + for (var day = new Date(head); day < one; day.setDate(day.getDate()+1)) { add(day, mdb.PREV) } + for (var day = new Date(one); day < end; day.setDate(day.getDate()+1)) { add(day, mdb.MAIN) } + for (var day = new Date(end); end.getDay() != 0 && day < tail; day.setDate(day.getDate()+1)) { add(day, mdb.NEXT) } - return now - } show(now), can.onlayout.figure(event, can), can.base.isFunc(cbs) && cbs(can) + return now + } show(now), can.onlayout.figure(event, can), can.base.isFunc(cbs) && cbs(can) })}} }, [""]) diff --git a/plugin/input/key.js b/plugin/input/key.js index 91f8a2d0..06eb4cac 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -1,53 +1,53 @@ Volcanos("onfigure", {help: "控件详情", list: [], key: { - _init: function(can, msg, target) { var call = arguments.callee - can.onmotion.clear(can), can.onappend.table(can, msg, function(value, key, index, line) { - return {text: [value, html.TD], onclick: function(event) { target.value = line[key] - if (msg.Option(ice.MSG_PROCESS) != ice.PROCESS_AGAIN) { return can.close() } - can.run(event, [ctx.ACTION, mdb.INPUTS, can.Conf(mdb.NAME), target.value], function(msg) { - call(can, msg, target) - }) - }} - }) - }, - _show: function(can, meta, cbs, target) { - can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { - if (msg.Length() == 0) { return can.close() } - target._can && target._can.close(), target._can = can - can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length()) - target._msg = msg, can.base.isFunc(cbs) && cbs(can) - }) + _init: function(can, msg, target) { var call = arguments.callee + can.onmotion.clear(can), can.onappend.table(can, msg, function(value, key, index, line) { + return {text: [value, html.TD], onclick: function(event) { target.value = line[key] + if (msg.Option(ice.MSG_PROCESS) != ice.PROCESS_AGAIN) { return can.close() } + can.run(event, [ctx.ACTION, mdb.INPUTS, can.Conf(mdb.NAME), target.value], function(msg) { + call(can, msg, target) + }) + }} + }) + }, + _show: function(can, meta, cbs, target) { + can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { + if (msg.Length() == 0) { return can.close() } + target._can && target._can.close(), target._can = can + can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length()) + target._msg = msg, can.base.isFunc(cbs) && cbs(can) + }) - }, - onfocus: function(event, can, meta, cb, target) { if (target._figure) { return } target._figure = {}; cb(function(can, cbs) { - target._figure = can.onlayout.figure(event, can, can._target, false, {top: can.page.offsetTop(target)+target.offsetHeight, left: can.page.offsetLeft(target)}) - can.onfigure.key._show(can, meta, cbs, target) - can.onmotion.focus(can, target) - }) }, - onblur: function(event, can, meta, cb, target) { delete(target._figure), target._can && target._can.close() }, - onclick: function(event, can, meta, cb, target) { if (target._figure) { target._figure = can.onlayout.figure(event, can, can.core.Value(target, "_can._target")||{}); return } target._figure = {}; cb(function(can, cbs) { - target._figure = can.onlayout.figure(event, can) - can.onfigure.key._show(can, meta, cbs, target) - }) }, - onkeydown: function(event, can, meta, cb, target, last) { - if (target._figure && target._can) { can = target._can - switch (event.key) { case lang.ENTER: can.close(); return } - can.onmotion.selectTableInput(event, can, target, function() { - can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { - can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length()) - target._msg = msg - }) - }) - } - switch (event.key) { - case lang.ESCAPE: event.target.blur(); return - case lang.TAB: - if (event.target.tagName == "TEXTAREA") { - can.onkeymap.insertText(event.target, "\t") - can.onkeymap.prevent(event) - return - } - } - can.base.isFunc(last) && last(event, can) - }, + }, + onfocus: function(event, can, meta, cb, target) { if (target._figure) { return } target._figure = {}; cb(function(can, cbs) { + target._figure = can.onlayout.figure(event, can, can._target, false, {top: can.page.offsetTop(target)+target.offsetHeight, left: can.page.offsetLeft(target)}) + can.onfigure.key._show(can, meta, cbs, target) + can.onmotion.focus(can, target) + }) }, + onblur: function(event, can, meta, cb, target) { delete(target._figure), target._can && target._can.close() }, + onclick: function(event, can, meta, cb, target) { if (target._figure) { target._figure = can.onlayout.figure(event, can, can.core.Value(target, "_can._target")||{}); return } target._figure = {}; cb(function(can, cbs) { + target._figure = can.onlayout.figure(event, can) + can.onfigure.key._show(can, meta, cbs, target) + }) }, + onkeydown: function(event, can, meta, cb, target, last) { + if (target._figure && target._can) { can = target._can + switch (event.key) { case lang.ENTER: can.close(); return } + can.onmotion.selectTableInput(event, can, target, function() { + can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { + can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length()) + target._msg = msg + }) + }) + } + switch (event.key) { + case lang.ESCAPE: event.target.blur(); return + case lang.TAB: + if (event.target.tagName == "TEXTAREA") { + can.onkeymap.insertText(event.target, "\t") + can.onkeymap.prevent(event) + return + } + } + can.base.isFunc(last) && last(event, can) + }, }}) diff --git a/plugin/input/province.js b/plugin/input/province.js index 2631f00a..02495975 100644 --- a/plugin/input/province.js +++ b/plugin/input/province.js @@ -1,9 +1,9 @@ Volcanos("onfigure", {help: "控件详情", list: [], province: {onclick: function(event, can, meta, cb, target) { cb(function(can, cbs) { - can.require(["/require/shylinux.com/x/echarts/echarts.js", "/require/shylinux.com/x/echarts/china.js"], function() { - var china_chart = echarts.init(can.page.Append(can, can._output, [{type: html.DIV, style: {width: 600, height: 400}}]).first) - china_chart.setOption({geo: {map: 'china'}}), china_chart.on(html.CLICK, function (params) { - target.value = params.name, can.close() - }), can.Status(mdb.TOTAL, 34), can.onlayout.figure(event, can), can.base.isFunc(cbs) && cbs(can) - }) + can.require(["/require/shylinux.com/x/echarts/echarts.js", "/require/shylinux.com/x/echarts/china.js"], function() { + var china_chart = echarts.init(can.page.Append(can, can._output, [{type: html.DIV, style: {width: 600, height: 400}}]).first) + china_chart.setOption({geo: {map: 'china'}}), china_chart.on(html.CLICK, function (params) { + target.value = params.name, can.close() + }), can.Status(mdb.TOTAL, 34), can.onlayout.figure(event, can), can.base.isFunc(cbs) && cbs(can) + }) }) }}, }) diff --git a/plugin/local/chat/div.js b/plugin/local/chat/div.js index 8d69dd47..d2400e01 100644 --- a/plugin/local/chat/div.js +++ b/plugin/local/chat/div.js @@ -1,95 +1,95 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - var meta = {}; msg.Table(function(value) { meta[value.key] = value.value }) - can._meta = can.base.Obj(meta.text, {meta: {name: meta.name||"hi"}, list: []}) - can.base.isFunc(cb) && cb(msg) + var meta = {}; msg.Table(function(value) { meta[value.key] = value.value }) + can._meta = can.base.Obj(meta.text, {meta: {name: meta.name||"hi"}, list: []}) + can.base.isFunc(cb) && cb(msg) - can.ui = can.page.Appends(can, target, [{view: [chat.LAYOUT, html.TABLE], list: [{type: html.TR, list: [ - {type: html.TD, list: [{view: chat.PROJECT}]}, - {type: html.TD, list: [{view: chat.DISPLAY}]}, - {type: html.TD, list: [{view: chat.PROFILE}]}, - ]}] }]), can.ui.project._fieldset = can.ui.display + can.ui = can.page.Appends(can, target, [{view: [chat.LAYOUT, html.TABLE], list: [{type: html.TR, list: [ + {type: html.TD, list: [{view: chat.PROJECT}]}, + {type: html.TD, list: [{view: chat.DISPLAY}]}, + {type: html.TD, list: [{view: chat.PROFILE}]}, + ]}] }]), can.ui.project._fieldset = can.ui.display - can.onimport._item(can, can._meta, can.ui.project, can.onimport._size(can)).click() - }, - _size: function(can) { - var width = can.Conf(html.WIDTH)-260, height = can.Conf(html.HEIGHT)-100 - if (can.Conf("auto.cmd")) { - width = can.Conf(html.WIDTH), height = can.Conf(html.HEIGHT) - can.onmotion.hidden(can, can.ui.project) - can.onmotion.hidden(can, can.ui.profile) - can.onmotion.hidden(can, can._option) - can.onmotion.hidden(can, can._action) - } - if (can.user.mod.isCmd || can.user.mod.isDiv) { - width = window.innerWidth, height = window.innerHeight - can.page.Modify(can, can._output, {style: {width: width, height: height}}) - } - return width - }, - _item: function(can, node, target, width) { width = width||node.meta.width - var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, node.meta.name||"hi"]}, {view: [html.LIST]}]) - ui.list._fieldset = can.onimport._plugin(can, node.meta, target._fieldset, width) + can.onimport._item(can, can._meta, can.ui.project, can.onimport._size(can)).click() + }, + _size: function(can) { + var width = can.Conf(html.WIDTH)-260, height = can.Conf(html.HEIGHT)-100 + if (can.Conf("auto.cmd")) { + width = can.Conf(html.WIDTH), height = can.Conf(html.HEIGHT) + can.onmotion.hidden(can, can.ui.project) + can.onmotion.hidden(can, can.ui.profile) + can.onmotion.hidden(can, can._option) + can.onmotion.hidden(can, can._action) + } + if (can.user.mod.isCmd || can.user.mod.isDiv) { + width = window.innerWidth, height = window.innerHeight + can.page.Modify(can, can._output, {style: {width: width, height: height}}) + } + return width + }, + _item: function(can, node, target, width) { width = width||node.meta.width + var ui = can.page.Append(can, target, [{view: [html.ITEM, html.DIV, node.meta.name||"hi"]}, {view: [html.LIST]}]) + ui.list._fieldset = can.onimport._plugin(can, node.meta, target._fieldset, width) - var msg = can.request({}); msg.Push(node.meta, "", true) - ui.item.onclick = function(event) { - can.onmotion.select(can, can.ui.project, "div.item", ui.item) - can.current = ui.item, can.onmotion.clear(can, can.ui.profile) - can.onappend.table(can, msg, function(value, key, index, line, array) { - return {text: [value, html.TD], ondblclick: function(event) { - key == "value" && can.onmotion.modifys(can, event.target, function(event, value, old) { - node.meta[line.key] = value - }) - }} - }, can.ui.profile) - } + var msg = can.request({}); msg.Push(node.meta, "", true) + ui.item.onclick = function(event) { + can.onmotion.select(can, can.ui.project, "div.item", ui.item) + can.current = ui.item, can.onmotion.clear(can, can.ui.profile) + can.onappend.table(can, msg, function(value, key, index, line, array) { + return {text: [value, html.TD], ondblclick: function(event) { + key == "value" && can.onmotion.modifys(can, event.target, function(event, value, old) { + node.meta[line.key] = value + }) + }} + }, can.ui.profile) + } - ui.item._add = function(data) { - if (node.meta.style == html.SPAN) { width = width * node.list.length } - node.list.push(data) - if (node.meta.style == html.SPAN) { width = width / node.list.length } - can.onmotion.clear(can, ui.list), can.onmotion.clear(can, ui.list._fieldset) - can.core.List(node.list, function(node) { can.onimport._item(can, node, ui.list, width) }) - } - if (node.meta.style == html.SPAN) { width = width / node.list.length } - can.core.List(node.list, function(node) { can.onimport._item(can, node, ui.list, width) }) - return ui.item - }, - _plugin: function(can, meta, target, width) { - var size = {width: width, height: meta.height} - var field = can.onappend.field(can, chat.LAYOUT, {}, target).fieldset - can.page.ClassList.add(can, field, meta.style) - can.page.Modify(can, field, {style: size}) + ui.item._add = function(data) { + if (node.meta.style == html.SPAN) { width = width * node.list.length } + node.list.push(data) + if (node.meta.style == html.SPAN) { width = width / node.list.length } + can.onmotion.clear(can, ui.list), can.onmotion.clear(can, ui.list._fieldset) + can.core.List(node.list, function(node) { can.onimport._item(can, node, ui.list, width) }) + } + if (node.meta.style == html.SPAN) { width = width / node.list.length } + can.core.List(node.list, function(node) { can.onimport._item(can, node, ui.list, width) }) + return ui.item + }, + _plugin: function(can, meta, target, width) { + var size = {width: width, height: meta.height} + var field = can.onappend.field(can, chat.LAYOUT, {}, target).fieldset + can.page.ClassList.add(can, field, meta.style) + can.page.Modify(can, field, {style: size}) - meta.index && can.run(event, [ctx.ACTION, ctx.COMMAND, meta.index], function(msg) { - can.onappend._init(can, can.base.Copy({ - feature: can.base.Obj(msg.Append("meta")), - inputs: can.base.Obj(msg.Append("list")), - args: meta.args, - name: meta.name, - }, size), ["/plugin/state.js"], function(sub) { - can.page.Modify(can, sub._output, {style: size}) - sub.run = function(event, cmds, cb) { - can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true) - } - }, target, field) - }, true) - return field - }, + meta.index && can.run(event, [ctx.ACTION, ctx.COMMAND, meta.index], function(msg) { + can.onappend._init(can, can.base.Copy({ + feature: can.base.Obj(msg.Append("meta")), + inputs: can.base.Obj(msg.Append("list")), + args: meta.args, + name: meta.name, + }, size), ["/plugin/state.js"], function(sub) { + can.page.Modify(can, sub._output, {style: size}) + sub.run = function(event, cmds, cb) { + can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true) + } + }, target, field) + }, true) + return field + }, }, ["/plugin/local/chat/div.css"]) Volcanos("onaction", {help: "操作数据", list: [], - "添加": function(event, can) { - can.user.input(event, can, [mdb.NAME, ctx.INDEX, ctx.ARGS, ctx.STYLE, html.HEIGHT, html.WIDTH], function(event, button, data, list, args) { - can.current._add({meta: data, list: []}) - }) - }, - "保存": function(event, can) { var msg = can.request(event, can.Option()) - can.run(event, [mdb.MODIFY, mdb.TEXT, JSON.stringify(can._meta)], function(msg) { - can.user.toastSuccess(can) - }, true) - }, - "预览": function(event, can) { - can.onmotion.share(event, can, [], [mdb.LINK, can.misc.MergeURL(can, {_path: "/chat/div/"+can.Option("hash")})]) - }, + "添加": function(event, can) { + can.user.input(event, can, [mdb.NAME, ctx.INDEX, ctx.ARGS, ctx.STYLE, html.HEIGHT, html.WIDTH], function(event, button, data, list, args) { + can.current._add({meta: data, list: []}) + }) + }, + "保存": function(event, can) { var msg = can.request(event, can.Option()) + can.run(event, [mdb.MODIFY, mdb.TEXT, JSON.stringify(can._meta)], function(msg) { + can.user.toastSuccess(can) + }, true) + }, + "预览": function(event, can) { + can.onmotion.share(event, can, [], [mdb.LINK, can.misc.MergeURL(can, {_path: "/chat/div/"+can.Option("hash")})]) + }, }) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/plugin/local/chat/media.js b/plugin/local/chat/media.js index e93af71e..ffabc7ed 100644 --- a/plugin/local/chat/media.js +++ b/plugin/local/chat/media.js @@ -1,36 +1,35 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.ui = can.onlayout.display(can, target) - can.ui.canvas = can.page.Append(can, can.ui.display, [{type: "canvas", width: 320, height: 240, style: {display: "none"}}]).first + can.ui = can.onlayout.display(can, target) + can.ui.canvas = can.page.Append(can, can.ui.display, [{type: "canvas", width: 320, height: 240, style: {display: "none"}}]).first - can.onappend.table(can, msg, function(value, key, index, line, array) { - return {text: [value, "td"], onclick: function(event) { - can.sup.onaction.change(event, can.sup, key, value, function(msg) { - can.run(event) - }) - }} - }, can.ui.content) + can.onappend.table(can, msg, function(value, key, index, line, array) { + return {text: [value, "td"], onclick: function(event) { + can.sup.onaction.change(event, can.sup, key, value, function(msg) { + can.run(event) + }) + }} + }, can.ui.content) - can.onappend.board(can, msg.Result(), can.ui.display) - can.base.isFunc(cb) && cb(msg) - }, + can.onappend.board(can, msg.Result(), can.ui.display) + can.base.isFunc(cb) && cb(msg) + }, }) Volcanos("onaction", {help: "操作数据", list: [], _init: function(can, msg, list, cb, target) { + }, - }, - - open: function(event, can) { - navigator.getUserMedia({video: {width: 320, height: 240}}, function(stream) { - var video = can.page.Append(can, can.ui.content, "video") - video.srcObject = stream, video.play() - can.ui.video = video - }, function(error) { - can.misc.Log("open camera", error) - }) - }, - snapshot: function(event, can) { - can.ui.canvas.getContext("2d").drawImage(can.ui.video, 0, 0) - can.page.Append(can, can.ui.display, [{type: "img", src: can.ui.canvas.toDataURL('image/webp')}]) - }, + open: function(event, can) { + navigator.getUserMedia({video: {width: 320, height: 240}}, function(stream) { + var video = can.page.Append(can, can.ui.content, "video") + video.srcObject = stream, video.play() + can.ui.video = video + }, function(error) { + can.misc.Log("open camera", error) + }) + }, + snapshot: function(event, can) { + can.ui.canvas.getContext("2d").drawImage(can.ui.video, 0, 0) + can.page.Append(can, can.ui.display, [{type: "img", src: can.ui.canvas.toDataURL('image/webp')}]) + }, }) Volcanos("onexport", {help: "导出数据", list: [], }) diff --git a/plugin/local/chat/trans.js b/plugin/local/chat/trans.js index cd916f8f..9755313e 100644 --- a/plugin/local/chat/trans.js +++ b/plugin/local/chat/trans.js @@ -1,34 +1,34 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.onmotion.clear(can) - can.from = can.onimport._plugin(can, nfs.DIR, html.LEFT, "from", "to") - can.to = can.onimport._plugin(can, nfs.DIR, html.RIGHT, "to", "from") - can.onimport._plugin(can, nfs.TRASH, html.LEFT, "from") - can.onimport._plugin(can, nfs.TRASH, html.RIGHT, "to") - }, - _plugin: function(can, index, pos, from, to) { - return can.onappend.plugin(can, {type: chat.STORY, index: index}, function(sub) { - can.page.Modify(can, sub._target, {style: {float: pos, clear: pos}}) - sub.Conf(html.WIDTH, can.Conf(html.WIDTH)/2) - sub._legend.innerHTML = can.Option(from)+ice.SP+index - can.page.Modify(can, sub._output, {style: {"max-width": can.Conf(html.WIDTH)/2}}) + can.onmotion.clear(can) + can.from = can.onimport._plugin(can, nfs.DIR, html.LEFT, "from", "to") + can.to = can.onimport._plugin(can, nfs.DIR, html.RIGHT, "to", "from") + can.onimport._plugin(can, nfs.TRASH, html.LEFT, "from") + can.onimport._plugin(can, nfs.TRASH, html.RIGHT, "to") + }, + _plugin: function(can, index, pos, from, to) { + return can.onappend.plugin(can, {type: chat.STORY, index: index}, function(sub) { + can.page.Modify(can, sub._target, {style: {float: pos, clear: pos}}) + sub.Conf(html.WIDTH, can.Conf(html.WIDTH)/2) + sub._legend.innerHTML = can.Option(from)+ice.SP+index + can.page.Modify(can, sub._output, {style: {"max-width": can.Conf(html.WIDTH)/2}}) - sub.run = function(event, cmds, cb) { - if (can.onaction[cmds[1]]) { return can.onaction[cmds[1]](can, from, to, event, cmds, cb) } + sub.run = function(event, cmds, cb) { + if (can.onaction[cmds[1]]) { return can.onaction[cmds[1]](can, from, to, event, cmds, cb) } - var msg = sub.request(event, {_pod: can.Option(from)}) - can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, index], cmds), cb, true) - } - }) - }, + var msg = sub.request(event, {_pod: can.Option(from)}) + can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, index], cmds), cb, true) + } + }) + }, }) Volcanos("onaction", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - }, - send: function(can, from, to, event, cmds, cb) { var _from = can[from], _to = can[to] - var path = can.request(event).Option(nfs.PATH) - var msg = can.request(event, {_handle: ice.TRUE, - from: can.Option(from), from_path: path, - to: can.Option(to), to_path: _to.Option(nfs.PATH)+path.split(ice.PS).pop(), - }) - can.run(event, cmds, function() { _to.Update() }, true) - }, + }, + send: function(can, from, to, event, cmds, cb) { var _from = can[from], _to = can[to] + var path = can.request(event).Option(nfs.PATH) + var msg = can.request(event, {_handle: ice.TRUE, + from: can.Option(from), from_path: path, + to: can.Option(to), to_path: _to.Option(nfs.PATH)+path.split(ice.PS).pop(), + }) + can.run(event, cmds, function() { _to.Update() }, true) + }, }) diff --git a/plugin/local/chat/wx.js b/plugin/local/chat/wx.js index 197b3573..b546f763 100644 --- a/plugin/local/chat/wx.js +++ b/plugin/local/chat/wx.js @@ -1,28 +1,28 @@ Volcanos("onaction", {source: function(can, msg) { - can.require(["https://res.wx.qq.com/open/js/jweixin-1.6.0.js"], function(can) { - wx.config({debug: msg.Option("debug") == ice.TRUE, - appId: msg.Option("appid"), signature: msg.Option("signature"), - nonceStr: msg.Option("noncestr"), timestamp: msg.Option("timestamp"), + can.require(["https://res.wx.qq.com/open/js/jweixin-1.6.0.js"], function(can) { + wx.config({debug: msg.Option("debug") == ice.TRUE, + appId: msg.Option("appid"), signature: msg.Option("signature"), + nonceStr: msg.Option("noncestr"), timestamp: msg.Option("timestamp"), - jsApiList: can.core.Item({ - scanQRCode: function(cb) { wx.scanQRCode({needResult: cb? 1: 0, scanType: ["qrCode","barCode"], success: function (res) { - can.base.isFunc(cb) && cb(res.resultStr, can.base.ParseJSON(res.resultStr)) - } }) }, - getLocation: function(cb) { wx.getLocation({type: "gcj02", success: function (res) { - can.base.isFunc(cb) && cb({type: "gcj02", name: "当前位置", text: "当前位置", latitude: parseInt(res.latitude*100000), longitude: parseInt(res.longitude*100000) }) - } }) }, - openLocation: function(msg) { wx.openLocation({ - latitude: parseInt(msg.Option("latitude"))/100000, - longitude: parseInt(msg.Option("longitude"))/100000, - name: msg.Option(mdb.NAME), address: msg.Option(mdb.TEXT), - scale: msg.Option("scale")||14, infoUrl: msg.Option(mdb.LINK), - }) }, - chooseImage: function(cb, count) { wx.chooseImage({count: count||9, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success: function (res) { - can.base.isFunc(cb) && cb(res.localIds) - } }) }, - }, function(key, value) { return can.user.agent[key] = value, key }), - }) - wx.error(function(err) { can.user.toast(err, "wx load") }) - wx.ready(function() { can.misc.Log("ready") }) - }) + jsApiList: can.core.Item({ + scanQRCode: function(cb) { wx.scanQRCode({needResult: cb? 1: 0, scanType: ["qrCode","barCode"], success: function (res) { + can.base.isFunc(cb) && cb(res.resultStr, can.base.ParseJSON(res.resultStr)) + } }) }, + getLocation: function(cb) { wx.getLocation({type: "gcj02", success: function (res) { + can.base.isFunc(cb) && cb({type: "gcj02", name: "当前位置", text: "当前位置", latitude: parseInt(res.latitude*100000), longitude: parseInt(res.longitude*100000) }) + } }) }, + openLocation: function(msg) { wx.openLocation({ + latitude: parseInt(msg.Option("latitude"))/100000, + longitude: parseInt(msg.Option("longitude"))/100000, + name: msg.Option(mdb.NAME), address: msg.Option(mdb.TEXT), + scale: msg.Option("scale")||14, infoUrl: msg.Option(mdb.LINK), + }) }, + chooseImage: function(cb, count) { wx.chooseImage({count: count||9, sizeType: ['original', 'compressed'], sourceType: ['album', 'camera'], success: function (res) { + can.base.isFunc(cb) && cb(res.localIds) + } }) }, + }, function(key, value) { return can.user.agent[key] = value, key }), + }) + wx.error(function(err) { can.user.toast(err, "wx load") }) + wx.ready(function() { can.misc.Log("ready") }) + }) }}) diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index bf3aa54a..eb17267d 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -1,482 +1,482 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target) { - can.onengine.plugin(can, "can.code.inner.plugin", shy("插件", {}, [{type: "button", name: "list", action: "auto"}, "back"], function(msg, cmds) { - msg.Echo("can.code.inner.plugin") - msg.result = msg.result.concat(cmds||[]) - })) + can.onengine.plugin(can, "can.code.inner.plugin", shy("插件", {}, [{type: "button", name: "list", action: "auto"}, "back"], function(msg, cmds) { + msg.Echo("can.code.inner.plugin") + msg.result = msg.result.concat(cmds||[]) + })) - var paths = can.core.Split(can.Option(nfs.PATH), ice.FS); can.Option(nfs.PATH, paths[0]) - var files = can.core.Split(can.Option(nfs.FILE), ice.FS); can.Option(nfs.FILE, files[0]) - can.tabview = can.tabview||{}, can.tabview[can.onexport.keys(can)] = msg - can.history = can.history||[], can.toolkit = {}, can.extentions = {}, can.profile_size = {} + var paths = can.core.Split(can.Option(nfs.PATH), ice.FS); can.Option(nfs.PATH, paths[0]) + var files = can.core.Split(can.Option(nfs.FILE), ice.FS); can.Option(nfs.FILE, files[0]) + can.tabview = can.tabview||{}, can.tabview[can.onexport.keys(can)] = msg + can.history = can.history||[], can.toolkit = {}, can.extentions = {}, can.profile_size = {} - can.onmotion.clear(can), can.onlayout.profile(can) - can.onimport._project(can, can.ui.project) - can.onimport._profile(can, can.ui.profile) - can.onimport._display(can, can.ui.display) - can.base.isFunc(cb) && cb(msg) + can.onmotion.clear(can), can.onlayout.profile(can) + can.onimport._project(can, can.ui.project) + can.onimport._profile(can, can.ui.profile) + can.onimport._display(can, can.ui.display) + can.base.isFunc(cb) && cb(msg) - can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE)) - can.onimport.project(can, paths, function() { - can.onimport._toolkit(can, can.ui.toolkit), can.onimport._session(can, msg), can.onimport._keydown(can) - can.onmotion.delay(can, function() { - can.core.Next(files.slice(1), function(file, next) { - can.onimport.tabview(can, can.Option(nfs.PATH), file, can.Option(nfs.LINE), next) - }, function() { can.onimport.tabview(can, paths[0], files[0]) }) - }) - }) - }, - _project: function(can, target) { - target._toggle = function(event) { can.onmotion.toggle(can, target), can.onimport.layout(can) } - }, - _profile: function(can, target) { - var ui = can.page.Append(can, target, [{view: html.ACTION}, {view: html.OUTPUT}]); can.ui.profile_output = ui.output - var action = can.onappend._action(can, [cli.SHOW, cli.CLEAR, mdb.PLUGIN, cli.CLOSE, "size"], ui.action, kit.Dict( - cli.SHOW, function(event) { can.onaction["展示"](event, can) }, - cli.CLEAR, function(event) { can.onmotion.clear(can, ui.output) }, - cli.CLOSE, function(event) { can.onmotion.hidden(can, target), can.onimport.layout(can) }, - "size", function(event) { - can.user.input(event, can, ["size"], function(event, button, data) { - can.profile_size[can.onexport.keys(can)] = can.ConfWidth()*parseInt(data.size)/100 - can.onaction["展示"](event, can) - }) - }, - mdb.PLUGIN, function(event) { - can.user.input(event, can, [ctx.INDEX], function(event, button, data) { - can.onimport.plugin(can, data, ui.output) - }) - }, - )) - target._toggle = function(event, show) { action[show? cli.SHOW: cli.CLOSE](event) } - }, - _display: function(can, target) { - var ui = can.page.Append(can, target, [{view: html.ACTION}, {view: html.OUTPUT}, {}]); can.ui.display_output = ui.output - var action = can.onappend._action(can, [cli.EXEC, cli.CLEAR, mdb.PLUGIN, cli.CLOSE], ui.action, kit.Dict( - cli.EXEC, function(event) { can.onaction["执行"](event, can) }, - cli.CLEAR, function(event) { can.onmotion.clear(can, ui.output) }, - cli.CLOSE, function(event) { can.onmotion.hidden(can, target), can.onimport.layout(can) }, - mdb.PLUGIN, function(event) { - can.user.input(event, can, [ctx.INDEX], function(event, button, data) { - can.onimport.plugin(can, data, ui.output) - }) - }, - )) - target._toggle = function(event, show) { action[show? cli.EXEC: cli.CLOSE](event) } - }, - _toolkit: function(can, target) { - can.ui.toolkit = can.onappend.field(can, "toolkit", {}, can._output) - }, - _session: function(can, msg) { can.onimport.sess(can, "", function() { can.onimport.sess(can, { - plug: can.core.Split(msg.OptionOrSearch("plug")).reverse(), - exts: can.core.Split(msg.OptionOrSearch("exts")).reverse(), - tabs: can.core.Split(msg.OptionOrSearch("tabs")), - }) }) }, - _keydown: function(can) { can.onkeymap._build(can) - can.user.mod.isCmd && can.onengine.listen(can, chat.ONKEYDOWN, function(event) { - can._key_list = can.onkeymap._parse(event, can, "plugin", can._key_list, can.ui.content) - }) - }, + can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE)) + can.onimport.project(can, paths, function() { + can.onimport._toolkit(can, can.ui.toolkit), can.onimport._session(can, msg), can.onimport._keydown(can) + can.onmotion.delay(can, function() { + can.core.Next(files.slice(1), function(file, next) { + can.onimport.tabview(can, can.Option(nfs.PATH), file, can.Option(nfs.LINE), next) + }, function() { can.onimport.tabview(can, paths[0], files[0]) }) + }) + }) + }, + _project: function(can, target) { + target._toggle = function(event) { can.onmotion.toggle(can, target), can.onimport.layout(can) } + }, + _profile: function(can, target) { + var ui = can.page.Append(can, target, [{view: html.ACTION}, {view: html.OUTPUT}]); can.ui.profile_output = ui.output + var action = can.onappend._action(can, [cli.SHOW, cli.CLEAR, mdb.PLUGIN, cli.CLOSE, "size"], ui.action, kit.Dict( + cli.SHOW, function(event) { can.onaction["展示"](event, can) }, + cli.CLEAR, function(event) { can.onmotion.clear(can, ui.output) }, + cli.CLOSE, function(event) { can.onmotion.hidden(can, target), can.onimport.layout(can) }, + "size", function(event) { + can.user.input(event, can, ["size"], function(event, button, data) { + can.profile_size[can.onexport.keys(can)] = can.ConfWidth()*parseInt(data.size)/100 + can.onaction["展示"](event, can) + }) + }, + mdb.PLUGIN, function(event) { + can.user.input(event, can, [ctx.INDEX], function(event, button, data) { + can.onimport.plugin(can, data, ui.output) + }) + }, + )) + target._toggle = function(event, show) { action[show? cli.SHOW: cli.CLOSE](event) } + }, + _display: function(can, target) { + var ui = can.page.Append(can, target, [{view: html.ACTION}, {view: html.OUTPUT}, {}]); can.ui.display_output = ui.output + var action = can.onappend._action(can, [cli.EXEC, cli.CLEAR, mdb.PLUGIN, cli.CLOSE], ui.action, kit.Dict( + cli.EXEC, function(event) { can.onaction["执行"](event, can) }, + cli.CLEAR, function(event) { can.onmotion.clear(can, ui.output) }, + cli.CLOSE, function(event) { can.onmotion.hidden(can, target), can.onimport.layout(can) }, + mdb.PLUGIN, function(event) { + can.user.input(event, can, [ctx.INDEX], function(event, button, data) { + can.onimport.plugin(can, data, ui.output) + }) + }, + )) + target._toggle = function(event, show) { action[show? cli.EXEC: cli.CLOSE](event) } + }, + _toolkit: function(can, target) { + can.ui.toolkit = can.onappend.field(can, "toolkit", {}, can._output) + }, + _session: function(can, msg) { can.onimport.sess(can, "", function() { can.onimport.sess(can, { + plug: can.core.Split(msg.OptionOrSearch("plug")).reverse(), + exts: can.core.Split(msg.OptionOrSearch("exts")).reverse(), + tabs: can.core.Split(msg.OptionOrSearch("tabs")), + }) }) }, + _keydown: function(can) { can.onkeymap._build(can) + can.user.mod.isCmd && can.onengine.listen(can, chat.ONKEYDOWN, function(event) { + can._key_list = can.onkeymap._parse(event, can, "plugin", can._key_list, can.ui.content) + }) + }, - project: function(can, path, cb) { can.onmotion.clear(can, can.ui.project) - can.core.Next(path, function(path, next, index, array) { - var list = can.ui.project; if (array.length > 1) { - var ui = can.page.Append(can, can.ui.project, [{view: [html.ITEM, html.DIV, path], onclick: function(event) { - can.onmotion.toggle(can, ui.list) - }}, {view: html.LIST}]); list = ui.list - if (index > 0) { ui.item.click() } - } - can.run(can.request({}, {dir_root: path, dir_deep: true})._event, [ice.PWD], function(msg) { - can.onappend.tree(can, can._file = msg.Table(), nfs.PATH, ice.PS, function(event, item) { - can.onimport.tabview(can, path, item.path) - }, list), can.onimport.layout(can), can.Status("文件数", msg.Length()), next() - }, true) - }, function() { - can.base.isFunc(cb) && cb() - }) - }, - tabview: function(can, path, file, line, cb, skip, skip2) { var key = can.onexport.keys(can, file, path) - if (!skip && can.tabview[key]) { can.user.mod.isCmd && can.user.title(path+file) - can._msg && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.tabview[key] - can.Option({path: path, file: file, line: line||can._msg.Option(nfs.LINE)||1}) - return can._msg.Option(can.Option()), can.onsyntax._init(can, can._msg, cb, skip2) - } + project: function(can, path, cb) { can.onmotion.clear(can, can.ui.project) + can.core.Next(path, function(path, next, index, array) { + var list = can.ui.project; if (array.length > 1) { + var ui = can.page.Append(can, can.ui.project, [{view: [html.ITEM, html.DIV, path], onclick: function(event) { + can.onmotion.toggle(can, ui.list) + }}, {view: html.LIST}]); list = ui.list + if (index > 0) { ui.item.click() } + } + can.run(can.request({}, {dir_root: path, dir_deep: true})._event, [ice.PWD], function(msg) { + can.onappend.tree(can, can._file = msg.Table(), nfs.PATH, ice.PS, function(event, item) { + can.onimport.tabview(can, path, item.path) + }, list), can.onimport.layout(can), can.Status("文件数", msg.Length()), next() + }, true) + }, function() { + can.base.isFunc(cb) && cb() + }) + }, + tabview: function(can, path, file, line, cb, skip, skip2) { var key = can.onexport.keys(can, file, path) + if (!skip && can.tabview[key]) { can.user.mod.isCmd && can.user.title(path+file) + can._msg && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.tabview[key] + can.Option({path: path, file: file, line: line||can._msg.Option(nfs.LINE)||1}) + return can._msg.Option(can.Option()), can.onsyntax._init(can, can._msg, cb, skip2) + } - function show(msg) { can.tabview[key] = msg - var skip2 = skip - msg._tab = can.onappend.tabs(can, [{name: file.split(ice.PS).pop(), text: file}], function(event, meta) { - can.onimport.tabview(can, path, file, "", cb, false, skip2), cb = null, skip2 = false - }, function(item) { delete(can.tabview[key]) }) - } + function show(msg) { can.tabview[key] = msg + var skip2 = skip + msg._tab = can.onappend.tabs(can, [{name: file.split(ice.PS).pop(), text: file}], function(event, meta) { + can.onimport.tabview(can, path, file, "", cb, false, skip2), cb = null, skip2 = false + }, function(item) { delete(can.tabview[key]) }) + } - can.Option({path: path, file: file, line: line||1}) - line == ctx.INDEX? show(can.request({}, {index: file, line: line})): can.run({}, [path, file], show, true) - }, - profile: function(can, msg) { - var width = can.profile_size[can.onexport.keys(can)]||(can.ConfWidth()-can.ui.project.offsetWidth)/2 - msg && can.onimport.process(can, msg, can.ui.profile_output, width-32) - can.onmotion.hidden(can, can.ui.profile, true), can.onimport.layout(can) - }, - display: function(can, msg) { - msg && can.onimport.process(can, msg, can.ui.display_output, can.ConfWidth()) - can.page.style(can, can.ui.display_output, html.MAX_HEIGHT, can.ConfHeight()/4) - can.onmotion.hidden(can, can.ui.display, true), can.onimport.layout(can) - }, - toolkit: function(can, meta, cb) { - meta.opts = meta.opts||{repos: can.base.trimSuffix(can.base.trimPrefix(can.Option(nfs.PATH), "usr/"), ice.PS) } - can.onimport.plugin(can, meta, can.ui.toolkit.output, function(sub) { - sub.ConfHeight(can.ConfHeight()-4*html.ACTION_HEIGHT), sub.ConfWidth(can.ConfWidth()) - sub.page.style(sub, sub._output, html.MAX_HEIGHT, sub.ConfHeight()) - sub.page.style(sub, sub._output, html.MAX_WIDTH, sub.ConfWidth()) - sub.select = function() { return sub._legend.click(), sub } + can.Option({path: path, file: file, line: line||1}) + line == ctx.INDEX? show(can.request({}, {index: file, line: line})): can.run({}, [path, file], show, true) + }, + profile: function(can, msg) { + var width = can.profile_size[can.onexport.keys(can)]||(can.ConfWidth()-can.ui.project.offsetWidth)/2 + msg && can.onimport.process(can, msg, can.ui.profile_output, width-32) + can.onmotion.hidden(can, can.ui.profile, true), can.onimport.layout(can) + }, + display: function(can, msg) { + msg && can.onimport.process(can, msg, can.ui.display_output, can.ConfWidth()) + can.page.style(can, can.ui.display_output, html.MAX_HEIGHT, can.ConfHeight()/4) + can.onmotion.hidden(can, can.ui.display, true), can.onimport.layout(can) + }, + toolkit: function(can, meta, cb) { + meta.opts = meta.opts||{repos: can.base.trimSuffix(can.base.trimPrefix(can.Option(nfs.PATH), "usr/"), ice.PS) } + can.onimport.plugin(can, meta, can.ui.toolkit.output, function(sub) { + sub.ConfHeight(can.ConfHeight()-4*html.ACTION_HEIGHT), sub.ConfWidth(can.ConfWidth()) + sub.page.style(sub, sub._output, html.MAX_HEIGHT, sub.ConfHeight()) + sub.page.style(sub, sub._output, html.MAX_WIDTH, sub.ConfWidth()) + sub.select = function() { return sub._legend.click(), sub } - var status = can.user.mod.isCmd? can._status: can.ui.toolkit.status - status.appendChild(sub._legend), sub._legend.onclick = function(event) { - if (can.page.Select(can, status, ice.PT+html.SELECT)[0] == event.target) { - can.page.ClassList.del(can, event.target, html.SELECT) - can.page.ClassList.del(can, sub._target, html.SELECT) - return - } - can.onmotion.select(can, status, html.LEGEND, event.target) - can.onmotion.select(can, can.ui.toolkit.output, html.FIELDSET, sub._target) - can.onmotion.focus(can, can.page.Select(can, sub._option, html.OPTION_ARGS)[0]) - }, can.base.isFunc(cb) && cb(sub) - }) - }, - process: function(can, msg, target, width) { - can.user.toastSuccess(can) - can.onmotion.clear(can, target) - if (msg.Option("_process") == "_field") { - msg.Table(function(meta) { meta.display = msg.Option("_display") - // delete(Volcanos.meta.cache[meta.display]) - can.onimport.plugin(can, meta, target, function(sub) { - can.onmotion.focus(can, can.page.Select(can, sub._option, html.OPTION_ARGS)[0]) - width && sub.ConfWidth(width) - }) - }) - } else { - can.onappend.table(can, msg, null, target) - can.onappend.board(can, msg.Result(), target) - } - }, - plugin: function(can, meta, target, cb) { - can.onappend.plugin(can, meta, function(sub) { - sub.run = function(event, cmds, cb) { - can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true) - }, can.base.isFunc(cb) && cb(sub) - }, target) - }, - layout: function(can) { var height = can.ConfHeight(), width = can.ConfWidth() - can.page.style(can, can.ui.content, can.user.mod.isCmd? html.HEIGHT: html.MAX_HEIGHT, height) - if (can.ui.project.style.display != html.NONE) { - can.page.styleHeight(can, can.ui.project, can.ui.content.offsetHeight) - } - if (can.user.mod.isCmd) { - can.page.styleHeight(can, can.ui.content, (can.ui.project.offsetHeight||height)-can.ui.display.offsetHeight) - } + var status = can.user.mod.isCmd? can._status: can.ui.toolkit.status + status.appendChild(sub._legend), sub._legend.onclick = function(event) { + if (can.page.Select(can, status, ice.PT+html.SELECT)[0] == event.target) { + can.page.ClassList.del(can, event.target, html.SELECT) + can.page.ClassList.del(can, sub._target, html.SELECT) + return + } + can.onmotion.select(can, status, html.LEGEND, event.target) + can.onmotion.select(can, can.ui.toolkit.output, html.FIELDSET, sub._target) + can.onmotion.focus(can, can.page.Select(can, sub._option, html.OPTION_ARGS)[0]) + }, can.base.isFunc(cb) && cb(sub) + }) + }, + process: function(can, msg, target, width) { + can.user.toastSuccess(can) + can.onmotion.clear(can, target) + if (msg.Option("_process") == "_field") { + msg.Table(function(meta) { meta.display = msg.Option("_display") + // delete(Volcanos.meta.cache[meta.display]) + can.onimport.plugin(can, meta, target, function(sub) { + can.onmotion.focus(can, can.page.Select(can, sub._option, html.OPTION_ARGS)[0]) + width && sub.ConfWidth(width) + }) + }) + } else { + can.onappend.table(can, msg, null, target) + can.onappend.board(can, msg.Result(), target) + } + }, + plugin: function(can, meta, target, cb) { + can.onappend.plugin(can, meta, function(sub) { + sub.run = function(event, cmds, cb) { + can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, meta.index], cmds), cb, true) + }, can.base.isFunc(cb) && cb(sub) + }, target) + }, + layout: function(can) { var height = can.ConfHeight(), width = can.ConfWidth() + can.page.style(can, can.ui.content, can.user.mod.isCmd? html.HEIGHT: html.MAX_HEIGHT, height) + if (can.ui.project.style.display != html.NONE) { + can.page.styleHeight(can, can.ui.project, can.ui.content.offsetHeight) + } + if (can.user.mod.isCmd) { + can.page.styleHeight(can, can.ui.content, (can.ui.project.offsetHeight||height)-can.ui.display.offsetHeight) + } - can.page.styleWidth(can, can.ui.profile_output, can.profile_size[can.onexport.keys(can)]||(width-can.ui.project.offsetWidth)/2) - can.page.styleWidth(can, can.ui.content, width-can.ui.project.offsetWidth-can.ui.profile.offsetWidth-26) + can.page.styleWidth(can, can.ui.profile_output, can.profile_size[can.onexport.keys(can)]||(width-can.ui.project.offsetWidth)/2) + can.page.styleWidth(can, can.ui.content, width-can.ui.project.offsetWidth-can.ui.profile.offsetWidth-26) - if (can.page.ClassList.has(can, can._fields, "full")) { - can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight) - } else { - can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight-html.ACTION_HEIGHT) - } - can.page.Select(can, can.ui.profile_output, html.IFRAME, function(item) { - can.page.style(can, item, - html.HEIGHT, can.ui.profile_output.offsetHeight-4, - html.WIDTH, can.ui.profile_output.offsetWidth-5, - "margin-left", "-10px", "margin-top", "-10px", - "position", "absolute", - "border", "0", - ) - }) - }, - exts: function(can, url, cb) { - can.require([url], function() {}, function(can, name, sub) { sub._init(can, can.base.ParseURL(sub._path), function(sub) { - can.extentions[url.split("?")[0]] = sub, can.base.isFunc(cb) && cb(sub) - }) }) - }, - sess: function(can, sess, cb) { sess = sess||can.base.Obj(localStorage.getItem("web.code.inner.sess"), {}) - can.core.Next(sess.plug, function(item, next) { can.onimport.toolkit(can, {index: item}, function(sub) { can.toolkit[item] = sub, next() }) }, function() { - can.core.Next(sess.exts, function(item, next) { can.onimport.exts(can, item, next) }, function() { - can.core.Next(sess.tabs, function(item, next) { var ls = item.split(ice.DF); can.onimport.tabview(can, ls[0], ls[1], ls[2], next) }, cb) - }) - }) - }, + if (can.page.ClassList.has(can, can._fields, "full")) { + can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight) + } else { + can.page.styleHeight(can, can.ui.profile_output, can.ui.content.offsetHeight-html.ACTION_HEIGHT) + } + can.page.Select(can, can.ui.profile_output, html.IFRAME, function(item) { + can.page.style(can, item, + html.HEIGHT, can.ui.profile_output.offsetHeight-4, + html.WIDTH, can.ui.profile_output.offsetWidth-5, + "margin-left", "-10px", "margin-top", "-10px", + "position", "absolute", + "border", "0", + ) + }) + }, + exts: function(can, url, cb) { + can.require([url], function() {}, function(can, name, sub) { sub._init(can, can.base.ParseURL(sub._path), function(sub) { + can.extentions[url.split("?")[0]] = sub, can.base.isFunc(cb) && cb(sub) + }) }) + }, + sess: function(can, sess, cb) { sess = sess||can.base.Obj(localStorage.getItem("web.code.inner.sess"), {}) + can.core.Next(sess.plug, function(item, next) { can.onimport.toolkit(can, {index: item}, function(sub) { can.toolkit[item] = sub, next() }) }, function() { + can.core.Next(sess.exts, function(item, next) { can.onimport.exts(can, item, next) }, function() { + can.core.Next(sess.tabs, function(item, next) { var ls = item.split(ice.DF); can.onimport.tabview(can, ls[0], ls[1], ls[2], next) }, cb) + }) + }) + }, }, [""]) Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"], _init: function(can, msg, cb, skip) { - if (can.onmotion.cache(can, function(cache_data) { - can.file && (cache_data[can.file] = {current: can.current, max: can.max, - profile_display: can.ui.profile.style.display, display_display: can.ui.display.style.display, - }) - can.file = can.base.Path(msg.Option(nfs.PATH), msg.Option(nfs.FILE)) - can.parse = can.base.Ext(can.file), can.Status("模式", "plugin") + if (can.onmotion.cache(can, function(cache_data) { + can.file && (cache_data[can.file] = {current: can.current, max: can.max, + profile_display: can.ui.profile.style.display, display_display: can.ui.display.style.display, + }) + can.file = can.base.Path(msg.Option(nfs.PATH), msg.Option(nfs.FILE)) + can.parse = can.base.Ext(can.file), can.Status("模式", "plugin") - var p = cache_data[can.file]; p && (can.current = p.current, can.max = p.max) - can.page.Modify(can, can.ui.profile, {style: {display: p? p.profile_display: html.NONE}}) - can.page.Modify(can, can.ui.display, {style: {display: p? p.display_display: html.NONE}}) - can.onmotion.select(can, can._action, chat.DIV_TABS, msg._tab) - can.onmotion.delay(can, function() { can.onimport.layout(can) - msg.Option(ctx.INDEX) && can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]) - }) - return can.file - }, can.ui.content, can.ui.profile_output, can.ui.display_output) && !skip) { - return can.onaction.selectLine(null, can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb() - } + var p = cache_data[can.file]; p && (can.current = p.current, can.max = p.max) + can.page.Modify(can, can.ui.profile, {style: {display: p? p.profile_display: html.NONE}}) + can.page.Modify(can, can.ui.display, {style: {display: p? p.display_display: html.NONE}}) + can.onmotion.select(can, can._action, chat.DIV_TABS, msg._tab) + can.onmotion.delay(can, function() { can.onimport.layout(can) + msg.Option(ctx.INDEX) && can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]) + }) + return can.file + }, can.ui.content, can.ui.profile_output, can.ui.display_output) && !skip) { + return can.onaction.selectLine(null, can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb() + } - if (msg.Option(ctx.INDEX)) { - can.onimport.plugin(can, {index: msg.Option(ctx.INDEX)}, can.ui.content, function(sub) { - can.onmotion.delay(can, function() { - can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]) - }), can.base.isFunc(cb) && cb() - }) - return - } - can.onmotion.clear(can, can.ui.content) + if (msg.Option(ctx.INDEX)) { + can.onimport.plugin(can, {index: msg.Option(ctx.INDEX)}, can.ui.content, function(sub) { + can.onmotion.delay(can, function() { + can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]) + }), can.base.isFunc(cb) && cb() + }) + return + } + can.onmotion.clear(can, can.ui.content) - function init(p) { can.max = 0, can.core.List(can.ls = msg.Result().split(ice.NL), function(item) { - can.onaction.appendLine(can, item) - }), can.onaction.selectLine(null, can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb() } + function init(p) { can.max = 0, can.core.List(can.ls = msg.Result().split(ice.NL), function(item) { + can.onaction.appendLine(can, item) + }), can.onaction.selectLine(null, can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb() } - var p = can.onsyntax[can.parse]; !p? can.run({}, [ctx.ACTION, mdb.PLUGIN, can.parse, msg.Option(nfs.FILE), msg.Option(nfs.PATH)], function(msg) { - init(p = can.onsyntax[can.parse] = can.base.Obj(msg.Result())) - }, true): init(p) - }, - _parse: function(can, line) { if (line.indexOf("'+str+'': str } - var p = can.onsyntax[can.parse]; if (!p) { return line } p = can.onsyntax[p.link]||p, p.split = p.split||{} - p.keyword && (line = can.core.List(can.core.Split(line, p.split.space||ice.SP, p.split.operator||"{[(|)]}", {detail: true}), function(item, index, array) { - item = can.base.isObject(item)? item: {text: item} - var text = item.text; var type = item.keyword||p.keyword[text] + function wrap(type, str) { return type? ''+str+'': str } + var p = can.onsyntax[can.parse]; if (!p) { return line } p = can.onsyntax[p.link]||p, p.split = p.split||{} + p.keyword && (line = can.core.List(can.core.Split(line, p.split.space||ice.SP, p.split.operator||"{[(|)]}", {detail: true}), function(item, index, array) { + item = can.base.isObject(item)? item: {text: item} + var text = item.text; var type = item.keyword||p.keyword[text] - switch (item.type) { case html.SPACE: return text - case lang.STRING: return wrap(lang.STRING, item.left+text+item.right) - default: return wrap(type, text) - } - }).join("")) + switch (item.type) { case html.SPACE: return text + case lang.STRING: return wrap(lang.STRING, item.left+text+item.right) + default: return wrap(type, text) + } + }).join("")) - p.prefix && can.core.Item(p.prefix, function(pre, type) { - if (can.base.beginWith(line, pre)) { - line = wrap(type, line) - } else { - var ls = line.split(pre); if (ls.length > 1) { - line = ls[0] + wrap(type, pre + ls[1]) - } - } - }) - p.suffix && can.core.Item(p.suffix, function(end, type) { - if (can.base.endWith(line, end)) { line = wrap(type, line) } - }) - return line - }, + p.prefix && can.core.Item(p.prefix, function(pre, type) { + if (can.base.beginWith(line, pre)) { + line = wrap(type, line) + } else { + var ls = line.split(pre); if (ls.length > 1) { + line = ls[0] + wrap(type, pre + ls[1]) + } + } + }) + p.suffix && can.core.Item(p.suffix, function(end, type) { + if (can.base.endWith(line, end)) { line = wrap(type, line) } + }) + return line + }, }) Volcanos("onkeymap", {help: "导入数据", _init: function(can, msg, cb, target) { - }, - _plugin: function(event, can) {}, - _normal: function(event, can) {}, - _insert: function(event, can) {}, - _mode: { - plugin: { - Escape: function(event, can) { can.onaction["清屏"](event, can) }, - g: function(event, can) { can.onaction["搜索"](event, can) }, - f: function(event, can) { can.onaction["打开"](event, can) }, - t: function(event, can) { can.onaction["添加"](event, can) }, - p: function(event, can) { can.onaction["插件"](event, can) }, - e: function(event, can) { can.onaction["扩展"](event, can) }, + }, + _plugin: function(event, can) {}, + _normal: function(event, can) {}, + _insert: function(event, can) {}, + _mode: { + plugin: { + Escape: function(event, can) { can.onaction["清屏"](event, can) }, + g: function(event, can) { can.onaction["搜索"](event, can) }, + f: function(event, can) { can.onaction["打开"](event, can) }, + t: function(event, can) { can.onaction["添加"](event, can) }, + p: function(event, can) { can.onaction["插件"](event, can) }, + e: function(event, can) { can.onaction["扩展"](event, can) }, - q: function(event, can) { can.onaction["全屏"](event, can) }, - r: function(event, can) { can.onaction["执行"](event, can) }, - v: function(event, can) { can.onaction["展示"](event, can) }, - s: function(event, can) { can.onaction["保存"](event, can) }, + q: function(event, can) { can.onaction["全屏"](event, can) }, + r: function(event, can) { can.onaction["执行"](event, can) }, + v: function(event, can) { can.onaction["展示"](event, can) }, + s: function(event, can) { can.onaction["保存"](event, can) }, - j: function(event, can) { can.current.scroll(1) }, - k: function(event, can) { can.current.scroll(-1) }, - J: function(event, can) { can.current.scroll(can.current.window()-3) }, - K: function(event, can) { can.current.scroll(-can.current.window()+3) }, + j: function(event, can) { can.current.scroll(1) }, + k: function(event, can) { can.current.scroll(-1) }, + J: function(event, can) { can.current.scroll(can.current.window()-3) }, + K: function(event, can) { can.current.scroll(-can.current.window()+3) }, - i: function(event, can) { can.onkeymap._insert(event, can) }, - n: function(event, can) { can.onkeymap._normal(event, can) }, - ":": function(event, can) { can.onimport.toolkit(can, {index: "cli.system"}, function(sub) { can.toolkit["cli.system"] = sub.select() }) }, - }, - }, _engine: {}, + i: function(event, can) { can.onkeymap._insert(event, can) }, + n: function(event, can) { can.onkeymap._normal(event, can) }, + ":": function(event, can) { can.onimport.toolkit(can, {index: "cli.system"}, function(sub) { can.toolkit["cli.system"] = sub.select() }) }, + }, + }, _engine: {}, }) Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加", "插件", "扩展", "刷新"], - "刷新": function(event, can) { - can.onimport.tabview(can, "src/", "main.go", "", function() {}, skip) - }, - "搜索": function(event, can) { - can.user.input(event, can, [mdb.NAME, [ctx.ACTION, nfs.TAGS, nfs.GREP, cli.MAKE]], function(event, button, data) { - can.ui.search.Update({}, [ctx.ACTION, data.action, data.name]) - }) - }, - "打开": function(event, can) { - can.user.input(event, can, [nfs.FILE], function(event, button, data) { - can.onimport.tabview(can, can.Option(nfs.PATH), data.file) - }) - }, - "添加": function(event, can) { - can.user.input(event, can, [ctx.INDEX], function(event, button, data) { - can.onimport.tabview(can, can.Option(nfs.PATH), data.index, ctx.INDEX) - }) - }, - "插件": function(event, can) { - can.user.input(event, can, [ctx.INDEX], function(event, button, data) { - var sub = can.toolkit[data.index]; if (sub) { sub.select(); return } - can.onimport.toolkit(can, data, function(sub) { can.toolkit[data.index] = sub.select() }) - }) - }, - "扩展": function(event, can) { - can.user.input(event, can, ["url"], function(event, button, data) { - var sub = can.extentions[data.url]; if (sub) { sub.select(); return } - can.onimport.exts(can, data.url, function(sub) { can.extentions[data.url] = sub.select() }) - }) - }, - "保存": function(event, can) { can.onexport.sess(can), can.user.toastSuccess(can) }, - "项目": function(event, can) { can.onmotion.toggle(can, can.ui.project), can.onimport.layout(can) }, - "工具": function(event, can) { can.onmotion.toggle(can, can.ui.toolkit.fieldset) }, - "执行": function(event, can) { can.onimport.display(can), can.request(event, {_toast: "执行中..."}) - can.run(event, [ctx.ACTION, mdb.ENGINE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { - can.onimport.display(can, msg) - }, true) - }, - "展示": function(event, can) { can.onimport.profile(can), can.request(event, {_toast: "渲染中..."}) - if (can.Option(nfs.FILE).indexOf("website/") == 0) { - can.profile_size[can.onexport.keys(can)] = can.profile_size[can.onexport.keys(can)] || can.ConfWidth()*parseInt(70)/100 - } - can.run(event, [ctx.ACTION, mdb.RENDER, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { - can.onimport.profile(can, msg) - }, true) - }, - "清屏": function(event, can) { - if (can.page.Select(can, document.body, ".input.float", function(item) { - return can.page.Remove(can, item) - }).length > 0) { return } + "刷新": function(event, can) { + can.onimport.tabview(can, "src/", "main.go", "", function() {}, skip) + }, + "搜索": function(event, can) { + can.user.input(event, can, [mdb.NAME, [ctx.ACTION, nfs.TAGS, nfs.GREP, cli.MAKE]], function(event, button, data) { + can.ui.search.Update({}, [ctx.ACTION, data.action, data.name]) + }) + }, + "打开": function(event, can) { + can.user.input(event, can, [nfs.FILE], function(event, button, data) { + can.onimport.tabview(can, can.Option(nfs.PATH), data.file) + }) + }, + "添加": function(event, can) { + can.user.input(event, can, [ctx.INDEX], function(event, button, data) { + can.onimport.tabview(can, can.Option(nfs.PATH), data.index, ctx.INDEX) + }) + }, + "插件": function(event, can) { + can.user.input(event, can, [ctx.INDEX], function(event, button, data) { + var sub = can.toolkit[data.index]; if (sub) { sub.select(); return } + can.onimport.toolkit(can, data, function(sub) { can.toolkit[data.index] = sub.select() }) + }) + }, + "扩展": function(event, can) { + can.user.input(event, can, ["url"], function(event, button, data) { + var sub = can.extentions[data.url]; if (sub) { sub.select(); return } + can.onimport.exts(can, data.url, function(sub) { can.extentions[data.url] = sub.select() }) + }) + }, + "保存": function(event, can) { can.onexport.sess(can), can.user.toastSuccess(can) }, + "项目": function(event, can) { can.onmotion.toggle(can, can.ui.project), can.onimport.layout(can) }, + "工具": function(event, can) { can.onmotion.toggle(can, can.ui.toolkit.fieldset) }, + "执行": function(event, can) { can.onimport.display(can), can.request(event, {_toast: "执行中..."}) + can.run(event, [ctx.ACTION, mdb.ENGINE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { + can.onimport.display(can, msg) + }, true) + }, + "展示": function(event, can) { can.onimport.profile(can), can.request(event, {_toast: "渲染中..."}) + if (can.Option(nfs.FILE).indexOf("website/") == 0) { + can.profile_size[can.onexport.keys(can)] = can.profile_size[can.onexport.keys(can)] || can.ConfWidth()*parseInt(70)/100 + } + can.run(event, [ctx.ACTION, mdb.RENDER, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { + can.onimport.profile(can, msg) + }, true) + }, + "清屏": 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.ui.toolkit.status, "legend.select", function(item) { - return item.click(), item - }).length > 0) { return } - if (can.page.Select(can, can._status, "legend.select", function(item) { - return item.click(), item - }).length > 0) { return } + if (can.page.Select(can, can.ui.toolkit.status, "legend.select", function(item) { + return item.click(), 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.profile.style.display == "") { - can.onmotion.hidden(can, can.ui.profile) - } else if (can.ui.display.style.display == "") { - can.onmotion.hidden(can, can.ui.display) - } else if (can.ui.project.style.display == "") { - can.onmotion.hidden(can, can.ui.project) - } else { - can.onaction["全屏"](event, can) - } - can.onimport.layout(can) - }, - "全屏": function(event, can) { - if (can.page.ClassList.neg(can, can._fields, "full")) { - can.onmotion.hidden(can, can.ui.project) - can.ConfHeight(window.innerHeight) - } else { - can.onmotion.hidden(can, can.ui.project, true) - can.ConfHeight(window.innerHeight-2*html.ACTION_HEIGHT) - } - can.onimport.layout(can) - }, - back: function(event, can) { can.history.pop(); var last = can.history.pop() - last && can.onimport.tabview(can, last.path, last.file, last.line) - can.Status("跳转数", can.history.length) - }, + if (can.ui.profile.style.display == "") { + can.onmotion.hidden(can, can.ui.profile) + } else if (can.ui.display.style.display == "") { + can.onmotion.hidden(can, can.ui.display) + } else if (can.ui.project.style.display == "") { + can.onmotion.hidden(can, can.ui.project) + } else { + can.onaction["全屏"](event, can) + } + can.onimport.layout(can) + }, + "全屏": function(event, can) { + if (can.page.ClassList.neg(can, can._fields, "full")) { + can.onmotion.hidden(can, can.ui.project) + can.ConfHeight(window.innerHeight) + } else { + can.onmotion.hidden(can, can.ui.project, true) + can.ConfHeight(window.innerHeight-2*html.ACTION_HEIGHT) + } + can.onimport.layout(can) + }, + back: function(event, can) { can.history.pop(); var last = can.history.pop() + last && can.onimport.tabview(can, last.path, last.file, last.line) + can.Status("跳转数", can.history.length) + }, - scrollLine: function(can, count) { var size = 20; can.current.scroll(count*size) }, - appendLine: function(can, value) { - var ui = can.page.Append(can, can.ui.content, [{type: html.TR, list: [ - {view: ["line unselectable", html.TD, ++can.max], onclick: function(event) { - can.onaction.selectLine(event, can, ui.tr) - }, ondblclick: function(event) { - can.onaction.favorLine(can, ui.text.innerText) - }}, + scrollLine: function(can, count) { var size = 20; can.current.scroll(count*size) }, + appendLine: function(can, value) { + var ui = can.page.Append(can, can.ui.content, [{type: html.TR, list: [ + {view: ["line unselectable", html.TD, ++can.max], onclick: function(event) { + can.onaction.selectLine(event, can, ui.tr) + }, ondblclick: function(event) { + can.onaction.favorLine(can, ui.text.innerText) + }}, - {view: [html.TEXT, html.TD], list: [can.onsyntax._parse(can, value)], onclick: function(event) { - can.onaction.selectLine(event, can, ui.tr) + {view: [html.TEXT, html.TD], list: [can.onsyntax._parse(can, value)], onclick: function(event) { + can.onaction.selectLine(event, can, ui.tr) - }, ondblclick: function(event) { - var s = document.getSelection().toString(), str = ui.text.innerText - var begin = str.indexOf(s), end = begin+s.length + }, ondblclick: function(event) { + var s = document.getSelection().toString(), str = ui.text.innerText + var 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 } - } + for (var i = begin; i >= 0; i--) { + if (str[i].match(/[a-zA-Z0-9_.]/)) { s = str.slice(i, end) } else { break } + } - if (s.indexOf("kit.") == 0) { s = s.replace("kit.", "toolkits.") } - if (s.indexOf(".") == 0) { s = s.slice(1) } - can.onaction.searchLine(event, can, s) - }} - ]}]); return ui.tr - }, - selectLine: function(event, can, line) { if (!line) { return parseInt(can.core.Value(can.page.Select(can, can.ui.content, [[[html.TR, html.SELECT], [html.TD, "line"]]])[0], "innerText")) } - can.page.Select(can, can.ui.content, html.TR, function(item, index, array) { if (line < 0 || line > array.length) { return } - if (!can.page.ClassList.set(can, item, html.SELECT, item == line || index+1 == line)) { return } - line = item, can.Status(kit.Dict("文件名", can.file, "解析器", can.parse, "当前行", can.onexport.position(can, can.Option(nfs.LINE, index+1)))) - }) + if (s.indexOf("kit.") == 0) { s = s.replace("kit.", "toolkits.") } + if (s.indexOf(".") == 0) { s = s.slice(1) } + can.onaction.searchLine(event, can, s) + }} + ]}]); return ui.tr + }, + selectLine: function(event, can, line) { if (!line) { return parseInt(can.core.Value(can.page.Select(can, can.ui.content, [[[html.TR, html.SELECT], [html.TD, "line"]]])[0], "innerText")) } + can.page.Select(can, can.ui.content, html.TR, function(item, index, array) { if (line < 0 || line > array.length) { return } + if (!can.page.ClassList.set(can, item, html.SELECT, item == line || index+1 == line)) { return } + line = item, can.Status(kit.Dict("文件名", can.file, "解析器", can.parse, "当前行", can.onexport.position(can, can.Option(nfs.LINE, index+1)))) + }) - can.base.isObject(line) && can.page.Select(can, line, "td.text", function(item) { - can.current = { - window: function() { return parseInt(can.ui.content.offsetHeight/can.current.line.offsetHeight) }, - scroll: function(count) { if (count) { can.ui.content.scrollTop += count*can.current.line.offsetHeight } - return parseInt((can.current.line.offsetTop-can.ui.content.scrollTop)/can.current.line.offsetHeight) - }, + can.base.isObject(line) && can.page.Select(can, line, "td.text", function(item) { + can.current = { + window: function() { return parseInt(can.ui.content.offsetHeight/can.current.line.offsetHeight) }, + scroll: function(count) { if (count) { can.ui.content.scrollTop += count*can.current.line.offsetHeight } + return parseInt((can.current.line.offsetTop-can.ui.content.scrollTop)/can.current.line.offsetHeight) + }, - prev: function() { return line.previousSibling }, - next: function() { return line.nextSibling }, - line: line, text: function(text) { - return text != undefined && can.onaction.modifyLine(can, line, text), item.innerText - }, - } + prev: function() { return line.previousSibling }, + next: function() { return line.nextSibling }, + line: line, text: function(text) { + return text != undefined && can.onaction.modifyLine(can, line, text), item.innerText + }, + } - if (!event) { - var scroll = can.current.scroll(); if (scroll < 5) { can.current.scroll(scroll-5) } else { - var window = can.current.window(); if (scroll > window/2) { can.current.scroll(scroll-window/2) } - } - } else { - var scroll = can.current.scroll(); if (scroll < 3) { can.current.scroll(scroll-3) } else { - var window = can.current.window(); if (scroll > window-4) { can.current.scroll(scroll-window+4) } - } - } + if (!event) { + var scroll = can.current.scroll(); if (scroll < 5) { can.current.scroll(scroll-5) } else { + var window = can.current.window(); if (scroll > window/2) { can.current.scroll(scroll-window/2) } + } + } else { + var scroll = can.current.scroll(); if (scroll < 3) { can.current.scroll(scroll-3) } else { + var window = can.current.window(); if (scroll > window-4) { can.current.scroll(scroll-window+4) } + } + } - var push = {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()} - can.base.Eq({path: push.path, file: push.file, line: push.line}, can.history[can.history.length-1]) || can.history.push(push) - can.Status("跳转数", can.history.length) - can.onaction._selectLine(event, can) - }) - }, - _selectLine: function(event, can) { }, - searchLine: function(event, can, value) { if (!can.ui.search) { return } - can.ui.search.Update(event, [ctx.ACTION, nfs.TAGS, value.trim()]) - }, - favorLine: function(can, value) { - can.user.input(event, can, [{name: "zone", value: "hi"}, {name: "name", value: "hello"}], function(event, button, data) { - can.run(event, [ctx.ACTION, code.FAVOR, ctx.ACTION, mdb.INSERT, mdb.ZONE, data.zone||"", - mdb.TYPE, can.parse, mdb.NAME, data.name||"", mdb.TEXT, (value||"").trimRight(), - nfs.PATH, can.Option(nfs.PATH), nfs.FILE, can.Option(nfs.FILE), nfs.LINE, can.Option(nfs.LINE), - ], function(msg) { can.user.toastSuccess(can) }, true) - }) - }, + var push = {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()} + can.base.Eq({path: push.path, file: push.file, line: push.line}, can.history[can.history.length-1]) || can.history.push(push) + can.Status("跳转数", can.history.length) + can.onaction._selectLine(event, can) + }) + }, + _selectLine: function(event, can) { }, + searchLine: function(event, can, value) { if (!can.ui.search) { return } + can.ui.search.Update(event, [ctx.ACTION, nfs.TAGS, value.trim()]) + }, + favorLine: function(can, value) { + can.user.input(event, can, [{name: "zone", value: "hi"}, {name: "name", value: "hello"}], function(event, button, data) { + can.run(event, [ctx.ACTION, code.FAVOR, ctx.ACTION, mdb.INSERT, mdb.ZONE, data.zone||"", + mdb.TYPE, can.parse, mdb.NAME, data.name||"", mdb.TEXT, (value||"").trimRight(), + nfs.PATH, can.Option(nfs.PATH), nfs.FILE, can.Option(nfs.FILE), nfs.LINE, can.Option(nfs.LINE), + ], function(msg) { can.user.toastSuccess(can) }, true) + }) + }, }) Volcanos("onexport", {help: "导出数据", list: ["文件数", "解析器", "文件名", "当前行", "跳转数", "标签数"], - sess: function(can) { - localStorage.setItem("web.code.inner.sess", JSON.stringify({ - "tabs": can.onexport.tabs(can), "plug": can.onexport.plug(can), "exts": can.onexport.exts(can), - })) - }, - keys: function(can, file, path) { return (path||can.Option(nfs.PATH))+":"+(file||can.Option(nfs.FILE)) }, - tabs: function(can) { return can.core.Item(can.tabview, function(key, msg) { return key+ice.DF+msg.Option(nfs.LINE) }) }, - plug: function(can) { return can.core.Item(can.toolkit) }, - exts: function(can) { return can.core.Item(can.plugins) }, - position: function(can, index, total) { total = total||can.max - return (parseInt(index))+ice.PS+parseInt(total)+" = "+parseInt((index)*100/total)+"%" - }, - content: function(can) { - return can.page.Select(can, can.ui.content, "td.text", function(item) { return item.innerText }).join(ice.NL)+ice.NL - }, + sess: function(can) { + localStorage.setItem("web.code.inner.sess", JSON.stringify({ + "tabs": can.onexport.tabs(can), "plug": can.onexport.plug(can), "exts": can.onexport.exts(can), + })) + }, + keys: function(can, file, path) { return (path||can.Option(nfs.PATH))+":"+(file||can.Option(nfs.FILE)) }, + tabs: function(can) { return can.core.Item(can.tabview, function(key, msg) { return key+ice.DF+msg.Option(nfs.LINE) }) }, + plug: function(can) { return can.core.Item(can.toolkit) }, + exts: function(can) { return can.core.Item(can.plugins) }, + position: function(can, index, total) { total = total||can.max + return (parseInt(index))+ice.PS+parseInt(total)+" = "+parseInt((index)*100/total)+"%" + }, + content: function(can) { + return can.page.Select(can, can.ui.content, "td.text", function(item) { return item.innerText }).join(ice.NL)+ice.NL + }, }) diff --git a/plugin/local/code/inner/favor.js b/plugin/local/code/inner/favor.js index e702964f..7fd82e34 100644 --- a/plugin/local/code/inner/favor.js +++ b/plugin/local/code/inner/favor.js @@ -1,31 +1,31 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { - can.onimport.toolkit(can, {index: "web.code.favor"}, function(sub) { - sub.run = function(event, cmds, cb) { var msg = can.request(event) - if (can.misc.runAction(can, msg, cmds, cb, kit.Dict( - code.INNER, function(cmds) { - can.onimport.tabview(can, msg.Option(nfs.PATH), msg.Option(nfs.FILE), msg.Option(nfs.LINE)) - }, - ))) { return } + can.onimport.toolkit(can, {index: "web.code.favor"}, function(sub) { + sub.run = function(event, cmds, cb) { var msg = can.request(event) + if (can.misc.runAction(can, msg, cmds, cb, kit.Dict( + code.INNER, function(cmds) { + can.onimport.tabview(can, msg.Option(nfs.PATH), msg.Option(nfs.FILE), msg.Option(nfs.LINE)) + }, + ))) { return } - can.run(event, can.misc.concat(can, [ctx.ACTION, code.FAVOR], cmds), function(msg) { var sub = msg._can - sub.onmotion.clear(sub), sub.onappend.table(sub, msg, function(value, key, index, line) { - if (msg.append.length == 2 && msg.append[0] == mdb.KEY && msg.append[1] == mdb.VALUE) { - if (key == mdb.VALUE) { key = line.key } - } - if (key != ctx.ACTION) { value = sub.page.replace(sub, value, ice.PWD, "") } + can.run(event, can.misc.concat(can, [ctx.ACTION, code.FAVOR], cmds), function(msg) { var sub = msg._can + sub.onmotion.clear(sub), sub.onappend.table(sub, msg, function(value, key, index, line) { + if (msg.append.length == 2 && msg.append[0] == mdb.KEY && msg.append[1] == mdb.VALUE) { + if (key == mdb.VALUE) { key = line.key } + } + if (key != ctx.ACTION) { value = sub.page.replace(sub, value, ice.PWD, "") } - return {text: ["", html.TD], list: [{text: [value, html.DIV]}], onclick: function(event) { var target = event.target - if ([mdb.ZONE, mdb.ID].indexOf(key) > -1) { return sub.onaction.change(event, sub, key, value) } + return {text: ["", html.TD], list: [{text: [value, html.DIV]}], onclick: function(event) { var target = event.target + if ([mdb.ZONE, mdb.ID].indexOf(key) > -1) { return sub.onaction.change(event, sub, key, value) } - if (target.tagName == "INPUT" && target.type == html.BUTTON) { var msg = sub.request(event, line, sub.Option()) - return sub.run(event, [ctx.ACTION, target.name], function(msg) { sub.run() }, true) - } + if (target.tagName == "INPUT" && target.type == html.BUTTON) { var msg = sub.request(event, line, sub.Option()) + return sub.run(event, [ctx.ACTION, target.name], function(msg) { sub.run() }, true) + } - line.line && can.onimport.tabview(can, line.path, line.file.replace(ice.PWD, ""), parseInt(line.line)) - }} - }, sub._output), sub.onappend._status(sub, msg.Option(ice.MSG_STATUS)), can.Status("标签数", msg.Length()) - }, true) - }, can.base.isFunc(cb) && cb(sub) - }) + line.line && can.onimport.tabview(can, line.path, line.file.replace(ice.PWD, ""), parseInt(line.line)) + }} + }, sub._output), sub.onappend._status(sub, msg.Option(ice.MSG_STATUS)), can.Status("标签数", msg.Length()) + }, true) + }, can.base.isFunc(cb) && cb(sub) + }) }}) diff --git a/plugin/local/code/inner/search.js b/plugin/local/code/inner/search.js index f2a06174..f8665b19 100644 --- a/plugin/local/code/inner/search.js +++ b/plugin/local/code/inner/search.js @@ -1,59 +1,59 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { var history = []; const SEARCH = "can.code.inner.search" - function show(msg, word) { if (!msg) { return } history.push(msg); var sub = msg._can; sub.Option("word", word||msg._word) - !sub.page.ClassList.has(sub, sub._legend, "select") && can.ui.search.select() - sub.onmotion.clear(sub), sub.onappend.table(sub, msg, function(value, key, index, line) { - return {text: ["", html.TD], list: [{text: [can.page.replace(can, value, ice.PWD, ""), html.DIV]}], onclick: function(event) { - line.line && can.onimport.tabview(can, can.Option(nfs.PATH), line.file.replace(ice.PWD, ""), parseInt(line.line)) - }} - }, sub._output), sub.onappend.board(sub, msg.Result()), sub.onappend._status(sub, msg.Option(ice.MSG_STATUS)), can.Status("标签数", msg.Length()) - } - can.onengine.plugin(can, SEARCH, shy("搜索", {}, [ - {type: html.TEXT, name: "word", value: cli.MAIN, onkeydown: function(event, can) { - can.onmotion.selectTable(event, can.sup, event.target, function(tr) { - can.page.Select(can, tr, html.TD, function(td, index) { index == 0 && td.click() }) - tr.scrollIntoView(), can._output.scrollTop -= 60 - }) - if (event.key == lang.ENTER) { can.sup.Update(event, [ctx.ACTION, event.ctrlKey? nfs.GREP: nfs.TAGS, can.sup.Option("word")]) } - if (event.key == lang.ESCAPE) { event.target.blur() } - }}, - {type: html.TEXT, name: "filter", value: "", onkeydown: function(event, can) { - can.onmotion.selectTableInput(event, can.sup, event.target) - if (event.key == lang.ENTER) { can.sup.Update(event, [ctx.ACTION, event.ctrlKey? nfs.GREP: nfs.TAGS, can.sup.Option("word")]) } - if (event.key == lang.ESCAPE) { event.target.blur() } - }}, - {type: html.BUTTON, name: nfs.TAGS}, - {type: html.BUTTON, name: nfs.GREP}, - {type: html.BUTTON, name: cli.MAKE}, - {type: html.BUTTON, name: "history"}, - {type: html.BUTTON, name: "last", _trans: "返回"}, - ], function(msg, cmds, cb) { if (can.misc.runAction(can, msg, cmds, cb, kit.Dict( - "history", function(cmds) { - can.core.List(can.history, function(item) { - msg.Push(nfs.FILE, item.file) - msg.Push(nfs.LINE, item.line) - msg.Push(mdb.TEXT, item.text) - }) - show(msg) - }, - nfs.TAGS, function(cmds) { msg.Option(kit.Dict(ice.MSG_HANDLE, ice.TRUE, ice.MSG_FIELDS, "file,line,text")) - can.run(msg._event, [ctx.ACTION, mdb.SEARCH, can.parse, cmds[0], can.Option(nfs.PATH)], function(msg) { var sub = msg._can - can.page.style(can, sub._output, html.MAX_HEIGHT, can.ConfHeight()/4), show(msg, msg._word = cmds[0]) - can.page.ClassList.has(sub, sub._target, html.SELECT) || sub._legend.click() - can.onmotion.focus(can, msg._can._inputs["word"]._target) - }, true) - }, - nfs.GREP, function(cmds) { msg.Option(kit.Dict(ice.MSG_HANDLE, ice.TRUE, ice.MSG_FIELDS, "file,line,text", nfs.PATH, can.Option(nfs.PATH))) - can.run(msg._event, [ctx.ACTION, nfs.GREP, cmds[0]], function(msg) { var sub = msg._can - can.page.style(can, sub._output, html.MAX_HEIGHT, can.ConfHeight()/4), show(msg, msg._word = cmds[0]) - can.page.ClassList.has(sub, sub._target, html.SELECT) || sub._legend.click() - can.onmotion.focus(can, msg._can._inputs["word"]._target) - }, true) - }, - "last", function(cmds) { history.pop(), show(history.pop()) }, - ))) { return } can.run(msg._event, cmds, function(msg) { show(msg) }, true) })) - can.onimport.toolkit(can, {index: SEARCH}, function(sub) { - can.ui.search = sub, can.base.isFunc(cb) && cb(sub) - can.ui.search._show = show - }) + function show(msg, word) { if (!msg) { return } history.push(msg); var sub = msg._can; sub.Option("word", word||msg._word) + !sub.page.ClassList.has(sub, sub._legend, "select") && can.ui.search.select() + sub.onmotion.clear(sub), sub.onappend.table(sub, msg, function(value, key, index, line) { + return {text: ["", html.TD], list: [{text: [can.page.replace(can, value, ice.PWD, ""), html.DIV]}], onclick: function(event) { + line.line && can.onimport.tabview(can, can.Option(nfs.PATH), line.file.replace(ice.PWD, ""), parseInt(line.line)) + }} + }, sub._output), sub.onappend.board(sub, msg.Result()), sub.onappend._status(sub, msg.Option(ice.MSG_STATUS)), can.Status("标签数", msg.Length()) + } + can.onengine.plugin(can, SEARCH, shy("搜索", {}, [ + {type: html.TEXT, name: "word", value: cli.MAIN, onkeydown: function(event, can) { + can.onmotion.selectTable(event, can.sup, event.target, function(tr) { + can.page.Select(can, tr, html.TD, function(td, index) { index == 0 && td.click() }) + tr.scrollIntoView(), can._output.scrollTop -= 60 + }) + if (event.key == lang.ENTER) { can.sup.Update(event, [ctx.ACTION, event.ctrlKey? nfs.GREP: nfs.TAGS, can.sup.Option("word")]) } + if (event.key == lang.ESCAPE) { event.target.blur() } + }}, + {type: html.TEXT, name: "filter", value: "", onkeydown: function(event, can) { + can.onmotion.selectTableInput(event, can.sup, event.target) + if (event.key == lang.ENTER) { can.sup.Update(event, [ctx.ACTION, event.ctrlKey? nfs.GREP: nfs.TAGS, can.sup.Option("word")]) } + if (event.key == lang.ESCAPE) { event.target.blur() } + }}, + {type: html.BUTTON, name: nfs.TAGS}, + {type: html.BUTTON, name: nfs.GREP}, + {type: html.BUTTON, name: cli.MAKE}, + {type: html.BUTTON, name: "history"}, + {type: html.BUTTON, name: "last", _trans: "返回"}, + ], function(msg, cmds, cb) { if (can.misc.runAction(can, msg, cmds, cb, kit.Dict( + "history", function(cmds) { + can.core.List(can.history, function(item) { + msg.Push(nfs.FILE, item.file) + msg.Push(nfs.LINE, item.line) + msg.Push(mdb.TEXT, item.text) + }) + show(msg) + }, + nfs.TAGS, function(cmds) { msg.Option(kit.Dict(ice.MSG_HANDLE, ice.TRUE, ice.MSG_FIELDS, "file,line,text")) + can.run(msg._event, [ctx.ACTION, mdb.SEARCH, can.parse, cmds[0], can.Option(nfs.PATH)], function(msg) { var sub = msg._can + can.page.style(can, sub._output, html.MAX_HEIGHT, can.ConfHeight()/4), show(msg, msg._word = cmds[0]) + can.page.ClassList.has(sub, sub._target, html.SELECT) || sub._legend.click() + can.onmotion.focus(can, msg._can._inputs["word"]._target) + }, true) + }, + nfs.GREP, function(cmds) { msg.Option(kit.Dict(ice.MSG_HANDLE, ice.TRUE, ice.MSG_FIELDS, "file,line,text", nfs.PATH, can.Option(nfs.PATH))) + can.run(msg._event, [ctx.ACTION, nfs.GREP, cmds[0]], function(msg) { var sub = msg._can + can.page.style(can, sub._output, html.MAX_HEIGHT, can.ConfHeight()/4), show(msg, msg._word = cmds[0]) + can.page.ClassList.has(sub, sub._target, html.SELECT) || sub._legend.click() + can.onmotion.focus(can, msg._can._inputs["word"]._target) + }, true) + }, + "last", function(cmds) { history.pop(), show(history.pop()) }, + ))) { return } can.run(msg._event, cmds, function(msg) { show(msg) }, true) })) + can.onimport.toolkit(can, {index: SEARCH}, function(sub) { + can.ui.search = sub, can.base.isFunc(cb) && cb(sub) + can.ui.search._show = show + }) }}) diff --git a/plugin/local/code/inner/sess.js b/plugin/local/code/inner/sess.js index 61a4a0a4..76aed025 100644 --- a/plugin/local/code/inner/sess.js +++ b/plugin/local/code/inner/sess.js @@ -1,22 +1,22 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { var SESS = "web.code.sess" - can.onimport.toolkit(can, {index: SESS}, function(sub) { - sub.run = function(event, cmds, cb) { var msg = can.request(event) - if (can.misc.runAction(can, msg, cmds, cb, kit.Dict( - nfs.SAVE, function(cmds) { - can.run(event, [ctx.ACTION, ice.RUN, SESS].concat([ctx.ACTION, mdb.CREATE, - "tool", JSON.stringify(can.onexport.tool(can)), - "tabs", JSON.stringify(can.onexport.tabs(can)), - ]), cb, true) - }, - nfs.LOAD, function(cmds) { - can.onimport.sess(can, { - tool: JSON.parse(msg.Option("tool")), - tabs: JSON.parse(msg.Option("tabs")), - }) - }, - ))) { return } - can.run(event, [ctx.ACTION, ice.RUN, SESS].concat(cmds), cb, true) - }, can.base.isFunc(cb) && cb(sub) - }) + can.onimport.toolkit(can, {index: SESS}, function(sub) { + sub.run = function(event, cmds, cb) { var msg = can.request(event) + if (can.misc.runAction(can, msg, cmds, cb, kit.Dict( + nfs.SAVE, function(cmds) { + can.run(event, [ctx.ACTION, ice.RUN, SESS].concat([ctx.ACTION, mdb.CREATE, + "tool", JSON.stringify(can.onexport.tool(can)), + "tabs", JSON.stringify(can.onexport.tabs(can)), + ]), cb, true) + }, + nfs.LOAD, function(cmds) { + can.onimport.sess(can, { + tool: JSON.parse(msg.Option("tool")), + tabs: JSON.parse(msg.Option("tabs")), + }) + }, + ))) { return } + can.run(event, [ctx.ACTION, ice.RUN, SESS].concat(cmds), cb, true) + }, can.base.isFunc(cb) && cb(sub) + }) }}) diff --git a/plugin/local/code/inner/template.js b/plugin/local/code/inner/template.js index f972b17c..53ce786b 100644 --- a/plugin/local/code/inner/template.js +++ b/plugin/local/code/inner/template.js @@ -1,25 +1,25 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { - can.onimport.toolkit(can, {index: "web.code.template"}, function(sub) { - sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option()) - if (can.misc.runAction(can, msg, cmds, cb, kit.Dict( - nfs.DEFS, function(cmds) { - can.user.input(event, can, can.base.Obj(msg.Option("args")||"[]"), function(ev, button, data, list, args) { - var msg = can.request(event); can.core.Item(data, function(key, value) { msg.Option(key, value) }) - can.run(event, [ctx.ACTION, ice.RUN, "web.code.template", nfs.DEFS].concat(cmds), function(msg) { - can.base.isFunc(cb) && cb(msg) - can.onimport.project(can, can.Option(nfs.PATH)) - can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option("main"), "", function() { - can.onimport.tabview(can, can.Option(nfs.PATH), cmds[1], 1, function() {}) - }, true) - }, true) - }) - }, - ))) { return } - can.run(event, [ctx.ACTION, ice.RUN, "web.code.template"].concat(cmds), function(msg) { - can.base.isFunc(cb) && cb(msg) - }, true) - }, can.base.isFunc(cb) && cb(sub) - }) + can.onimport.toolkit(can, {index: "web.code.template"}, function(sub) { + sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option()) + if (can.misc.runAction(can, msg, cmds, cb, kit.Dict( + nfs.DEFS, function(cmds) { + can.user.input(event, can, can.base.Obj(msg.Option("args")||"[]"), function(ev, button, data, list, args) { + var msg = can.request(event); can.core.Item(data, function(key, value) { msg.Option(key, value) }) + can.run(event, [ctx.ACTION, ice.RUN, "web.code.template", nfs.DEFS].concat(cmds), function(msg) { + can.base.isFunc(cb) && cb(msg) + can.onimport.project(can, can.Option(nfs.PATH)) + can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option("main"), "", function() { + can.onimport.tabview(can, can.Option(nfs.PATH), cmds[1], 1, function() {}) + }, true) + }, true) + }) + }, + ))) { return } + can.run(event, [ctx.ACTION, ice.RUN, "web.code.template"].concat(cmds), function(msg) { + can.base.isFunc(cb) && cb(msg) + }, true) + }, can.base.isFunc(cb) && cb(sub) + }) }}) diff --git a/plugin/local/code/snippet.js b/plugin/local/code/snippet.js index 63072916..90bd4141 100644 --- a/plugin/local/code/snippet.js +++ b/plugin/local/code/snippet.js @@ -1,31 +1,31 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.onmotion.clear(can) - if (msg.Option("content")) { - can.onappend.plugin(can, {index: "web.code.vimer", style: "full"}, function(sub) { - sub.run = function(event, cmds, cb) { var res = can.request(event) - if (cmds[1] == "plugin") { - can.run(event, can.misc.concat(can, ["action", "vimer"], cmds), cb, true) - return - } - if (cmds[1] == "main.go") { res.Echo(msg.Option("content")) - can.core.Timer(100, function() { can.sub && can.sub.onaction["项目"]({}, can.sub) }) - } - cb(res), can.sub = can.core.Value(sub, "_outputs.-1") - } - }, can._output) - return - } - can.onappend.table(can, msg) - can.onappend.board(can, msg) - }, + can.onmotion.clear(can) + if (msg.Option("content")) { + can.onappend.plugin(can, {index: "web.code.vimer", style: "full"}, function(sub) { + sub.run = function(event, cmds, cb) { var res = can.request(event) + if (cmds[1] == "plugin") { + can.run(event, can.misc.concat(can, ["action", "vimer"], cmds), cb, true) + return + } + if (cmds[1] == "main.go") { res.Echo(msg.Option("content")) + can.core.Timer(100, function() { can.sub && can.sub.onaction["项目"]({}, can.sub) }) + } + cb(res), can.sub = can.core.Value(sub, "_outputs.-1") + } + }, can._output) + return + } + can.onappend.table(can, msg) + can.onappend.board(can, msg) + }, }) Volcanos("onaction", {help: "操作数据", list: [], _init: function(can, msg, list, cb, target) { - }, - run: function(event, can, msg) { - can.run(event, [ctx.ACTION, ice.RUN, "go", "hi.go", can.sub.onexport.content(can.sub)], function(msg) { - can.onappend.board(can, msg) - }, true) - }, + }, + run: function(event, can, msg) { + can.run(event, [ctx.ACTION, ice.RUN, "go", "hi.go", can.sub.onexport.content(can.sub)], function(msg) { + can.onappend.board(can, msg) + }, true) + }, }) Volcanos("onexport", {help: "导出数据", list: [], _init: function(can, msg, list, cb, target) { }}) diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index c570a15b..b1c79152 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -1,196 +1,196 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, cb, target) { - can.require(["inner.js"], function(can) { can.onimport.inner_init(can, msg, function() { - can.onkeymap._build(can), can.onimport._input(can), can.onkeymap._plugin({}, can), can.base.isFunc(cb) && cb(msg) - }, target) }, function(can, name, sub) { name == chat.ONIMPORT && (can.onimport.inner_init = sub._init) - if (name == chat.ONKEYMAP) { - can.base.Copy(can.onkeymap._mode, sub._mode) - can.core.Item(can.onkeymap._mode.normal, function(k, v) { - if (!sub._mode.plugin[k]) { sub._mode.plugin[k] = v } - }) - can.core.Item(sub._mode.plugin, function(k, v) { - if (!can.onkeymap._mode.normal[k]) { can.onkeymap._mode.normal[k] = v } - }) - } - }) - }, - _input: function(can) { - can.ui.current = can.page.Append(can, can.ui.content.parentNode, [ - {view: ["current", html.INPUT], onkeydown: function(event) { if (event.metaKey) { return } - can.misc.Debug("key", event.key) - can._keylist = can.onkeymap._parse(event, can, can.mode+(event.ctrlKey? "_ctrl": ""), can._keylist, can.ui.current) - can.mode == "insert" && can.core.Timer(10, function() { can.current.text(can.ui.current.value) }) - can.mode == "normal" && can.Status("按键", can._keylist.join("")) - can.mode == "normal" && can.onkeymap.prevent(event) - }, onclick: function(event) { can.onkeymap._insert(event, can) }, - ondblclick: function(event) { var target = event.target - can.onaction.searchLine(event, can, target.value.slice(target.selectionStart, target.selectionEnd)) - }, - }, - ]).first - }, + can.require(["inner.js"], function(can) { can.onimport.inner_init(can, msg, function() { + can.onkeymap._build(can), can.onimport._input(can), can.onkeymap._plugin({}, can), can.base.isFunc(cb) && cb(msg) + }, target) }, function(can, name, sub) { name == chat.ONIMPORT && (can.onimport.inner_init = sub._init) + if (name == chat.ONKEYMAP) { + can.base.Copy(can.onkeymap._mode, sub._mode) + can.core.Item(can.onkeymap._mode.normal, function(k, v) { + if (!sub._mode.plugin[k]) { sub._mode.plugin[k] = v } + }) + can.core.Item(sub._mode.plugin, function(k, v) { + if (!can.onkeymap._mode.normal[k]) { can.onkeymap._mode.normal[k] = v } + }) + } + }) + }, + _input: function(can) { + can.ui.current = can.page.Append(can, can.ui.content.parentNode, [ + {view: ["current", html.INPUT], onkeydown: function(event) { if (event.metaKey) { return } + can.misc.Debug("key", event.key) + can._keylist = can.onkeymap._parse(event, can, can.mode+(event.ctrlKey? "_ctrl": ""), can._keylist, can.ui.current) + can.mode == "insert" && can.core.Timer(10, function() { can.current.text(can.ui.current.value) }) + can.mode == "normal" && can.Status("按键", can._keylist.join("")) + can.mode == "normal" && can.onkeymap.prevent(event) + }, onclick: function(event) { can.onkeymap._insert(event, can) }, + ondblclick: function(event) { var target = event.target + can.onaction.searchLine(event, can, target.value.slice(target.selectionStart, target.selectionEnd)) + }, + }, + ]).first + }, }, [""]) Volcanos("onkeymap", {help: "键盘交互", list: [], - _model: function(can, value) { can.Status("模式", can.mode = value) - return can.page.Modify(can, can.ui.current, {className: "current"+ice.SP+can.mode}), value - }, - _plugin: function(event, can) { can.onkeymap._model(can, "plugin") - can.ui.current.blur() - }, - _normal: function(event, can) { can.onkeymap._model(can, "normal") - can.ui.current.focus(), can.ui.content.scrollLeft -= 10000 - }, - _insert: function(event, can) { can.onkeymap._model(can, "insert") - can.ui.current.focus(), can.ui.content.scrollLeft -= 10000 - can.onkeymap.prevent(event) - }, + _model: function(can, value) { can.Status("模式", can.mode = value) + return can.page.Modify(can, can.ui.current, {className: "current"+ice.SP+can.mode}), value + }, + _plugin: function(event, can) { can.onkeymap._model(can, "plugin") + can.ui.current.blur() + }, + _normal: function(event, can) { can.onkeymap._model(can, "normal") + can.ui.current.focus(), can.ui.content.scrollLeft -= 10000 + }, + _insert: function(event, can) { can.onkeymap._model(can, "insert") + can.ui.current.focus(), can.ui.content.scrollLeft -= 10000 + can.onkeymap.prevent(event) + }, - _mode: { - normal_ctrl: { - f: function(event, can, target, count) { - var line = can.onaction.selectLine(event, can)+can.current.window()-3-can.current.scroll() - return can.current.scroll(line), can.onaction.selectLine(event, can, line), true - }, - b: function(event, can, target, count) { - var line = can.onaction.selectLine(event, can)-can.current.window()+3 - return can.current.scroll(line), can.onaction.selectLine(event, can, line), true - }, - }, - normal: { - escape: function(event, can) { can.onkeymap._plugin(event, can) }, - ArrowLeft: function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) }, - ArrowRight: function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) }, - ArrowDown: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) }, - ArrowUp: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) }, + _mode: { + normal_ctrl: { + f: function(event, can, target, count) { + var line = can.onaction.selectLine(event, can)+can.current.window()-3-can.current.scroll() + return can.current.scroll(line), can.onaction.selectLine(event, can, line), true + }, + b: function(event, can, target, count) { + var line = can.onaction.selectLine(event, can)-can.current.window()+3 + return can.current.scroll(line), can.onaction.selectLine(event, can, line), true + }, + }, + normal: { + escape: function(event, can) { can.onkeymap._plugin(event, can) }, + ArrowLeft: function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) }, + ArrowRight: function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) }, + ArrowDown: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) }, + ArrowUp: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) }, - H: function(event, can, target) { can.onkeymap.cursorMove(can, target, 0, 0) }, - h: function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) }, - l: function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) }, - L: function(event, can, target) { can.onkeymap.cursorMove(can, target, 0, -1) }, - j: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) }, - k: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) }, + H: function(event, can, target) { can.onkeymap.cursorMove(can, target, 0, 0) }, + h: function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) }, + l: function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) }, + L: function(event, can, target) { can.onkeymap.cursorMove(can, target, 0, -1) }, + j: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) }, + k: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) }, - gg: function(event, can, target, count) { return can.onaction.selectLine(event, can, count), true }, - G: function(event, can, target, count) { return can.onaction.selectLine(event, can, count = count>1? count: can.max), true }, - zt: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-(count>1? count: 3)), true }, - zz: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-(count = count>1? count: can.current.window()/2)), true }, - zb: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-can.current.window()+(count>1? count: 5)), true }, + gg: function(event, can, target, count) { return can.onaction.selectLine(event, can, count), true }, + G: function(event, can, target, count) { return can.onaction.selectLine(event, can, count = count>1? count: can.max), true }, + zt: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-(count>1? count: 3)), true }, + zz: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-(count = count>1? count: can.current.window()/2)), true }, + zb: function(event, can, target, count) { return can.current.scroll(can.current.scroll()-can.current.window()+(count>1? count: 5)), true }, - i: function(event, can) { can.onkeymap._insert(event, can) }, - I: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 0, 0) }, - a: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 1) }, - A: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 0, -1) }, - o: function(event, can) { can.onkeymap._insert(event, can), can.onaction.selectLine(event, can, can.onaction.insertLine(can, "", can.current.next())) }, - O: function(event, can) { can.onkeymap._insert(event, can), can.onaction.selectLine(event, can, can.onaction.insertLine(can, "", can.current.line)) }, + i: function(event, can) { can.onkeymap._insert(event, can) }, + I: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 0, 0) }, + a: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 1) }, + A: function(event, can, target) { can.onkeymap._insert(event, can), can.onkeymap.cursorMove(can, target, 0, -1) }, + o: function(event, can) { can.onkeymap._insert(event, can), can.onaction.selectLine(event, can, can.onaction.insertLine(can, "", can.current.next())) }, + O: function(event, can) { can.onkeymap._insert(event, can), can.onaction.selectLine(event, can, can.onaction.insertLine(can, "", can.current.line)) }, - yy: function(event, can, target, count) { can._last_text = can.current.text() }, - dd: function(event, can, target, count) { can._last_text = can.current.text(), can.onaction.selectLine(event, can, can.onaction.deleteLine(can, can.current.line)) }, - p: function(event, can) { can.onaction.insertLine(can, can._last_text, can.current.next()) }, - P: function(event, can) { can.onaction.insertLine(can, can._last_text, can.current.line) }, + yy: function(event, can, target, count) { can._last_text = can.current.text() }, + dd: function(event, can, target, count) { can._last_text = can.current.text(), can.onaction.selectLine(event, can, can.onaction.deleteLine(can, can.current.line)) }, + p: function(event, can) { can.onaction.insertLine(can, can._last_text, can.current.next()) }, + P: function(event, can) { can.onaction.insertLine(can, can._last_text, can.current.line) }, - s: function(event, can) { can.onaction.save(event, can) }, - m: function(event, can) { can.onaction.autogen(event, can, "autogen") }, - c: function(event, can) { can.onaction.compile(event, can, "compile") }, - }, - insert: { - jk: function(event, can, target) { can.onkeymap._normal(event, can), - can.onkeymap.deleteText(target, target.selectionStart-1, 1) - can.current.text(can.ui.current.value) - }, - Escape: function(event, can) { can.onkeymap._normal(event, can) }, - Tab: function(event, can) { - can.onkeymap.insertText(can.ui.current, "\t") - can.onkeymap.prevent(event) - }, + s: function(event, can) { can.onaction.save(event, can) }, + m: function(event, can) { can.onaction.autogen(event, can, "autogen") }, + c: function(event, can) { can.onaction.compile(event, can, "compile") }, + }, + insert: { + jk: function(event, can, target) { can.onkeymap._normal(event, can), + can.onkeymap.deleteText(target, target.selectionStart-1, 1) + can.current.text(can.ui.current.value) + }, + Escape: function(event, can) { can.onkeymap._normal(event, can) }, + Tab: function(event, can) { + can.onkeymap.insertText(can.ui.current, "\t") + can.onkeymap.prevent(event) + }, - Enter: function(event, can, target) { - var line = can.onaction.insertLine(can, can.onkeymap.deleteText(target, target.selectionEnd), can.current.next()) - can.current.text(can.ui.current.value), can.onaction.selectLine(event, can, line) - }, - Backspace: function(event, can, target) { - if (target.selectionStart > 0) { return } - if (!can.current.prev()) { return } - can.onkeymap.prevent(event) + Enter: function(event, can, target) { + var line = can.onaction.insertLine(can, can.onkeymap.deleteText(target, target.selectionEnd), can.current.next()) + can.current.text(can.ui.current.value), can.onaction.selectLine(event, can, line) + }, + Backspace: function(event, can, target) { + if (target.selectionStart > 0) { return } + if (!can.current.prev()) { return } + can.onkeymap.prevent(event) - var rest = can.current.text() - can.onaction.selectLine(event, can, can.current.prev()) - can.onaction.deleteLine(can, can.current.next()) - var pos = can.current.text().length + var rest = can.current.text() + can.onaction.selectLine(event, can, can.current.prev()) + can.onaction.deleteLine(can, can.current.next()) + var pos = can.current.text().length - can.ui.current.value = can.current.text()+rest - can.onkeymap.cursorMove(can, can.ui.current, 0, pos) - }, - ArrowUp: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) }, - ArrowDown: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) }, - }, - }, _engine: {}, + can.ui.current.value = can.current.text()+rest + can.onkeymap.cursorMove(can, can.ui.current, 0, pos) + }, + ArrowUp: function(event, can) { can.onaction.selectLine(event, can, can.current.prev()) }, + ArrowDown: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) }, + }, + }, _engine: {}, }) Volcanos("onaction", {help: "控件交互", list: ["加载", nfs.SAVE, "autogen", "compile", "binpack", "刷新"], - "刷新": function(event, can) { - can.onimport.tabview(can, "src/", "main.go", "", function() {}, true) - }, - "加载": function(event, can) { - var file = "/share/local/"+can.Option(nfs.PATH)+can.Option(nfs.FILE) - delete(Volcanos.meta.cache[file]) - var script = `\n_can_name = "`+file+`"\n`+ - can.onexport.content(can)+ - `\n_can_name = ""\nconsole.log("once")` - eval(script) - }, - save: function(event, can) { var msg = can.request(event, {content: can.onexport.content(can)}) - can.run(event, [ctx.ACTION, nfs.SAVE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { - can.user.toastSuccess(can) - }, true) - }, - autogen: function(event, can, button) { var meta = can.Conf(), msg = can.request(event, {_handle: ice.TRUE}) - can.user.input(event, can, meta.feature[button], function(ev, btn, data, list, args) { - can.run(event, [ctx.ACTION, button].concat(args), function(msg) { - can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option(nfs.FILE)) - can.onimport.project(can, can.Option(nfs.PATH)) - }, true) - }) - }, - compile: function(event, can, button) { var msg = can.ui.search.request(event, {_handle: ice.TRUE, _toast: "编译中..."}) - can.run(event, [ctx.ACTION, button], function(msg) { - if (msg.Length() == 0) { var toast = can.user.toast(can, "重启中...", "", -1) - can.core.Timer(5000, function() { toast.close(), can.onaction["展示"]({}, can) }) - } else { - can.ui.search._show(msg) - } - }, true) - }, + "刷新": function(event, can) { + can.onimport.tabview(can, "src/", "main.go", "", function() {}, true) + }, + "加载": function(event, can) { + var file = "/share/local/"+can.Option(nfs.PATH)+can.Option(nfs.FILE) + delete(Volcanos.meta.cache[file]) + var script = `\n_can_name = "`+file+`"\n`+ + can.onexport.content(can)+ + `\n_can_name = ""\nconsole.log("once")` + eval(script) + }, + save: function(event, can) { var msg = can.request(event, {content: can.onexport.content(can)}) + can.run(event, [ctx.ACTION, nfs.SAVE, can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { + can.user.toastSuccess(can) + }, true) + }, + autogen: function(event, can, button) { var meta = can.Conf(), msg = can.request(event, {_handle: ice.TRUE}) + can.user.input(event, can, meta.feature[button], function(ev, btn, data, list, args) { + can.run(event, [ctx.ACTION, button].concat(args), function(msg) { + can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option(nfs.FILE)) + can.onimport.project(can, can.Option(nfs.PATH)) + }, true) + }) + }, + compile: function(event, can, button) { var msg = can.ui.search.request(event, {_handle: ice.TRUE, _toast: "编译中..."}) + can.run(event, [ctx.ACTION, button], function(msg) { + if (msg.Length() == 0) { var toast = can.user.toast(can, "重启中...", "", -1) + can.core.Timer(5000, function() { toast.close(), can.onaction["展示"]({}, can) }) + } else { + can.ui.search._show(msg) + } + }, true) + }, - _selectLine: function(event, can) { - can.page.Select(can, can.current.line, "td.text", function(td) { can.current.line.appendChild(can.ui.current) - can.page.Modify(can, can.ui.current, {style: kit.Dict(html.LEFT, td.offsetLeft-1, html.WIDTH,td.offsetWidth-12), value: td.innerText}) - if (event) { if (can.mode == "plugin") { can.onkeymap._insert(event, can) } - can.ui.current.focus(), can.onkeymap.cursorMove(can, can.ui.current, 0, (event.offsetX)/13-1) - can.ui.content.scrollLeft -= 10000 - } - }) - }, - rerankLine: function(can, value) { can.max = 0 - can.page.Select(can, can.ui.content, html.TR, function(item, index) { - can.max++, can.page.Select(can, item, "td.line", function(item) { item.innerText = index+1 }) - }) - }, - insertLine: function(can, value, before) { - var line = can.onaction.appendLine(can, value) - before && can.ui.content.insertBefore(line, before) - return can.onaction.rerankLine(can), line - }, - deleteLine: function(can, line) { - var next = line.nextSibling||line.previousSibling - can.page.Remove(can, line), can.onaction.rerankLine(can) - return next - }, - modifyLine: function(can, line, value) { - can.page.Select(can, can.ui.content, html.TR, function(item, index) { - if (item != line && index+1 != line) { return } - can.page.Select(can, item, "td.text", function(item) { - can.page.Appends(can, item, [can.onsyntax._parse(can, value)]) - }) - }) - }, + _selectLine: function(event, can) { + can.page.Select(can, can.current.line, "td.text", function(td) { can.current.line.appendChild(can.ui.current) + can.page.Modify(can, can.ui.current, {style: kit.Dict(html.LEFT, td.offsetLeft-1, html.WIDTH,td.offsetWidth-12), value: td.innerText}) + if (event) { if (can.mode == "plugin") { can.onkeymap._insert(event, can) } + can.ui.current.focus(), can.onkeymap.cursorMove(can, can.ui.current, 0, (event.offsetX)/13-1) + can.ui.content.scrollLeft -= 10000 + } + }) + }, + rerankLine: function(can, value) { can.max = 0 + can.page.Select(can, can.ui.content, html.TR, function(item, index) { + can.max++, can.page.Select(can, item, "td.line", function(item) { item.innerText = index+1 }) + }) + }, + insertLine: function(can, value, before) { + var line = can.onaction.appendLine(can, value) + before && can.ui.content.insertBefore(line, before) + return can.onaction.rerankLine(can), line + }, + deleteLine: function(can, line) { + var next = line.nextSibling||line.previousSibling + can.page.Remove(can, line), can.onaction.rerankLine(can) + return next + }, + modifyLine: function(can, line, value) { + can.page.Select(can, can.ui.content, html.TR, function(item, index) { + if (item != line && index+1 != line) { return } + can.page.Select(can, item, "td.text", function(item) { + can.page.Appends(can, item, [can.onsyntax._parse(can, value)]) + }) + }) + }, }) Volcanos("onexport", {help: "导出数据", list: ["文件数", "模式", "按键", "解析器", "文件名", "当前行", "跳转数"]}) diff --git a/plugin/local/team/plan.js b/plugin/local/team/plan.js index 03b7a87b..4535ee00 100644 --- a/plugin/local/team/plan.js +++ b/plugin/local/team/plan.js @@ -1,199 +1,199 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.onmotion.clear(can, target) - can.ui = can.onlayout.profile(can) - can.onmotion.hidden(can, can._action) - can.onimport[can.Option("scale")||"week"](can, msg) - can.page.Modify(can, can.ui.project, {style: {"max-height": can.ui.content.offsetHeight}}) - can.page.Modify(can, can.ui.profile, {style: {"max-height": can.ui.content.offsetHeight}}) - can.page.Modify(can, can.ui.profile, {style: {display: "block"}}) - can.base.isFunc(cb) && cb(msg) - }, - _content: function(can, msg, head, list, key, get, set) { - var hash = {}; msg.Table(function(value, index) { - var k = key(can.base.Date(value.begin_time)); hash[k] = (hash[k]||[]).concat([value]) - }) + can.onmotion.clear(can, target) + can.ui = can.onlayout.profile(can) + can.onmotion.hidden(can, can._action) + can.onimport[can.Option("scale")||"week"](can, msg) + can.page.Modify(can, can.ui.project, {style: {"max-height": can.ui.content.offsetHeight}}) + can.page.Modify(can, can.ui.profile, {style: {"max-height": can.ui.content.offsetHeight}}) + can.page.Modify(can, can.ui.profile, {style: {display: "block"}}) + can.base.isFunc(cb) && cb(msg) + }, + _content: function(can, msg, head, list, key, get, set) { + var hash = {}; msg.Table(function(value, index) { + var k = key(can.base.Date(value.begin_time)); hash[k] = (hash[k]||[]).concat([value]) + }) - can.sup.task && (can.sup.task._target = null) - var begin_time = can.base.Date(can.Option("begin_time")) - can.page.Append(can, can.ui.content, [{view: [chat.CONTENT, html.TABLE], list: can.core.List(list, function(hour, row) { - return {type: html.TR, list: can.core.List(head, function(week, col) { - if (row == 0) { return {text: [week, html.TH]} } - if (col == 0) { return {text: [hour, html.TD]} } - return can.onimport._task(can, msg, get(begin_time, col, row, hash), set(begin_time, col, row)) - })} - }) }]) - can.core.Timer(10, function() { if (!can.sup.task) { return } - var target = can.sup.task._target||can.task._target - can.sup.task = null, target.click() - can.Status("count", msg.Length()) - }) - }, - _task: function(can, msg, list, time) { return {text: ["", html.TD], - ondblclick: function(event) { - can.onaction.insertTask(event, can, time+can.base.Time(null, "%y-%m-%d %H:%M:%S").slice(time.length)) - }, - ondrop: function(event) { event.preventDefault() - can.drop(event, event.target, time) - }, - ondragover: function(event) { event.preventDefault() - can.page.Select(can, can.ui.content, html.TD, function(item) { - can.page.ClassList[event.target == item? "add": "del"](can, item, "over") - }) - }, - list: can.core.List(list, function(task) { return can.base.isString(task)? {text: [task, html.DIV, "date"]}: - {text: [can.onexport[can.Action("view")||"text"](can, task), html.DIV, can.onexport.style(can, task)], - ondragstart: function(event) { var target = event.target; can.drop = function(event, td, time) { td.append(target) - can.onaction.modifyTask(event, can, task, "begin_time", time+task.begin_time.slice(time.length), task.begin_time) - } }, draggable: time != undefined, + can.sup.task && (can.sup.task._target = null) + var begin_time = can.base.Date(can.Option("begin_time")) + can.page.Append(can, can.ui.content, [{view: [chat.CONTENT, html.TABLE], list: can.core.List(list, function(hour, row) { + return {type: html.TR, list: can.core.List(head, function(week, col) { + if (row == 0) { return {text: [week, html.TH]} } + if (col == 0) { return {text: [hour, html.TD]} } + return can.onimport._task(can, msg, get(begin_time, col, row, hash), set(begin_time, col, row)) + })} + }) }]) + can.core.Timer(10, function() { if (!can.sup.task) { return } + var target = can.sup.task._target||can.task._target + can.sup.task = null, target.click() + can.Status("count", msg.Length()) + }) + }, + _task: function(can, msg, list, time) { return {text: ["", html.TD], + ondblclick: function(event) { + can.onaction.insertTask(event, can, time+can.base.Time(null, "%y-%m-%d %H:%M:%S").slice(time.length)) + }, + ondrop: function(event) { event.preventDefault() + can.drop(event, event.target, time) + }, + ondragover: function(event) { event.preventDefault() + can.page.Select(can, can.ui.content, html.TD, function(item) { + can.page.ClassList[event.target == item? "add": "del"](can, item, "over") + }) + }, + list: can.core.List(list, function(task) { return can.base.isString(task)? {text: [task, html.DIV, "date"]}: + {text: [can.onexport[can.Action("view")||"text"](can, task), html.DIV, can.onexport.style(can, task)], + ondragstart: function(event) { var target = event.target; can.drop = function(event, td, time) { td.append(target) + can.onaction.modifyTask(event, can, task, "begin_time", time+task.begin_time.slice(time.length), task.begin_time) + } }, draggable: time != undefined, - title: can.onexport.title(can, task), _init: function(target) { - var item = can.onappend.item(can, html.ITEM, {nick: task.name+":"+task.text}, function() { - can.core.Timer(10, function() { can.onmotion.select(can, can.ui.content, html.TD, target.parentNode) }) - can.onimport._profile(can, task) - }, function() { + title: can.onexport.title(can, task), _init: function(target) { + var item = can.onappend.item(can, html.ITEM, {nick: task.name+":"+task.text}, function() { + can.core.Timer(10, function() { can.onmotion.select(can, can.ui.content, html.TD, target.parentNode) }) + can.onimport._profile(can, task) + }, function() { - }, can.ui.project); task._target = target, can.task = can.task||task, can.sup.task = can.sup.task||task - can.sup.task.zone == task.zone && can.sup.task.id == task.id && (can.sup.task._target = target) - target.onclick = function(event) { item.click() } - }, - } - }), - } }, - _profile: function(can, task) { - if (can.sup.task && can.sup.task.pod == task.pod && can.sup.task.id == task.id) { return } - if (can.onmotion.cache(can, function() { return can.sup.task = task, can.Status(task), [task.pod, task.zone, task.id].join(ice.PT) }, can.ui.profile, can.ui.display)) { return } + }, can.ui.project); task._target = target, can.task = can.task||task, can.sup.task = can.sup.task||task + can.sup.task.zone == task.zone && can.sup.task.id == task.id && (can.sup.task._target = target) + target.onclick = function(event) { item.click() } + }, + } + }), + } }, + _profile: function(can, task) { + if (can.sup.task && can.sup.task.pod == task.pod && can.sup.task.id == task.id) { return } + if (can.onmotion.cache(can, function() { return can.sup.task = task, can.Status(task), [task.pod, task.zone, task.id].join(ice.PT) }, can.ui.profile, can.ui.display)) { return } - task.extra && can.core.Item(can.base.Obj(task.extra), function(key, value) { task["extra."+key] = value }), delete(task.extra) - var table = can.page.Appends(can, can.ui.profile, [{view: [chat.CONTENT, html.TABLE], list: [{th: ["key", "value"]}]}]).first - can.core.Item(task, function(key, value) { key != "_target" && can.page.Append(can, table, [{ - td: [key, key == "pod" && value != ""? can.page.Format("a", can.misc.MergeURL(can, {pod: value}), value): value], - onclick: function(event) { if (event.target.type == "button") { var msg = can.request(event, can.sup.task) - can.run(event, [ctx.ACTION, event.target.name], function(msg) { can.Update() }, true) - } }, - ondblclick: function(event) { can.onmotion.modify(can, event.target, function(ev, value, old) { - can.onaction.modifyTask(event, can, task, key, value) - }, {name: key, action: key.indexOf("time") > 0? "date": "key"}) }, - }]) }), can.onimport._display(can, task) - }, - _display: function(can, task) { if (!task["extra.cmd"]) { return } - can.onappend.plugin(can, {type: chat.STORY, ctx: task["extra.ctx"], cmd: task["extra.cmd"], arg: task["extra.arg"]}, function(sub, meta) { - sub.run = function(event, cmds, cb) { var msg = can.request(event, kit.Dict("task.pod", task["pod"], "task.zone", task.zone, "task.id", task.id)) - can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, task[mdb.ZONE], task[mdb.ID]], cmds), cb, true) - } - }, can.ui.display) - can.page.Modify(can, can.ui.display, {style: {display: html.BLOCK}}) - }, + task.extra && can.core.Item(can.base.Obj(task.extra), function(key, value) { task["extra."+key] = value }), delete(task.extra) + var table = can.page.Appends(can, can.ui.profile, [{view: [chat.CONTENT, html.TABLE], list: [{th: ["key", "value"]}]}]).first + can.core.Item(task, function(key, value) { key != "_target" && can.page.Append(can, table, [{ + td: [key, key == "pod" && value != ""? can.page.Format("a", can.misc.MergeURL(can, {pod: value}), value): value], + onclick: function(event) { if (event.target.type == "button") { var msg = can.request(event, can.sup.task) + can.run(event, [ctx.ACTION, event.target.name], function(msg) { can.Update() }, true) + } }, + ondblclick: function(event) { can.onmotion.modify(can, event.target, function(ev, value, old) { + can.onaction.modifyTask(event, can, task, key, value) + }, {name: key, action: key.indexOf("time") > 0? "date": "key"}) }, + }]) }), can.onimport._display(can, task) + }, + _display: function(can, task) { if (!task["extra.cmd"]) { return } + can.onappend.plugin(can, {type: chat.STORY, ctx: task["extra.ctx"], cmd: task["extra.cmd"], arg: task["extra.arg"]}, function(sub, meta) { + sub.run = function(event, cmds, cb) { var msg = can.request(event, kit.Dict("task.pod", task["pod"], "task.zone", task.zone, "task.id", task.id)) + can.run(event, can.misc.concat(can, [ctx.ACTION, ice.RUN, task[mdb.ZONE], task[mdb.ID]], cmds), cb, true) + } + }, can.ui.display) + can.page.Modify(can, can.ui.display, {style: {display: html.BLOCK}}) + }, - day: function(can, msg) { - var head = ["hour", "task"] - var list = [0]; for (var i = 7; i < 24; i++) { list.push(can.base.Number(i, 2)) } + day: function(can, msg) { + var head = ["hour", "task"] + var list = [0]; for (var i = 7; i < 24; i++) { list.push(can.base.Number(i, 2)) } - function key(time) { return can.base.Number(time.getHours(), 2) } - function get(begin_time, col, row, hash) { return hash[list[row]] } - function set(begin_time, col, row) { return can.base.Time(begin_time, "%y-%m-%d ")+list[row] } + function key(time) { return can.base.Number(time.getHours(), 2) } + function get(begin_time, col, row, hash) { return hash[list[row]] } + function set(begin_time, col, row) { return can.base.Time(begin_time, "%y-%m-%d ")+list[row] } - can.onimport._content(can, msg, head, list, key, get, set) - }, - week: function(can, msg) { - var head = ["hour"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"]) - var list = [0]; for (var i = 7; i < 24; i++) { list.push(can.base.Number(i, 2)) } + can.onimport._content(can, msg, head, list, key, get, set) + }, + week: function(can, msg) { + var head = ["hour"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"]) + var list = [0]; for (var i = 7; i < 24; i++) { list.push(can.base.Number(i, 2)) } - function key(time) { return time.getDay()+" "+can.base.Number(time.getHours(), 2) } - function get(begin_time, col, row, hash) { return hash[col-1+" "+list[row]] } - function set(begin_time, col, row) { return can.base.Time(can.base.TimeAdd(begin_time, -begin_time.getDay()+col-1), "%y-%m-%d ")+list[row] } + function key(time) { return time.getDay()+" "+can.base.Number(time.getHours(), 2) } + function get(begin_time, col, row, hash) { return hash[col-1+" "+list[row]] } + function set(begin_time, col, row) { return can.base.Time(can.base.TimeAdd(begin_time, -begin_time.getDay()+col-1), "%y-%m-%d ")+list[row] } - can.onimport._content(can, msg, head, list, key, get, set) - }, - month: function(can, msg) { - var head = ["order"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"]) - var list = [0]; for (var i = 1; i < 6; i++) { list.push(i) } + can.onimport._content(can, msg, head, list, key, get, set) + }, + month: function(can, msg) { + var head = ["order"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"]) + var list = [0]; for (var i = 1; i < 6; i++) { list.push(i) } - function key(time) { return can.base.Time(time, "%y-%m-%d") } - function get(begin_time, col, row, hash) { - var begin = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)) - var last = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)-begin.getDay()) - var day = can.base.TimeAdd(last, (row-1)*7+col) - return [day.getDate()+""].concat(hash[key(day)]||[]) - } - function set(begin_time, col, row) { - var begin = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)) - var last = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)-begin.getDay()) - var day = can.base.TimeAdd(last, (row-1)*7+col) - return key(day) - } + function key(time) { return can.base.Time(time, "%y-%m-%d") } + function get(begin_time, col, row, hash) { + var begin = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)) + var last = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)-begin.getDay()) + var day = can.base.TimeAdd(last, (row-1)*7+col) + return [day.getDate()+""].concat(hash[key(day)]||[]) + } + function set(begin_time, col, row) { + var begin = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)) + var last = can.base.TimeAdd(begin_time, -(begin_time.getDate()-1)-begin.getDay()) + var day = can.base.TimeAdd(last, (row-1)*7+col) + return key(day) + } - can.onimport._content(can, msg, head, list, key, get, set) - }, - year: function(can, msg) { - var head = ["month"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"]); - var list = [0]; for (var i = 1; i < 13; i++) { list.push(i) } + can.onimport._content(can, msg, head, list, key, get, set) + }, + year: function(can, msg) { + var head = ["month"].concat(["周日", "周一", "周二", "周三", "周四", "周五", "周六"]); + var list = [0]; for (var i = 1; i < 13; i++) { list.push(i) } - function key(time) { return can.base.Time(time, "%y-%m ")+time.getDay() } - function get(begin_time, col, row, hash) { return hash[begin_time.getFullYear()+"-"+can.base.Number(row, 2)+" "+(col-1)] } - function set(begin_time, col, row) { return begin_time.getFullYear()+"-"+can.base.Number(list[row], 2) } + function key(time) { return can.base.Time(time, "%y-%m ")+time.getDay() } + function get(begin_time, col, row, hash) { return hash[begin_time.getFullYear()+"-"+can.base.Number(row, 2)+" "+(col-1)] } + function set(begin_time, col, row) { return begin_time.getFullYear()+"-"+can.base.Number(list[row], 2) } - can.onimport._content(can, msg, head, list, key, get, set) - }, - long: function(can, msg) { - var begin_time = can.base.Date(can.base.Time(can.Option("begin_time"), "%y-%m-%d %H:%M:%S")) - var begin = begin_time.getFullYear() - 5 + can.onimport._content(can, msg, head, list, key, get, set) + }, + long: function(can, msg) { + var begin_time = can.base.Date(can.base.Time(can.Option("begin_time"), "%y-%m-%d %H:%M:%S")) + var begin = begin_time.getFullYear() - 5 - var head = ["month"]; for (var i = 0; i < 10; i++) { head.push(begin+i) } - var list = [0]; for (var i = 1; i < 13; i++) { list.push(i) } + var head = ["month"]; for (var i = 0; i < 10; i++) { head.push(begin+i) } + var list = [0]; for (var i = 1; i < 13; i++) { list.push(i) } - function key(time) { return can.base.Time(time, "%y-%m") } - function get(begin_time, col, row, hash) { return hash[begin+col-1+"-"+can.base.Number(row, 2)] } - function set(begin_time, col, row) { return begin+col-1+"-"+can.base.Number(row, 2) } + function key(time) { return can.base.Time(time, "%y-%m") } + function get(begin_time, col, row, hash) { return hash[begin+col-1+"-"+can.base.Number(row, 2)] } + function set(begin_time, col, row) { return begin+col-1+"-"+can.base.Number(row, 2) } - can.onimport._content(can, msg, head, list, key, get, set) - }, + can.onimport._content(can, msg, head, list, key, get, set) + }, }, [""]) Volcanos("onaction", {help: "组件交互", list: [ - ["level", "all", "l1", "l2", "l3", "l4", "l5"], - ["status", "all", "prepare", "process", "cancel", "finish"], - ["score", "all", "s1", "s2", "s3", "s4", "s5"], - ["view", "", "name", "text", "level", "score"], - ], - insertTask: function(event, can, time) { var msg = can.sup.request(event, {begin_time: time}) - can.user.input(event, can, can.Conf("feature.insert"), function(event, button, data, list) { - can.run(event, can.base.Simple(ctx.ACTION, mdb.INSERT, data, "begin_time", time), true) - }) - }, - modifyTask: function(event, can, task, key, value) { var msg = can.request(event, task) - can.run(event, [ctx.ACTION, mdb.MODIFY, key, value, task[key]]) - }, + ["level", "all", "l1", "l2", "l3", "l4", "l5"], + ["status", "all", "prepare", "process", "cancel", "finish"], + ["score", "all", "s1", "s2", "s3", "s4", "s5"], + ["view", "", "name", "text", "level", "score"], + ], + insertTask: function(event, can, time) { var msg = can.sup.request(event, {begin_time: time}) + can.user.input(event, can, can.Conf("feature.insert"), function(event, button, data, list) { + can.run(event, can.base.Simple(ctx.ACTION, mdb.INSERT, data, "begin_time", time), true) + }) + }, + modifyTask: function(event, can, task, key, value) { var msg = can.request(event, task) + can.run(event, [ctx.ACTION, mdb.MODIFY, key, value, task[key]]) + }, - _filter: function(event, can, key, value) { var count = 0 - if (value == "all") { - can.page.Select(can, can.ui.content, "div.item", function(item) { - can.page.ClassList.del(can, item, "hide"), count++ - }) - } else { - can.page.Select(can, can.ui.content, "div.item", function(item) { - can.page.ClassList.add(can, item, "hide") - }) - can.page.Select(can, can.ui.content, "div."+value, function(item) { - can.page.ClassList.del(can, item, "hide"), count++ - }) - } - can.Action(key, value), can.Status("count", count) - }, - level: function(event, can, key, value) { can.onaction._filter(event, can, key, value) }, - status: function(event, can, key, value) { can.onaction._filter(event, can, key, value) }, - score: function(event, can, key, value) { can.onaction._filter(event, can, key, value) }, - view: function(event, can, key, value) { - can.Action(key, value) - can.onmotion.clear(can, can.ui.project) - can.onmotion.clear(can, can.ui.content) - can.onimport[can.Option("scale")](can, can._msg) - }, + _filter: function(event, can, key, value) { var count = 0 + if (value == "all") { + can.page.Select(can, can.ui.content, "div.item", function(item) { + can.page.ClassList.del(can, item, "hide"), count++ + }) + } else { + can.page.Select(can, can.ui.content, "div.item", function(item) { + can.page.ClassList.add(can, item, "hide") + }) + can.page.Select(can, can.ui.content, "div."+value, function(item) { + can.page.ClassList.del(can, item, "hide"), count++ + }) + } + can.Action(key, value), can.Status("count", count) + }, + level: function(event, can, key, value) { can.onaction._filter(event, can, key, value) }, + status: function(event, can, key, value) { can.onaction._filter(event, can, key, value) }, + score: function(event, can, key, value) { can.onaction._filter(event, can, key, value) }, + view: function(event, can, key, value) { + can.Action(key, value) + can.onmotion.clear(can, can.ui.project) + can.onmotion.clear(can, can.ui.content) + can.onimport[can.Option("scale")](can, can._msg) + }, }) Volcanos("onexport", {help: "导出数据", list: ["count", "begin_time", "zone", "id", "type", "name", "text"], - name: function(can, task) { return task.name }, - text: function(can, task) { return task.name+": "+(task.text||"") }, - level: function(can, task) { return "l-"+(task.level||3)+": "+(task.name||"") }, - score: function(can, task) { return "s-"+(task.level||3)+": "+(task.name||"") }, - title: function(can, task) { return task.zone+": "+(task.type||"") }, - style: function(can, task) { return ["item", task.status, "id"+task.id, "l"+(task.level||""), "s"+(task.score||"")].join(" ") }, + name: function(can, task) { return task.name }, + text: function(can, task) { return task.name+": "+(task.text||"") }, + level: function(can, task) { return "l-"+(task.level||3)+": "+(task.name||"") }, + score: function(can, task) { return "s-"+(task.level||3)+": "+(task.name||"") }, + title: function(can, task) { return task.zone+": "+(task.type||"") }, + style: function(can, task) { return ["item", task.status, "id"+task.id, "l"+(task.level||""), "s"+(task.score||"")].join(" ") }, }) diff --git a/plugin/local/wiki/data.js b/plugin/local/wiki/data.js index ca01bc11..24692757 100644 --- a/plugin/local/wiki/data.js +++ b/plugin/local/wiki/data.js @@ -1,143 +1,143 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb) { - can.ui = can.onlayout.display(can) - can.base.isFunc(cb) && cb(msg) + can.ui = can.onlayout.display(can) + can.base.isFunc(cb) && cb(msg) - can.table = can.onappend.table(can, msg, function(value, key, index, line) { - return {text: [value, "td"], oncontextmenu: function(event) { - can.user.carte(event, can, can.ondetail, can.ondetail.list, function(ev, cmd, meta) { - var cb = meta[cmd]; cb && cb(event, can, cmd, value, key, index, line) - }) - }, ondblclick: function(event) { - can.page.Modify(can, event.target, {contenteditable: true}) - }, onclick: function(event) { - if (key == "path") { can.run(event, [can.Option("path", value)]) } - }} - }, can.ui.content) + can.table = can.onappend.table(can, msg, function(value, key, index, line) { + return {text: [value, "td"], oncontextmenu: function(event) { + can.user.carte(event, can, can.ondetail, can.ondetail.list, function(ev, cmd, meta) { + var cb = meta[cmd]; cb && cb(event, can, cmd, value, key, index, line) + }) + }, ondblclick: function(event) { + can.page.Modify(can, event.target, {contenteditable: true}) + }, onclick: function(event) { + if (key == "path") { can.run(event, [can.Option("path", value)]) } + }} + }, can.ui.content) - can.onexport.list = msg.append - can.onaction._compute(event, can) - }, + can.onexport.list = msg.append + can.onaction._compute(event, can) + }, }) Volcanos("onfigure", {help: "组件菜单", list: [], - "求和": function(event, can, res, td, index) { - res[index] = parseInt(td.innerText) + (res[index]||0); - }, - "最大": function(event, can, res, td, index) { - var n = parseInt(td.innerText); - n > (res[index]||-10000) && (res[index] = n); - }, - "最小": function(event, can, res, td, index) { - var n = parseInt(td.innerText); - n < (res[index]||10000) && (res[index] = n); - }, - "平均": function(event, can, res, td, ncol, cols, rows, nrow) { - res[ncol] = parseInt(td.innerText) + (res[ncol]||0); - if (nrow == rows.length - 1) { - res[ncol] = res[ncol] / nrow - } - }, + "求和": function(event, can, res, td, index) { + res[index] = parseInt(td.innerText) + (res[index]||0); + }, + "最大": function(event, can, res, td, index) { + var n = parseInt(td.innerText); + n > (res[index]||-10000) && (res[index] = n); + }, + "最小": function(event, can, res, td, index) { + var n = parseInt(td.innerText); + n < (res[index]||10000) && (res[index] = n); + }, + "平均": function(event, can, res, td, ncol, cols, rows, nrow) { + res[ncol] = parseInt(td.innerText) + (res[ncol]||0); + if (nrow == rows.length - 1) { + res[ncol] = res[ncol] / nrow + } + }, }) Volcanos("onaction", {help: "组件菜单", list: ["保存", ["mode", "全选", "块选", "反选", "多选", "拖动", "编辑"], ["some", "求和", "最大", "最小", "平均"]], - _compute: function(event, can) { - var mul = "tr" + (can.Action("mode") == "全选"? "": ".select") - var method = can.onfigure[can.Action("some")], res = {} + _compute: function(event, can) { + var mul = "tr" + (can.Action("mode") == "全选"? "": ".select") + var method = can.onfigure[can.Action("some")], res = {} - can.page.Select(can, can.ui.content, mul, function(tr, nrow, rows) { - (mul != "tr" || nrow > 0) && can.page.Select(can, tr, "td", function(td, ncol, cols) { - method && method(event, can, res, td, ncol, cols, rows, nrow) - }) - }) + can.page.Select(can, can.ui.content, mul, function(tr, nrow, rows) { + (mul != "tr" || nrow > 0) && can.page.Select(can, tr, "td", function(td, ncol, cols) { + method && method(event, can, res, td, ncol, cols, rows, nrow) + }) + }) - can.core.Item(res, function(key, value) { - can.Status(can._msg.append[key], value||"") - }) - }, + can.core.Item(res, function(key, value) { + can.Status(can._msg.append[key], value||"") + }) + }, - "保存": function(event, can, cmd) { - can.run(event, [ctx.ACTION, cmd, can.Option("path"), can.onexport.file(can)], function(msg) { - can.user.toastSuccess(can) - }, true) - }, - some: function(event, can, cmd) { - can.onaction._compute(event, can) - }, + "保存": function(event, can, cmd) { + can.run(event, [ctx.ACTION, cmd, can.Option("path"), can.onexport.file(can)], function(msg) { + can.user.toastSuccess(can) + }, true) + }, + some: function(event, can, cmd) { + can.onaction._compute(event, can) + }, - "全选": function(event, can, cmd) { - cmd && can.Action("mode", cmd) - can.page.Select(can, can.ui.content, "tr", function(item) { - can.page.ClassList.del(can, item, "over") - can.page.ClassList.del(can, item, "select") - item.setAttribute("contenteditable", false) - item.setAttribute("draggable", false) - item.onmouseenter = null - item.onclick = null - }) - can.onaction._compute(event, can) - }, - "块选": function(event, can, cmd) { - cmd && can.Action("mode", cmd) - can.page.Select(can, can.ui.content, "tr", function(item) { - item.onmouseenter = function() { - can.page.ClassList.add(can, item, "select") - can.onaction._compute(event, can) - } - }) - }, - "反选": function(event, can, cmd) { - cmd && can.Action("mode", cmd) - can.page.Select(can, can.ui.content, "tr", function(item) { - item.onmouseenter = function() { - can.page.ClassList.del(can, item, "select") - can.onaction._compute(event, can) - } - }) - }, - "多选": function(event, can, cmd) { - cmd && can.Action("mode", cmd) - can.page.Select(can, can.ui.content, "tr", function(item) { - item.onclick = function() { - can.page.ClassList.neg(can, item, "select") - can.onaction._compute(event, can) - } - }) - }, - "拖动": function(event, can, cmd) { - can.onaction["全选"](event, can, cmd) - can.page.Select(can, can.ui.content, "tr", function(item) { - item.setAttribute("draggable", true) - item.ondragstart = function(event) { can.drag = item } - item.ondragover = function(event) { event.preventDefault(), can.page.ClassList.add(can, item, "over")} - item.ondragleave = function(event) { can.page.ClassList.del(can, item, "over") } - item.ondrop = function(event) { event.preventDefault() - can.page.Select(can, can.ui.content, "table", function(table) { - table.insertBefore(can.drag, item) - }) - } - }) - }, - "编辑": function(event, can, cmd) { - cmd && can.Action("mode", cmd) - can.page.Select(can, can.ui.content, "tr", function(item) { - item.setAttribute("contenteditable", true) - }) - }, + "全选": function(event, can, cmd) { + cmd && can.Action("mode", cmd) + can.page.Select(can, can.ui.content, "tr", function(item) { + can.page.ClassList.del(can, item, "over") + can.page.ClassList.del(can, item, "select") + item.setAttribute("contenteditable", false) + item.setAttribute("draggable", false) + item.onmouseenter = null + item.onclick = null + }) + can.onaction._compute(event, can) + }, + "块选": function(event, can, cmd) { + cmd && can.Action("mode", cmd) + can.page.Select(can, can.ui.content, "tr", function(item) { + item.onmouseenter = function() { + can.page.ClassList.add(can, item, "select") + can.onaction._compute(event, can) + } + }) + }, + "反选": function(event, can, cmd) { + cmd && can.Action("mode", cmd) + can.page.Select(can, can.ui.content, "tr", function(item) { + item.onmouseenter = function() { + can.page.ClassList.del(can, item, "select") + can.onaction._compute(event, can) + } + }) + }, + "多选": function(event, can, cmd) { + cmd && can.Action("mode", cmd) + can.page.Select(can, can.ui.content, "tr", function(item) { + item.onclick = function() { + can.page.ClassList.neg(can, item, "select") + can.onaction._compute(event, can) + } + }) + }, + "拖动": function(event, can, cmd) { + can.onaction["全选"](event, can, cmd) + can.page.Select(can, can.ui.content, "tr", function(item) { + item.setAttribute("draggable", true) + item.ondragstart = function(event) { can.drag = item } + item.ondragover = function(event) { event.preventDefault(), can.page.ClassList.add(can, item, "over")} + item.ondragleave = function(event) { can.page.ClassList.del(can, item, "over") } + item.ondrop = function(event) { event.preventDefault() + can.page.Select(can, can.ui.content, "table", function(table) { + table.insertBefore(can.drag, item) + }) + } + }) + }, + "编辑": function(event, can, cmd) { + cmd && can.Action("mode", cmd) + can.page.Select(can, can.ui.content, "tr", function(item) { + item.setAttribute("contenteditable", true) + }) + }, }) Volcanos("ondetail", {help: "组件详情", list: ["复制", "删除"], - "复制": function(event, can, cmd, value, key, index, line) { - var end = can.page.Append(can, can.table, [{type: "tr", list: can.core.List(can._msg.append, function(key) { - return {text: [line[key], "td"]} - })}]).tr - can.table.insertBefore(end, event.target.parentNode) - }, - "删除": function(event, can, cmd) { - can.page.Remove(can, event.target.parentNode) - }, + "复制": function(event, can, cmd, value, key, index, line) { + var end = can.page.Append(can, can.table, [{type: "tr", list: can.core.List(can._msg.append, function(key) { + return {text: [line[key], "td"]} + })}]).tr + can.table.insertBefore(end, event.target.parentNode) + }, + "删除": function(event, can, cmd) { + can.page.Remove(can, event.target.parentNode) + }, }) Volcanos("onexport", {help: "导出数据", list: [], - file: function(can) { - return can.page.Select(can, can.ui.content, "tr", function(tr) { - return can.page.Select(can, tr, "th,td", function(td) {return td.innerHTML}).join(",") - }).join("\n") - }, + file: function(can) { + return can.page.Select(can, can.ui.content, "tr", function(tr) { + return can.page.Select(can, tr, "th,td", function(td) {return td.innerHTML}).join(",") + }).join("\n") + }, }) diff --git a/plugin/local/wiki/draw.js b/plugin/local/wiki/draw.js index 5e31277c..1705df6a 100644 --- a/plugin/local/wiki/draw.js +++ b/plugin/local/wiki/draw.js @@ -1,590 +1,590 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.onmotion.clear(can), can.onmotion.hidden(can, can._action) - can.onimport._show(can, msg), can.base.isFunc(cb) && cb(msg) - can.keylist = [], can.onkeymap._build(can) - }, - _show: function(can, msg) { can.point = [] - can.svg = null, can.group = null, can.temp = null, can.current = null + can.onmotion.clear(can), can.onmotion.hidden(can, can._action) + can.onimport._show(can, msg), can.base.isFunc(cb) && cb(msg) + can.keylist = [], can.onkeymap._build(can) + }, + _show: function(can, msg) { can.point = [] + can.svg = null, can.group = null, can.temp = null, can.current = null - // 加载图形 - can.ui = can.onlayout.profile(can), can.onmotion.hidden(can, can.ui.project) - can.page.Modify(can, can.ui.content, msg.Result()||can.onexport.content(can)) - can.page.Select(can, can.ui.content, html.SVG, function(svg) { - can.svg = can.group = can.onimport._block(can, svg), can.onimport._group(can, svg).click() - can.core.ItemCB(can.onaction, function(key, cb) { svg[key] = function(event) { cb(event, can) } }) - can.page.Select(can, svg, "*", function(item, index) { can.onimport._block(can, item) - item.tagName == svg.G && item.Value(html.CLASS) && can.onimport._group(can, item) - }) - }) - // 默认参数 - can.core.Timer(10, function() { - can.core.Item({ - "stroke-width": 2, stroke: cli.YELLOW, fill: cli.PURPLE, - "font-size": 24, "font-family": html.MONOSPACE, - go: ice.RUN, shape: "rect", grid: 10, - }, function(key, value) { can.svg.Value(key, can.Action(key, can.svg.Value(key)||value)) }) + // 加载图形 + can.ui = can.onlayout.profile(can), can.onmotion.hidden(can, can.ui.project) + can.page.Modify(can, can.ui.content, msg.Result()||can.onexport.content(can)) + can.page.Select(can, can.ui.content, html.SVG, function(svg) { + can.svg = can.group = can.onimport._block(can, svg), can.onimport._group(can, svg).click() + can.core.ItemCB(can.onaction, function(key, cb) { svg[key] = function(event) { cb(event, can) } }) + can.page.Select(can, svg, "*", function(item, index) { can.onimport._block(can, item) + item.tagName == svg.G && item.Value(html.CLASS) && can.onimport._group(can, item) + }) + }) + // 默认参数 + can.core.Timer(10, function() { + can.core.Item({ + "stroke-width": 2, stroke: cli.YELLOW, fill: cli.PURPLE, + "font-size": 24, "font-family": html.MONOSPACE, + go: ice.RUN, shape: "rect", grid: 10, + }, function(key, value) { can.svg.Value(key, can.Action(key, can.svg.Value(key)||value)) }) - var pid = can.Option("pid")||can.svg.Value("pid"); can.onmotion.hidden(can, can.ui.profile, true) - pid && can.page.Select(can, can.svg, ice.PT+pid, function(item) { - can.ondetail.run({target: item}, can), can.onimport._profile(can, item) - }) || can.onimport._profile(can, can.svg), can.onmotion.hidden(can, can.ui.profile) - can.page.Modify(can, can.ui.display, {style: {"min-height": 80, "max-height": can.Conf("height")-can.svg.Val("height")-52}}) - }) - }, - _group: function(can, target) { var name = target.Groups() - function show(event) { can.group = target - can.core.List([html.STROKE_WIDTH, html.STROKE, html.FILL, html.FONT_SIZE], function(key) { - can.Action(key, target.Value(key)||can.Action(key)) - }) - } - return (name || target == can.svg) && can.onappend.item(can, html.ITEM, {name: name||html.SVG}, function(event) { show(event) - can.onaction.show(event, can) - }, function(event) { - can.user.carteRight(event, can, can.onaction, [ice.HIDE, ice.SHOW, mdb.CREATE, cli.CLEAR, mdb.REMOVE]) - }, can.ui.project) - }, - _block: function(can, target) { - target.oncontextmenu = function(event) { - var carte = can.user.carte(event, can, can.ondetail, null, function(ev, button, meta) { - meta[button](event, can, button) - }); can.page.Modify(can, carte._target, {style: {left: event.clientX, top: event.clientY}}) - } - target.Val = function(key, value) { - return parseInt(target.Value(key, value == undefined? value: parseInt(value)||0))||0 - } - target.Value = function(key, value) { if (can.base.isUndefined(key)) { return } - if (can.base.isObject(key)) { can.core.Item(key, target.Value); return } + var pid = can.Option("pid")||can.svg.Value("pid"); can.onmotion.hidden(can, can.ui.profile, true) + pid && can.page.Select(can, can.svg, ice.PT+pid, function(item) { + can.ondetail.run({target: item}, can), can.onimport._profile(can, item) + }) || can.onimport._profile(can, can.svg), can.onmotion.hidden(can, can.ui.profile) + can.page.Modify(can, can.ui.display, {style: {"min-height": 80, "max-height": can.Conf("height")-can.svg.Val("height")-52}}) + }) + }, + _group: function(can, target) { var name = target.Groups() + function show(event) { can.group = target + can.core.List([html.STROKE_WIDTH, html.STROKE, html.FILL, html.FONT_SIZE], function(key) { + can.Action(key, target.Value(key)||can.Action(key)) + }) + } + return (name || target == can.svg) && can.onappend.item(can, html.ITEM, {name: name||html.SVG}, function(event) { show(event) + can.onaction.show(event, can) + }, function(event) { + can.user.carteRight(event, can, can.onaction, [ice.HIDE, ice.SHOW, mdb.CREATE, cli.CLEAR, mdb.REMOVE]) + }, can.ui.project) + }, + _block: function(can, target) { + target.oncontextmenu = function(event) { + var carte = can.user.carte(event, can, can.ondetail, null, function(ev, button, meta) { + meta[button](event, can, button) + }); can.page.Modify(can, carte._target, {style: {left: event.clientX, top: event.clientY}}) + } + target.Val = function(key, value) { + return parseInt(target.Value(key, value == undefined? value: parseInt(value)||0))||0 + } + target.Value = function(key, value) { if (can.base.isUndefined(key)) { return } + if (can.base.isObject(key)) { can.core.Item(key, target.Value); return } - var figure = can.onfigure._get(can, target) - key = figure && figure.data && figure.data.size && figure.data.size[key] || key - if (figure && figure.data && can.base.isFunc(figure.data[key])) { - return figure.data[key](can, value, key, target) - } + var figure = can.onfigure._get(can, target) + key = figure && figure.data && figure.data.size && figure.data.size[key] || key + if (figure && figure.data && can.base.isFunc(figure.data[key])) { + return figure.data[key](can, value, key, target) + } - if (key == html.INNER) { - return value != undefined && (target.innerHTML = value), target.innerHTML - } - if (key == ice.SHIP) { - return value != undefined && target.setAttribute(key, JSON.stringify(value)), can.base.Obj(target.getAttribute(key), []) - } - return value != undefined && target.setAttribute(key, value), target.getAttribute(key||html.CLASS) - || target[key]&&target[key].baseVal&&target[key].baseVal.value || target[key]&&target[key].baseVal || "" - } - target.Group = function() { var item = target - while (item) { if ([html.SVG, svg.G].indexOf(item.tagName) > -1) { return item }; item = item.parentNode } - return can.svg - } - target.Groups = function() { var item = target - var list = []; while (item && item.tagName != html.SVG) { - item.tagName == svg.G && item.Value(html.CLASS) && list.push(item.Value(html.CLASS)) - item = item.parentNode - } - return list.reverse().join(ice.PT) - } - return target - }, - _profile: function(can, target, list) { can.Option("pid", can.onfigure._pid(can, target)) - if (can.onmotion.cache(can, function() { return target.Value("pid") }, can.ui.profile)) { return } + if (key == html.INNER) { + return value != undefined && (target.innerHTML = value), target.innerHTML + } + if (key == ice.SHIP) { + return value != undefined && target.setAttribute(key, JSON.stringify(value)), can.base.Obj(target.getAttribute(key), []) + } + return value != undefined && target.setAttribute(key, value), target.getAttribute(key||html.CLASS) + || target[key]&&target[key].baseVal&&target[key].baseVal.value || target[key]&&target[key].baseVal || "" + } + target.Group = function() { var item = target + while (item) { if ([html.SVG, svg.G].indexOf(item.tagName) > -1) { return item }; item = item.parentNode } + return can.svg + } + target.Groups = function() { var item = target + var list = []; while (item && item.tagName != html.SVG) { + item.tagName == svg.G && item.Value(html.CLASS) && list.push(item.Value(html.CLASS)) + item = item.parentNode + } + return list.reverse().join(ice.PT) + } + return target + }, + _profile: function(can, target, list) { can.Option("pid", can.onfigure._pid(can, target)) + if (can.onmotion.cache(can, function() { return target.Value("pid") }, can.ui.profile)) { return } - var action = can.page.Append(can, can.ui.profile, [{view: "action"}]).first - can.onappend._action(can, can.ondetail.list, action, {_engine: function(event, can, button) { - can.ondetail[button]({target: target}, can, button) - }}) + var action = can.page.Append(can, can.ui.profile, [{view: "action"}]).first + can.onappend._action(can, can.ondetail.list, action, {_engine: function(event, can, button) { + can.ondetail[button]({target: target}, can, button) + }}) - var figure = can.onfigure._get(can, target) - list = (list||[]).concat(figure.data.copy, [svg.X, svg.Y, mdb.INDEX, ctx.ARGS]) - can.page.Append(can, can.ui.profile, [{type: html.TABLE, className: "content", list: [ - {th: [mdb.KEY, mdb.VALUE]}, {td: [mdb.TYPE, target.tagName]}, {td: ["pid", target.Value("pid")]}, - ].concat(can.core.List(list, function(key) { - return key = figure.data.size[key]||key, {td: [key, target.Value(key)], ondblclick: function(event) { - can.onmotion.modify(can, event.target, function(event, value, old) { - target.Value(key, value), can.onfigure._move(can, target) - }) - }} - })) }]) + var figure = can.onfigure._get(can, target) + list = (list||[]).concat(figure.data.copy, [svg.X, svg.Y, mdb.INDEX, ctx.ARGS]) + can.page.Append(can, can.ui.profile, [{type: html.TABLE, className: "content", list: [ + {th: [mdb.KEY, mdb.VALUE]}, {td: [mdb.TYPE, target.tagName]}, {td: ["pid", target.Value("pid")]}, + ].concat(can.core.List(list, function(key) { + return key = figure.data.size[key]||key, {td: [key, target.Value(key)], ondblclick: function(event) { + can.onmotion.modify(can, event.target, function(event, value, old) { + target.Value(key, value), can.onfigure._move(can, target) + }) + }} + })) }]) - }, - draw: function(event, can, value) { - var figure = can.onfigure[value.shape] - var data = figure.draw(event, can, value.point, value.style) - can.core.Item(value.style, function(key, value) { data[key] = value }) - var item = can.onfigure._push(can, figure.data.name||value.shape, data, can.group||can.svg) - can.core.ItemCB(value, function(key, cb) { item[key] = cb }) - can.onimport._block(can, item), can.onfigure._pid(can, item) - return value._init && value._init(item), item - }, + }, + draw: function(event, can, value) { + var figure = can.onfigure[value.shape] + var data = figure.draw(event, can, value.point, value.style) + can.core.Item(value.style, function(key, value) { data[key] = value }) + var item = can.onfigure._push(can, figure.data.name||value.shape, data, can.group||can.svg) + can.core.ItemCB(value, function(key, cb) { item[key] = cb }) + can.onimport._block(can, item), can.onfigure._pid(can, item) + return value._init && value._init(item), item + }, }, ["/plugin/local/wiki/draw.css"]) Volcanos("onfigure", {help: "图形绘制", list: [], - _get: function(can, item, name) { - return can.onfigure[name]||can.onfigure[item.getAttribute(mdb.NAME)]||can.onfigure[item.tagName] - }, - _pid: function(can, item) { if (item.Value("pid")) { return item.Value("pid") } - var pid = "p"+can.svg.Val(mdb.COUNT, can.svg.Val(mdb.COUNT)+1) - item.Value(html.CLASS, (item.Value(html.CLASS)+ice.SP+item.Value("pid", pid)).trim()) - return pid - }, - _push: function(can, type, data, target) { - var item = document.createElementNS("http://www.w3.org/2000/svg", type) - target.appendChild(can.onimport._block(can, item)), item.Value(data) - return item - }, - _copy: function(event, can, target) { - var data = {}, figure = can.onfigure._get(can, target), size = figure.data.size - can.core.List(figure.data.copy, function(item) { data[item] = target.Value(item) }) - data[size.x||svg.X] = target.Val(size.x||svg.X)+10 - data[size.y||svg.Y] = target.Val(size.y||svg.Y)+10 - return can.onfigure._push(can, target.tagName, data, can.group||can.svg) - }, - _move: function(can, target, list) { - can.core.List(list||target.Value(ice.SHIP), function(ship) { - ship.target = can.page.Select(can, can.svg, ice.PT+ship.pid)[0] - var p = can.onexport.anchor(target, ship.anchor, {}) - if (ship.which == 1) { - ship.target.Val("x1", p.x), ship.target.Val("y1", p.y) - } else if (ship.which == 2) { - ship.target.Val("x2", p.x), ship.target.Val("y2", p.y) - } - }) - }, + _get: function(can, item, name) { + return can.onfigure[name]||can.onfigure[item.getAttribute(mdb.NAME)]||can.onfigure[item.tagName] + }, + _pid: function(can, item) { if (item.Value("pid")) { return item.Value("pid") } + var pid = "p"+can.svg.Val(mdb.COUNT, can.svg.Val(mdb.COUNT)+1) + item.Value(html.CLASS, (item.Value(html.CLASS)+ice.SP+item.Value("pid", pid)).trim()) + return pid + }, + _push: function(can, type, data, target) { + var item = document.createElementNS("http://www.w3.org/2000/svg", type) + target.appendChild(can.onimport._block(can, item)), item.Value(data) + return item + }, + _copy: function(event, can, target) { + var data = {}, figure = can.onfigure._get(can, target), size = figure.data.size + can.core.List(figure.data.copy, function(item) { data[item] = target.Value(item) }) + data[size.x||svg.X] = target.Val(size.x||svg.X)+10 + data[size.y||svg.Y] = target.Val(size.y||svg.Y)+10 + return can.onfigure._push(can, target.tagName, data, can.group||can.svg) + }, + _move: function(can, target, list) { + can.core.List(list||target.Value(ice.SHIP), function(ship) { + ship.target = can.page.Select(can, can.svg, ice.PT+ship.pid)[0] + var p = can.onexport.anchor(target, ship.anchor, {}) + if (ship.which == 1) { + ship.target.Val("x1", p.x), ship.target.Val("y1", p.y) + } else if (ship.which == 2) { + ship.target.Val("x2", p.x), ship.target.Val("y2", p.y) + } + }) + }, - svg: { // - data: {size: {}, copy: []}, - show: function(can, target, figure) { return can.onexport._size(can, target, figure) } - }, - text: { // hi - data: {points: 1, size: {}, copy: [html.INNER]}, - draw: function(event, can, point, style) { if (point.length < 1 || event.type == "mousemove") { return } - var p0 = point[0], text = style&&style.inner||can.user.prompt(mdb.TEXT) - return text? {x: p0.x, y: p0.y, inner: text}: null - }, - show: function(can, target, figure) { return can.onexport._position(can, target, figure) } - }, - circle: { // - data: {points: 2, size: {height: svg.R, width: svg.R, x: "cx", y: "cy"}, copy: [svg.R]}, - draw: function(event, can, point) { if (point.length < 2) { return } - var p0 = point[0], p1 = point[1] - return {r: parseInt(Math.sqrt(Math.pow(p0.x-p1.x, 2)+Math.pow(p0.y-p1.y, 2))), cx: p0.x, cy: p0.y} - }, - }, - ellipse: { // - data: {points: 2, size: {height: "ry", width: "rx", x: "cx", y: "cy"}, copy: ["ry", "rx"]}, - draw: function(event, can, point) { if (point.length < 2) { return } - var p0 = point[0], p1 = point[1] - return {ry: Math.abs(p0.y - p1.y), rx: Math.abs(p0.x - p1.x), cx: p0.x, cy: p0.y} - }, - }, - rect: { // - data: {points: 2, ry: 4, rx: 4, size: {}, copy: [html.HEIGHT, html.WIDTH, "ry", "rx"]}, - draw: function(event, can, point) { if (point.length < 2) { return } - var p0 = point[0], p1 = point[1] - return { - height: Math.abs(p0.y-p1.y), width: Math.abs(p0.x-p1.x), ry: this.data.ry, rx: this.data.rx, - x: p0.x > p1.x? p1.x: p0.x, y: p0.y > p1.y? p1.y: p0.y, - } - }, - text: function(can, data, target) { return data.x = target.Val(svg.X)+target.Val(html.WIDTH)/2, data.y = target.Val(svg.Y)+target.Val(html.HEIGHT)/2, data }, - }, - block: { // - data: {points: 2, ry: 4, rx: 4, size: {}, copy: [html.HEIGHT, html.WIDTH, "ry", "rx"]}, - draw: function(event, can, point) { if (point.length < 2) { return } - this._temp && can.page.Remove(can, this._temp) && delete(this._temp) - this._temp = can.onfigure._push(can, svg.G, {}, can.group||can.svg) + svg: { // + data: {size: {}, copy: []}, + show: function(can, target, figure) { return can.onexport._size(can, target, figure) } + }, + text: { // hi + data: {points: 1, size: {}, copy: [html.INNER]}, + draw: function(event, can, point, style) { if (point.length < 1 || event.type == "mousemove") { return } + var p0 = point[0], text = style&&style.inner||can.user.prompt(mdb.TEXT) + return text? {x: p0.x, y: p0.y, inner: text}: null + }, + show: function(can, target, figure) { return can.onexport._position(can, target, figure) } + }, + circle: { // + data: {points: 2, size: {height: svg.R, width: svg.R, x: "cx", y: "cy"}, copy: [svg.R]}, + draw: function(event, can, point) { if (point.length < 2) { return } + var p0 = point[0], p1 = point[1] + return {r: parseInt(Math.sqrt(Math.pow(p0.x-p1.x, 2)+Math.pow(p0.y-p1.y, 2))), cx: p0.x, cy: p0.y} + }, + }, + ellipse: { // + data: {points: 2, size: {height: "ry", width: "rx", x: "cx", y: "cy"}, copy: ["ry", "rx"]}, + draw: function(event, can, point) { if (point.length < 2) { return } + var p0 = point[0], p1 = point[1] + return {ry: Math.abs(p0.y - p1.y), rx: Math.abs(p0.x - p1.x), cx: p0.x, cy: p0.y} + }, + }, + rect: { // + data: {points: 2, ry: 4, rx: 4, size: {}, copy: [html.HEIGHT, html.WIDTH, "ry", "rx"]}, + draw: function(event, can, point) { if (point.length < 2) { return } + var p0 = point[0], p1 = point[1] + return { + height: Math.abs(p0.y-p1.y), width: Math.abs(p0.x-p1.x), ry: this.data.ry, rx: this.data.rx, + x: p0.x > p1.x? p1.x: p0.x, y: p0.y > p1.y? p1.y: p0.y, + } + }, + text: function(can, data, target) { return data.x = target.Val(svg.X)+target.Val(html.WIDTH)/2, data.y = target.Val(svg.Y)+target.Val(html.HEIGHT)/2, data }, + }, + block: { // + data: {points: 2, ry: 4, rx: 4, size: {}, copy: [html.HEIGHT, html.WIDTH, "ry", "rx"]}, + draw: function(event, can, point) { if (point.length < 2) { return } + this._temp && can.page.Remove(can, this._temp) && delete(this._temp) + this._temp = can.onfigure._push(can, svg.G, {}, can.group||can.svg) - var rect = can.onfigure._push(can, "rect", can.onfigure.rect.draw(event, can, point), this._temp) - if (event.type == html.CLICK) { - can.onfigure._pid(can, rect), delete(this._temp) - } - }, - text: function(can, data, target) { can.onfigure.rect.text(can, data, target) }, - }, - line: { // - data: {points: 2, size: {x: "x1", y: "y1"}, copy: ["x1", "y1", "x2", "y2"]}, - grid: function(event, can, point) { var target = event.target - if (target == can.svg) { return } - var p = point[point.length-1], pos = can.onexport.cursor(event, can, target) - target.Val && can.onexport.anchor(target, pos, p) - return p.target = target, p.anchor = pos, point - }, - draw: function(event, can, point) { if (point.length < 2) { return } - var p0 = point[0], p1 = point[1], ship = [] - p0.target && p0.target.Value && ship.push({pid: p0.target.Value("pid")}) - p1.target && p1.target.Value && ship.push({pid: p1.target.Value("pid")}) - return {x1: p0.x, y1: p0.y, x2: p1.x, y2: p1.y, ship: ship} - }, - text: function(can, target, data) { return data.x = (target.Val("x1")+target.Val("x2"))/2, data.y = (target.Val("y1")+target.Val("y2"))/2, data }, - show: function(can, target, figure) { return "<("+(target.Val("y2")-target.Val("y1"))+ice.FS+(target.Val("x2")-target.Val("x1"))+")"+can.onexport._position(can, target, figure) }, - }, + var rect = can.onfigure._push(can, "rect", can.onfigure.rect.draw(event, can, point), this._temp) + if (event.type == html.CLICK) { + can.onfigure._pid(can, rect), delete(this._temp) + } + }, + text: function(can, data, target) { can.onfigure.rect.text(can, data, target) }, + }, + line: { // + data: {points: 2, size: {x: "x1", y: "y1"}, copy: ["x1", "y1", "x2", "y2"]}, + grid: function(event, can, point) { var target = event.target + if (target == can.svg) { return } + var p = point[point.length-1], pos = can.onexport.cursor(event, can, target) + target.Val && can.onexport.anchor(target, pos, p) + return p.target = target, p.anchor = pos, point + }, + draw: function(event, can, point) { if (point.length < 2) { return } + var p0 = point[0], p1 = point[1], ship = [] + p0.target && p0.target.Value && ship.push({pid: p0.target.Value("pid")}) + p1.target && p1.target.Value && ship.push({pid: p1.target.Value("pid")}) + return {x1: p0.x, y1: p0.y, x2: p1.x, y2: p1.y, ship: ship} + }, + text: function(can, target, data) { return data.x = (target.Val("x1")+target.Val("x2"))/2, data.y = (target.Val("y1")+target.Val("y2"))/2, data }, + show: function(can, target, figure) { return "<("+(target.Val("y2")-target.Val("y1"))+ice.FS+(target.Val("x2")-target.Val("x1"))+")"+can.onexport._position(can, target, figure) }, + }, }, []) Volcanos("onkeymap", {help: "键盘交互", list: [], - _mode: { - normal: { - gr: function(event, can) { can.Action("go", "run") }, - ga: function(event, can) { can.Action("go", "auto") }, - gm: function(event, can) { can.Action("go", "manual") }, + _mode: { + normal: { + gr: function(event, can) { can.Action("go", "run") }, + ga: function(event, can) { can.Action("go", "auto") }, + gm: function(event, can) { can.Action("go", "manual") }, - ad: function(event, can) { can.Action("mode", "draw") }, - ar: function(event, can) { can.Action("mode", "resize") }, + ad: function(event, can) { can.Action("mode", "draw") }, + ar: function(event, can) { can.Action("mode", "resize") }, - st: function(event, can) { can.Action("shape", "text") }, - sr: function(event, can) { can.Action("shape", "rect") }, - sl: function(event, can) { can.Action("shape", "line") }, - sc: function(event, can) { can.Action("shape", "circle") }, - se: function(event, can) { can.Action("shape", "ellipse") }, + st: function(event, can) { can.Action("shape", "text") }, + sr: function(event, can) { can.Action("shape", "rect") }, + sl: function(event, can) { can.Action("shape", "line") }, + sc: function(event, can) { can.Action("shape", "circle") }, + se: function(event, can) { can.Action("shape", "ellipse") }, - cr: function(event, can) { can.onaction._change(can, "stroke", "red") }, - cb: function(event, can) { can.onaction._change(can, "stroke", "blue") }, - cg: function(event, can) { can.onaction._change(can, "stroke", "green") }, - cy: function(event, can) { can.onaction._change(can, "stroke", "yellow") }, - cp: function(event, can) { can.onaction._change(can, "stroke", "purple") }, - cc: function(event, can) { can.onaction._change(can, "stroke", "cyan") }, - ch: function(event, can) { can.onaction._change(can, "stroke", "black") }, - cw: function(event, can) { can.onaction._change(can, "stroke", "white") }, + cr: function(event, can) { can.onaction._change(can, "stroke", "red") }, + cb: function(event, can) { can.onaction._change(can, "stroke", "blue") }, + cg: function(event, can) { can.onaction._change(can, "stroke", "green") }, + cy: function(event, can) { can.onaction._change(can, "stroke", "yellow") }, + cp: function(event, can) { can.onaction._change(can, "stroke", "purple") }, + cc: function(event, can) { can.onaction._change(can, "stroke", "cyan") }, + ch: function(event, can) { can.onaction._change(can, "stroke", "black") }, + cw: function(event, can) { can.onaction._change(can, "stroke", "white") }, - fr: function(event, can) { can.onaction._change(can, "fill", "red") }, - fb: function(event, can) { can.onaction._change(can, "fill", "blue") }, - fg: function(event, can) { can.onaction._change(can, "fill", "green") }, - fy: function(event, can) { can.onaction._change(can, "fill", "yellow") }, - fp: function(event, can) { can.onaction._change(can, "fill", "purple") }, - fc: function(event, can) { can.onaction._change(can, "fill", "cyan") }, - fh: function(event, can) { can.onaction._change(can, "fill", "black") }, - fw: function(event, can) { can.onaction._change(can, "fill", "white") }, - }, - }, _engine: {}, + fr: function(event, can) { can.onaction._change(can, "fill", "red") }, + fb: function(event, can) { can.onaction._change(can, "fill", "blue") }, + fg: function(event, can) { can.onaction._change(can, "fill", "green") }, + fy: function(event, can) { can.onaction._change(can, "fill", "yellow") }, + fp: function(event, can) { can.onaction._change(can, "fill", "purple") }, + fc: function(event, can) { can.onaction._change(can, "fill", "cyan") }, + fh: function(event, can) { can.onaction._change(can, "fill", "black") }, + fw: function(event, can) { can.onaction._change(can, "fill", "white") }, + }, + }, _engine: {}, }) Volcanos("onaction", {help: "组件菜单", list: [ - ["stroke-width", 1, 2, 3, 4, 5], - ["stroke", cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.PURPLE, cli.BLACK, cli.WHITE], - ["fill", cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.PURPLE, cli.BLACK, cli.WHITE, "#0000"], - ["font-size", 12, 16, 18, 24, 32], + ["stroke-width", 1, 2, 3, 4, 5], + ["stroke", cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.PURPLE, cli.BLACK, cli.WHITE], + ["fill", cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.PURPLE, cli.BLACK, cli.WHITE, "#0000"], + ["font-size", 12, 16, 18, 24, 32], - ["go", ice.RUN, ice.AUTO, "manual"], - ["mode", "draw", "resize"], - ["shape", "text", "circle", "ellipse", "rect", "block", "line"], - ["grid", 1, 2, 3, 4, 5, 10, 20], - ], - _change: function(can, key, value) { can.Action(key, value), can.group.Value(key, value) }, - "stroke-width": function(event, can, key, value) { can.onaction._change(can, key, value) }, - stroke: function(event, can, key, value) { can.onaction._change(can, key, value) }, - fill: function(event, can, key, value) { can.onaction._change(can, key, value) }, - "font-size": function(event, can, key, value) { can.onaction._change(can, key, value) }, + ["go", ice.RUN, ice.AUTO, "manual"], + ["mode", "draw", "resize"], + ["shape", "text", "circle", "ellipse", "rect", "block", "line"], + ["grid", 1, 2, 3, 4, 5, 10, 20], + ], + _change: function(can, key, value) { can.Action(key, value), can.group.Value(key, value) }, + "stroke-width": function(event, can, key, value) { can.onaction._change(can, key, value) }, + stroke: function(event, can, key, value) { can.onaction._change(can, key, value) }, + fill: function(event, can, key, value) { can.onaction._change(can, key, value) }, + "font-size": function(event, can, key, value) { can.onaction._change(can, key, value) }, - go: function(event, can, key, value) { can.Action(key, value) }, - mode: function(event, can, key, value) { can.Action(key, value) }, - shape: function(event, can, key, value) { can.Action(key, value) }, + go: function(event, can, key, value) { can.Action(key, value) }, + mode: function(event, can, key, value) { can.Action(key, value) }, + shape: function(event, can, key, value) { can.Action(key, value) }, - edit: function(event, can) { can.Action("go", can.Action("go") == ice.RUN? ice.AUTO: ice.RUN) }, - save: function(event, can, button) { - var msg = can.request(event, {content: can.onexport.content(can, can.svg)}) - can.run(event, [ctx.ACTION, button, can.Option(nfs.PATH)], function(msg) { - can.user.toastSuccess(can) - }, true) - }, + edit: function(event, can) { can.Action("go", can.Action("go") == ice.RUN? ice.AUTO: ice.RUN) }, + save: function(event, can, button) { + var msg = can.request(event, {content: can.onexport.content(can, can.svg)}) + can.run(event, [ctx.ACTION, button, can.Option(nfs.PATH)], function(msg) { + can.user.toastSuccess(can) + }, true) + }, - project: function(event, can) { can.onmotion.toggle(can, can.ui.project) }, - profile: function(event, can) { can.onmotion.toggle(can, can.ui.profile) }, - show: function(event, can) { can.onmotion.show(can, {interval: 100, length: 10}, null, can.group) }, - hide: function(event, can) { can.onmotion.hide(can, {interval: 100, length: 10}, null, can.group) }, - create: function(event, can) { - can.user.prompt("group", "some", function(name) { - var group = document.createElementNS('http://www.w3.org/2000/svg', svg.G) - can.group.append(group), can.onimport._block(can, group) - group.Value(html.CLASS, name), can.core.List([html.STROKE_WIDTH, html.STROKE, html.FILL, html.FONT_SIZE], function(name) { - group.Value(name, can.Action(name)) - }), can.onimport._group(can, group).click() - }) - }, - remove: function(event, can) { if (can.group == can.svg) { return } - can.page.Remove(can, can.group) - }, - clear: function(event, can) { - can.onmotion.clear(can, can.group), can.point = [], delete(can.temp) - }, + project: function(event, can) { can.onmotion.toggle(can, can.ui.project) }, + profile: function(event, can) { can.onmotion.toggle(can, can.ui.profile) }, + show: function(event, can) { can.onmotion.show(can, {interval: 100, length: 10}, null, can.group) }, + hide: function(event, can) { can.onmotion.hide(can, {interval: 100, length: 10}, null, can.group) }, + create: function(event, can) { + can.user.prompt("group", "some", function(name) { + var group = document.createElementNS('http://www.w3.org/2000/svg', svg.G) + can.group.append(group), can.onimport._block(can, group) + group.Value(html.CLASS, name), can.core.List([html.STROKE_WIDTH, html.STROKE, html.FILL, html.FONT_SIZE], function(name) { + group.Value(name, can.Action(name)) + }), can.onimport._group(can, group).click() + }) + }, + remove: function(event, can) { if (can.group == can.svg) { return } + can.page.Remove(can, can.group) + }, + clear: function(event, can) { + can.onmotion.clear(can, can.group), can.point = [], delete(can.temp) + }, - _mode: { - draw: function(event, can, point) { - var shape = can.Action("shape") - var figure = can.onfigure[shape] - figure.grid && figure.grid(event, can, point) + _mode: { + draw: function(event, can, point) { + var shape = can.Action("shape") + var figure = can.onfigure[shape] + figure.grid && figure.grid(event, can, point) - var data = figure.draw && figure.draw(event, can, point) - var item = data && can.onfigure._push(can, figure.data.name||shape, data, can.group||can.svg) - event.type == html.CLICK && point.length === figure.data.points && (can.point = []) + var data = figure.draw && figure.draw(event, can, point) + var item = data && can.onfigure._push(can, figure.data.name||shape, data, can.group||can.svg) + event.type == html.CLICK && point.length === figure.data.points && (can.point = []) - if (event.type == html.CLICK && item) { - var pid = can.onfigure._pid(can, item); can.core.List(point, function(p, i) { if (!p.target) { return } - p.target.Value(ice.SHIP, p.target.Value(ice.SHIP).concat([{pid: pid, which: i+1, anchor: p.anchor}])) - }) - } - return item - }, - resize: function(event, can, point, target) { target = target||event.target - if (event.type == html.CLICK) { - if (point.length == 1) { - can.current = {target: target, begin: can.core.List([target], function(item) { if (item.tagName == svg.G) { return } - return { - height: item.Val(html.HEIGHT), width: item.Val(html.WIDTH), x: item.Val(svg.X), y: item.Val(svg.Y), - target: item, ship: can.core.List(item.Value(ice.SHIP), function(ship) { - return ship.pid && (ship.target = can.page.Select(can, can.svg, ice.PT+ship.pid)[0]) && ship - }) - } - }), pos: can.onexport.cursor(event, can, target)} - return - } - return can.point = [], delete(can.current) - } + if (event.type == html.CLICK && item) { + var pid = can.onfigure._pid(can, item); can.core.List(point, function(p, i) { if (!p.target) { return } + p.target.Value(ice.SHIP, p.target.Value(ice.SHIP).concat([{pid: pid, which: i+1, anchor: p.anchor}])) + }) + } + return item + }, + resize: function(event, can, point, target) { target = target||event.target + if (event.type == html.CLICK) { + if (point.length == 1) { + can.current = {target: target, begin: can.core.List([target], function(item) { if (item.tagName == svg.G) { return } + return { + height: item.Val(html.HEIGHT), width: item.Val(html.WIDTH), x: item.Val(svg.X), y: item.Val(svg.Y), + target: item, ship: can.core.List(item.Value(ice.SHIP), function(ship) { + return ship.pid && (ship.target = can.page.Select(can, can.svg, ice.PT+ship.pid)[0]) && ship + }) + } + }), pos: can.onexport.cursor(event, can, target)} + return + } + return can.point = [], delete(can.current) + } - can.current && can.core.List(can.current.begin, function(item) { var figure = can.onfigure._get(can, item.target) - can.onexport.resize(event, item.target, item, point[0], point[1], can.current.pos) - can.page.Select(can, can.svg, ice.PT+item.target.Value(mdb.TEXT), function(text) { - text.Value(can.onexport._text(can, item.target, figure, {})) - }) - can.onfigure._move(can, item.target, item.ship) - }) - }, - run: function(event, can) { - can.onimport._profile(can, event.target) - }, - }, - _auto: function(can, target) { - if (can.point.length > 0) { return } - if (target.tagName == mdb.TEXT) { return } + can.current && can.core.List(can.current.begin, function(item) { var figure = can.onfigure._get(can, item.target) + can.onexport.resize(event, item.target, item, point[0], point[1], can.current.pos) + can.page.Select(can, can.svg, ice.PT+item.target.Value(mdb.TEXT), function(text) { + text.Value(can.onexport._text(can, item.target, figure, {})) + }) + can.onfigure._move(can, item.target, item.ship) + }) + }, + run: function(event, can) { + can.onimport._profile(can, event.target) + }, + }, + _auto: function(can, target) { + if (can.point.length > 0) { return } + if (target.tagName == mdb.TEXT) { return } - var pos = can.onexport.cursor(event, can, event.target) - if (target == can.svg) { - if (pos == 5) { - can.Action(ice.MODE, "draw"), can.Action("shape", html.BLOCK) - can.page.Modify(can, target, {style: {cursor: "crosshair"}}) - } else { - can.Action(ice.MODE, "resize") - } - } else { - switch (pos) { - case 5: - case 9: can.Action(ice.MODE, "resize"); break - default: can.Action(ice.MODE, "draw"), can.Action("shape", "line") - } - } - }, - _figure: function(event, can, points, target) { - can.temp && can.page.Remove(can, can.temp) && delete(can.temp) - can.temp = can.core.CallFunc([can.onaction._mode, can.Action(ice.MODE)], [event, can, points, target]) - can.point.length == 0 && delete(can.temp) - }, + var pos = can.onexport.cursor(event, can, event.target) + if (target == can.svg) { + if (pos == 5) { + can.Action(ice.MODE, "draw"), can.Action("shape", html.BLOCK) + can.page.Modify(can, target, {style: {cursor: "crosshair"}}) + } else { + can.Action(ice.MODE, "resize") + } + } else { + switch (pos) { + case 5: + case 9: can.Action(ice.MODE, "resize"); break + default: can.Action(ice.MODE, "draw"), can.Action("shape", "line") + } + } + }, + _figure: function(event, can, points, target) { + can.temp && can.page.Remove(can, can.temp) && delete(can.temp) + can.temp = can.core.CallFunc([can.onaction._mode, can.Action(ice.MODE)], [event, can, points, target]) + can.point.length == 0 && delete(can.temp) + }, - onmouseover: function(event, can) { can.onexport._show(can, event.target) }, - onmousemove: function(event, can) { var point = can.onexport._point(event, can) - if (can.Action("go") == ice.RUN) { return } - can.onexport.cursor(event, can, event.target) - if (can.Action("go") == ice.AUTO) { can.onaction._auto(can, event.target) } - can.onaction._figure(event, can, can.point.concat(point)) - }, - onclick: function(event, can) { var point = can.onexport._point(event, can) - if (can.Action("go") == ice.RUN) { can.onimport._profile(can, event.target) - return event.shiftKey? can.onaction._mode.run(event, can): can.ondetail.run(event, can) - } - can.onaction._figure(event, can, can.point = can.point.concat(point)) - }, - ondblclick: function(event, can) { - can.ondetail.label(event, can) - }, + onmouseover: function(event, can) { can.onexport._show(can, event.target) }, + onmousemove: function(event, can) { var point = can.onexport._point(event, can) + if (can.Action("go") == ice.RUN) { return } + can.onexport.cursor(event, can, event.target) + if (can.Action("go") == ice.AUTO) { can.onaction._auto(can, event.target) } + can.onaction._figure(event, can, can.point.concat(point)) + }, + onclick: function(event, can) { var point = can.onexport._point(event, can) + if (can.Action("go") == ice.RUN) { can.onimport._profile(can, event.target) + return event.shiftKey? can.onaction._mode.run(event, can): can.ondetail.run(event, can) + } + can.onaction._figure(event, can, can.point = can.point.concat(point)) + }, + ondblclick: function(event, can) { + can.ondetail.label(event, can) + }, }) Volcanos("ondetail", {help: "组件详情", list: [cli.START, ice.RUN, ice.COPY, html.LABEL, mdb.MODIFY, "toimage", mdb.DELETE], - start: function(event, can) { var target = event.target - var list = [target], dict = {} - for (var i = 0; i < list.length; i++) { var ship = list[i].Value("ship") - for (var j = 0; j < ship.length; j++) { var pid = ship[j].pid - can.page.Select(can, can.svg, ice.PT+pid, function(item) { - var pid = item.Value("ship")[1].pid - can.page.Select(can, can.svg, ice.PT+pid, function(item) { - !dict[pid] && list.push(item), dict[pid] = true - }) - }) - } - } - can.core.Next(list, function(item, next) { can.core.Timer(3000, function() { - can.onmotion.show(can, {interval: 300, length: 10}, null, item) - can.user.toast(can, item.Value("index")) - can.ondetail.run({target: item}, can), next() - }) }) - }, - run: function(event, can) { var target = event.target - if (!target.Value("pid")) { can.onfigure._pid(can, target) } + start: function(event, can) { var target = event.target + var list = [target], dict = {} + for (var i = 0; i < list.length; i++) { var ship = list[i].Value("ship") + for (var j = 0; j < ship.length; j++) { var pid = ship[j].pid + can.page.Select(can, can.svg, ice.PT+pid, function(item) { + var pid = item.Value("ship")[1].pid + can.page.Select(can, can.svg, ice.PT+pid, function(item) { + !dict[pid] && list.push(item), dict[pid] = true + }) + }) + } + } + can.core.Next(list, function(item, next) { can.core.Timer(3000, function() { + can.onmotion.show(can, {interval: 300, length: 10}, null, item) + can.user.toast(can, item.Value("index")) + can.ondetail.run({target: item}, can), next() + }) }) + }, + run: function(event, can) { var target = event.target + if (!target.Value("pid")) { can.onfigure._pid(can, target) } - if (can.onmotion.cache(can, function() { return target.Value("pid") }, can.ui.display)) { return } + if (can.onmotion.cache(can, function() { return target.Value("pid") }, can.ui.display)) { return } - can.onmotion.clear(can, can.ui.display), can.svg.Value("pid", target.Value("pid")) - var index = target.Value(mdb.INDEX); index && can.onappend.plugin(can, {type: chat.STORY, index: index, args: target.Value(ctx.ARGS)}, function(sub) { - sub.Conf("height", can.Conf("height")-can.svg.Val("height")-52), sub.Conf("width", can.Conf("width")) - sub.run = function(event, cmds, cb) { can.run(event, can.misc.concat(can, [ice.RUN, index], cmds), cb, true) } - can.onmotion.hidden(can, sub._legend), can.onmotion.hidden(can, can.ui.display, true) - }, can.ui.display) - }, - copy: function(event, can) { can.onfigure._copy(event, can, event.target) }, - label: function(event, can) { var target = event.target - var def = target.Value(mdb.TEXT); def && can.page.Select(can, can.svg, ice.PT+def, function(item) { - def = item.Value(html.INNER) - }) - can.user.prompt(html.LABEL, def, function(text) { - if (target.tagName == html.TEXT) { return target.innerHTML = text } + can.onmotion.clear(can, can.ui.display), can.svg.Value("pid", target.Value("pid")) + var index = target.Value(mdb.INDEX); index && can.onappend.plugin(can, {type: chat.STORY, index: index, args: target.Value(ctx.ARGS)}, function(sub) { + sub.Conf("height", can.Conf("height")-can.svg.Val("height")-52), sub.Conf("width", can.Conf("width")) + sub.run = function(event, cmds, cb) { can.run(event, can.misc.concat(can, [ice.RUN, index], cmds), cb, true) } + can.onmotion.hidden(can, sub._legend), can.onmotion.hidden(can, can.ui.display, true) + }, can.ui.display) + }, + copy: function(event, can) { can.onfigure._copy(event, can, event.target) }, + label: function(event, can) { var target = event.target + var def = target.Value(mdb.TEXT); def && can.page.Select(can, can.svg, ice.PT+def, function(item) { + def = item.Value(html.INNER) + }) + can.user.prompt(html.LABEL, def, function(text) { + if (target.tagName == html.TEXT) { return target.innerHTML = text } - if (def && can.page.Select(can, can.svg, ice.PT+def, function(item) { - item.Value(html.INNER, text) - }).length > 0) { - return - } + if (def && can.page.Select(can, can.svg, ice.PT+def, function(item) { + item.Value(html.INNER, text) + }).length > 0) { + return + } - var figure = can.onfigure._get(can, target) - var data = can.onexport._text(can, target, figure, {inner: text}) - var item = can.onfigure._push(can, html.TEXT, data, target.Group()) - target.Value(mdb.TEXT, can.onfigure._pid(can, item)) - }) - }, - modify: function(event, can) { can.onimport._profile(can, event.target) }, - toimage: function(event, can) { can.onmotion.toimage(event, can, can.Option(nfs.PATH).split("/").pop().split(".")[0], can.svg) }, - "delete": function(event, can) { var target = event.target - if (target == can.svg) { return } - can.core.List(target.Value(ice.SHIP), function(value) { - can.page.Select(can, can.svg, ice.PT+value.pid, function(item) { - can.page.Remove(can, item) - }) - }) - target.Value(mdb.TEXT) && can.page.Select(can, can.svg, ice.PT+target.Value(mdb.TEXT), function(item) { - can.page.Remove(can, item) - }) - can.page.Remove(can, target) - }, + var figure = can.onfigure._get(can, target) + var data = can.onexport._text(can, target, figure, {inner: text}) + var item = can.onfigure._push(can, html.TEXT, data, target.Group()) + target.Value(mdb.TEXT, can.onfigure._pid(can, item)) + }) + }, + modify: function(event, can) { can.onimport._profile(can, event.target) }, + toimage: function(event, can) { can.onmotion.toimage(event, can, can.Option(nfs.PATH).split("/").pop().split(".")[0], can.svg) }, + "delete": function(event, can) { var target = event.target + if (target == can.svg) { return } + can.core.List(target.Value(ice.SHIP), function(value) { + can.page.Select(can, can.svg, ice.PT+value.pid, function(item) { + can.page.Remove(can, item) + }) + }) + target.Value(mdb.TEXT) && can.page.Select(can, can.svg, ice.PT+target.Value(mdb.TEXT), function(item) { + can.page.Remove(can, item) + }) + can.page.Remove(can, target) + }, }) Volcanos("onexport", {help: "导出数据", list: ["group", "figure", "index", "pos"], - _show: function(can, target) { var figure = can.onfigure._get(can, target) - function show() { return can.onexport._size(can, target, figure)+ice.SP+can.onexport._position(can, target, figure) } - can.Status("figure", target.tagName+":"+target.Value("pid")+ice.SP+(figure? (figure.show||show)(can, target, figure): "")) - can.Status("group", target.Groups()||can.group.Groups()||html.SVG) - can.Status("index", target.Value("index")) - }, - _size: function(can, target, figure) { var size = figure.data.size||{} - return "<("+target.Val(size[html.HEIGHT]||html.HEIGHT)+ice.FS+target.Val(size[html.WIDTH]||html.WIDTH)+")" - }, - _position: function(can, target, figure) { var size = figure.data.size||{} - return "@("+target.Val(size[svg.X]||svg.X)+ice.FS+target.Val(size[svg.Y]||svg.Y)+")" - }, - _text: function(can, target, figure, data) { var size = figure.data.size||{} - if (figure.text) { return figure.text(can, data, target) } - return data.x = target.Val(size[svg.X]||svg.X), data.y = target.Val(size[svg.Y]||svg.Y), data - }, - _point: function(event, can) { - var p = can.svg.getBoundingClientRect() - var point = {x: event.clientX-p.x, y: event.clientY-p.y} - point.x = point.x - point.x % parseInt(can.Action("grid")) - point.y = point.y - point.y % parseInt(can.Action("grid")) - return can.Status("pos", point.x+ice.FS+point.y), point - }, + _show: function(can, target) { var figure = can.onfigure._get(can, target) + function show() { return can.onexport._size(can, target, figure)+ice.SP+can.onexport._position(can, target, figure) } + can.Status("figure", target.tagName+":"+target.Value("pid")+ice.SP+(figure? (figure.show||show)(can, target, figure): "")) + can.Status("group", target.Groups()||can.group.Groups()||html.SVG) + can.Status("index", target.Value("index")) + }, + _size: function(can, target, figure) { var size = figure.data.size||{} + return "<("+target.Val(size[html.HEIGHT]||html.HEIGHT)+ice.FS+target.Val(size[html.WIDTH]||html.WIDTH)+")" + }, + _position: function(can, target, figure) { var size = figure.data.size||{} + return "@("+target.Val(size[svg.X]||svg.X)+ice.FS+target.Val(size[svg.Y]||svg.Y)+")" + }, + _text: function(can, target, figure, data) { var size = figure.data.size||{} + if (figure.text) { return figure.text(can, data, target) } + return data.x = target.Val(size[svg.X]||svg.X), data.y = target.Val(size[svg.Y]||svg.Y), data + }, + _point: function(event, can) { + var p = can.svg.getBoundingClientRect() + var point = {x: event.clientX-p.x, y: event.clientY-p.y} + point.x = point.x - point.x % parseInt(can.Action("grid")) + point.y = point.y - point.y % parseInt(can.Action("grid")) + return can.Status("pos", point.x+ice.FS+point.y), point + }, - content: function(can, svg) { - return ['"]).join("") - }, - cursor: function(event, can, item, show) { - var p = item.getBoundingClientRect() - var q = {x: event.clientX, y: event.clientY} + content: function(can, svg) { + return ['"]).join("") + }, + cursor: function(event, can, item, show) { + var p = item.getBoundingClientRect() + var q = {x: event.clientX, y: event.clientY} - var pos = 5, margin = 20 - var y = (q.y-p.y)/p.height - if (y < 0.2 && q.y-p.y < margin) { - pos -= 3 - } else if (y > 0.8 && q.y-p.y-p.height > -margin) { - pos += 3 - } - var x = (q.x-p.x)/p.width - if (x < 0.2 && q.x-p.x < margin) { - pos -= 1 - } else if (x > 0.8 && q.x-p.x- p.width > -margin) { - pos += 1 - } + var pos = 5, margin = 20 + var y = (q.y-p.y)/p.height + if (y < 0.2 && q.y-p.y < margin) { + pos -= 3 + } else if (y > 0.8 && q.y-p.y-p.height > -margin) { + pos += 3 + } + var x = (q.x-p.x)/p.width + if (x < 0.2 && q.x-p.x < margin) { + pos -= 1 + } else if (x > 0.8 && q.x-p.x- p.width > -margin) { + pos += 1 + } - return (show||can.svg).style.cursor = [ - "nw-resize", "n-resize", "ne-resize", - "w-resize", "move", "e-resize", - "sw-resize", "s-resize", "se-resize", - ][pos-1], pos - }, - anchor: function(target, pos, point) { - switch (pos) { - case 1: - case 2: - case 3: - point.y = target.Val(svg.Y) - break - case 4: - case 5: - case 6: - point.y = target.Val(svg.Y) + target.Val(html.HEIGHT) / 2 - break - case 7: - case 8: - case 9: - point.y = target.Val(svg.Y) + target.Val(html.HEIGHT) - break - } + return (show||can.svg).style.cursor = [ + "nw-resize", "n-resize", "ne-resize", + "w-resize", "move", "e-resize", + "sw-resize", "s-resize", "se-resize", + ][pos-1], pos + }, + anchor: function(target, pos, point) { + switch (pos) { + case 1: + case 2: + case 3: + point.y = target.Val(svg.Y) + break + case 4: + case 5: + case 6: + point.y = target.Val(svg.Y) + target.Val(html.HEIGHT) / 2 + break + case 7: + case 8: + case 9: + point.y = target.Val(svg.Y) + target.Val(html.HEIGHT) + break + } - switch (pos) { - case 1: - case 4: - case 7: - point.x = target.Val(svg.X) - break - case 2: - case 5: - case 8: - point.x = target.Val(svg.X) + target.Val(html.WIDTH) / 2 - break - case 3: - case 6: - case 9: - point.x = target.Val(svg.X) + target.Val(html.WIDTH) - break - } - return point - }, - resize: function(event, item, begin, p0, p1, pos) { - switch (pos) { - case 5: - item.Value(svg.X, begin.x + p1.x - p0.x) - item.Value(svg.Y, begin.y + p1.y - p0.y) - return - } + switch (pos) { + case 1: + case 4: + case 7: + point.x = target.Val(svg.X) + break + case 2: + case 5: + case 8: + point.x = target.Val(svg.X) + target.Val(html.WIDTH) / 2 + break + case 3: + case 6: + case 9: + point.x = target.Val(svg.X) + target.Val(html.WIDTH) + break + } + return point + }, + resize: function(event, item, begin, p0, p1, pos) { + switch (pos) { + case 5: + item.Value(svg.X, begin.x + p1.x - p0.x) + item.Value(svg.Y, begin.y + p1.y - p0.y) + return + } - switch (pos) { - case 1: - case 2: - case 3: - item.Value(svg.Y, begin.y + p1.y - p0.y) - item.Value(html.HEIGHT, begin.height - p1.y + p0.y) - break - } - switch (pos) { - case 1: - case 4: - case 7: - item.Value(sve.X, begin.x + p1.x - p0.x) - item.Value(html.WIDTH, begin.width - p1.x + p0.x) - break - } - switch (pos) { - case 3: - case 6: - case 9: - item.Value(html.WIDTH, begin.width + p1.x - p0.x) - break - } - switch (pos) { - case 7: - case 8: - case 9: - item.Value(html.HEIGHT, begin.height + p1.y - p0.y) - break - } - }, + switch (pos) { + case 1: + case 2: + case 3: + item.Value(svg.Y, begin.y + p1.y - p0.y) + item.Value(html.HEIGHT, begin.height - p1.y + p0.y) + break + } + switch (pos) { + case 1: + case 4: + case 7: + item.Value(sve.X, begin.x + p1.x - p0.x) + item.Value(html.WIDTH, begin.width - p1.x + p0.x) + break + } + switch (pos) { + case 3: + case 6: + case 9: + item.Value(html.WIDTH, begin.width + p1.x - p0.x) + break + } + switch (pos) { + case 7: + case 8: + case 9: + item.Value(html.HEIGHT, begin.height + p1.y - p0.y) + break + } + }, }) diff --git a/plugin/local/wiki/feel.js b/plugin/local/wiki/feel.js index 03e71368..3a3d3f4c 100644 --- a/plugin/local/wiki/feel.js +++ b/plugin/local/wiki/feel.js @@ -1,125 +1,125 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.path = can.request(), can.list = [], msg.Table(function(value) { - value.path.lastIndexOf(ice.PS)==value.path.length-1? can.path.Push(value): can.list.push(value) - }) + can.path = can.request(), can.list = [], msg.Table(function(value) { + value.path.lastIndexOf(ice.PS)==value.path.length-1? can.path.Push(value): can.list.push(value) + }) - can.base.isFunc(cb) && cb(msg) - can.ui = can.onlayout.display(can, target) - can.onappend.table(can, can.path, null, can.ui.content) - can.dir_root = msg.Option("dir_root") + can.base.isFunc(cb) && cb(msg) + can.ui = can.onlayout.display(can, target) + can.onappend.table(can, can.path, null, can.ui.content) + can.dir_root = msg.Option("dir_root") - can.Action("height", msg.Option("height")||"100") - can.Action("limit", msg.Option("limit")||"6") - can.Action("rate", msg.Option("rate")||"1") - can.onmotion.hidden(can, can._action) + can.Action("height", msg.Option("height")||"100") + can.Action("limit", msg.Option("limit")||"6") + can.Action("rate", msg.Option("rate")||"1") + can.onmotion.hidden(can, can._action) - can.begin = msg.Option("begin")||"0" - can.onimport.page(can, can.list) - }, - _file: function(can, path, index) { var p = location.href.indexOf("http") == 0? "": "http://localhost:9020" - return path.indexOf("http") == 0? path: p+can.base.Path("/share/local", can.dir_root||"", path) - }, - file: function(can, path, index) { path = can.onimport._file(can, path, index) - var cb = can.onfigure[can.base.Ext(path)]; can.Status("file", path) - can.base.isFunc(cb) && can.page.Append(can, can.ui.display, [cb(can, path, index)]) - }, - page: function(can, list, begin, limit) { can.onmotion.clear(can, can.ui.display) - begin = parseInt(begin||can.begin), limit = parseInt(limit||can.Action("limit")) - for (var i = begin; i < begin+limit; i++) { list && list[i] && can.onimport.file(can, list[i].path, i) } - can.Status({begin: begin, limit: limit, total: can.list.length}) - }, + can.begin = msg.Option("begin")||"0" + can.onimport.page(can, can.list) + }, + _file: function(can, path, index) { var p = location.href.indexOf("http") == 0? "": "http://localhost:9020" + return path.indexOf("http") == 0? path: p+can.base.Path("/share/local", can.dir_root||"", path) + }, + file: function(can, path, index) { path = can.onimport._file(can, path, index) + var cb = can.onfigure[can.base.Ext(path)]; can.Status("file", path) + can.base.isFunc(cb) && can.page.Append(can, can.ui.display, [cb(can, path, index)]) + }, + page: function(can, list, begin, limit) { can.onmotion.clear(can, can.ui.display) + begin = parseInt(begin||can.begin), limit = parseInt(limit||can.Action("limit")) + for (var i = begin; i < begin+limit; i++) { list && list[i] && can.onimport.file(can, list[i].path, i) } + can.Status({begin: begin, limit: limit, total: can.list.length}) + }, }, ["/plugin/local/wiki/feel.css"]) Volcanos("onfigure", {help: "组件菜单", list: [], - png: function(can, path, index) { return can.onfigure.image(can, path, index) }, - jpg: function(can, path, index) { return can.onfigure.image(can, path, index) }, - jpeg: function(can, path, index) { return can.onfigure.image(can, path, index) }, - image: function(can, path, index) { return {img: path, height: can.Action("height"), onclick: function(event) { - can.ondetail._init(can, index) - }, _init: function(target) { can.Status("file", path) }, - onmouseover: function(event) { can.Status("file", path) }, - } }, + png: function(can, path, index) { return can.onfigure.image(can, path, index) }, + jpg: function(can, path, index) { return can.onfigure.image(can, path, index) }, + jpeg: function(can, path, index) { return can.onfigure.image(can, path, index) }, + image: function(can, path, index) { return {img: path, height: can.Action("height"), onclick: function(event) { + can.ondetail._init(can, index) + }, _init: function(target) { can.Status("file", path) }, + onmouseover: function(event) { can.Status("file", path) }, + } }, - video: function(can, path) { var auto = can.user.isMobile&&can.Action("limit")!="1"? false: true, loop = true, total = 0; function cb(event) { } - return {type: "video", style: {height: parseInt(can.Action("height"))}, className: "preview", - data: {src: path, controls: "controls", autoplay: auto, loop: loop, playbackRate: parseFloat(can.Action("rate"))}, - oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb, - onmouseover: function(event) { can.Status("file", path) }, - onloadedmetadata: function(event) { total = event.timeStamp - event.target.currentTime = can._msg.currentTime || 0 - }, onloadeddata: cb, ontimeupdate: function(event) { - can.Status("file") == path && can.Status("position", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration)) - }, - } - }, - mp4: function(can, path) { return can.onfigure.video(can, path) }, - m4v: function(can, path) { return can.onfigure.video(can, path) }, - mov: function(can, path) { return can.onfigure.video(can, path) }, + video: function(can, path) { var auto = can.user.isMobile&&can.Action("limit")!="1"? false: true, loop = true, total = 0; function cb(event) { } + return {type: "video", style: {height: parseInt(can.Action("height"))}, className: "preview", + data: {src: path, controls: "controls", autoplay: auto, loop: loop, playbackRate: parseFloat(can.Action("rate"))}, + oncontextmenu: cb, onplay: cb, onpause: cb, onended: cb, + onmouseover: function(event) { can.Status("file", path) }, + onloadedmetadata: function(event) { total = event.timeStamp + event.target.currentTime = can._msg.currentTime || 0 + }, onloadeddata: cb, ontimeupdate: function(event) { + can.Status("file") == path && can.Status("position", can.onexport.position(can, (can._msg.currentTime=event.target.currentTime)-1, event.target.duration)) + }, + } + }, + mp4: function(can, path) { return can.onfigure.video(can, path) }, + m4v: function(can, path) { return can.onfigure.video(can, path) }, + mov: function(can, path) { return can.onfigure.video(can, path) }, }) Volcanos("onaction", {help: "组件菜单", list: [ - ["height", 100, 200, 400, 600, 800], - ["limit", 1, 3, 6, 9, 12, 15, 20, 30], - ["rate", 0.1, 0.2, 0.5, 1, 2, 3, 5, 10], - ], - "上一页": function(event, can, key, value) { - can.begin > 0 && (can.begin -= parseInt(can.Action("limit")), can.onimport.page(can, can.list)) - }, - "下一页": function(event, can, key, value) { - can.begin + parseInt(can.Action("limit")) < can.list.length && (can.begin += parseInt(can.Action("limit")), can.onimport.page(can, can.list)) - }, + ["height", 100, 200, 400, 600, 800], + ["limit", 1, 3, 6, 9, 12, 15, 20, 30], + ["rate", 0.1, 0.2, 0.5, 1, 2, 3, 5, 10], + ], + "上一页": function(event, can, key, value) { + can.begin > 0 && (can.begin -= parseInt(can.Action("limit")), can.onimport.page(can, can.list)) + }, + "下一页": function(event, can, key, value) { + can.begin + parseInt(can.Action("limit")) < can.list.length && (can.begin += parseInt(can.Action("limit")), can.onimport.page(can, can.list)) + }, - "height": function(event, can, key, value) { - can.Action("height", value), can.onimport.page(can, can.list) - }, - "limit": function(event, can, key, value) { - can.Action("limit", value), can.onimport.page(can, can.list) - }, - "rate": function(event, can, key, value) { - can.Action("rate", value), can.onimport.page(can, can.list) - }, + "height": function(event, can, key, value) { + can.Action("height", value), can.onimport.page(can, can.list) + }, + "limit": function(event, can, key, value) { + can.Action("limit", value), can.onimport.page(can, can.list) + }, + "rate": function(event, can, key, value) { + can.Action("rate", value), can.onimport.page(can, can.list) + }, - chooseImage: function(event, can) { var msg = can.request(event) - can.user.agent.chooseImage(function(list) { can.core.List(list, function(item) { - can.page.Append(can, can._output, [{img: item, height: 200}]) - }) }) - }, + chooseImage: function(event, can) { var msg = can.request(event) + can.user.agent.chooseImage(function(list) { can.core.List(list, function(item) { + can.page.Append(can, can._output, [{img: item, height: 200}]) + }) }) + }, }) Volcanos("ondetail", {help: "组件菜单", list: ["关闭", "下载", "删除", "上一个", "下一个", "设置头像", "设置背景", "复制链接"], _init: function(can, index) { - can.onappend._init(can, {type: "story feel float"}, [], function(sub) { can.sub = sub - sub.run = function(event, cmds, cb) { return can.run(event, cmds, cb, true) } + can.onappend._init(can, {type: "story feel float"}, [], function(sub) { can.sub = sub + sub.run = function(event, cmds, cb) { return can.run(event, cmds, cb, true) } - sub.search({}, ["Action.onexport.size"], function(msg, left, top, width, height) { - sub.page.Modify(sub, sub._target, {style: {left: left, top: top}}) - sub.page.Modify(sub, sub._output, {style: {"max-width": width, "max-height": height}}) - sub.onappend._action(can, can.ondetail.list, sub._action, can.ondetail) + sub.search({}, ["Action.onexport.size"], function(msg, left, top, width, height) { + sub.page.Modify(sub, sub._target, {style: {left: left, top: top}}) + sub.page.Modify(sub, sub._output, {style: {"max-width": width, "max-height": height}}) + sub.onappend._action(can, can.ondetail.list, sub._action, can.ondetail) - can.order = index, can.show = function(order) { - path = can.onimport._file(can, can.list[order].path) - sub.page.Appends(sub, sub._output, [{img: path, style: {"max-width": width-40, "max-height": height-55}}]) - sub.Status("begin", order+1+ice.PS+can.list.length), sub.Status("file", path) - }, can.show(can.order) - }) - }, document.body) - }, - "关闭": 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)) }, - "删除": function(event, can) { - can.run(event, [ctx.ACTION, mdb.REMOVE, can.Status("file")], function(msg) { can.user.toast(can, "删除成功") }, true) - }, - "上一个": function(event, can) { can.order > 0? can.show(--can.order): can.user.toast(can, "已经是第一张啦!") }, - "下一个": function(event, can) { can.order < can.list.length-1? can.show(++can.order): can.user.toast(can, "已经是最后一张啦!") }, - "设置头像": function(event, can) { var msg = can.request(event, {url: can.onimport._file(can, can.list[can.order].path)}) - can.search(event, ["Header.onimport.avatar"], null, true) - }, - "设置背景": function(event, can) { var msg = can.request(event, {url: can.onimport._file(can, can.list[can.order].path)}) - can.search(event, ["Header.onimport.background"], null, true) - }, - "复制链接": function(event, can) { - can.user.copy(event, can, can.misc.MergeURL(can, {_path: can.onimport._file(can, can.list[can.order].path)}, true)) - }, + can.order = index, can.show = function(order) { + path = can.onimport._file(can, can.list[order].path) + sub.page.Appends(sub, sub._output, [{img: path, style: {"max-width": width-40, "max-height": height-55}}]) + sub.Status("begin", order+1+ice.PS+can.list.length), sub.Status("file", path) + }, can.show(can.order) + }) + }, document.body) + }, + "关闭": 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)) }, + "删除": function(event, can) { + can.run(event, [ctx.ACTION, mdb.REMOVE, can.Status("file")], function(msg) { can.user.toast(can, "删除成功") }, true) + }, + "上一个": function(event, can) { can.order > 0? can.show(--can.order): can.user.toast(can, "已经是第一张啦!") }, + "下一个": function(event, can) { can.order < can.list.length-1? can.show(++can.order): can.user.toast(can, "已经是最后一张啦!") }, + "设置头像": function(event, can) { var msg = can.request(event, {url: can.onimport._file(can, can.list[can.order].path)}) + can.search(event, ["Header.onimport.avatar"], null, true) + }, + "设置背景": function(event, can) { var msg = can.request(event, {url: can.onimport._file(can, can.list[can.order].path)}) + can.search(event, ["Header.onimport.background"], null, true) + }, + "复制链接": function(event, can) { + can.user.copy(event, can, can.misc.MergeURL(can, {_path: can.onimport._file(can, can.list[can.order].path)}, true)) + }, }) Volcanos("onexport", {help: "导出数据", list: ["begin", "limit", "total", "position", "file"], - position: function(can, index, total) { total = total || can.max - return parseInt((index+1)*100/total)+"%"+" = "+(parseInt(index)+1)+ice.PS+parseInt(total) - }, + position: function(can, index, total) { total = total || can.max + return parseInt((index+1)*100/total)+"%"+" = "+(parseInt(index)+1)+ice.PS+parseInt(total) + }, }) diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index 9ce5623a..48ea1c8e 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -1,189 +1,189 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target) { - can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) - if (msg.Length() > 0) { return can.onappend.table(can, msg) } + can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) + if (msg.Length() > 0) { return can.onappend.table(can, msg) } - can.page.Modify(can, target, msg.Result()) - can.page.Select(can, target, wiki.ITEM, function(item) { var data = item.dataset||{} - can.core.CallFunc([can.onimport, data.type], [can, data, item]) - can.page.Modify(can, item, {style: can.base.Obj(data.style)}) - }) - }, - navmenu: function(can, data, target) { var nav = can.sup._navmenu - nav = nav||can.page.Append(can, can._fields, [{view: wiki.NAVMENU}]).first - can.onmotion.clear(can, nav), can._fields.insertBefore(nav, can._output) + can.page.Modify(can, target, msg.Result()) + can.page.Select(can, target, wiki.ITEM, function(item) { var data = item.dataset||{} + can.core.CallFunc([can.onimport, data.type], [can, data, item]) + can.page.Modify(can, item, {style: can.base.Obj(data.style)}) + }) + }, + navmenu: function(can, data, target) { var nav = can.sup._navmenu + nav = nav||can.page.Append(can, can._fields, [{view: wiki.NAVMENU}]).first + can.onmotion.clear(can, nav), can._fields.insertBefore(nav, can._output) - can.onappend.list(can, can.base.Obj(data.data), function(event, item) { - var link = item.meta.link, list = can.core.Split(item.meta.link) - if (can.core.Value(can, list[0])) { return can.core.CallFunc([can, list[0]], list.slice(1)) } - if (!link || link == can.Option(nfs.PATH)) { return false } + can.onappend.list(can, can.base.Obj(data.data), function(event, item) { + var link = item.meta.link, list = can.core.Split(item.meta.link) + if (can.core.Value(can, list[0])) { return can.core.CallFunc([can, list[0]], list.slice(1)) } + if (!link || link == can.Option(nfs.PATH)) { return false } - if (can.onmotion.cache(can, function() { can.user.mod.isCmd && can.user.title(item.meta.name); return can.Option(nfs.PATH, link) })) { return } - return can.sup.Update(event, [link]) - }, nav), can.sup._navmenu = nav + if (can.onmotion.cache(can, function() { can.user.mod.isCmd && can.user.title(item.meta.name); return can.Option(nfs.PATH, link) })) { return } + return can.sup.Update(event, [link]) + }, nav), can.sup._navmenu = nav - can.getActionSize(function(msg) { - can.page.style(can, nav, html.HEIGHT, can.Conf(html.HEIGHT)+(can.user.mod.isCmd? msg.Option(html.MARGIN_Y): 0)) - can.Conf(html.WIDTH, can.Conf(html.WIDTH)-nav.offsetWidth-(can.user.mod.isCmd? 10: 20)) - can.page.Modify(can, can._output, {style: kit.Dict( - html.HEIGHT, can.sup._navmenu.offsetHeight, html.MAX_WIDTH, can.Conf(html.WIDTH), - html.FLOAT, html.LEFT, html.CLEAR, html.NONE - )}) - }) - }, - premenu: function(can, data, target) { - can.page.Select(can, can._output, can.page.Keys(wiki.H2, wiki.H3), function(item) { - can.page.Append(can, target, [{text: [item.innerHTML, html.LI, item.tagName], onclick: function() { - item.scrollIntoView() - }}]), item.onclick = function(event) { target.scrollIntoView() } - }) - }, - title: function(can, data, target) { - can.user.mod.isCmd && target.tagName == "H1" && can.user.title(data.text) - }, - spark: function(can, data, target) { - if (data[mdb.NAME] == html.INNER) { return can.onmotion.copy(can, target) } - can.page.Select(can, target, html.A, function(item) { can.onmotion.link(can, item) }) - can.page.Select(can, target, html.SPAN, function(item) { can.onmotion.copy(can, item) }) - }, - chart: function(can, data, target) { - target.oncontextmenu = function(event) { - can.user.carteClient(event, can, kit.Dict(mdb.EXPORT, function(event, can, button) { - can.user.toPNG(can, can.user.prompt("please input file name", "hi")+".png", target.outerHTML, - parseInt(target.getAttribute(html.HEIGHT))||200, parseInt(target.getAttribute(html.WIDTH))||200) - }), [mdb.EXPORT]) - } - }, - table: function(can, data, target) { - can.page.OrderTable(can, target), can.page.ClassList.add(can, target, chat.CONTENT) - can.page.Select(can, target, html.TD, function(item) { can.onmotion.copy(can, item) }) - }, - field: function(can, data, target, width) { var item = can.base.Obj(data.meta) - can.onappend._init(can, item, [chat.PLUGIN_STATE_JS], function(sub) { - sub.run = function(event, cmds, cb, silent) { - can.run(event, can.misc.concat(can, [ctx.ACTION, chat.STORY, data.type, data.name, data.text], cmds), cb, true) - } - sub.Conf(html.HEIGHT, can.Conf(html.HEIGHT)) - sub.Conf(html.WIDTH, item.width = (width||can.Conf(html.WIDTH))-20) + can.getActionSize(function(msg) { + can.page.style(can, nav, html.HEIGHT, can.Conf(html.HEIGHT)+(can.user.mod.isCmd? msg.Option(html.MARGIN_Y): 0)) + can.Conf(html.WIDTH, can.Conf(html.WIDTH)-nav.offsetWidth-(can.user.mod.isCmd? 10: 20)) + can.page.Modify(can, can._output, {style: kit.Dict( + html.HEIGHT, can.sup._navmenu.offsetHeight, html.MAX_WIDTH, can.Conf(html.WIDTH), + html.FLOAT, html.LEFT, html.CLEAR, html.NONE + )}) + }) + }, + premenu: function(can, data, target) { + can.page.Select(can, can._output, can.page.Keys(wiki.H2, wiki.H3), function(item) { + can.page.Append(can, target, [{text: [item.innerHTML, html.LI, item.tagName], onclick: function() { + item.scrollIntoView() + }}]), item.onclick = function(event) { target.scrollIntoView() } + }) + }, + title: function(can, data, target) { + can.user.mod.isCmd && target.tagName == "H1" && can.user.title(data.text) + }, + spark: function(can, data, target) { + if (data[mdb.NAME] == html.INNER) { return can.onmotion.copy(can, target) } + can.page.Select(can, target, html.A, function(item) { can.onmotion.link(can, item) }) + can.page.Select(can, target, html.SPAN, function(item) { can.onmotion.copy(can, item) }) + }, + chart: function(can, data, target) { + target.oncontextmenu = function(event) { + can.user.carteClient(event, can, kit.Dict(mdb.EXPORT, function(event, can, button) { + can.user.toPNG(can, can.user.prompt("please input file name", "hi")+".png", target.outerHTML, + parseInt(target.getAttribute(html.HEIGHT))||200, parseInt(target.getAttribute(html.WIDTH))||200) + }), [mdb.EXPORT]) + } + }, + table: function(can, data, target) { + can.page.OrderTable(can, target), can.page.ClassList.add(can, target, chat.CONTENT) + can.page.Select(can, target, html.TD, function(item) { can.onmotion.copy(can, item) }) + }, + field: function(can, data, target, width) { var item = can.base.Obj(data.meta) + can.onappend._init(can, item, [chat.PLUGIN_STATE_JS], function(sub) { + sub.run = function(event, cmds, cb, silent) { + can.run(event, can.misc.concat(can, [ctx.ACTION, chat.STORY, data.type, data.name, data.text], cmds), cb, true) + } + sub.Conf(html.HEIGHT, can.Conf(html.HEIGHT)) + sub.Conf(html.WIDTH, item.width = (width||can.Conf(html.WIDTH))-20) - can.core.Value(item, "auto.cmd") && can.core.Timer300ms(function() { - var msg = sub.request({}, can.core.Value(item, "opts")); msg.Option(ice.MSG_HANDLE, ice.TRUE) - sub.Update(msg._event, [ctx.ACTION, can.core.Value(item, "auto.cmd")]) - }) - }, can._output, target) - }, - iframe: function(can, data, target) { var meta = can.base.Obj(data.meta) - can.page.Modify(can, target, {width: can.Conf(html.WIDTH)-200}) - }, + can.core.Value(item, "auto.cmd") && can.core.Timer300ms(function() { + var msg = sub.request({}, can.core.Value(item, "opts")); msg.Option(ice.MSG_HANDLE, ice.TRUE) + sub.Update(msg._event, [ctx.ACTION, can.core.Value(item, "auto.cmd")]) + }) + }, can._output, target) + }, + iframe: function(can, data, target) { var meta = can.base.Obj(data.meta) + can.page.Modify(can, target, {width: can.Conf(html.WIDTH)-200}) + }, }, [""]) Volcanos("onkeymap", {help: "键盘交互", list: [], - _mode: { - normal: { - "n": function(event, can) { can.ondetail.next(can.sub) }, - "j": function(event, can) { can.ondetail.next(can.sub) }, - "ArrowRight": function(event, can) { can.ondetail.next(can.sub) }, - "ArrowLeft": function(event, can) { can.ondetail.prev(can.sub) }, - "k": function(event, can) { can.ondetail.prev(can.sub) }, - "p": function(event, can) { can.ondetail.prev(can.sub) }, + _mode: { + normal: { + "n": function(event, can) { can.ondetail.next(can.sub) }, + "j": function(event, can) { can.ondetail.next(can.sub) }, + "ArrowRight": function(event, can) { can.ondetail.next(can.sub) }, + "ArrowLeft": function(event, can) { can.ondetail.prev(can.sub) }, + "k": function(event, can) { can.ondetail.prev(can.sub) }, + "p": function(event, can) { can.ondetail.prev(can.sub) }, - "q": function(event, can) { can.ondetail["结束"](event, can.sub) }, - "h": function(event, can) { can.ondetail["隐藏"](event, can.sub) }, - }, - }, _engine: {}, + "q": function(event, can) { can.ondetail["结束"](event, can.sub) }, + "h": function(event, can) { can.ondetail["隐藏"](event, can.sub) }, + }, + }, _engine: {}, }) Volcanos("onaction", {help: "控件交互", list: [], - play: function(event, can) { var list = [], current = [] - can.page.Select(can, can._output, wiki.ITEM, function(item) { - switch (item.tagName) { - case "H1": - case "H2": - case "H3": - list.push(current = []) - break - } - current.push(item) - }) + play: function(event, can) { var list = [], current = [] + can.page.Select(can, can._output, wiki.ITEM, function(item) { + switch (item.tagName) { + case "H1": + case "H2": + case "H3": + list.push(current = []) + break + } + current.push(item) + }) - can.onappend._init(can, {type: "story word float"}, [], function(sub) { - sub.run = can.run, sub.sup = can, can.sub = sub, can.onappend._action(sub, [ - ["布局", "开讲", "快闪", "网格"], "大纲", "首页", "上一页", - ["菜单"].concat(can.core.List(list, function(page) { return page[0].innerHTML })), - "下一页", "隐藏", "结束", - ], sub._action, can.ondetail) + can.onappend._init(can, {type: "story word float"}, [], function(sub) { + sub.run = can.run, sub.sup = can, can.sub = sub, can.onappend._action(sub, [ + ["布局", "开讲", "快闪", "网格"], "大纲", "首页", "上一页", + ["菜单"].concat(can.core.List(list, function(page) { return page[0].innerHTML })), + "下一页", "隐藏", "结束", + ], sub._action, can.ondetail) - can.onengine.signal(can, "keymap.focus", can.request(event, {cb: function(event) { - can.keylist = can.onkeymap._parse(event, can, "normal", can.keylist) - }})), can.onkeymap._build(can) + can.onengine.signal(can, "keymap.focus", can.request(event, {cb: function(event) { + 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._output, html.HEIGHT, window.innerHeight-4*html.PLUGIN_MARGIN-2*html.ACTION_HEIGHT) - sub.page.style(sub, sub._output, html.WIDTH, window.innerWidth-4*html.PLUGIN_MARGIN) + sub.page.style(sub, sub._target, html.BACKGROUND, document.body.style.background) + sub.page.style(sub, sub._output, html.HEIGHT, window.innerHeight-4*html.PLUGIN_MARGIN-2*html.ACTION_HEIGHT) + sub.page.style(sub, sub._output, html.WIDTH, window.innerWidth-4*html.PLUGIN_MARGIN) - sub.ui = sub.page.Append(sub, sub._output, [{view: chat.PROJECT}, {view: chat.CONTENT}]) - can.core.List(sub.list = list, function(page, index) { - can.onappend.item(can, html.ITEM, {name: page[0].innerHTML}, function(event) { - can.ondetail.show(sub, index) - }, function(event) {}, sub.ui.project) + sub.ui = sub.page.Append(sub, sub._output, [{view: chat.PROJECT}, {view: chat.CONTENT}]) + can.core.List(sub.list = list, function(page, index) { + can.onappend.item(can, html.ITEM, {name: page[0].innerHTML}, function(event) { + can.ondetail.show(sub, index) + }, function(event) {}, sub.ui.project) - sub.page.Append(sub, sub.ui.content, [{view: "page"+(index==0? " first": ""), list: can.core.List(page, function(item) { var data = item.dataset||{} - switch (data.type) { - case wiki.PREMENU: item = item.cloneNode(false); break - case chat.FIELD: item = can.onappend.field(can, chat.STORY, can.base.Obj(data.meta), sub.ui.content).first; break - default: item = item.cloneNode(true) - } - return can.core.CallFunc([can.onimport, data.type], [sub, data, item, window.innerWidth-4*html.PLUGIN_MARGIN]), item - }), }]) - }), can.onmotion.hidden(can, sub.ui.project), can.ondetail.show(sub, 0) + sub.page.Append(sub, sub.ui.content, [{view: "page"+(index==0? " first": ""), list: can.core.List(page, function(item) { var data = item.dataset||{} + switch (data.type) { + case wiki.PREMENU: item = item.cloneNode(false); break + case chat.FIELD: item = can.onappend.field(can, chat.STORY, can.base.Obj(data.meta), sub.ui.content).first; break + default: item = item.cloneNode(true) + } + return can.core.CallFunc([can.onimport, data.type], [sub, data, item, window.innerWidth-4*html.PLUGIN_MARGIN]), item + }), }]) + }), can.onmotion.hidden(can, sub.ui.project), can.ondetail.show(sub, 0) - sub.onappend._status(sub, [mdb.PAGE, cli.FROM, cli.COST]), sub.Status(cli.FROM, can.base.Time()) - 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) - }, + sub.onappend._status(sub, [mdb.PAGE, cli.FROM, cli.COST]), sub.Status(cli.FROM, can.base.Time()) + 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) + }, }) Volcanos("ondetail", {help: "交互操作", list: ["删除"], _init: function(can, msg, list, cb, target) { - }, - show: function(sub, which) { sub.page.Modify(sub, sub.ui.content, {className: chat.CONTENT}) - sub.page.Select(sub, sub.ui.content, wiki.DIV_PAGE, function(page, index) { - if (index == which || page == which) { - sub.page.Select(sub, page, sub.page.Keys(html.H1, html.H2, html.H3), function(item) { sub.Action("菜单", item.innerHTML) }) - sub.onmotion.select(sub, sub.ui.project, html.DIV_ITEM, index) - sub.Status(mdb.PAGE, index+1+ice.PS+sub.list.length) - sub.page.ClassList.add(sub, page, html.SHOW) - } else { - sub.page.ClassList.del(sub, page, html.SHOW) - } - }) - }, - next: function(sub) { - sub.page.Select(sub, sub.ui.content, sub.core.Keys(wiki.DIV_PAGE, ice.SHOW), function(page) { - page.nextSibling? sub.sup.ondetail.show(sub, page.nextSibling): sub.user.toast(sub, cli.END) - }) - }, - prev: function(sub) { - sub.page.Select(sub, sub.ui.content, sub.core.Keys(wiki.DIV_PAGE, ice.SHOW), function(page) { - page.previousSibling? sub.sup.ondetail.show(sub, page.previousSibling): sub.user.toast(sub, cli.END) - }) - }, - flash: function(sub) { - sub.core.Next(sub.page.Select(sub, sub.ui.content, wiki.DIV_PAGE), function(page, next) { - sub.sup.ondetail.show(sub, page), sub.core.Timer(500, function() { next() }) - }) - }, - grid: function(sub) { sub.page.Modify(sub, sub.ui.content, {className: "content grid"}) }, + }, + show: function(sub, which) { sub.page.Modify(sub, sub.ui.content, {className: chat.CONTENT}) + sub.page.Select(sub, sub.ui.content, wiki.DIV_PAGE, function(page, index) { + if (index == which || page == which) { + sub.page.Select(sub, page, sub.page.Keys(html.H1, html.H2, html.H3), function(item) { sub.Action("菜单", item.innerHTML) }) + sub.onmotion.select(sub, sub.ui.project, html.DIV_ITEM, index) + sub.Status(mdb.PAGE, index+1+ice.PS+sub.list.length) + sub.page.ClassList.add(sub, page, html.SHOW) + } else { + sub.page.ClassList.del(sub, page, html.SHOW) + } + }) + }, + next: function(sub) { + sub.page.Select(sub, sub.ui.content, sub.core.Keys(wiki.DIV_PAGE, ice.SHOW), function(page) { + page.nextSibling? sub.sup.ondetail.show(sub, page.nextSibling): sub.user.toast(sub, cli.END) + }) + }, + prev: function(sub) { + sub.page.Select(sub, sub.ui.content, sub.core.Keys(wiki.DIV_PAGE, ice.SHOW), function(page) { + page.previousSibling? sub.sup.ondetail.show(sub, page.previousSibling): sub.user.toast(sub, cli.END) + }) + }, + flash: function(sub) { + sub.core.Next(sub.page.Select(sub, sub.ui.content, wiki.DIV_PAGE), function(page, next) { + sub.sup.ondetail.show(sub, page), sub.core.Timer(500, function() { next() }) + }) + }, + grid: function(sub) { sub.page.Modify(sub, sub.ui.content, {className: "content grid"}) }, - "开讲": function(event, can) { can.sup.ondetail.show(can, 0) }, - "快闪": function(event, can) { can.sup.ondetail.flash(can) }, - "网格": function(event, can) { can.sup.ondetail.grid(can) }, + "开讲": function(event, can) { can.sup.ondetail.show(can, 0) }, + "快闪": function(event, can) { can.sup.ondetail.flash(can) }, + "网格": function(event, can) { can.sup.ondetail.grid(can) }, - "大纲": function(event, can) { can.onmotion.toggle(can, can.ui.project) }, - "首页": function(event, can) { can.sup.ondetail.show(can, 0) }, - "上一页": function(event, can) { can.sup.ondetail.prev(can, can.ui.content) }, - "菜单": function(event, can) { can.sup.ondetail.show(can, event.target.selectedIndex) }, - "下一页": function(event, can) { can.sup.ondetail.next(can, can.ui.content) }, - "隐藏": function(event, can) { can.onmotion.toggle(can, can._output) }, - "结束": function(event, can) { can.page.Remove(can, can._target) }, - "删除": function(event, sub) { sub.page.Remove(sub, sub._target) }, + "大纲": function(event, can) { can.onmotion.toggle(can, can.ui.project) }, + "首页": function(event, can) { can.sup.ondetail.show(can, 0) }, + "上一页": function(event, can) { can.sup.ondetail.prev(can, can.ui.content) }, + "菜单": function(event, can) { can.sup.ondetail.show(can, event.target.selectedIndex) }, + "下一页": function(event, can) { can.sup.ondetail.next(can, can.ui.content) }, + "隐藏": function(event, can) { can.onmotion.toggle(can, can._output) }, + "结束": function(event, can) { can.page.Remove(can, can._target) }, + "删除": function(event, sub) { sub.page.Remove(sub, sub._target) }, }) diff --git a/plugin/state.js b/plugin/state.js index 663bc7be..42e8a723 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -1,227 +1,227 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, conf, list, cb, target) {}, - _process: function(can, msg) { - msg.OptionStatus() && can.onmotion.clear(can, can._status) && can.onappend._status(can, can.base.Obj(msg.OptionStatus())) - return can.core.CallFunc([can.onimport, msg.OptionProcess()], [can, msg]) - }, + _process: function(can, msg) { + msg.OptionStatus() && can.onmotion.clear(can, can._status) && can.onappend._status(can, can.base.Obj(msg.OptionStatus())) + return can.core.CallFunc([can.onimport, msg.OptionProcess()], [can, msg]) + }, - _location: function(can, msg) { location.href = msg._arg[0] }, - _rewrite: function(can, msg) { - for (var i = 0; i < msg._arg.length; i += 2) { - can.Option(msg._arg[i], msg._arg[i+1]) - } - can.Update() - return true - }, - _refresh: function(can, msg) { - can.core.Timer(parseInt(msg.Option("_delay")||"500"), function() { - var sub = can.request({}, {_count: parseInt(msg.Option("_count"))-1}) - can.Update() - }) - return true - }, - _display: function(can, msg) { - Volcanos("some", {}, [msg.Option(ice.MSG_DISPLAY)].concat(Volcanos.meta.libs, Volcanos.meta.volcano), function(sub) { - sub.Conf(can.Conf()), sub.run = can.run - sub._option = can._option, sub._action = can._action - sub.onimport._init(sub, msg, [], function() {}, can._output) - }) - return true - }, - _field: function(can, msg) { - msg.Table(function(item) { can.onappend._plugin(can, item, {arg: can.base.Obj(item[ice.ARG], [])}, function(sub, meta) { - var opt = can.base.Obj(item[ice.OPT], []) - sub.Conf(html.HEIGHT, can.Conf(html.HEIGHT)) - sub.Conf(html.WIDTH, can.Conf(html.WIDTH)) - sub.run = function(event, cmds, cb, silent) { - var res = can.request(event, can.Option()) - for (var i = 0; i < opt.length; i += 2) { res.Option(opt[i], opt[i+1]) } - can.run(event, (msg[ice.MSG_PREFIX]||[]).concat(cmds), cb, true) - } - }) }) - return true - }, - _inner: function(can, msg) { - can.onappend.table(can, msg) - can.onappend.board(can, msg) - can.onmotion.story.auto(can) - can.page.Modify(can, can._output, {style: {display: html.BLOCK}}) - return true - }, + _location: function(can, msg) { location.href = msg._arg[0] }, + _rewrite: function(can, msg) { + for (var i = 0; i < msg._arg.length; i += 2) { + can.Option(msg._arg[i], msg._arg[i+1]) + } + can.Update() + return true + }, + _refresh: function(can, msg) { + can.core.Timer(parseInt(msg.Option("_delay")||"500"), function() { + var sub = can.request({}, {_count: parseInt(msg.Option("_count"))-1}) + can.Update() + }) + return true + }, + _display: function(can, msg) { + Volcanos("some", {}, [msg.Option(ice.MSG_DISPLAY)].concat(Volcanos.meta.libs, Volcanos.meta.volcano), function(sub) { + sub.Conf(can.Conf()), sub.run = can.run + sub._option = can._option, sub._action = can._action + sub.onimport._init(sub, msg, [], function() {}, can._output) + }) + return true + }, + _field: function(can, msg) { + msg.Table(function(item) { can.onappend._plugin(can, item, {arg: can.base.Obj(item[ice.ARG], [])}, function(sub, meta) { + var opt = can.base.Obj(item[ice.OPT], []) + sub.Conf(html.HEIGHT, can.Conf(html.HEIGHT)) + sub.Conf(html.WIDTH, can.Conf(html.WIDTH)) + sub.run = function(event, cmds, cb, silent) { + var res = can.request(event, can.Option()) + for (var i = 0; i < opt.length; i += 2) { res.Option(opt[i], opt[i+1]) } + can.run(event, (msg[ice.MSG_PREFIX]||[]).concat(cmds), cb, true) + } + }) }) + return true + }, + _inner: function(can, msg) { + can.onappend.table(can, msg) + can.onappend.board(can, msg) + can.onmotion.story.auto(can) + can.page.Modify(can, can._output, {style: {display: html.BLOCK}}) + return true + }, - _open: function(can, msg) { can.user.open(msg.Option("_arg")); return true }, - _hold: function(can, msg) { return true }, - _back: function(can) { - can._history.pop(); for (var his = can._history.pop(); his; his = can._history.pop()) { - if (his[0] == ctx.ACTION) { continue } - can.page.SelectArgs(can, can._option, "", function(item, index) { item.value = his[index]||"" }), can.Update() - break - } - !his && can.Update() - return true - }, + _open: function(can, msg) { can.user.open(msg.Option("_arg")); return true }, + _hold: function(can, msg) { return true }, + _back: function(can) { + can._history.pop(); for (var his = can._history.pop(); his; his = can._history.pop()) { + if (his[0] == ctx.ACTION) { continue } + can.page.SelectArgs(can, can._option, "", function(item, index) { item.value = his[index]||"" }), can.Update() + break + } + !his && can.Update() + return true + }, - _grow: function(can, str) { - if (can.page.Select(can, can._output, "div.code", function(div) { - can.page.Modify(can, div, {style: {"max-height": 400}}) - can.page.Append(can, div, [{text: [str]}]) - div.scrollBy(0, 10000) - return true - }).length == 0) { - can.onappend.board(can, str) - } - }, + _grow: function(can, str) { + if (can.page.Select(can, can._output, "div.code", function(div) { + can.page.Modify(can, div, {style: {"max-height": 400}}) + can.page.Append(can, div, [{text: [str]}]) + div.scrollBy(0, 10000) + return true + }).length == 0) { + can.onappend.board(can, str) + } + }, }) Volcanos("onaction", {help: "交互操作", list: [ - "共享工具", "打开链接", "生成链接", "生成脚本", "生成图片", "清空参数", "刷新数据", [ - "其它 ->", "复制数据", "下载数据", "清空数据", "删除工具", "摄像头", "生成图片", - ], - ], _init: function(can, msg, list, cb, target) {}, - _engine: function(event, can, button) { - can.Update(event, [ctx.ACTION, button].concat(can.Input([], true))) - }, - "共享工具": function(event, can) { var meta = can.Conf() - can.onmotion.share(event, can, [{name: chat.TITLE, value: meta.name}, {name: chat.TOPIC, values: [cli.WHITE, cli.BLACK]}], [ - mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input([], true)), - ]) - }, - "打开链接": function(event, can) { var meta = can.Conf() - var pre = "/chat/cmd/"; if (can.user.mod.isPod) { pre = "/chat/pod/"+can.misc.Search(can, ice.POD)+"/cmd/" } - var args = can.Option(); args._path = pre+(meta.index||can.core.Keys(meta.ctx, meta.cmd)) - args._path.indexOf("/cmd/web.wiki.word") > -1 && (args = {_path: pre+args.path}) + "共享工具", "打开链接", "生成链接", "生成脚本", "生成图片", "清空参数", "刷新数据", [ + "其它 ->", "复制数据", "下载数据", "清空数据", "删除工具", "摄像头", "生成图片", + ], + ], _init: function(can, msg, list, cb, target) {}, + _engine: function(event, can, button) { + can.Update(event, [ctx.ACTION, button].concat(can.Input([], true))) + }, + "共享工具": function(event, can) { var meta = can.Conf() + can.onmotion.share(event, can, [{name: chat.TITLE, value: meta.name}, {name: chat.TOPIC, values: [cli.WHITE, cli.BLACK]}], [ + mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input([], true)), + ]) + }, + "打开链接": function(event, can) { var meta = can.Conf() + var pre = "/chat/cmd/"; if (can.user.mod.isPod) { pre = "/chat/pod/"+can.misc.Search(can, ice.POD)+"/cmd/" } + var args = can.Option(); args._path = pre+(meta.index||can.core.Keys(meta.ctx, meta.cmd)) + args._path.indexOf("/cmd/web.wiki.word") > -1 && (args = {_path: pre+args.path}) - can.user.open(can.misc.MergeURL(can, args)) - }, - "生成链接": function(event, can) { var meta = can.Conf() - var pre = "/chat/cmd/"; if (can.user.mod.isPod) { pre = "/chat/pod/"+can.misc.Search(can, ice.POD)+"/cmd/" } - var args = can.Option(); args._path = pre+(meta.index||can.core.Keys(meta.ctx, meta.cmd)) - args._path.indexOf("/cmd/web.wiki.word") > -1 && (args = {_path: pre+args.path}) - var url = can.misc.MergeURL(can, args) - can.user.copy(event, can, url) - can.onmotion.share(event, can, [], [mdb.LINK, url]) - }, - "生成脚本": function(event, can, button) { var conf = can.Conf() - var args = can.Input("", true).join(ice.SP); var list = [ - "export ctx_dev="+location.origin+"; ctx_temp=$(mktemp); curl -fsSL $ctx_dev -o $ctx_temp;"+" source $ctx_temp "+(conf.index||"")+ice.SP+args, - "ish_sys_dev_run_command "+args, "ish_sys_dev_run_action", "ish_sys_dev_run_source", - ] - var ui = can.user.toast(can, {title: button, duration: -1, width: -300, - content: '
'+ - ''+''+list.join("
")+''+'
', - action: [cli.CLOSE], - }) - can.onmotion.story.auto(can, ui._target) - can.user.copy(event, can, list[0]) - }, - "生成图片": function(event, can) { can.onmotion.toimage(event, can, can._name) }, - "保存参数": function(event, can) { can.search(event, ["River.ondetail.保存参数"]) }, - "清空参数": function(event, can) { - can.page.SelectArgs(can, can._option, "", function(item) { return item.value = "" }) - }, - "刷新数据": function(event, can) { can.Update({}, can.Input([], true)) }, + can.user.open(can.misc.MergeURL(can, args)) + }, + "生成链接": function(event, can) { var meta = can.Conf() + var pre = "/chat/cmd/"; if (can.user.mod.isPod) { pre = "/chat/pod/"+can.misc.Search(can, ice.POD)+"/cmd/" } + var args = can.Option(); args._path = pre+(meta.index||can.core.Keys(meta.ctx, meta.cmd)) + args._path.indexOf("/cmd/web.wiki.word") > -1 && (args = {_path: pre+args.path}) + var url = can.misc.MergeURL(can, args) + can.user.copy(event, can, url) + can.onmotion.share(event, can, [], [mdb.LINK, url]) + }, + "生成脚本": function(event, can, button) { var conf = can.Conf() + var args = can.Input("", true).join(ice.SP); var list = [ + "export ctx_dev="+location.origin+"; ctx_temp=$(mktemp); curl -fsSL $ctx_dev -o $ctx_temp;"+" source $ctx_temp "+(conf.index||"")+ice.SP+args, + "ish_sys_dev_run_command "+args, "ish_sys_dev_run_action", "ish_sys_dev_run_source", + ] + var ui = can.user.toast(can, {title: button, duration: -1, width: -300, + content: '
'+ + ''+''+list.join("
")+''+'
', + action: [cli.CLOSE], + }) + can.onmotion.story.auto(can, ui._target) + can.user.copy(event, can, list[0]) + }, + "生成图片": function(event, can) { can.onmotion.toimage(event, can, can._name) }, + "保存参数": function(event, can) { can.search(event, ["River.ondetail.保存参数"]) }, + "清空参数": function(event, can) { + can.page.SelectArgs(can, can._option, "", function(item) { return item.value = "" }) + }, + "刷新数据": function(event, can) { can.Update({}, can.Input([], true)) }, - "复制数据": function(event, can) { var meta = can.Conf(), msg = can._msg - var res = [msg.append && msg.append.join(",")]; msg.Table(function(line, index, array) { - res.push(can.core.Item(line, function(key, value) { return value }).join(",")) - }) + "复制数据": function(event, can) { var meta = can.Conf(), msg = can._msg + var res = [msg.append && msg.append.join(",")]; msg.Table(function(line, index, array) { + res.push(can.core.Item(line, function(key, value) { return value }).join(",")) + }) - res.length > 1 && can.user.copy(event, can, res.join(ice.SP)) - msg.result && can.user.copy(event, can, msg.Result()) - }, - "下载数据": function(event, can) { var meta = can.Conf(), msg = can._msg - var res = [msg.append && msg.append.join(",")]; msg.Table(function(line, index, array) { - res.push(can.core.Item(line, function(key, value) { return value }).join(",")) - }) + res.length > 1 && can.user.copy(event, can, res.join(ice.SP)) + msg.result && can.user.copy(event, can, msg.Result()) + }, + "下载数据": function(event, can) { var meta = can.Conf(), msg = can._msg + var res = [msg.append && msg.append.join(",")]; msg.Table(function(line, index, array) { + res.push(can.core.Item(line, function(key, value) { return value }).join(",")) + }) - res.length > 1 && can.user.downloads(can, res.join("\n"), meta.name+".csv") - msg.result && can.user.downloads(can, msg.Result(), meta.name+".txt") - }, - "清空数据": function(event, can) { can.onmotion.clear(can, can._output) }, - "删除工具": function(event, can) { can.page.Remove(can, can._target) }, - // "生成图片": function(event, can) { - // can.user.toPNG(can, "hi.png", can._target.outerHTML, can.Conf(html.HEIGHT), can.Conf(html.WIDTH)) - // }, + res.length > 1 && can.user.downloads(can, res.join("\n"), meta.name+".csv") + msg.result && can.user.downloads(can, msg.Result(), meta.name+".txt") + }, + "清空数据": function(event, can) { can.onmotion.clear(can, can._output) }, + "删除工具": function(event, can) { can.page.Remove(can, can._target) }, + // "生成图片": function(event, can) { + // can.user.toPNG(can, "hi.png", can._target.outerHTML, can.Conf(html.HEIGHT), can.Conf(html.WIDTH)) + // }, - "摄像头": function(event, can) { - var constraints = {audio: false, video: {width: 200, height: 200}} - var ui = can.page.Append(can, can._output, [{view: ctx.ACTION}, {view: "capture", list: [{type: "video", _init: function(item) { - navigator.mediaDevices.getUserMedia(constraints).then(function(stream) { - item.srcObject = stream, item.onloadedmetadata = function(e) { - item.play() - }, ui.stream = stream - }).catch(function(err) { console.log(err.name + ": " + err.message); }) - }}]}]) + "摄像头": function(event, can) { + var constraints = {audio: false, video: {width: 200, height: 200}} + var ui = can.page.Append(can, can._output, [{view: ctx.ACTION}, {view: "capture", list: [{type: "video", _init: function(item) { + navigator.mediaDevices.getUserMedia(constraints).then(function(stream) { + item.srcObject = stream, item.onloadedmetadata = function(e) { + item.play() + }, ui.stream = stream + }).catch(function(err) { console.log(err.name + ": " + err.message); }) + }}]}]) - can.onappend._action(can, ["关闭", "抓拍"], ui.action, { - "抓拍": function(event) { - var canvas = can.page.Append(can, ui.capture, [{type: "canvas", width: ui.video.offsetWidth, height: ui.video.offsetHeight}]).first - canvas.getContext("2d").drawImage(ui.video, 0, 0) - can.page.Append(can, ui.capture, [{img: canvas.toDataURL('image/png'), style: {width: ui.video.offsetWidth, height: ui.video.offsetHeight}}]) - can.page.Remove(can, canvas) - }, - "关闭": function(event) { - can.core.List(ui.stream.getTracks(), function(track) { track.stop() }) - can.page.Remove(can, ui.action) - can.page.Remove(can, ui.video) - can.page.Remove(can, ui.capture) - }, - }) - }, + can.onappend._action(can, ["关闭", "抓拍"], ui.action, { + "抓拍": function(event) { + var canvas = can.page.Append(can, ui.capture, [{type: "canvas", width: ui.video.offsetWidth, height: ui.video.offsetHeight}]).first + canvas.getContext("2d").drawImage(ui.video, 0, 0) + can.page.Append(can, ui.capture, [{img: canvas.toDataURL('image/png'), style: {width: ui.video.offsetWidth, height: ui.video.offsetHeight}}]) + can.page.Remove(can, canvas) + }, + "关闭": function(event) { + can.core.List(ui.stream.getTracks(), function(track) { track.stop() }) + can.page.Remove(can, ui.action) + can.page.Remove(can, ui.video) + can.page.Remove(can, ui.capture) + }, + }) + }, - actions: function(event, can) { can.onmotion.toggle(can, can._action) }, - clear: function(event, can, name) { can.onmotion.clear(can, can._output) }, - close: function(event, can) { can.page.Remove(can, can._target) }, - upload: function(event, can) { can.user.upload(event, can) }, - change: function(event, can, name, value, cb) { - return can.page.SelectArgs(can, can._option, "", function(input) { - if (input.name == name && value != input.value) { input.value = value - var data = input.dataset||{}; can.Update(event, can.Input(), cb) - return input - } - }) - }, + actions: function(event, can) { can.onmotion.toggle(can, can._action) }, + clear: function(event, can, name) { can.onmotion.clear(can, can._output) }, + close: function(event, can) { can.page.Remove(can, can._target) }, + upload: function(event, can) { can.user.upload(event, can) }, + change: function(event, can, name, value, cb) { + return can.page.SelectArgs(can, can._option, "", function(input) { + if (input.name == name && value != input.value) { input.value = value + var data = input.dataset||{}; can.Update(event, can.Input(), cb) + return input + } + }) + }, - next: function(event, can) { - can.Update(event, [ctx.ACTION, "next", can.Status("total")||0, can.Option("limit"), can.Option("offend")]) - }, - prev: function(event, can) { - can.Update(event, [ctx.ACTION, "prev", can.Status("total")||0, can.Option("limit"), can.Option("offend")]) - }, + next: function(event, can) { + can.Update(event, [ctx.ACTION, "next", can.Status("total")||0, can.Option("limit"), can.Option("offend")]) + }, + prev: function(event, can) { + can.Update(event, [ctx.ACTION, "prev", can.Status("total")||0, can.Option("limit"), can.Option("offend")]) + }, - listTags: function(event, can, button) { var list = [] - can.core.List([can.base, can.core, can.misc, can.page, can.user, - can.onengine, can.ondaemon, can.onappend, can.onlayout, can.onmotion, can.onkeymap, - ], function(lib) { - can.core.Item(lib, function(key, value) { if (key.indexOf("_") == 0 || !lib.hasOwnProperty(key)) { return } - list.push({zone: lib._name, type: typeof value, name: key, text: can.base.isObject(value)? "": (value+"").split(ice.NL)[0], - path: "usr/volcanos/", file: lib._path, line: 1, - }) - }) - }) - var msg = can.request(event, {_handle: true, text: can.base.Format(list)}) - can.run(event, [ctx.ACTION, button], function() { can.user.toastSuccess(can) }) - }, - getClipboardData: function(event, can, button) { - function add(text) { - can.run(event, can.base.Simple(ctx.ACTION, button, can.base.ParseJSON(text)), function(msg) { - can.user.toastSuccess(can), can.Update() - }, true) - } - if (navigator.clipboard) { - navigator.clipboard.readText().then(add).catch(function(err) { can.misc.Log(err) }) - } else { - can.user.input(event, can, [{type: html.TEXTAREA, name: mdb.TEXT}], function(ev, button, data, list, args) { add(list[0]) }) - } - }, - getLocation: function(event, can, button) { - can.user.agent.getLocation(function(data) { can.request(event, data) - can.user.input(event, can, [mdb.TYPE, mdb.NAME, mdb.TEXT, "latitude", "longitude"], function(ev, bu, data, list, args) { - can.run(event, [ctx.ACTION, button].concat(can.base.Simple(args, data)), function(msg) { - can.user.toastSuccess(can), can.Update() - }, true) - }) - }) - }, - openLocation: function(event, can) { can.user.agent.openLocation(can.request(event)) }, + listTags: function(event, can, button) { var list = [] + can.core.List([can.base, can.core, can.misc, can.page, can.user, + can.onengine, can.ondaemon, can.onappend, can.onlayout, can.onmotion, can.onkeymap, + ], function(lib) { + can.core.Item(lib, function(key, value) { if (key.indexOf("_") == 0 || !lib.hasOwnProperty(key)) { return } + list.push({zone: lib._name, type: typeof value, name: key, text: can.base.isObject(value)? "": (value+"").split(ice.NL)[0], + path: "usr/volcanos/", file: lib._path, line: 1, + }) + }) + }) + var msg = can.request(event, {_handle: true, text: can.base.Format(list)}) + can.run(event, [ctx.ACTION, button], function() { can.user.toastSuccess(can) }) + }, + getClipboardData: function(event, can, button) { + function add(text) { + can.run(event, can.base.Simple(ctx.ACTION, button, can.base.ParseJSON(text)), function(msg) { + can.user.toastSuccess(can), can.Update() + }, true) + } + if (navigator.clipboard) { + navigator.clipboard.readText().then(add).catch(function(err) { can.misc.Log(err) }) + } else { + can.user.input(event, can, [{type: html.TEXTAREA, name: mdb.TEXT}], function(ev, button, data, list, args) { add(list[0]) }) + } + }, + getLocation: function(event, can, button) { + can.user.agent.getLocation(function(data) { can.request(event, data) + can.user.input(event, can, [mdb.TYPE, mdb.NAME, mdb.TEXT, "latitude", "longitude"], function(ev, bu, data, list, args) { + can.run(event, [ctx.ACTION, button].concat(can.base.Simple(args, data)), function(msg) { + can.user.toastSuccess(can), can.Update() + }, true) + }) + }) + }, + openLocation: function(event, can) { can.user.agent.openLocation(can.request(event)) }, }) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/plugin/story/json.js b/plugin/story/json.js index 52b5d1de..90585e4d 100644 --- a/plugin/story/json.js +++ b/plugin/story/json.js @@ -1,60 +1,60 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) - can.onimport.show(can, can.base.Obj(msg.Result(), {}), target) - }, - show: function(can, data, target) { - function show(data, target, index, total) { var list - switch (typeof data) { - case lang.OBJECT: - if (data == null) { - return can.page.Append(can, list, [{text: "null"}]).item - return - } - function wrap(begin, end, add, cb) { - can.page.Append(can, target, [{text: begin}]) - add && can.page.Append(can, target, [{text: ["...", html.SPAN, "nonce"]}]), cb() - can.page.Append(can, target, [{text: end}]) - } - function toggle(list) { list && can.onmotion.toggle(can, list) } - function _item() { - list = list || can.page.Append(can, target, [{view: html.LIST}]).list - return can.page.Append(can, list, [{view: html.ITEM}]).item - } + can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) + can.onimport.show(can, can.base.Obj(msg.Result(), {}), target) + }, + show: function(can, data, target) { + function show(data, target, index, total) { var list + switch (typeof data) { + case lang.OBJECT: + if (data == null) { + return can.page.Append(can, list, [{text: "null"}]).item + return + } + function wrap(begin, end, add, cb) { + can.page.Append(can, target, [{text: begin}]) + add && can.page.Append(can, target, [{text: ["...", html.SPAN, "nonce"]}]), cb() + can.page.Append(can, target, [{text: end}]) + } + function toggle(list) { list && can.onmotion.toggle(can, list) } + function _item() { + list = list || can.page.Append(can, target, [{view: html.LIST}]).list + return can.page.Append(can, list, [{view: html.ITEM}]).item + } - if (can.base.isArray(data)) { // 数组 - wrap("[", "]", data.length > 0, function() { can.core.List(data, function(value, index) { var item = _item() - show(value, item, index, data.length) - }) }) - } else { // 对象 - var length = can.core.Item(data).length, count = 0 - wrap("{", "}", length > 0, function() { can.core.Item(data, function(key, value) { var item = _item() - can.page.Append(can, item, [{text: ['"'+key+'"', html.SPAN, "key"], onclick: function(event) { toggle(sub) }}, {text: ': '}]) - var sub = show(value, item, count++, length) - }) }) - } - break - case lang.STRING: /* 字串 */ can.page.Append(can, target, [{text: ['"'+data+'"', html.SPAN, lang.STRING]}]); break - default: /* 其它 */ can.page.Append(can, target, [{text: [''+data+'', html.SPAN, "const"]}]) - } - (index < total-1) && can.page.Append(can, target, [{text: ice.FS}]) - return list - }; show(data, can.page.Append(can, target, [{view: html.ITEM}]).item, 0, 0) - }, + if (can.base.isArray(data)) { // 数组 + wrap("[", "]", data.length > 0, function() { can.core.List(data, function(value, index) { var item = _item() + show(value, item, index, data.length) + }) }) + } else { // 对象 + var length = can.core.Item(data).length, count = 0 + wrap("{", "}", length > 0, function() { can.core.Item(data, function(key, value) { var item = _item() + can.page.Append(can, item, [{text: ['"'+key+'"', html.SPAN, "key"], onclick: function(event) { toggle(sub) }}, {text: ': '}]) + var sub = show(value, item, count++, length) + }) }) + } + break + case lang.STRING: /* 字串 */ can.page.Append(can, target, [{text: ['"'+data+'"', html.SPAN, lang.STRING]}]); break + default: /* 其它 */ can.page.Append(can, target, [{text: [''+data+'', html.SPAN, "const"]}]) + } + (index < total-1) && can.page.Append(can, target, [{text: ice.FS}]) + return list + }; show(data, can.page.Append(can, target, [{view: html.ITEM}]).item, 0, 0) + }, }, [""]) Volcanos("onaction", {help: "组件菜单", list: ["展开", "折叠", "复制"], - "展开": function(event, can) { - can.page.Select(can, can._output, "div.list div.list", function(list) { - can.onmotion.hidden(can, list, true) - }) - }, - "折叠": function(event, can) { - can.page.Select(can, can._output, "div.list div.list", function(list) { - can.onmotion.hidden(can, list) - }) - }, - "复制": function(event, can) { - can.user.copy(event, can, can._msg.Result()) - }, + "展开": function(event, can) { + can.page.Select(can, can._output, "div.list div.list", function(list) { + can.onmotion.hidden(can, list, true) + }) + }, + "折叠": function(event, can) { + can.page.Select(can, can._output, "div.list div.list", function(list) { + can.onmotion.hidden(can, list) + }) + }, + "复制": function(event, can) { + can.user.copy(event, can, can._msg.Result()) + }, }) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/plugin/story/pie.js b/plugin/story/pie.js index 416d940a..cfa6eeeb 100644 --- a/plugin/story/pie.js +++ b/plugin/story/pie.js @@ -1,44 +1,44 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() { - can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) - can.onmotion.clear(can), can.onimport._show(can, msg) - var r = 200, margin = 20; can.svg.Val(html.WIDTH, 2*(r+margin)), can.svg.Val(html.HEIGHT, 2*(r+margin)) - can._args = can.base.Copy({field: "value"}, can.base.ParseURL(can._display)) - can.onimport._draw(can, msg, can._args.field, r+margin, r+margin, r, margin, 0) - can.onmotion.clear(can, can.ui.project), can.onappend.table(can, msg, null, can.ui.project) - can.onmotion.hidden(can, can.ui.project, true) - can.page.Modify(can, can.ui.project, {style: {"max-width": 480}}) - can.page.Select(can, can.ui.project, html.TR, function(tr, index) { - can.page.Modify(can, tr, {onmouseenter: function(event) { - can.onmotion.clear(can, can.svg), can.onimport._draw(can, msg, can._args.field, r+margin, r+margin, r, margin, index-1) - }}) - }) - }) - }, - _draw: function(can, msg, field, x, y, r, margin, which) { - function pos(x, y, r, angle) { angle -= 90 - return [x + r * Math.cos(angle * Math.PI / 180), y + r * Math.sin(angle * Math.PI / 180)] - } - function pie(x, y, r, begin, span, color, cb) { can.onimport.draw({}, can, {shape: "path", style: { - "stroke-width": 1, stroke: color, fill: color, d: can.base.joins([ - ["M", x, y], ["L"].concat(pos(x, y, r, begin)), ["A", r, r, "0", span>180? "1": "0", "1"].concat(pos(x, y, r, begin+span)), ["Z"] - ], ice.SP, ice.FS), - }, onmouseenter: function(event) { - can.base.isFunc(cb) && cb(event) - } }) } + can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() { + can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) + can.onmotion.clear(can), can.onimport._show(can, msg) + var r = 200, margin = 20; can.svg.Val(html.WIDTH, 2*(r+margin)), can.svg.Val(html.HEIGHT, 2*(r+margin)) + can._args = can.base.Copy({field: "value"}, can.base.ParseURL(can._display)) + can.onimport._draw(can, msg, can._args.field, r+margin, r+margin, r, margin, 0) + can.onmotion.clear(can, can.ui.project), can.onappend.table(can, msg, null, can.ui.project) + can.onmotion.hidden(can, can.ui.project, true) + can.page.Modify(can, can.ui.project, {style: {"max-width": 480}}) + can.page.Select(can, can.ui.project, html.TR, function(tr, index) { + can.page.Modify(can, tr, {onmouseenter: function(event) { + can.onmotion.clear(can, can.svg), can.onimport._draw(can, msg, can._args.field, r+margin, r+margin, r, margin, index-1) + }}) + }) + }) + }, + _draw: function(can, msg, field, x, y, r, margin, which) { + function pos(x, y, r, angle) { angle -= 90 + return [x + r * Math.cos(angle * Math.PI / 180), y + r * Math.sin(angle * Math.PI / 180)] + } + function pie(x, y, r, begin, span, color, cb) { can.onimport.draw({}, can, {shape: "path", style: { + "stroke-width": 1, stroke: color, fill: color, d: can.base.joins([ + ["M", x, y], ["L"].concat(pos(x, y, r, begin)), ["A", r, r, "0", span>180? "1": "0", "1"].concat(pos(x, y, r, begin+span)), ["Z"] + ], ice.SP, ice.FS), + }, onmouseenter: function(event) { + can.base.isFunc(cb) && cb(event) + } }) } - var total = 0; msg.Table(function(value) { total += parseInt(value[field]) }) - var color = [cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.PURPLE, cli.WHITE, cli.BLACK] - var begin = 0; msg["color"] = [], msg["weight"] = [], msg.Table(function(value, index) { var span = parseInt(value[field])/total*360 - var p = index==which? pos(x, y, margin, begin+span/2): [x, y]; index == which && can.Status(value) - var c = color[index%color.length]; pie(p[0], p[1], r, begin, span, c, function(event) { - if (index == can._last) { return } can._last = index - can.onmotion.clear(can, can.svg), can.svg.Value("count", 0) - can.onimport._draw(can, msg, field, x, y, r, margin, index) - can.onimport._profile(can, event.target) - }), begin += span, msg.Push("color", ' ') - msg.Push("weight", parseInt(parseInt(value[field])*10000/total)/100+"%") - }) - }, + var total = 0; msg.Table(function(value) { total += parseInt(value[field]) }) + var color = [cli.RED, cli.YELLOW, cli.GREEN, cli.CYAN, cli.BLUE, cli.PURPLE, cli.WHITE, cli.BLACK] + var begin = 0; msg["color"] = [], msg["weight"] = [], msg.Table(function(value, index) { var span = parseInt(value[field])/total*360 + var p = index==which? pos(x, y, margin, begin+span/2): [x, y]; index == which && can.Status(value) + var c = color[index%color.length]; pie(p[0], p[1], r, begin, span, c, function(event) { + if (index == can._last) { return } can._last = index + can.onmotion.clear(can, can.svg), can.svg.Value("count", 0) + can.onimport._draw(can, msg, field, x, y, r, margin, index) + can.onimport._profile(can, event.target) + }), begin += span, msg.Push("color", ' ') + msg.Push("weight", parseInt(parseInt(value[field])*10000/total)/100+"%") + }) + }, }) diff --git a/plugin/story/spide.js b/plugin/story/spide.js index 8b3dae2f..36c2bf37 100644 --- a/plugin/story/spide.js +++ b/plugin/story/spide.js @@ -1,191 +1,191 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) - if (msg.Length() == 0) { return } + can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) + if (msg.Length() == 0) { return } - can._args = can.base.Copy({root: "ice", field: msg.append[0], split: ice.PS}, can.base.ParseURL(can._display)) - can.dir_root = msg.Option(nfs.DIR_ROOT)||can._args.root||"" - can._tree = can.onimport._tree(can, msg.Table(), can._args.field, can._args.split) - if (!can._tree[""]) { return } - can._tree[""].name = can._args.root + can._args = can.base.Copy({root: "ice", field: msg.append[0], split: ice.PS}, can.base.ParseURL(can._display)) + can.dir_root = msg.Option(nfs.DIR_ROOT)||can._args.root||"" + can._tree = can.onimport._tree(can, msg.Table(), can._args.field, can._args.split) + if (!can._tree[""]) { return } + can._tree[""].name = can._args.root - can.size = 30, can.margin = 30 - can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() { - can.page.ClassList.add(can, can._fields, "draw") - can.onimport._show(can, msg), can.onmotion.hidden(can, can.ui.project) - var p = can.Action(ice.VIEW, can.sup.view||can.Action(ice.VIEW)) - can.onaction[p](event, can, p) - }) - }, + can.size = 30, can.margin = 30 + can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() { + can.page.ClassList.add(can, can._fields, "draw") + can.onimport._show(can, msg), can.onmotion.hidden(can, can.ui.project) + var p = can.Action(ice.VIEW, can.sup.view||can.Action(ice.VIEW)) + can.onaction[p](event, can, p) + }) + }, - _tree: function(can, list, field, split) { - var node = {}; can.core.List(list, function(item) { if (!item[field]) { return } - can.core.List(can.base.trimPrefix(item[field], can.dir_root+can._args.split).split(split), function(value, index, array) { - var last = array.slice(0, index).join(split)||"", name = array.slice(0, index+1).join(split) - if (!value || node[name]) { return } + _tree: function(can, list, field, split) { + var node = {}; can.core.List(list, function(item) { if (!item[field]) { return } + can.core.List(can.base.trimPrefix(item[field], can.dir_root+can._args.split).split(split), function(value, index, array) { + var last = array.slice(0, index).join(split)||"", name = array.slice(0, index+1).join(split) + if (!value || node[name]) { return } - node[last] = node[last]||{name: last, meta: {}, list: []} - node[last].list.push(node[name] = { - name: value+(index==array.length-1? "": split), - meta: item, list: [], last: node[last], - file: item[field]||item.file, hide: true, - }) - }) - }) - return node - }, - _height: function(can, tree, deep) { if (!tree) { return 0 } - tree.deep = deep||0 - if (tree.list.length == 0 || tree.hide) { return tree.height = 1 } + node[last] = node[last]||{name: last, meta: {}, list: []} + node[last].list.push(node[name] = { + name: value+(index==array.length-1? "": split), + meta: item, list: [], last: node[last], + file: item[field]||item.file, hide: true, + }) + }) + }) + return node + }, + _height: function(can, tree, deep) { if (!tree) { return 0 } + tree.deep = deep||0 + if (tree.list.length == 0 || tree.hide) { return tree.height = 1 } - var height = 0; can.core.List(tree.list, function(item) { - height += can.onimport._height(can, item, (deep||0)+1) - }) - return tree.height = height - }, - _width: function(can, tree, deep) { if (!tree) { return 0 } - tree.deep = deep||0 - if (tree.list.length == 0 || tree.hide) { - tree.view = can.onimport.draw({}, can, {shape: html.TEXT, point: [{x: 0, y: 0}], style: {inner: tree.name}}) - return tree.width = tree.view.Val("textLength")+can.margin - } + var height = 0; can.core.List(tree.list, function(item) { + height += can.onimport._height(can, item, (deep||0)+1) + }) + return tree.height = height + }, + _width: function(can, tree, deep) { if (!tree) { return 0 } + tree.deep = deep||0 + if (tree.list.length == 0 || tree.hide) { + tree.view = can.onimport.draw({}, can, {shape: html.TEXT, point: [{x: 0, y: 0}], style: {inner: tree.name}}) + return tree.width = tree.view.Val("textLength")+can.margin + } - var width = 0; can.core.List(tree.list, function(item) { - width += can.onimport._width(can, item, (deep||0)+1) - }) - return tree.width = width - }, - _color: function(can, tree) { - return tree.meta&&tree.meta.color || (tree.list == 0? cli.PURPLE: cli.YELLOW) - }, + var width = 0; can.core.List(tree.list, function(item) { + width += can.onimport._width(can, item, (deep||0)+1) + }) + return tree.width = width + }, + _color: function(can, tree) { + return tree.meta&&tree.meta.color || (tree.list == 0? cli.PURPLE: cli.YELLOW) + }, }, [""]) Volcanos("onaction", {help: "用户操作", list: ["编辑", [ice.VIEW, "横向", "纵向"], "生成图片"], - "编辑": function(event, can) { - can.onmotion.toggle(can, can._action) - can.onmotion.toggle(can, can._status) - }, - "横向": function(event, can) { - can.onimport._height(can, can._tree[""]) - can.sup.view = "横向", can.onmotion.clear(can, can.svg) + "编辑": function(event, can) { + can.onmotion.toggle(can, can._action) + can.onmotion.toggle(can, can._status) + }, + "横向": function(event, can) { + can.onimport._height(can, can._tree[""]) + can.sup.view = "横向", can.onmotion.clear(can, can.svg) - can.svg.Val(html.HEIGHT, can._tree[""].height*can.size+2*can.margin) - can.width = 0, can.onaction._draw_horizontal(can, can._tree[""], can.margin, can.margin) - can.svg.Val(html.WIDTH, can.width+can.margin) - }, - "纵向": function(event, can) { - can.onimport._width(can, can._tree[""]) - can.sup.view = "纵向", can.onmotion.clear(can, can.svg) + can.svg.Val(html.HEIGHT, can._tree[""].height*can.size+2*can.margin) + can.width = 0, can.onaction._draw_horizontal(can, can._tree[""], can.margin, can.margin) + can.svg.Val(html.WIDTH, can.width+can.margin) + }, + "纵向": function(event, can) { + can.onimport._width(can, can._tree[""]) + can.sup.view = "纵向", can.onmotion.clear(can, can.svg) - can.svg.Val(html.WIDTH, can._tree[""].width+2*can.margin) - can.height = 0, can.onaction._draw_vertical(can, can._tree[""], can.margin, can.margin+can.size) - can.svg.Val(html.HEIGHT, can.height+can.margin) - }, - "生成图片": function(event, can) { - can.user.toPNG(can, "hi.png", can.svg.outerHTML, can.svg.Val(html.HEIGHT), can.svg.Val(html.WIDTH)) - }, - _draw: function(can, tree, x, y, style) { - var color = can.onimport._color(can, tree) - tree.view = can.onimport.draw({}, can, { - shape: html.TEXT, point: [{x: x, y: y}], style: can.base.Copy({ - stroke: color, fill: color, "text-anchor": "start", inner: tree.name||tree.file, - }, style), - }), can.core.ItemCB(can.ondetail, tree.view, can, tree) - }, - _draw_vertical: function(can, tree, x, y) { tree.x = x, tree.y = y - can.onaction._draw(can, tree, x+tree.width/2, y, {"text-anchor": "middle"}) + can.svg.Val(html.WIDTH, can._tree[""].width+2*can.margin) + can.height = 0, can.onaction._draw_vertical(can, can._tree[""], can.margin, can.margin+can.size) + can.svg.Val(html.HEIGHT, can.height+can.margin) + }, + "生成图片": function(event, can) { + can.user.toPNG(can, "hi.png", can.svg.outerHTML, can.svg.Val(html.HEIGHT), can.svg.Val(html.WIDTH)) + }, + _draw: function(can, tree, x, y, style) { + var color = can.onimport._color(can, tree) + tree.view = can.onimport.draw({}, can, { + shape: html.TEXT, point: [{x: x, y: y}], style: can.base.Copy({ + stroke: color, fill: color, "text-anchor": "start", inner: tree.name||tree.file, + }, style), + }), can.core.ItemCB(can.ondetail, tree.view, can, tree) + }, + _draw_vertical: function(can, tree, x, y) { tree.x = x, tree.y = y + can.onaction._draw(can, tree, x+tree.width/2, y, {"text-anchor": "middle"}) - tree.height = can.size - if (y+tree.height > can.height) { can.height = y+tree.height } - if (tree.hide) { return } + tree.height = can.size + if (y+tree.height > can.height) { can.height = y+tree.height } + if (tree.hide) { return } - var offset = 0; can.core.List(tree.list, function(item) { - can.onimport.draw({}, can, {shape: "path2v", point: [ - {x: x+tree.width/2, y: y+tree.height-can.margin/2}, - {x: x+offset+item.width/2, y: y+tree.height+can.margin/2}, - ], style: {stroke: cli.CYAN}}) + var offset = 0; can.core.List(tree.list, function(item) { + can.onimport.draw({}, can, {shape: "path2v", point: [ + {x: x+tree.width/2, y: y+tree.height-can.margin/2}, + {x: x+offset+item.width/2, y: y+tree.height+can.margin/2}, + ], style: {stroke: cli.CYAN}}) - can.onaction._draw_vertical(can, item, x+offset, y+tree.height+can.margin) - offset += item.width - }) - }, - _draw_horizontal: function(can, tree, x, y) { tree.x = x, tree.y = y - can.onaction._draw(can, tree, x, y+tree.height*can.size/2, {"text-anchor": "start"}) + can.onaction._draw_vertical(can, item, x+offset, y+tree.height+can.margin) + offset += item.width + }) + }, + _draw_horizontal: function(can, tree, x, y) { tree.x = x, tree.y = y + can.onaction._draw(can, tree, x, y+tree.height*can.size/2, {"text-anchor": "start"}) - tree.width = tree.view.Val("textLength")||(tree.name||"").length*10 - if (x+tree.width > can.width) { can.width = x+tree.width } - if (tree.hide) { return } + tree.width = tree.view.Val("textLength")||(tree.name||"").length*10 + if (x+tree.width > can.width) { can.width = x+tree.width } + if (tree.hide) { return } - var offset = 0; can.core.List(tree.list, function(item) { - can.onimport.draw({}, can, {shape: "path2h", point: [ - {x: x+tree.width+can.margin/8, y: y+tree.height*can.size/2}, - {x: x+tree.width+can.margin*2-2*can.margin/8, y: y+offset+item.height*can.size/2} - ], style: {stroke: cli.CYAN}}) + var offset = 0; can.core.List(tree.list, function(item) { + can.onimport.draw({}, can, {shape: "path2h", point: [ + {x: x+tree.width+can.margin/8, y: y+tree.height*can.size/2}, + {x: x+tree.width+can.margin*2-2*can.margin/8, y: y+offset+item.height*can.size/2} + ], style: {stroke: cli.CYAN}}) - can.onaction._draw_horizontal(can, item, x+tree.width+2*can.margin, y+offset) - offset += item.height*can.size - }) - }, + can.onaction._draw_horizontal(can, item, x+tree.width+2*can.margin, y+offset) + offset += item.height*can.size + }) + }, }) Volcanos("ondetail", {help: "用户交互", list: [], - onmouseenter: function(event, can, tree) { var y = tree.y+tree.height*can.size/2 - can.page.Remove(can, can.pos), can.pos = can.onimport.draw({}, can, { - shape: svg.RECT, point: [ - {x: tree.x-can.margin/4, y: y-can.size/2}, - {x: tree.x+tree.width+can.margin/8, y: y+can.size/2}, - ], style: {stroke: cli.RED, fill: html.NONE}, - }), can.onkeymap.prevent(event) - }, - onclick: function(event, can, tree) { - if (tree.list.length > 0 || tree.tags || tree.name.endsWith(can._args.split)) { - return tree.hide = !tree.hide, can.onaction[can.Action(ice.VIEW)](event, can) - } + onmouseenter: function(event, can, tree) { var y = tree.y+tree.height*can.size/2 + can.page.Remove(can, can.pos), can.pos = can.onimport.draw({}, can, { + shape: svg.RECT, point: [ + {x: tree.x-can.margin/4, y: y-can.size/2}, + {x: tree.x+tree.width+can.margin/8, y: y+can.size/2}, + ], style: {stroke: cli.RED, fill: html.NONE}, + }), can.onkeymap.prevent(event) + }, + onclick: function(event, can, tree) { + if (tree.list.length > 0 || tree.tags || tree.name.endsWith(can._args.split)) { + return tree.hide = !tree.hide, can.onaction[can.Action(ice.VIEW)](event, can) + } - for (var node = tree; node; node = node.last) { - can.request(event, node.meta) - } - var msg = can.request(event, can.Option()) - can.run(event, can.base.Obj(can._args.prefix, []).concat([can.Option("repos")||"", tree.file||"", tree.name]), function(msg) { - if (msg.Length() == 0) { - return can.ondetail.plugin(can, tree, {}, "web.code.inner", [can.dir_root, tree.file, tree.line], [ctx.ACTION, "inner"]) - } - if (msg.Append(mdb.INDEX)) { msg.Table(function(value) { - can.ondetail.plugin(can, tree, value, value.index, [], [ctx.ACTION, ice.RUN, value.index]) - }); return } + for (var node = tree; node; node = node.last) { + can.request(event, node.meta) + } + var msg = can.request(event, can.Option()) + can.run(event, can.base.Obj(can._args.prefix, []).concat([can.Option("repos")||"", tree.file||"", tree.name]), function(msg) { + if (msg.Length() == 0) { + return can.ondetail.plugin(can, tree, {}, "web.code.inner", [can.dir_root, tree.file, tree.line], [ctx.ACTION, "inner"]) + } + if (msg.Append(mdb.INDEX)) { msg.Table(function(value) { + can.ondetail.plugin(can, tree, value, value.index, [], [ctx.ACTION, ice.RUN, value.index]) + }); return } - tree.tags = true - if (msg.Option("split")) { - tree.list = can.onimport._tree(can, msg.Table(), msg.Option("field")||msg.append[0], msg.Option("split"))[""].list||[] - can.core.List(tree.list, function(item) { item.last = tree }) - } else { - msg.Table(function(item) { tree.list.push({ - type: "tags", name: item.name||item.file||item[msg.append[0]], - meta: item, list: [], last: tree, - file: item.file, line: item.line, hide: true, - }) }) - } - tree.hide = !tree.hide, can.onaction[can.Action(ice.VIEW)](event, can) - }, true) - }, + tree.tags = true + if (msg.Option("split")) { + tree.list = can.onimport._tree(can, msg.Table(), msg.Option("field")||msg.append[0], msg.Option("split"))[""].list||[] + can.core.List(tree.list, function(item) { item.last = tree }) + } else { + msg.Table(function(item) { tree.list.push({ + type: "tags", name: item.name||item.file||item[msg.append[0]], + meta: item, list: [], last: tree, + file: item.file, line: item.line, hide: true, + }) }) + } + tree.hide = !tree.hide, can.onaction[can.Action(ice.VIEW)](event, can) + }, true) + }, - plugin: function(can, tree, value, index, args, prefix) { - for (var node = tree; node; node = node.last) { - can.base.Copy(value, node.meta) - } - can.onappend.plugin(can, can.base.Copy({type: chat.FLOAT, index: index, args: args}, value), function(sub) { - sub.run = function(event, cmds, cb) { var msg = can.request(event) - can.run(event, can.misc.concat(can, prefix, cmds), cb, true) - }, can.ondetail.figure(can, sub) - }) - }, - figure: function(can, sub, msg, cb) { - can.getActionSize(function(left, top, width, height) { left = left||0 - var top = 120, margin = 20; if (can.user.isMobile) { margin = 0 - top = can.user.isLandscape()? 24: 48 - } - can.onmotion.move(can, sub._target, {position: html.FIXED, left: left+margin, top: top}) - can.page.style(can, sub._output, html.MAX_WIDTH, width-margin*2) - sub.Conf(html.HEIGHT, height-top-2*html.ACTION_HEIGHT) - can.base.isFunc(cb) && cb(msg) - }) - }, + plugin: function(can, tree, value, index, args, prefix) { + for (var node = tree; node; node = node.last) { + can.base.Copy(value, node.meta) + } + can.onappend.plugin(can, can.base.Copy({type: chat.FLOAT, index: index, args: args}, value), function(sub) { + sub.run = function(event, cmds, cb) { var msg = can.request(event) + can.run(event, can.misc.concat(can, prefix, cmds), cb, true) + }, can.ondetail.figure(can, sub) + }) + }, + figure: function(can, sub, msg, cb) { + can.getActionSize(function(left, top, width, height) { left = left||0 + var top = 120, margin = 20; if (can.user.isMobile) { margin = 0 + top = can.user.isLandscape()? 24: 48 + } + can.onmotion.move(can, sub._target, {position: html.FIXED, left: left+margin, top: top}) + can.page.style(can, sub._output, html.MAX_WIDTH, width-margin*2) + sub.Conf(html.HEIGHT, height-top-2*html.ACTION_HEIGHT) + can.base.isFunc(cb) && cb(msg) + }) + }, }) diff --git a/plugin/story/trend.js b/plugin/story/trend.js index dcc6b98d..18fb59ab 100644 --- a/plugin/story/trend.js +++ b/plugin/story/trend.js @@ -1,153 +1,153 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) - if (msg.Option("branch")) { return can.onappend.table(can, msg) } - can.onappend._status(can, ["from", "commit", "total", "max", "date", "text", "add", "del"]) - can.Conf(html.HEIGHT, can.Conf(html.HEIGHT)||200) + can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) + if (msg.Option("branch")) { return can.onappend.table(can, msg) } + can.onappend._status(can, ["from", "commit", "total", "max", "date", "text", "add", "del"]) + can.Conf(html.HEIGHT, can.Conf(html.HEIGHT)||200) - can.msg = msg, can.data = msg.Table(), can.onimport._sum(can) - can.Action(html.HEIGHT, msg.Option(html.HEIGHT)||can.user.mod.isCmd? "max": can.user.isMobile&&can.user.isLandscape()? "200": "400") - can.Action("speed", parseInt(msg.Option("speed")||"100")) + can.msg = msg, can.data = msg.Table(), can.onimport._sum(can) + can.Action(html.HEIGHT, msg.Option(html.HEIGHT)||can.user.mod.isCmd? "max": can.user.isMobile&&can.user.isLandscape()? "200": "400") + can.Action("speed", parseInt(msg.Option("speed")||"100")) - can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() { - can.page.ClassList.add(can, can._fields, "draw") - can.onimport._show(can, msg), can.onmotion.hidden(can, can.ui.project) - can.onaction[can.Action("view")](event, can) - }) - }, - _sum: function(can) { - var begin = "", count = 0, rest = 0, add = 0, del = 0, max = 0 - can.max = 0, can.min = 0, can.list = can.core.List(can.data, function(value, index) { - var line = { - date: value[can.msg.append[0]], - text: value[can.msg.append[4]], - add: parseInt(value[can.msg.append[1]]), - del: parseInt(value[can.msg.append[2]]), - } + can.require(["/plugin/local/wiki/draw.js", "/plugin/local/wiki/draw/path.js"], function() { + can.page.ClassList.add(can, can._fields, "draw") + can.onimport._show(can, msg), can.onmotion.hidden(can, can.ui.project) + can.onaction[can.Action("view")](event, can) + }) + }, + _sum: function(can) { + var begin = "", count = 0, rest = 0, add = 0, del = 0, max = 0 + can.max = 0, can.min = 0, can.list = can.core.List(can.data, function(value, index) { + var line = { + date: value[can.msg.append[0]], + text: value[can.msg.append[4]], + add: parseInt(value[can.msg.append[1]]), + del: parseInt(value[can.msg.append[2]]), + } - line.begin = rest - line.max = rest + line.add - line.min = rest - line.del - line.close = rest + line.add - line.del + line.begin = rest + line.max = rest + line.add + line.min = rest - line.del + line.close = rest + line.add - line.del - begin = begin || value.date, count++ - rest = line.close, add += line.add, del += line.del + begin = begin || value.date, count++ + rest = line.close, add += line.add, del += line.del - if (line.max - line.min > max) { max = line.max - line.min } - if (line.max > can.max) { can.max = line.max } - if (line.min < can.min) { can.min = line.min } - return line - }) - can.Status({"from": begin, "commit": count, "total": add+del, "max": max}) - }, + if (line.max - line.min > max) { max = line.max - line.min } + if (line.max > can.max) { can.max = line.max } + if (line.min < can.min) { can.min = line.min } + return line + }) + can.Status({"from": begin, "commit": count, "total": add+del, "max": max}) + }, }, [""]) Volcanos("onaction", {help: "组件菜单", list: ["编辑", ["view", "趋势图", "柱状图", "数据源"], ["height", "100", "200", "400", "600", "800", "max"], ["speed", "10", "20", "50", "100"]], - "编辑": function(event, can) { - can.onmotion.toggle(can, can._action) - can.onmotion.toggle(can, can._status) - }, - "趋势图": function(event, can) { var height = can.Action(html.HEIGHT) - if (height == "max") { height = can.Conf(html.HEIGHT) } - height = parseInt(height) + "编辑": function(event, can) { + can.onmotion.toggle(can, can._action) + can.onmotion.toggle(can, can._status) + }, + "趋势图": function(event, can) { var height = can.Action(html.HEIGHT) + if (height == "max") { height = can.Conf(html.HEIGHT) } + height = parseInt(height) - var space = 10, width = parseInt(can.Conf(html.WIDTH)) - var step = parseInt((width-2*space) / can.list.length) + var space = 10, width = parseInt(can.Conf(html.WIDTH)) + var step = parseInt((width-2*space) / can.list.length) - can.onmotion.clear(can, can.svg) - can.svg.Val(html.HEIGHT, height) - can.svg.Val(html.WIDTH, width) + can.onmotion.clear(can, can.svg) + can.svg.Val(html.HEIGHT, height) + can.svg.Val(html.WIDTH, width) - function scale(y) { return (y - can.min)/(can.max - can.min)*(height-2*space) } - function order(index, x, y) { return {x: space+step*index+x, y: height-space-scale(y)} } + function scale(y) { return (y - can.min)/(can.max - can.min)*(height-2*space) } + function order(index, x, y) { return {x: space+step*index+x, y: height-space-scale(y)} } - can.core.Next(can.list, function(line, next, index) { can.Status(line, ["date", "text", "add", "del"]) - can.onimport.draw({}, can, { - shape: "line", point: [ - order(index, step/2, line.min), order(index, step/2, line.max), - ], style: { - "stroke-width": 1, "stroke": line.begin < line.close? chat.WHITE: chat.BLACK, - }, - }) + can.core.Next(can.list, function(line, next, index) { can.Status(line, ["date", "text", "add", "del"]) + can.onimport.draw({}, can, { + shape: "line", point: [ + order(index, step/2, line.min), order(index, step/2, line.max), + ], style: { + "stroke-width": 1, "stroke": line.begin < line.close? chat.WHITE: chat.BLACK, + }, + }) - can.onimport.draw({}, can, { - shape: "rect", point: [ - order(index, step/4, line.close), order(index, step/4*3, line.begin), - ], style: can.base.Copy({"stroke-width": 1, "rx": 0, "ry": 0}, line.begin < line.close? { - "stroke": chat.WHITE, "fill": chat.WHITE, - }: { - "stroke": chat.BLACK, "fill": chat.BLACK, - }), - _init: function(view) { - can.core.ItemCB(can.ondetail, function(key, cb) { - view[key] = function(event) { cb(event, can, line) } - }) - }, - }) + can.onimport.draw({}, can, { + shape: "rect", point: [ + order(index, step/4, line.close), order(index, step/4*3, line.begin), + ], style: can.base.Copy({"stroke-width": 1, "rx": 0, "ry": 0}, line.begin < line.close? { + "stroke": chat.WHITE, "fill": chat.WHITE, + }: { + "stroke": chat.BLACK, "fill": chat.BLACK, + }), + _init: function(view) { + can.core.ItemCB(can.ondetail, function(key, cb) { + view[key] = function(event) { cb(event, can, line) } + }) + }, + }) - can.core.Timer(parseInt(can.Action("speed")), next) - }) - }, - "柱状图": function(event, can) { - var max = {}, min = {} - can.core.List(can.msg.append, function(key, which) { - can.core.List(can.data, function(value, index) { - var v = parseInt(value[key])||0; if (index == 0) { - max[key] = v, min[key] = v - return - } - if (v > max[key]) { max[key] = v } - if (v < min[key]) { min[key] = v } - }) - }) + can.core.Timer(parseInt(can.Action("speed")), next) + }) + }, + "柱状图": function(event, can) { + var max = {}, min = {} + can.core.List(can.msg.append, function(key, which) { + can.core.List(can.data, function(value, index) { + var v = parseInt(value[key])||0; if (index == 0) { + max[key] = v, min[key] = v + return + } + if (v > max[key]) { max[key] = v } + if (v < min[key]) { min[key] = v } + }) + }) - var height = parseInt(can.Action(html.HEIGHT)) - var space = 10, width = parseInt(can.Conf(html.WIDTH)) - var step = parseInt((width-2*space) / can.list.length) + var height = parseInt(can.Action(html.HEIGHT)) + var space = 10, width = parseInt(can.Conf(html.WIDTH)) + var step = parseInt((width-2*space) / can.list.length) - can.onmotion.clear(can, can.svg) - can.svg.Val(html.HEIGHT, height) - can.svg.Val(html.WIDTH, width) + can.onmotion.clear(can, can.svg) + can.svg.Val(html.HEIGHT, height) + can.svg.Val(html.WIDTH, width) - function scale(key, y) { return (y - min[key])/(max[key] - min[key])*(height-2*space) } - function order(index, key, x, y) { return {x: space+step*index+x, y: space+scale(key, y)} } + function scale(key, y) { return (y - min[key])/(max[key] - min[key])*(height-2*space) } + function order(index, key, x, y) { return {x: space+step*index+x, y: space+scale(key, y)} } - var width = (step-4)/can.msg.append.length - can.core.List(can.msg.append, function(key, which) { - max[key] != min[key] && can.core.Next(can.data, function(line, next, index) { - var y = scale(key, parseFloat(line[key])) - y && can.onimport.draw({}, can, { - shape: "rect", point: [ - order(index, key, width*which+2, 0), order(index, key, width*which+2+width, y), - ], style: { - "stroke-width": 1, "stroke": chat.WHITE, "fill": chat.WHITE, "rx": 0, "ry": 0, - }, - _init: function(view) { - can.core.ItemCB(can.ondetail, function(key, cb) { - view[key] = function(event) { cb(event, can, line) } - }) - }, - }) + var width = (step-4)/can.msg.append.length + can.core.List(can.msg.append, function(key, which) { + max[key] != min[key] && can.core.Next(can.data, function(line, next, index) { + var y = scale(key, parseFloat(line[key])) + y && can.onimport.draw({}, can, { + shape: "rect", point: [ + order(index, key, width*which+2, 0), order(index, key, width*which+2+width, y), + ], style: { + "stroke-width": 1, "stroke": chat.WHITE, "fill": chat.WHITE, "rx": 0, "ry": 0, + }, + _init: function(view) { + can.core.ItemCB(can.ondetail, function(key, cb) { + view[key] = function(event) { cb(event, can, line) } + }) + }, + }) - can.core.Timer(parseInt(can.Action("speed")), next) - }) - }) - }, - "数据源": function(event, can) { - can.onmotion.clear(can, can.ui.display) - can.onappend.table(can, can.msg, null, can.ui.display) - can.onmotion.show(can, can.ui.display) - }, + can.core.Timer(parseInt(can.Action("speed")), next) + }) + }) + }, + "数据源": function(event, can) { + can.onmotion.clear(can, can.ui.display) + can.onappend.table(can, can.msg, null, can.ui.display) + can.onmotion.show(can, can.ui.display) + }, - height: function(event, can) { - can.onaction[can.Action("view")](event, can) - }, - speed: function(event, can) { - can.onaction[can.Action("view")](event, can) - }, + height: function(event, can) { + can.onaction[can.Action("view")](event, can) + }, + speed: function(event, can) { + can.onaction[can.Action("view")](event, can) + }, }) Volcanos("ondetail", {help: "用户交互", list: [], - onmouseenter: function(event, can, line) { - can.Status(line, ["date", "text", "add", "del"]) - }, + onmouseenter: function(event, can, line) { + can.Status(line, ["date", "text", "add", "del"]) + }, }) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/plugin/story/video.js b/plugin/story/video.js index 4077a546..467fca61 100644 --- a/plugin/story/video.js +++ b/plugin/story/video.js @@ -1,48 +1,48 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { - can.onimport.select(can, msg) - can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) - can.onappend.table(can, msg), can.onappend.board(can, msg) - can.core.Timer(12000, function() { can.onaction.play(event, can) }) - can.page.Select(can, can._output, "td a", function(a) { - can.page.Modify(can, a, {target: ""}) - }) - }, - select: function(can, msg) { - msg.Clear(), can.page.Select(can, document.body, can.Option("tags"), function(a, index) { - msg.Push(mdb.INDEX, index) - msg.Push(mdb.NAME, a.innerText) - msg.Push(mdb.LINK, a.href) - a.href == location.href && can.core.Timer(100, function() { - can.page.Select(can, can._output, html.TR, function(tr, i) { - i-1 == index && can.page.ClassList.add(can, tr, "select") - }) - }) - }) - msg.Option(ice.MSG_STATUS, JSON.stringify([ - {name: "time", value: can.base.Time(null, "%y-%m-%d %H:%M:%S")}, - {name: "count", value: msg.Length()}, - ])) - }, + can.onimport.select(can, msg) + can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg) + can.onappend.table(can, msg), can.onappend.board(can, msg) + can.core.Timer(12000, function() { can.onaction.play(event, can) }) + can.page.Select(can, can._output, "td a", function(a) { + can.page.Modify(can, a, {target: ""}) + }) + }, + select: function(can, msg) { + msg.Clear(), can.page.Select(can, document.body, can.Option("tags"), function(a, index) { + msg.Push(mdb.INDEX, index) + msg.Push(mdb.NAME, a.innerText) + msg.Push(mdb.LINK, a.href) + a.href == location.href && can.core.Timer(100, function() { + can.page.Select(can, can._output, html.TR, function(tr, i) { + i-1 == index && can.page.ClassList.add(can, tr, "select") + }) + }) + }) + msg.Option(ice.MSG_STATUS, JSON.stringify([ + {name: "time", value: can.base.Time(null, "%y-%m-%d %H:%M:%S")}, + {name: "count", value: msg.Length()}, + ])) + }, }) Volcanos("onaction", {help: "控件交互", list: [], - next: function(event, can) { var msg = can._msg - msg.Table(function(line, index) { - if (line.link == location.href) { - location.href = msg.link[index+1] - } - }) - }, - play: function(event, can) { - can.page.SelectAll(can, document.body, html.VIDEO, function(video) { - video.playbackRate = parseFloat(can.Option("rate")) - video.currentTime = parseInt(can.Option("skip")) - video.ontimeupdate = function(event) { - if (video.currentTime > parseInt(can.Option("next"))) { - can.onaction.next(event, can) - } - }, video.play(), video.requestFullscreen() - }) - }, + next: function(event, can) { var msg = can._msg + msg.Table(function(line, index) { + if (line.link == location.href) { + location.href = msg.link[index+1] + } + }) + }, + play: function(event, can) { + can.page.SelectAll(can, document.body, html.VIDEO, function(video) { + video.playbackRate = parseFloat(can.Option("rate")) + video.currentTime = parseInt(can.Option("skip")) + video.ontimeupdate = function(event) { + if (video.currentTime > parseInt(can.Option("next"))) { + can.onaction.next(event, can) + } + }, video.play(), video.requestFullscreen() + }) + }, }) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/plugin/table.js b/plugin/table.js index 86d63c98..52983d1e 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -1,15 +1,15 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, cb, target) { - can.onmotion.clear(can) - can.onappend.table(can, msg) - can.onappend.board(can, msg) - can.onmotion.story.auto(can) - can.base.isFunc(cb) && cb(msg) - }, + can.onmotion.clear(can) + can.onappend.table(can, msg) + can.onappend.board(can, msg) + can.onmotion.story.auto(can) + can.base.isFunc(cb) && cb(msg) + }, - _process: function(can, msg) { - msg.Option(ice.MSG_TOAST) && can.user.toast(can, msg.Option(ice.MSG_TOAST)) - return can.core.CallFunc([can.onimport, msg.Option(ice.MSG_PROCESS)], [can, msg]) - }, + _process: function(can, msg) { + msg.Option(ice.MSG_TOAST) && can.user.toast(can, msg.Option(ice.MSG_TOAST)) + return can.core.CallFunc([can.onimport, msg.Option(ice.MSG_PROCESS)], [can, msg]) + }, }) Volcanos("onaction", {help: "控件交互", list: []}) Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/proto.js b/proto.js index 0d22dce2..ede482c7 100644 --- a/proto.js +++ b/proto.js @@ -1,398 +1,398 @@ var kit = { - Dict: function() { var res = {} - for (var i = 0; i < arguments.length; i += 2) { - res[arguments[i]] = arguments[i+1] - } return res - } + Dict: function() { var res = {} + for (var i = 0; i < arguments.length; i += 2) { + res[arguments[i]] = arguments[i+1] + } return res + } } var ice = { - SP: " ", PS: "/", PT: ".", DF: ":", FS: ",", NL: "\n", LT: "<", GT: ">", - POD: "pod", CTX: "ctx", CMD: "cmd", ARG: "arg", OPT: "opt", - RUN: "run", RES: "res", ERR: "err", + SP: " ", PS: "/", PT: ".", DF: ":", FS: ",", NL: "\n", LT: "<", GT: ">", + POD: "pod", CTX: "ctx", CMD: "cmd", ARG: "arg", OPT: "opt", + RUN: "run", RES: "res", ERR: "err", - OK: "ok", TRUE: "true", FALSE: "false", SUCCESS: "success", FAILURE: "failure", PROCESS: "process", - PWD: "./", + OK: "ok", TRUE: "true", FALSE: "false", SUCCESS: "success", FAILURE: "failure", PROCESS: "process", + PWD: "./", - AUTO: "auto", HELP: "help", HTTP: "http", - VIEW: "view", MODE: "mode", SHIP: "ship", - COPY: "copy", SHOW: "show", HIDE: "hide", + AUTO: "auto", HELP: "help", HTTP: "http", + VIEW: "view", MODE: "mode", SHIP: "ship", + COPY: "copy", SHOW: "show", HIDE: "hide", - MSG_DETAIL: "detail", - MSG_OPTION: "option", - MSG_APPEND: "append", - MSG_RESULT: "result", - MSG_FIELDS: "fields", - MSG_SESSID: "sessid", + 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_UPLOAD: "_upload", - MSG_DAEMON: "_daemon", - MSG_ACTION: "_action", - MSG_STATUS: "_status", + MSG_SOURCE: "_source", + MSG_TARGET: "_target", + MSG_HANDLE: "_handle", + MSG_UPLOAD: "_upload", + MSG_DAEMON: "_daemon", + MSG_ACTION: "_action", + MSG_STATUS: "_status", - MSG_DISPLAY: "_display", - MSG_PROCESS: "_process", + MSG_DISPLAY: "_display", + MSG_PROCESS: "_process", - MSG_USERNAME: "user.name", - MSG_USERNICK: "user.nick", + MSG_USERNAME: "user.name", + MSG_USERNICK: "user.nick", - MSG_TITLE: "sess.title", - MSG_TOPIC: "sess.topic", - MSG_RIVER: "sess.river", - MSG_STORM: "sess.storm", - MSG_TOAST: "sess.toast", + MSG_TITLE: "sess.title", + MSG_TOPIC: "sess.topic", + MSG_RIVER: "sess.river", + MSG_STORM: "sess.storm", + MSG_TOAST: "sess.toast", - PROCESS_AGAIN: "_again", - MSG_PREFIX: "_prefix", + PROCESS_AGAIN: "_again", + MSG_PREFIX: "_prefix", - ErrWarn: "warn: ", - ErrNotFound: "not found: ", + ErrWarn: "warn: ", + ErrNotFound: "not found: ", } var ctx = { - CONTEXT: "context", COMMAND: "command", ACTION: "action", CONFIG: "config", - INDEX: "index", ARGS: "args", STYLE: "style", - INPUTS: "inputs", FEATURE: "feature", + CONTEXT: "context", COMMAND: "command", ACTION: "action", CONFIG: "config", + INDEX: "index", ARGS: "args", STYLE: "style", + INPUTS: "inputs", FEATURE: "feature", } var cli = { - CODE: "code", COST: "cost", FROM: "from", BACK: "back", - OPEN: "open", CLOSE: "close", BEGIN: "begin", END: "end", - START: "start", STOP: "stop", DONE: "done", ERROR: "error", - CLEAR: "clear", REFRESH: "refresh", - EXEC: "exec", - SHOW: "show", - MAIN: "main", - MAKE: "make", + CODE: "code", COST: "cost", FROM: "from", BACK: "back", + OPEN: "open", CLOSE: "close", BEGIN: "begin", END: "end", + START: "start", STOP: "stop", DONE: "done", ERROR: "error", + CLEAR: "clear", REFRESH: "refresh", + EXEC: "exec", + SHOW: "show", + MAIN: "main", + MAKE: "make", - RED: "red", GREEN: "green", BLUE: "blue", - YELLOW: "yellow", CYAN: "cyan", PURPLE: "purple", MAGENTA: "magenta", - WHITE: "white", BLACK: "black", + RED: "red", GREEN: "green", BLUE: "blue", + YELLOW: "yellow", CYAN: "cyan", PURPLE: "purple", MAGENTA: "magenta", + WHITE: "white", BLACK: "black", } var web = { - SPACE: "space", SHARE: "share", + SPACE: "space", SHARE: "share", } var aaa = { - USERNAME: "username", USERNICK: "usernick", BACKGROUND: "background", AVATAR: "avatar", - LANGUAGE: "language", ENGLISH: "english", CHINESE: "chinese", - LOGIN: "login", LOGOUT: "logout", INVITE: "invite", + USERNAME: "username", USERNICK: "usernick", BACKGROUND: "background", AVATAR: "avatar", + LANGUAGE: "language", ENGLISH: "english", CHINESE: "chinese", + LOGIN: "login", LOGOUT: "logout", INVITE: "invite", } var mdb = { - DICT: "dict", META: "meta", HASH: "hash", LIST: "list", + 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", SHOW: "show", HELP: "help", - SHORT: "short", FIELD: "field", TOTAL: "total", COUNT: "count", LIMIT: "limit", - INDEX: "index", VALUE: "value", EXTRA: "extra", ALIAS: "alias", EXPIRE: "expire", + ID: "id", KEY: "key", TIME: "time", ZONE: "zone", TYPE: "type", NAME: "name", TEXT: "text", + LINK: "link", SCAN: "scan", SHOW: "show", 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", + CREATE: "create", REMOVE: "remove", INSERT: "insert", DELETE: "delete", + MODIFY: "modify", SELECT: "select", + INPUTS: "inputs", PRUNES: "prunes", EXPORT: "export", IMPORT: "import", - PLUGIN: "plugin", RENDER: "render", SEARCH: "search", ENGINE: "engine", - NEXT: "next", PREV: "prev", PAGE: "page", MAIN: "main", + PLUGIN: "plugin", RENDER: "render", SEARCH: "search", ENGINE: "engine", + NEXT: "next", PREV: "prev", PAGE: "page", MAIN: "main", - FOREACH: "*", RANDOMS: "%", + FOREACH: "*", RANDOMS: "%", } var ssh = { - SCRIPT: "script", + SCRIPT: "script", } var nfs = { - DEFS: "defs", - HTML: "html", CSS: "css", JS: "js", GO: "go", SH: "sh", CSV: "csv", JSON: "json", - PATH: "path", FILE: "file", LINE: "line", SIZE: "size", - DIR: "dir", CAT: "cat", TRASH: "trash", - DIR_ROOT: "dir_root", - FIND: "find", GREP: "grep", - SAVE: "save", LOAD: "load", - TAGS: "tags", + DEFS: "defs", + HTML: "html", CSS: "css", JS: "js", GO: "go", SH: "sh", CSV: "csv", JSON: "json", + PATH: "path", FILE: "file", LINE: "line", SIZE: "size", + DIR: "dir", CAT: "cat", TRASH: "trash", + DIR_ROOT: "dir_root", + FIND: "find", GREP: "grep", + SAVE: "save", LOAD: "load", + TAGS: "tags", } var tcp = { - HOST: "host", PORT: "port", + HOST: "host", PORT: "port", } var code = { - VIMER: "vimer", INNER: "inner", FAVOR: "favor", - WEBPACK: "webpack", + VIMER: "vimer", INNER: "inner", FAVOR: "favor", + WEBPACK: "webpack", } 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", + 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", + NAVMENU: "navmenu", PREMENU: "premenu", - ITEM: ".story", - H2: "h2.story", - H3: "h3.story", - DIV_PAGE: "div.page", + ITEM: ".story", + H2: "h2.story", + H3: "h3.story", + DIV_PAGE: "div.page", } var chat = {ONIMPORT: "onimport", ONACTION: "onaction", ONKEYMAP: "onkeymap", ONEXPORT: "onexport", - LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", OUTPUT: "output", INPUT: "input", UPLOAD: "upload", - STORY: "story", FLOAT: "float", CONTEXTS: "contexts", CARTE: "carte", TOAST: "toast", - LEGNED: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status", - LAYOUT: "layout", PROJECT: "project", CONTENT: "content", DISPLAY: "display", PROFILE: "profile", + LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", OUTPUT: "output", INPUT: "input", UPLOAD: "upload", + STORY: "story", FLOAT: "float", CONTEXTS: "contexts", CARTE: "carte", TOAST: "toast", + LEGNED: "legend", OPTION: "option", ACTION: "action", OUTPUT: "output", STATUS: "status", + 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", TOAST: "toast", - PUBLIC: "public", PROTECTED: "protected", PRIVATE: "private", - USER: "user", TOOL: "tool", NODE: "node", + TITLE: "title", TOPIC: "topic", BLACK: "black", WHITE: "white", PRINT: "print", + SHARE: "share", RIVER: "river", STORM: "storm", FIELD: "field", TOAST: "toast", + PUBLIC: "public", PROTECTED: "protected", PRIVATE: "private", + USER: "user", TOOL: "tool", NODE: "node", - AGENT: "agent", CHECK: "check", GRANT: "grant", - STATE: "state", MENUS: "menus", TRANS: "trans", + AGENT: "agent", CHECK: "check", GRANT: "grant", + STATE: "state", MENUS: "menus", TRANS: "trans", - ONMAIN: "onmain", ONLOGIN: "onlogin", ONSEARCH: "onsearch", - ONSIZE: "onsize", ONTOAST: "ontoast", ONREMOTE: "onremote", - ONKEYDOWN: "onkeydown", + ONMAIN: "onmain", ONLOGIN: "onlogin", ONSEARCH: "onsearch", + ONSIZE: "onsize", ONTOAST: "ontoast", ONREMOTE: "onremote", + ONKEYDOWN: "onkeydown", - HEAD: "head", LEFT: "left", MAIN: "main", AUTO: "auto", HIDE: "hide", FOOT: "foot", - SCROLL: "scroll", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom", - HEADER: "header", FOOTER: "footer", + HEAD: "head", LEFT: "left", MAIN: "main", AUTO: "auto", HIDE: "hide", FOOT: "foot", + SCROLL: "scroll", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom", + HEADER: "header", FOOTER: "footer", - TABS: "tabs", DIV_TABS: "div.tabs", + TABS: "tabs", DIV_TABS: "div.tabs", - SSO: "sso", + SSO: "sso", - PLUGIN_STATE_JS: "/plugin/state.js", - PLUGIN_INPUT_JS: "/plugin/input.js", - PLUGIN_TABLE_JS: "/plugin/table.js", + PLUGIN_STATE_JS: "/plugin/state.js", + PLUGIN_INPUT_JS: "/plugin/input.js", + PLUGIN_TABLE_JS: "/plugin/table.js", - libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"], - panel_list: [ - {name: "Header", help: "标题栏", pos: "head", state: ["time", "usernick", "avatar"]}, - {name: "River", help: "群聊组", pos: "left", action: ["create", "refresh"]}, - {name: "Action", help: "工作台", pos: "main"}, - {name: "Search", help: "搜索框", pos: "auto"}, - {name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]}, - ], - 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/inner.js", - "/plugin/local/code/vimer.js", - "/plugin/local/wiki/draw/path.js", - "/plugin/local/wiki/draw.js", - "/plugin/local/wiki/word.js", - "/plugin/local/chat/div.js", - "/plugin/local/team/plan.js", - "/plugin/input/province.js", - ], - ACTION_LAYOUT_FMT: ` -fieldset.Action.grid>div.output fieldset.plugin { - width:_width; height:_height; -} -fieldset.Action.grid>div.output fieldset.plugin>div.output { - width:_width; height:_height; -} -`, + libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"], + panel_list: [ + {name: "Header", help: "标题栏", pos: "head", state: ["time", "usernick", "avatar"]}, + {name: "River", help: "群聊组", pos: "left", action: ["create", "refresh"]}, + {name: "Action", help: "工作台", pos: "main"}, + {name: "Search", help: "搜索框", pos: "auto"}, + {name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]}, + ], + 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/inner.js", + "/plugin/local/code/vimer.js", + "/plugin/local/wiki/draw/path.js", + "/plugin/local/wiki/draw.js", + "/plugin/local/wiki/word.js", + "/plugin/local/chat/div.js", + "/plugin/local/team/plan.js", + "/plugin/input/province.js", + ], + ACTION_LAYOUT_FMT: ` + fieldset.Action.grid>div.output fieldset.plugin { + width:_width; height:_height; + } + fieldset.Action.grid>div.output fieldset.plugin>div.output { + width:_width; height:_height; + } + `, } var team = { - TASK: "task", PLAN: "plan", + TASK: "task", PLAN: "plan", } var mall = { - ASSET: "asset", SALARY: "salary", + ASSET: "asset", SALARY: "salary", } var svg = { - G: "g", X: "x", Y: "y", R: "r", RECT: "rect", - M: "M", Q: "Q", T: "T", + G: "g", X: "x", Y: "y", R: "r", RECT: "rect", + M: "M", Q: "Q", T: "T", } var html = { - 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: "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_HEAD: "fieldset.head", FIELDSET_FOOT: "fieldset.foot", - FIELDSET_LEFT: "fieldset.left", FIELDSET_MAIN: "fieldset.main", - FIELDSET_AUTO: "fieldset.auto", FIELDSET_FLOAT: "fieldset.float", + FIELDSET_HEAD: "fieldset.head", FIELDSET_FOOT: "fieldset.foot", + FIELDSET_LEFT: "fieldset.left", FIELDSET_MAIN: "fieldset.main", + FIELDSET_AUTO: "fieldset.auto", FIELDSET_FLOAT: "fieldset.float", - OPTION_ARGS: "select.args,input.args,textarea.args", - INPUT_ARGS: "input.args,textarea.args", - DIV_ITEM: "div.item", DIV_FLOAT: "div.float", + OPTION_ARGS: "select.args,input.args,textarea.args", + INPUT_ARGS: "input.args,textarea.args", + DIV_ITEM: "div.item", DIV_FLOAT: "div.float", - INPUT_BUTTON: "input[type=button]", - UPLOAD: "upload", USERNAME: "username", PASSWORD: "password", - INPUT: "input", TEXT: "text", TEXTAREA: "textarea", SELECT: "select", BUTTON: "button", - FORM: "form", FILE: "file", SPACE: "space", CLICK: "click", SUBMIT: "submit", CANCEL: "cancel", - DIV: "div", IMG: "img", CODE: "code", SPAN: "span", VIDEO: "video", - TABLE: "table", TR: "tr", TH: "th", TD: "td", BR: "br", UL: "ul", LI: "li", - A: "a", LABEL: "label", INNER: "inner", TITLE: "title", + INPUT_BUTTON: "input[type=button]", + UPLOAD: "upload", USERNAME: "username", PASSWORD: "password", + INPUT: "input", TEXT: "text", TEXTAREA: "textarea", SELECT: "select", BUTTON: "button", + FORM: "form", FILE: "file", SPACE: "space", CLICK: "click", SUBMIT: "submit", CANCEL: "cancel", + DIV: "div", IMG: "img", CODE: "code", SPAN: "span", VIDEO: "video", + TABLE: "table", TR: "tr", TH: "th", TD: "td", BR: "br", UL: "ul", LI: "li", + A: "a", LABEL: "label", INNER: "inner", TITLE: "title", - CLASS: "class", FLOAT: "float", CLEAR: "clear", BOTH: "both", - BACKGROUND: "background", SELECT: "select", HIDDEN: "hidden", - DISPLAY: "display", BLOCK: "block", NONE: "none", - STROKE_WIDTH: "stroke-width", STROKE: "stroke", FILL: "fill", FONT_SIZE: "font-size", MONOSPACE: "monospace", - SCROLL: "scroll", HEIGHT: "height", WIDTH: "width", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom", - MAX_HEIGHT: "max-height", MAX_WIDTH: "max-width", MARGIN_X: "margin-x", MARGIN_Y: "margin-y", - PLUGIN_MARGIN: 10, ACTION_HEIGHT: 27, ACTION_MARGIN: 200, + CLASS: "class", FLOAT: "float", CLEAR: "clear", BOTH: "both", + BACKGROUND: "background", SELECT: "select", HIDDEN: "hidden", + DISPLAY: "display", BLOCK: "block", NONE: "none", + STROKE_WIDTH: "stroke-width", STROKE: "stroke", FILL: "fill", FONT_SIZE: "font-size", MONOSPACE: "monospace", + SCROLL: "scroll", HEIGHT: "height", WIDTH: "width", LEFT: "left", TOP: "top", RIGHT: "right", BOTTOM: "bottom", + MAX_HEIGHT: "max-height", MAX_WIDTH: "max-width", MARGIN_X: "margin-x", MARGIN_Y: "margin-y", + PLUGIN_MARGIN: 10, ACTION_HEIGHT: 27, ACTION_MARGIN: 200, - FIXED: "fixed", + FIXED: "fixed", - WSS: "wss", SVG: "svg", CANVAS: "canvas", IFRAME: "iframe", CHROME: "chrome", - LIST: "list", ITEM: "item", MENU: "menu", NODE: "node", - HIDE: "hide", SHOW: "show", - H1: "h1", H2: "h2", H3: "h3", + WSS: "wss", SVG: "svg", CANVAS: "canvas", IFRAME: "iframe", CHROME: "chrome", + LIST: "list", ITEM: "item", MENU: "menu", NODE: "node", + HIDE: "hide", SHOW: "show", + H1: "h1", H2: "h2", H3: "h3", } var lang = { - UNDEFINED: "undefined", - STRING: "string", NUMBER: "number", - OBJECT: "object", FUNCTION: "function", - ESCAPE: "Escape", ENTER: "Enter", TAB: "Tab", + UNDEFINED: "undefined", + STRING: "string", NUMBER: "number", + OBJECT: "object", FUNCTION: "function", + ESCAPE: "Escape", ENTER: "Enter", TAB: "Tab", } function shy(help, meta, list, cb) { - var index = 0, args = arguments; function next(type) { - if (index < args.length && (!type || type == typeof args[index])) { - return args[index++] - } - } + var index = 0, args = arguments; function next(type) { + if (index < args.length && (!type || type == typeof args[index])) { + return args[index++] + } + } - cb = args[args.length-1]||function() {} - cb.help = next(lang.STRING)||"" - cb.meta = next(lang.OBJECT)|| {} - cb.list = next(lang.OBJECT)||[] - return cb + cb = args[args.length-1]||function() {} + cb.help = next(lang.STRING)||"" + cb.meta = next(lang.OBJECT)|| {} + cb.list = next(lang.OBJECT)||[] + return cb }; var _can_name = "", _can_path = "" var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args: {}, pack: {}, libs: [], cache: {}}, function(name, can, libs, cb) { - var meta = arguments.callee.meta, list = arguments.callee.list - if (typeof name == lang.OBJECT) { var Config = name; Config.plugin = Config.plugin||chat.plugin_list - Config.panels = Config.panels||chat.panel_list, Config.main = Config.main||{name: "Header"} - meta.libs = chat.libs, meta.iceberg = Config.iceberg||meta.iceberg + var meta = arguments.callee.meta, list = arguments.callee.list + if (typeof name == lang.OBJECT) { var Config = name; Config.plugin = Config.plugin||chat.plugin_list + Config.panels = Config.panels||chat.panel_list, Config.main = Config.main||{name: "Header"} + meta.libs = chat.libs, meta.iceberg = Config.iceberg||meta.iceberg - // 预加载 - libs = []; for (var i = 0; i < Config.panels.length; i++) { var panel = Config.panels[i] - panel && (libs = libs.concat(panel.list = panel.list||["/panel/"+panel.name+".css", "/panel/"+panel.name+".js"])) - }; libs = libs.concat(Config.plugin, Config.main.list) + // 预加载 + libs = []; for (var i = 0; i < Config.panels.length; i++) { var panel = Config.panels[i] + panel && (libs = libs.concat(panel.list = panel.list||["/panel/"+panel.name+".css", "/panel/"+panel.name+".js"])) + }; libs = libs.concat(Config.plugin, Config.main.list) - // 根模块 - _can_name = "", name = Config.name||"chat", cb = can||function(can) { - can.onengine._init(can, can.Conf(Config), Config.panels, Config._init, can._target) - }, can = {_follow: name, _target: Config.target||document.body}, can._root = can - for (var k in Config) { can[k] = Config[k] } - } + // 根模块 + _can_name = "", name = Config.name||"chat", cb = can||function(can) { + can.onengine._init(can, can.Conf(Config), Config.panels, Config._init, can._target) + }, can = {_follow: name, _target: Config.target||document.body}, can._root = can + for (var k in Config) { can[k] = Config[k] } + } - can = can||{} - var proto = {__proto__: meta, _path: _can_path, _name: name, _load: function(name, each) { // 加载缓存 - 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 + can = can||{} + var proto = {__proto__: meta, _path: _can_path, _name: name, _load: function(name, each) { // 加载缓存 + 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 - // 加载模块 - for (var i = 0; i < cache.length; i++) { var sub = cache[i], name = sub._name - if (typeof each == lang.FUNCTION && each(can, name, sub)) { continue } - !can[name] && (can[name] = {}); for (var k in sub) { - can[name].hasOwnProperty(k) || (can[name][k] = sub[k]) - } - } - }, - require: function(libs, cb, each) { if (!libs || libs.length == 0) { - typeof cb == lang.FUNCTION && setTimeout(function() { cb(can) }, 10) - return // 加载完成 - } + // 加载模块 + for (var i = 0; i < cache.length; i++) { var sub = cache[i], name = sub._name + if (typeof each == lang.FUNCTION && each(can, name, sub)) { continue } + !can[name] && (can[name] = {}); for (var k in sub) { + can[name].hasOwnProperty(k) || (can[name][k] = sub[k]) + } + } + }, + require: function(libs, cb, each) { if (!libs || libs.length == 0) { + typeof cb == lang.FUNCTION && setTimeout(function() { cb(can) }, 10) + return // 加载完成 + } - if (!libs[0]) { return can.require(libs.slice(1), cb, each) } - libs[0] = libs[0].toLowerCase() + if (!libs[0]) { return can.require(libs.slice(1), cb, each) } + libs[0] = libs[0].toLowerCase() - if (libs[0] == "") { - libs[0] = can._name.replace(".js", ".css") - } else 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] - } + if (libs[0] == "") { + libs[0] = can._name.replace(".js", ".css") + } else 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].split("?")[0] - function next() { can._load(name, each), can.require(libs.slice(1), cb, each) } - meta.cache[name]? next(): (_can_path = libs[0], meta._load(name, next)) - }, - request: function(event, option) { event = event||{} - var msg = event._msg||can.misc.Message(event, can); event._msg = msg - function set(key, value) { msg.Option(key) || value == "" || msg.Option(key, value) } + // 请求模块 + var name = libs[0].split("?")[0] + function next() { can._load(name, each), can.require(libs.slice(1), cb, each) } + meta.cache[name]? next(): (_can_path = libs[0], meta._load(name, next)) + }, + request: function(event, option) { event = event||{} + var msg = event._msg||can.misc.Message(event, can); event._msg = msg + function set(key, value) { msg.Option(key) || value == "" || msg.Option(key, value) } - can.core.List(arguments, function(option, index) { if (!option || index == 0) { return } - can.base.isFunc(option.Option)? can.core.List(option.Option(), function(key) { - set(key, option.Option(key)) - }): can.core.Item(can.base.isFunc(option)? option(): option, set) - }); return msg - }, + can.core.List(arguments, function(option, index) { if (!option || index == 0) { return } + can.base.isFunc(option.Option)? can.core.List(option.Option(), function(key) { + set(key, option.Option(key)) + }): can.core.Item(can.base.isFunc(option)? option(): option, set) + }); return msg + }, - get: function(name, key, cb) { - return can.search({}, [can.core.Keys(name, "onexport", key)], cb) - }, - set: function(name, key, value) { var msg = can.request({}); msg.Option(key, value) - return can.search(msg._event, [can.core.Keys(name, "onimport", key)]) - }, - setHeaderMenu: function(list, cb) { can._menu && can.page.Remove(can, can._menu) - var msg = can.request({}, {trans: can.onaction._trans}) - return can._menu = can.search(msg._event, ["Header.onimport.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) }, - getAction: function(key, cb) { return can.get("Action", key, cb) }, - getActionSize: function(cb) { return can.get("Action", "size", cb) }, - search: function(event, cmds, cb) { return can.run && can.run(event, ["_search"].concat(cmds), cb, true) }, + get: function(name, key, cb) { + return can.search({}, [can.core.Keys(name, "onexport", key)], cb) + }, + set: function(name, key, value) { var msg = can.request({}); msg.Option(key, value) + return can.search(msg._event, [can.core.Keys(name, "onimport", key)]) + }, + setHeaderMenu: function(list, cb) { can._menu && can.page.Remove(can, can._menu) + var msg = can.request({}, {trans: can.onaction._trans}) + return can._menu = can.search(msg._event, ["Header.onimport.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) }, + getAction: function(key, cb) { return can.get("Action", key, cb) }, + getActionSize: function(cb) { return can.get("Action", "size", cb) }, + search: function(event, cmds, cb) { return can.run && can.run(event, ["_search"].concat(cmds), cb, true) }, - 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-- - return - } - res = can.core.Value(can._conf, arguments[i], arguments[i+1]) - } - return res - }, _conf: {}, - } + 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-- + return + } + res = can.core.Value(can._conf, arguments[i], arguments[i+1]) + } + return res + }, _conf: {}, + } - if (navigator.userAgent.indexOf("MSIE") > -1) { - for (var k in proto) { can[k] = proto[k] } - } else { - can.__proto__ = proto - } + if (navigator.userAgent.indexOf("MSIE") > -1) { + for (var k in proto) { can[k] = proto[k] } + } else { + can.__proto__ = proto + } - if (_can_name) { // 加入缓存 - meta.cache[_can_name] = meta.cache[_can_name]||[], meta.cache[_can_name].push(can) - } else { // 加入队列 - list.push(can) - } - if (can._follow) { libs = libs.concat(meta.libs, meta.volcano) } - if (libs && libs.length > 0) { - for (var i = 0; i < libs.length; i++) { - if (libs[i] == undefined) { + if (_can_name) { // 加入缓存 + meta.cache[_can_name] = meta.cache[_can_name]||[], meta.cache[_can_name].push(can) + } else { // 加入队列 + list.push(can) + } + if (can._follow) { libs = libs.concat(meta.libs, meta.volcano) } + if (libs && libs.length > 0) { + for (var i = 0; i < libs.length; i++) { + if (libs[i] == undefined) { - } else if (libs[i] == "") { - libs[i] = _can_path.replace(".js", ".css") - } else 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] - } - } - } - return can.require(libs, cb), can + } else if (libs[i] == "") { + libs[i] = _can_path.replace(".js", ".css") + } else 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] + } + } + } + return can.require(libs, cb), can }) 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.type = "text/css" - item.onload = cb, item.href = url - return (document.head||document.body).appendChild(item), item - case nfs.JS: - var item = document.createElement(ssh.SCRIPT) - item.onload = cb, item.onerror = cb, item.src = url - return document.body.appendChild(item), item - } + switch (url.split("?")[0].split(ice.PT).pop().toLowerCase()) { + case nfs.CSS: + var item = document.createElement(mdb.LINK) + item.rel = "stylesheet", item.type = "text/css" + item.onload = cb, item.href = url + return (document.head||document.body).appendChild(item), item + case nfs.JS: + var item = document.createElement(ssh.SCRIPT) + item.onload = cb, item.onerror = cb, item.src = url + return document.body.appendChild(item), item + } } function can(tool) { - Volcanos({name: "chat", panels: [ - {name: "Header", help: "标题栏", pos: "hide", state: ["time", "usernick", "avatar"]}, - {name: "Action", help: "工作台", pos: chat.MAIN, tool: tool}, - {name: "Search", help: "搜索框", pos: "auto"}, - ]}) + Volcanos({name: "chat", panels: [ + {name: "Header", help: "标题栏", pos: "hide", state: ["time", "usernick", "avatar"]}, + {name: "Action", help: "工作台", pos: chat.MAIN, tool: tool}, + {name: "Search", help: "搜索框", pos: "auto"}, + ]}) }