From 02c53dc63b5cb7905d7fd9270ac1f4bce587a29b Mon Sep 17 00:00:00 2001 From: harveyshao Date: Tue, 11 Jan 2022 12:30:46 +0800 Subject: [PATCH] opt onappend --- .gitignore | 8 +- frame.js | 217 +++++++++++++++++++------------------ lib/core.js | 3 +- lib/page.js | 5 +- lib/user.js | 10 +- page/cmd.html | 10 -- page/index.css | 8 +- page/share.css | 0 page/share.html | 21 ---- page/share.js | 24 ---- panel/action.css | 19 ++++ panel/action.js | 21 +++- panel/cmd.css | 18 --- panel/cmd.js | 20 ---- panel/header.js | 4 +- panel/river.js | 2 +- plugin/input.js | 25 ++--- plugin/input/date.css | 2 +- plugin/input/date.js | 28 +++-- plugin/input/key.js | 81 +++++++++++--- plugin/input/province.js | 18 +-- plugin/local/wiki/draw.js | 8 +- plugin/local/wiki/word.css | 4 +- plugin/local/wiki/word.js | 167 ++++++++++++---------------- plugin/state.js | 23 ++-- proto.js | 44 ++++---- 26 files changed, 379 insertions(+), 411 deletions(-) delete mode 100644 page/cmd.html delete mode 100644 page/share.css delete mode 100644 page/share.html delete mode 100644 page/share.js delete mode 100644 panel/cmd.css delete mode 100644 panel/cmd.js diff --git a/.gitignore b/.gitignore index dd619d8a..3ade8a37 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,8 @@ *.swp *.swo -cmd.js -cmd.css -cache.js -cache.css .DS_Store +page/can.js +page/can.css +page/cache.js +page/cache.css pack/ diff --git a/frame.js b/frame.js index bb68b93c..d262daa0 100644 --- a/frame.js +++ b/frame.js @@ -137,7 +137,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }, 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._output(sub, sub.Conf(), event||{}, cmds||sub.Input(), cb, silent) }, + Update: function(event, cmds, cb, silent) { sub.onappend._output0(sub, sub.Conf(), event||{}, cmds||sub.Input(), cb, silent) }, 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) @@ -153,19 +153,26 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, 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))], ["close"])) - }}), meta.inputs && sub.onappend._option(sub, meta, sub._option) + 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)) + sub.onappend._output(sub, msg, msg.Option(ice.MSG_DISPLAY)) + meta.inputs && sub.onappend._option(sub, meta, sub._option, true) + } else { + meta.inputs && sub.onappend._option(sub, meta, sub._option) + } can.base.isFunc(cb) && cb(sub) }); return sub }, - _option: function(can, meta, option) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []), opts = can.base.Obj(meta.opts, {}) + _option: function(can, meta, option, skip) { meta = meta||{}; var index = -1, args = can.base.Obj(meta.args||meta.arg, []), 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), + _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, - CloneInput: function() { can.onmotion.focus(can, add(item)._target) }, CloneField: function() { can.Clone() }, + Option: can.Option, Action: can.Action, Status: can.Status, CloneField: function() { can.Clone() }, + CloneInput: function() { can.onmotion.focus(can, add(item)._target) }, }, [item.display||"/plugin/input.js"], function(input) { input.Conf(item) input.run = function(event, cmds, cb, silent) { var msg = can.request(event) if (msg.RunAction(event, input, cmds)) { return } @@ -175,14 +182,14 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, can.core.ItemCB(input.onaction, function(key, cb) { input._target[key] = function(event) { cb(event, input) } - }), can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target]); + }), skip? next(): can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target]); - (item.action||meta.feature["inputs"]) && can.onappend.figure(input, item, input._target) + (item.action||can.core.Value(meta, "feature.inputs")) && can.onappend.figure(input, item, input._target) }) - }; can.core.Next(can.base.Obj(meta.inputs, []).concat(meta.type == chat.FLOAT? [{type: html.BUTTON, name: cli.CLOSE}]: []), add) + }; 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) { action = action||can._action, meta = meta||can.onaction - can.core.List(list||can.onaction.list, function(item) { can.onappend.input(can, item == ""? /*空白*/ {type: html.SPACE}: + _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) { 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())) @@ -196,7 +203,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, , "", action)}) return meta }, - _output: function(can, meta, event, cmds, cb, silent) { var msg = can.request(event) + _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]}) @@ -205,47 +212,50 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }) } - can.base.isUndefined(can._daemon) && (can._daemon = can.ondaemon._list.push(can)-1), msg._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 } + } return can.run(event, cmds, function(msg) { var sub = can.core.Value(can, "_outputs.-1")||{}; can._msg = msg, sub._msg = msg var process = msg._can == can || msg._can == sub - if (process && can.core.CallFunc([sub, "onimport._process"], [sub, msg, cmds, cb])) { return } - if (process && can.core.CallFunc([can, "onimport._process"], [can, msg, cmds, cb])) { return } + if (process && can.core.CallFunc([sub, "onimport._process"], {can: sub, msg: msg, cb: cb})) { return } + if (process && can.core.CallFunc([can, "onimport._process"], {can: can, msg: msg, cb: cb})) { return } if (can.base.isFunc(cb) && can.core.CallFunc(cb, {can: can, msg: msg})) { return } if (silent) { return } - var display = msg.Option(ice.MSG_DISPLAY)||meta.display||meta.feature.display||"/plugin/table.js" + can.onappend._output(can, msg, msg.Option(ice.MSG_DISPLAY)||meta.display||meta.feature.display) + }) + }, + _output: function(can, msg, display, output) { display = display||"/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, + Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status, + }, [display, "/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 - Volcanos(display, {_follow: can.core.Keys(can._follow, display), _display: display, _target: can._output, _fields: can._target, - _option: can._option, _action: can._action, _output: can._output, _status: can._status, - Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status, - }, [display, "/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 - - table.onimport && table.onimport._init && table.onimport._init(table, msg, msg.result||[], function(msg) { - can.page.Modify(can, can._action, ""), can.page.Modify(can, can._status, "") - table.onaction && table.onappend._action(table, can.base.Obj(msg.Option(ice.MSG_ACTION)||can.Conf(ice.MSG_ACTION), table.onaction.list)) - table.onexport && table.onappend._status(table, can.base.Obj(msg.Option(ice.MSG_STATUS), table.onexport.list)) - }, can._output) - }) + 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(list, function(item) { item = can.base.isObject(item)? item: {name: item} + 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]}, ], }]) }) }, - list: function(can, root, cb, target) { + 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, nav, "div.item", event.target) + can.onmotion.select(can, target, "div.item", event.target) }}, {view: html.LIST}]); can.onappend.list(can, item, cb, ui.list) }) }, @@ -257,7 +267,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }]); return ui.first }, tree: function(can, list, field, split, cb, target, node) { - node = node || {"": target}; can.core.List(list, function(item) { + 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) @@ -306,11 +316,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, 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) { - can.user.jumps("/chat/div/"+value) - return - } + 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) { @@ -324,7 +330,6 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, }, 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 } @@ -337,38 +342,6 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, return code.scrollBy(0, 10000), code }, - figure: function(can, meta, target, cb) { if ([html.BUTTON, html.SELECT].indexOf(meta.type) > -1) { return } - var input = meta.action||mdb.KEY; input != "auto" && can.require(["/plugin/input/"+input+".js"], function(can) { - can.core.ItemCB(can.onfigure[input], function(key, on) { - target[key] = function(event) { - can.onappend._init(can, {type: html.INPUT, name: input, pos: chat.FLOAT}, [], function(sub) { sub.Conf(meta) - sub.run = function(event, cmds, cb) { var msg = sub.request(event, can.Option()); - (meta.run||can.run)(event, cmds, cb, true) - } - - meta.style && sub.page.Modify(sub, sub._target, {style: meta.style}) - can.onmotion.float.add(can, chat.INPUT, sub) - on(event, sub, meta, cb, target) - }, document.body) - } - }) - }) - }, - 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] - var 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) { - can.base.isFunc(cbs) && cbs(sub, meta, skip) - sub.run = function(event, cmds, cb) { - can.core.CallFunc(p, {msg: can.request(event), cmds: cmds, cb: cb}) - } - }, 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 - }, _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, []) @@ -385,45 +358,70 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta, 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] + var 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) { 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) + 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], sub._action, kit.Dict( + cli.CLOSE, function(event) { sub.close() }, + cli.CLEAR, function(event) { target.value = "" }, + )), 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, cbs) + }, document.body) + }, target) } }) + }) + }, 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.onengine.signal(can, "keymap.focus") } - can.onmotion.float.auto(can, ui.output, chat.CARTE, chat.INPUT) + ui.close = function() { can.page.Remove(can, ui.first) } - can.search({}, ["Action.onexport.size"], function(msg, top, left, width, height) { - can.page.Modify(can, ui.output, {style: {"max-height": height-28, "max-width": width}}) - can.page.Modify(can, ui.first, {style: {top: top, left: left}}) + 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: "text", placeholder: "filter", style: {position: ""}, _init: function(input) { + 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(), event.stopPropagation(), event.preventDefault() } }})) - }, onkeydown: function(event) { - can.onkeypop.input(event, can) + }, onkeydown: function(event) { can.onkeypop.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.Modify(can, tr, {style: {display: html.NONE}}) - can.page.Select(can, tr, html.TD, function(td) { - if (td.innerText.indexOf(event.target.value) > -1) { - can.page.Modify(can, tr, {style: {display: ""}}) - } - }) + 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, {"close": ui.close, - "refresh": function(event) { ui.close(), can.toast.click() }, - }) + }}], 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) + }, ui.output), can.onappend.board(can, msg.Result(), ui.output) return ui }, }, [], function(can) {}) @@ -468,20 +466,22 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe 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) { target = target||can._target; if (!event || !event.target) { 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 + figure: function(event, can, target, right, layout) { target = target||can._target + if (!layout) { if (!event || !event.target) { 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 + } + if (left+target.offsetWidth>window.innerWidth) { left = window.innerWidth - target.offsetWidth } + if (top+target.offsetHeight>window.innerHeight-100) { top = window.innerHeight - target.offsetHeight - 100 } + + + layout = {left: left, top: top} + if (layout.left < 0) { layout.left = 0 } + if (layout.top < 0) { layout.top = 0 } } - - if (left+target.offsetWidth>window.innerWidth) { left = window.innerWidth - target.offsetWidth } - if (top+target.offsetHeight>window.innerHeight-100) { top = window.innerHeight - target.offsetHeight - 100 } - - var layout = {left: left, top: top} - if (layout.left < 0) { layout.left = 0 } - if (layout.top < 0) { layout.top = 0 } - can.page.Modify(can, target, {style: layout}) can.onmotion.move(can, target, layout) + return layout }, display: function(can, target) { target = target||can._target @@ -652,6 +652,15 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe }}]) }, + 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 target.onmousedown = function(event) { layout.height = target.offsetHeight, layout.width = target.offsetWidth diff --git a/lib/core.js b/lib/core.js index 66be1b36..f88af181 100644 --- a/lib/core.js +++ b/lib/core.js @@ -37,7 +37,7 @@ Volcanos("core", {help: "数据结构", // 字符定义 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 block = _list(arg[1]||"{[()]}") // 分隔符 var quote = _list(arg[2]||"'\"`") // 引用符 var trans = _list(arg[3]||"\\") // 转义符 @@ -174,6 +174,7 @@ Volcanos("core", {help: "数据结构", }), 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) { diff --git a/lib/page.js b/lib/page.js index 833b7b00..380f1c0b 100644 --- a/lib/page.js +++ b/lib/page.js @@ -208,9 +208,10 @@ Volcanos("page", {help: "用户界面", ClassList: { }) }]) can.page.Append(can, table, can.core.List(msg.Table(), function(line, index, array) { - return {type: html.TR, dataset: {index: index}, list: can.core.List(list, function(key) { if (key.indexOf("_") == 0) { return } + 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) }), diff --git a/lib/user.js b/lib/user.js index fc9704d0..92eff17a 100644 --- a/lib/user.js +++ b/lib/user.js @@ -37,7 +37,7 @@ Volcanos("user", {help: "用户操作", agent: { alert: function(text) { alert(JSON.stringify(text)) }, confirm: function(text) { return confirm(JSON.stringify(text)) }, - prompt: function(text, cb, def, silent) { (text = silent? def: prompt(text, def||"")) != undefined && typeof cb == lang.FUNCTION && cb(text); return 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) }, @@ -65,6 +65,7 @@ Volcanos("user", {help: "用户操作", agent: { if (can.base.isFunction(text)) { text = text.name||"" } return can._trans&&can._trans[text] || can.Conf("trans."+text) || can.Conf("feature._trans."+text) || { "create": "创建", "remove": "删除", "insert": "添加", "delete": "删除", "modify": "编辑", + "inputs": "补全", "prunes": "清理", "export": "导出", "import": "导入", "list": "查看", "back": "返回", "run": "执行", "done": "完成", "share": "共享", "edit": "编辑", "save": "保存", "copy": "复制", "show": "显示", "hide": "隐藏", "project": "项目", "profile": "详情", "actions": "参数", @@ -218,7 +219,7 @@ Volcanos("user", {help: "用户操作", agent: { } return event.stopPropagation(), event.preventDefault(), carte }, - cartes: function(event, can, meta, list, cb, parent) { + carteRight: function(event, can, meta, list, cb, parent) { var carte = can.user.carte(event, can, meta, list, cb, parent) can.page.Modify(can, carte._target, {style: { left: event.clientX-event.offsetX+event.target.offsetWidth-3, @@ -226,6 +227,11 @@ Volcanos("user", {help: "用户操作", agent: { }}) 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) { // form [ string, array, object, {type: "select", values: []} var msg = can.request(event) var ui = can.page.Append(can, document.body, [{view: [html.INPUT], style: {left: 0, top: 0}, list: [ diff --git a/page/cmd.html b/page/cmd.html deleted file mode 100644 index 7316b16a..00000000 --- a/page/cmd.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/page/index.css b/page/index.css index 31588116..deccf774 100644 --- a/page/index.css +++ b/page/index.css @@ -9,12 +9,18 @@ a { h1, h2, h3 { clear:both; } +tr.show { + background:red; +} h1:hover, h2:hover, h3:hover { background:green; cursor:pointer; } .hide { display:none; } +.hidden { + display:none; +} div.item { cursor:pointer; } @@ -35,7 +41,7 @@ div.story[data-type=spark] { box-shadow:4px 4px 10px 1px #626bd0; margin:10px 0px; padding:4px 10px; border-left:solid 4px blue; - cursor:copy; + overflow:auto; cursor:copy; } div.story[data-type=spark] span:hover { box-shadow: 4px 4px 10px 1px #29318e; diff --git a/page/share.css b/page/share.css deleted file mode 100644 index e69de29b..00000000 diff --git a/page/share.html b/page/share.html deleted file mode 100644 index db886e17..00000000 --- a/page/share.html +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - volcanos - - - - - - - - - - - diff --git a/page/share.js b/page/share.js deleted file mode 100644 index 959e8b7d..00000000 --- a/page/share.js +++ /dev/null @@ -1,24 +0,0 @@ -Volcanos({name: "chat", iceberg: "/chat/", volcano: "/frame.js", - libs: ["/lib/base.js", "/lib/core.js", "/lib/misc.js", "/lib/page.js", "/lib/user.js"], panels: [ - {name: "Header", help: "标题栏", pos: "head", state: ["time", "username", "avatar"]}, - {name: "Search", help: "搜索框", pos: "auto"}, - {name: "River", help: "群聊组", pos: "left", action: ["create", "refresh"]}, - {name: "Action", help: "工作台", pos: "main"}, - {name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]}, - ], main: {name: "Header"}, river: { - "serivce": {name: "运营群", storm: { - "wx": {name: "公众号 wx", action: [ - {name: "微信公众号", help: "wx", index: "web.wiki.word", args: ["usr/icebergs/misc/wx/wx.shy"]}, - ]}, - "mp": {name: "小程序 mp", action: [ - {name: "微信小程序", help: "mp", index: "web.wiki.word", args: ["usr/icebergs/misc/mp/mp.shy"]}, - ]}, - "lark": {name: "机器人 lark", action: [ - {name: "飞书机器人", help: "lark", index: "web.wiki.word", args: ["usr/icebergs/misc/lark/lark.shy"]}, - ]}, - "share": {name: "上下文 share", action: [ - {name: "系统上下文", help: "shylinux/contexts", index: "web.wiki.word", args: ["usr/learning/社会/管理/20200724.shy"]}, - ]}, - }}, - }, -}) diff --git a/panel/action.css b/panel/action.css index 8ce2a648..35d6bf65 100644 --- a/panel/action.css +++ b/panel/action.css @@ -75,3 +75,22 @@ fieldset.Action div.output fieldset.plugin legend { fieldset.Action div.output fieldset.plugin legend:hover { background:red; } + +fieldset.panel.cmd>div.legend { + display:none; +} +fieldset.panel.cmd>div.output>fieldset.plugin { + margin:0; padding:0; +} +fieldset.panel.cmd>div.output>fieldset.plugin>legend { + display:none; +} +fieldset.panel.cmd>div.output>fieldset.plugin>div.legend { + float:left; padding:0 10px; margin-right:3px; + height:25px; font-size:18px; + background-color:darkcyan; + cursor:pointer; +} +body.white fieldset.panel.cmd>div.output>fieldset.plugin>div.legend { + background-color:honeydew; +} diff --git a/panel/action.js b/panel/action.js index 30f598f5..742582bb 100644 --- a/panel/action.js +++ b/panel/action.js @@ -1,7 +1,7 @@ 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.type = chat.PLUGIN - item.height = parseInt(can.Conf(html.HEIGHT))-40, item.width = parseInt(can.Conf(html.WIDTH))-40 + item.height = parseInt(can.Conf(html.HEIGHT))-240, item.width = parseInt(can.Conf(html.WIDTH))-40 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) { @@ -46,7 +46,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) can.user.title(can.misc.Search(can, chat.TITLE)||msg.Option(chat.TITLE)) can.onaction.layout(can, "auto") - if (msg[mdb.INDEX].length == 1) { can.require(["/panel/cmd.css"]) + if (msg[mdb.INDEX].length == 1) { can.user.mod.isCmd = true, can.page.ClassList.add(can, can._target, "cmd") can.page.Select(can, document.body, "fieldset.panel", function(item) { item != can._target && can.onmotion.hidden(can, item) @@ -61,6 +61,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg) }, }) Volcanos("onengine", {help: "解析引擎", list: [], _engine: function(event, page, msg, can, cmds, cb) { + if (!can._root.river) { return false } var list = can._root.river; var river = list[cmds[0]] var storm = river && river.storm[cmds[1]] if (!storm || cmds.length != 2) { return false } @@ -91,6 +92,22 @@ Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, can.onimport._share(can, can.misc.Search(can, web.SHARE)) can.onkeypop._init(can) }, + onlogin: function(can) { if (!can.user.mod.isCmd) { return } + can.page.ClassList.add(can, can._target, "cmd") + can._names = location.pathname + can.Conf(chat.TOOL)? can.core.Next(can.Conf(chat.TOOL), function(item, next) { + can.core.Timer(500, function() { can.onaction._plugin(can, item, next) }) + + }): can.run(can.request()._event, [ctx.ACTION, ctx.COMMAND], function(msg) { + can.core.Next(msg.Table(), function(item, next) { + can.onaction._plugin(can, item, next) + }) + }) + }, + _plugin: function(can, item, next) { + can.base.Copy(item, {height: window.innerHeight, width: window.innerWidth, opts: can.misc.Search(can)}) + can.onappend.plugin(can, item, function(sub, meta) { can.user.title(meta.name), next() }) + }, onstorm_select: function(can, msg, river, storm) { can.onlayout._init(can) function key(name) { return can.core.Keys(can.Conf(chat.RIVER), can.Conf(chat.STORM), name) } can.page.Cache(key(html.ACTION), can._action, can._output.scrollTop+1) diff --git a/panel/cmd.css b/panel/cmd.css deleted file mode 100644 index 7bb1aacf..00000000 --- a/panel/cmd.css +++ /dev/null @@ -1,18 +0,0 @@ -fieldset.panel.cmd>div.legend { - display:none; -} -fieldset.panel.cmd>div.output>fieldset.plugin { - margin:0; padding:0; -} -fieldset.panel.cmd>div.output>fieldset.plugin>legend { - display:none; -} -fieldset.panel.cmd>div.output>fieldset.plugin>div.legend { - float:left; padding:0 10px; margin-right:3px; - height:25px; font-size:18px; - background-color:darkcyan; - cursor:pointer; -} -body.white fieldset.panel.cmd>div.output>fieldset.plugin>div.legend { - background-color:honeydew; -} diff --git a/panel/cmd.js b/panel/cmd.js deleted file mode 100644 index daa776a6..00000000 --- a/panel/cmd.js +++ /dev/null @@ -1,20 +0,0 @@ -Volcanos("onaction", {help: "交互操作", list: [], _init: function(can, msg, list, cb, target) { - can.page.ClassList.add(can, can._target, "Action") - can.base.isFunc(cb) && cb() - }, - onlogin: function(can) { can._names = location.pathname - can.Conf(chat.TOOL)? can.core.Next(can.Conf(chat.TOOL), function(item, next) { - can.core.Timer(500, function() { can.onaction._plugin(can, item, next) }) - - }): can.run(can.request()._event, [ctx.ACTION, ctx.COMMAND], function(msg) { - can.core.Next(msg.Table(), function(item, next) { - can.onaction._plugin(can, item, next) - }) - }) - }, - _plugin: function(can, item, next) { - can.base.Copy(item, {height: window.innerHeight, width: window.innerWidth, opts: can.misc.Search(can)}) - can.onappend.plugin(can, item, function(sub, meta) { can.user.title(meta.name), next() }) - }, -}) - diff --git a/panel/header.js b/panel/header.js index cad4b835..2d8f1721 100644 --- a/panel/header.js +++ b/panel/header.js @@ -72,7 +72,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, 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 } - msg.Option(aaa.AVATAR) && can.page.Modify(can, "div.output 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) { var menus = can.base.Obj(msg.Option(chat.MENUS)||can.Conf(chat.MENUS), [chat.HEADER, ["setting", chat.BLACK, chat.WHITE, chat.PRINT]]) @@ -87,7 +87,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, 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, left: window.innerWidth-sub._target.offsetWidth}}) + can.page.Modify(can, sub._target, {style: {top: top, right: 0, left: null}}) }) }), target.onmouseenter = target.click }, diff --git a/panel/river.js b/panel/river.js index 2d71a8ee..38055dec 100644 --- a/panel/river.js +++ b/panel/river.js @@ -101,7 +101,7 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, msg, }, carte: function(event, can, list, cb) { - can.user.cartes(event, can, can.ondetail, 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]) diff --git a/plugin/input.js b/plugin/input.js index 1604b35e..d332c975 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -1,6 +1,3 @@ -Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, meta, list, cb, target) { - }, -}) 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 @@ -23,18 +20,18 @@ Volcanos("onaction", {help: "控件交互", list: [], _init: function(can, meta, onchange: function(event, can) { if (can.Conf(mdb.TYPE) == html.SELECT) { can.run(event) } }, - onkeydown: function(event, can) { + onkeydown: function(event, can) { can.onkeypop.input(event, can, event.target) if (can.Conf(mdb.TYPE) == html.TEXTAREA) { if (!event.ctrlKey) { return } } - can.onkeypop.input(event, can, event.target); switch (event.key) { - case lang.ENTER: - switch (can.Conf(mdb.TYPE)) { - case html.TEXTAREA: if (!event.ctrlKey) { return } - case html.TEXT: event.target.setSelectionRange(0, -1); break - }; can.run(event), event.stopPropagation(), event.preventDefault(); break - case "b": if (event.ctrlKey) { can.CloneInput() } break - case "m": if (event.ctrlKey) { can.CloneField(), event.stopPropagation(), event.preventDefault() } break - } + if (event.key == lang.ENTER) { + can.run(event), event.target.setSelectionRange(0, -1) + event.stopPropagation(), event.preventDefault() + } if (!event.ctrlKey) { return } + + switch (event.key) { + case "b": can.CloneInput(); break + case "m": can.CloneField(); break + default: return + } event.stopPropagation(), event.preventDefault() }, }) -Volcanos("onexport", {help: "导出数据", list: []}) diff --git a/plugin/input/date.css b/plugin/input/date.css index 588c4656..a80080ae 100644 --- a/plugin/input/date.css +++ b/plugin/input/date.css @@ -1,7 +1,7 @@ fieldset.input.date div.action div.space { clear:both; width:0; } -fieldset.input.date div.output td.last { +fieldset.input.date div.output td.prev { color:gray; } fieldset.input.date div.output td.next { diff --git a/plugin/input/date.js b/plugin/input/date.js index 7959cb83..a2617c21 100644 --- a/plugin/input/date.js +++ b/plugin/input/date.js @@ -1,16 +1,13 @@ -Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(event, can, meta, cb, target) { - function set(now) { target.value = can.user.time(can, now), can.page.Remove(can, can._target) - meta && meta.action == ice.AUTO && can.run({}) - } +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({}) } // 添加控件 var now = target.value? new Date(target.value): new Date() - can.onappend._action(can, [cli.CLOSE, + 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.page.Remove(can, can._target) }, + ], 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) }, @@ -26,11 +23,12 @@ Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(e "后一年": function(event) { now.setFullYear(now.getFullYear()+1), show(now) }, }) - can._table = can.page.Append(can, can._output, [{view: [chat.CONTENT, html.TABLE]}]).first + 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("month", now.getMonth()+1) 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) @@ -52,11 +50,11 @@ Volcanos("onfigure", {help: "控件详情", list: [], date: {onclick: function(e 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, "last")} - for (var day = new Date(one); day < end; day.setDate(day.getDate()+1)) {add(day, "main")} - for (var day = new Date(end); end.getDay() != 0 && day < tail; day.setDate(day.getDate()+1)) {add(day, "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 can.onlayout.figure(event, can), can.base.isFunc(cb) && cb(can), now - }; show(now) -}} }, ["/plugin/input/date.css"]) + 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 171c983d..e58b87e8 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -1,22 +1,67 @@ -Volcanos("onfigure", {help: "控件详情", list: [], key: {onclick: function(event, can, meta, cb, target) { - can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { - if (msg.Length() == 0) { return can.page.Remove(can, can._target) } +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) + }) + }} + }) + }, + _select: function(event, can, target) { + 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 = "" + } + }, + onclick: function(event, can, meta, cb, target) { cb(function(can, cbs) { + can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { + if (msg.Length() == 0) { return can.close() } + can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length()) + target._msg = msg, target._figure = can.onlayout.figure(event, can) + can.base.isFunc(cbs) && cbs(can) + }) + }) }, + onkeydown: function(event, can, meta, cb, target) { + var msg = target._msg; msg && cb(function(can, cbs) { + if (event.ctrlKey) { can.onfigure.key._select(event, can, target) } else { + target._index = 0, target._value = "" + switch (event.key) { case lang.ENTER: can.close(); return } + 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) + }) + } - can.onappend._action(can, [cli.CLOSE, cli.CLEAR], can._action, { - close: function(event) { can.page.Remove(can, can._target) }, - clear: function(event) { target.value = "" }, + can.onlayout.figure(event, can, can._target, false, target._figure) + 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 + can.Status(kit.Dict(mdb.TOTAL, total, mdb.INDEX, target._index)) + can.base.isFunc(cbs) && cbs(can) }) - function show(msg) { can.onmotion.clear(can) - can.onappend.table(can, msg, function(value, key, index, line) { - return {text: [value, html.TD], onclick: function() { target.value = line[key] - msg.Option(ice.MSG_PROCESS) == ice.PROCESS_AGAIN? can.run({}, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) { - show(msg) - }): can.page.Remove(can, can._target) - }} - }), can.Status(mdb.COUNT, msg.Length()) - } - show(msg), can.onlayout.figure(event, can) - }) -}}}) + if (event.ctrlKey && ["n", "p"].indexOf(event.key) > -1) { + return event.stopPropagation(), event.preventDefault() + } can.onaction.onkeydown(event, can) + }, +}}) diff --git a/plugin/input/province.js b/plugin/input/province.js index 3a022daa..2631f00a 100644 --- a/plugin/input/province.js +++ b/plugin/input/province.js @@ -1,15 +1,9 @@ -Volcanos("onfigure", {help: "控件详情", list: [], province: {onclick: function(event, can, meta, cb, target) { +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() { - can.onappend._action(can, [cli.CLOSE, cli.CLEAR], can._action, { - close: function(event) { can.page.Remove(can, can._target) }, - clear: function(event) { target.value = "" }, - }) - - var china_chart = echarts.init(can.page.Append(can, can._output, [{type: html.DIVk, style: {width: "600px", height: "400px"}}]).first) - china_chart.setOption({geo: {map: 'china'}}), china_chart.on('click', function (params) { - target.value = params.name, can.page.Remove(can, can._target) - }), can.Status(mdb.COUNT, 34) - can.onlayout.figure(event, can) + 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/wiki/draw.js b/plugin/local/wiki/draw.js index d7555454..aab25f88 100644 --- a/plugin/local/wiki/draw.js +++ b/plugin/local/wiki/draw.js @@ -40,7 +40,7 @@ Volcanos("onimport", {help: "导入数据", list: [], _init: function(can, msg, 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.cartes(event, can, can.onaction, [ice.HIDE, ice.SHOW, mdb.CREATE, cli.CLEAR, mdb.REMOVE]) + can.user.carteRight(event, can, can.onaction, [ice.HIDE, ice.SHOW, mdb.CREATE, cli.CLEAR, mdb.REMOVE]) }, can.ui.project) }, _block: function(can, target) { @@ -286,7 +286,7 @@ Volcanos("onaction", {help: "组件菜单", list: [ 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", function(name) { + 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) { @@ -425,7 +425,7 @@ Volcanos("ondetail", {help: "组件详情", list: [cli.START, ice.RUN, ice.COPY, 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, function(text) { + 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) { @@ -438,7 +438,7 @@ Volcanos("ondetail", {help: "组件详情", list: [cli.START, ice.RUN, ice.COPY, 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)) - }, def) + }) }, modify: function(event, can) { can.onimport._profile(can, event.target) }, "delete": function(event, can) { var target = event.target diff --git a/plugin/local/wiki/word.css b/plugin/local/wiki/word.css index 4cbc8a86..ca82683f 100644 --- a/plugin/local/wiki/word.css +++ b/plugin/local/wiki/word.css @@ -104,7 +104,7 @@ fieldset.word.float>div.output { overflow:auto; padding:20px; } -fieldset.word.float div.project { +fieldset.word.float>div.output>div.project { background:cornsilk; left:0; top:25px; position:fixed; @@ -116,7 +116,7 @@ fieldset.word.float div.content div.page { margin-top:30px; display:none; } -fieldset.word.float div.content div.page.select { +fieldset.word.float div.content div.page.show { display:block; } fieldset.word.float div.content.grid div.page { diff --git a/plugin/local/wiki/word.js b/plugin/local/wiki/word.js index e00a6096..8fa2aef3 100644 --- a/plugin/local/wiki/word.js +++ b/plugin/local/wiki/word.js @@ -1,4 +1,4 @@ -Volcanos("onimport", {H6help: "导入数据", list: [], _init: function(can, msg, list, cb, target) { +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) } @@ -6,39 +6,32 @@ Volcanos("onimport", {H6help: "导入数据", list: [], _init: function(can, msg can.page.Select(can, target, ".story", 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)}) - }), can.onimport._navmenu(can) - }, - _navmenu: function(can) { if (!can.sup._navmenu) { return } - if (can.user.mod.isCmd) { can.page.ClassList.add(can, can._fields, "cmd") - can.Conf(html.WIDTH, can.Conf(html.WIDTH)-can.sup._navmenu.offsetWidth-10) - can.page.Modify(can, can.sup._navmenu, {style: {height: window.innerHeight}}) - can.page.Modify(can, can._output, {style: {"max-width": can.Conf(html.WIDTH)}}) - can.page.Modify(can, can._output, {style: {height: window.innerHeight}}) - } else { - can.Conf(html.WIDTH, can.Conf(html.WIDTH)-can.sup._navmenu.offsetWidth-20) - can.page.Modify(can, can.sup._navmenu, {style: {height: window.innerHeight-240}}) - can.page.Modify(can, can._output, {style: {height: window.innerHeight-240}}) - } + }) }, navmenu: function(can, data, target) { var nav = can.sup._navmenu - nav = nav||can.page.Append(can, can._fields, [{view: "navmenu"}]).first + nav = nav||can.page.Append(can, can._fields, [{view: wiki.NAVMENU}]).first can.onmotion.clear(can, nav), can._fields.insertBefore(nav, can._output) - can.sup._navmenu = nav - - can.page.Modify(can, can._output, {style: {float: html.LEFT, clear: html.NONE}}) + can.page.Modify(can, nav, {style: {height: can.Conf(html.HEIGHT)}}) can.onappend.list(can, can.base.Obj(data.data), function(event, item) { - var link = item.meta.link, cmd = link.split(ice.PS).pop() - if (can.onaction[cmd]) { return can.onaction[cmd](event, can) } - if (!link || link == can.Option(nfs.PATH)) { return } + 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.page.Cache(can.Option(nfs.PATH), can._output, "some") - can.Option(nfs.PATH, link) - var some = can.page.Cache(can.Option(nfs.PATH), can._output) - if (!some) { can.sup.Update(event, [link]) } - can.user.title(item.meta.name) + can.page.Cache(can.Option(nfs.PATH), can._output, can._output.scrollTop+1) + can.Option(nfs.PATH, link), can.user.mod.isCmd && can.user.title(item.meta.name) + var position = can.page.Cache(can.Option(nfs.PATH), can._output) + if (position) { can._output.scrollTo(0, position-1); return true } + + can.sup.Update(event, [link]) return true - }, nav) + }, nav), can.sup._navmenu = nav + + 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, "h2.story, h3.story", function(item) { @@ -51,54 +44,34 @@ Volcanos("onimport", {H6help: "导入数据", list: [], _init: function(can, msg can.user.mod.isCmd && can.user.title(data.text) }, spark: function(can, data, target) { - if (data[mdb.NAME] == html.INNER) { - target.title = "点击复制", target.onclick = function(event) { - can.user.copy(event, can, target.innerText) - } - return - } - can.page.Select(can, target, html.SPAN, function(item) { - item.title = "点击复制", item.onclick = function(event) { - can.user.copy(event, can, item.innerText) - } - }) - can.page.Select(can, target, html.A, function(item) { - if (item.innerText == "") { item.innerText = item.href } - can.page.Modify(can, item, {target: "_blank"}) - }) + 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) { - var ui = can.user.carte(event, can, kit.Dict(mdb.EXPORT, function(event, can, button) { - can.user.toPNG(can, can.user.prompt("file name", null, "hi.png"), target.outerHTML, - parseInt(target.getAttribute(html.HEIGHT)), parseInt(target.getAttribute(html.WIDTH))) + 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]) - can.page.Modify(can, ui._target, {style: {left: event.clientX, top: event.clientY}}) } }, 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) { - item.title = "点击复制", item.onclick = function(event) { - can.user.copy(event, can, item.innerText) - } - }) + 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, ["/plugin/state.js"], function(sub) { sub.run = function(event, cmds, cb, silent) { can.run(event, can.misc.concat([ctx.ACTION, chat.STORY, data.type, data.name, data.text], cmds), cb, true) - } - sub.Conf(html.WIDTH, item.width = (width||can.Conf(html.WIDTH))-20) + }, sub.Conf(html.WIDTH, item.width = (width||can.Conf(html.WIDTH))-20) - can.core.Value(item, "auto.cmd") && can.core.Timer(100, function() { - var msg = sub.request({}, can.core.Value(item, "opts")); msg.Option("_handle", "true") + can.core.Value(item, "auto.cmd") && can.core.Timer300ms(function() { + var msg = sub.request({}, can.core.Value(item, "opts")); msg.Option("_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}) }, @@ -106,15 +79,15 @@ Volcanos("onimport", {H6help: "导入数据", list: [], _init: function(can, msg Volcanos("onkeypop", {help: "键盘交互", list: [], _mode: { normal: { - "n": function(event, can) { can.onaction.next(can.sub) }, - "j": function(event, can) { can.onaction.next(can.sub) }, - "ArrowRight": function(event, can) { can.onaction.next(can.sub) }, - "ArrowLeft": function(event, can) { can.onaction.prev(can.sub) }, - "k": function(event, can) { can.onaction.prev(can.sub) }, - "p": function(event, can) { can.onaction.prev(can.sub) }, + "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.onaction["结束"](event, can.sub) }, - "h": function(event, can) { can.onaction["隐藏"](event, can.sub) }, + "q": function(event, can) { can.ondetail["结束"](event, can.sub) }, + "h": function(event, can) { can.ondetail["隐藏"](event, can.sub) }, }, }, _engine: {}, }) @@ -136,7 +109,7 @@ Volcanos("onaction", {help: "控件交互", list: [], ["布局", "开讲", "快闪", "网格"], "大纲", "首页", "上一页", ["菜单"].concat(can.core.List(list, function(page) { return page[0].innerHTML })), "下一页", "隐藏", "结束", - ], sub._action, can.onaction) + ], sub._action, can.ondetail) can.onengine.signal(can, "keymap.focus", can.request(event, {cb: function(event) { can.keylist = can.onkeypop._parse(event, can, "normal", can.keylist) @@ -149,76 +122,72 @@ Volcanos("onaction", {help: "控件交互", list: [], can.core.List(sub.list = list, function(page, index) { can.onappend.item(can, html.ITEM, {name: page[0].innerHTML}, function(event) { - can.onaction.show(sub, index) + 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 "premenu": item = item.cloneNode(false); break + 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-40]), item }), }]) - }), can.onmotion.hidden(can, sub.ui.project), can.onaction.show(sub, 0) + }), can.onmotion.hidden(can, sub.ui.project), can.ondetail.show(sub, 0) - sub.onappend._status(sub, ["page", "from", "cost"]), sub.Status("from", can.base.Time()) + 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("cost", can.base.Duration(now-from)) + sub.Status(cli.COST, can.base.Duration(now-from)) }) }, document.body) }, - "开讲": function(event, can) { can.sup.onaction.show(can, 0) }, - "快闪": function(event, can) { can.sup.onaction.flash(can) }, - "网格": function(event, can) { can.sup.onaction.grid(can) }, - - "大纲": function(event, can) { can.onmotion.toggle(can, can.ui.project) }, - "首页": function(event, can) { can.sup.onaction.show(can, 0) }, - "上一页": function(event, can) { can.sup.onaction.prev(can, can.ui.content) }, - "菜单": function(event, can) { can.sup.onaction.show(can, event.target.selectedIndex) }, - "下一页": function(event, can) { can.sup.onaction.next(can, can.ui.content) }, - "隐藏": function(event, can) { can.onmotion.toggle(can, can._output) }, - "结束": function(event, can) { can.page.Remove(can, can._target) - can.onengine.signal(can, "keymap.focus", can.request(event, {cb: null})) +}) +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, "div.page", function(page, index) { if (index == which || page == which) { sub.page.Select(sub, page, "h1,h2,h3", function(item) { sub.Action("菜单", item.innerHTML) }) sub.onmotion.select(sub, sub.ui.project, "div.item", index) - sub.Status("page", index+1+ice.PS+sub.list.length) - sub.page.ClassList.add(sub, page, "select") + 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, "select") + sub.page.ClassList.del(sub, page, html.SHOW) } }) }, next: function(sub) { - sub.page.Select(sub, sub.ui.content, "div.page.select", function(page) { - page.nextSibling? sub.sup.onaction.show(sub, page.nextSibling): + sub.page.Select(sub, sub.ui.content, "div.page.show", function(page) { + page.nextSibling? sub.sup.ondetail.show(sub, page.nextSibling): sub.user.toast(sub, "end") }) }, prev: function(sub) { - sub.page.Select(sub, sub.ui.content, "div.page.select", function(page) { - page.previousSibling? sub.sup.onaction.show(sub, page.previousSibling): + sub.page.Select(sub, sub.ui.content, "div.page.show", function(page) { + page.previousSibling? sub.sup.ondetail.show(sub, page.previousSibling): sub.user.toast(sub, "end") }) }, flash: function(sub) { sub.core.Next(sub.page.Select(sub, sub.ui.content, "div.page"), function(page, next) { sub.core.Timer(500, function() { next() }) - sub.sup.onaction.show(sub, page) + sub.sup.ondetail.show(sub, page) }) }, grid: function(sub) { sub.page.Modify(sub, sub.ui.content, {className: "content grid"}) }, -}) -Volcanos("ondetail", {help: "交互操作", list: ["删除"], _init: function(can, msg, list, cb, target) { - }, - "删除": function(event, sub) { - sub.page.Remove(sub, sub._target) - }, + + "开讲": 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) }, }) diff --git a/plugin/state.js b/plugin/state.js index 468811e1..3f0f10b6 100644 --- a/plugin/state.js +++ b/plugin/state.js @@ -186,23 +186,18 @@ Volcanos("onaction", {help: "交互操作", list: [ 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.onkeypop, + 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.onkeypop, ], function(lib) { - can.core.Item(lib, function(key, value) { if (!lib.hasOwnProperty(key)) { return } - if (key.indexOf("_") == 0) { return } - list.push({zone: lib._name, type: typeof value, name: key, text: can.base.isObject(value)? "": (value+"").split(ice.NL)[0], file: lib._path}) + 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, content: can.base.Format(list)}) - can.run(event, [button], function() { - can.user.toastSuccess(can) - }) + 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) { diff --git a/proto.js b/proto.js index 9ecc04ab..2e610fc8 100644 --- a/proto.js +++ b/proto.js @@ -56,11 +56,10 @@ var ctx = { INDEX: "index", ARGS: "args", } var cli = { - OPEN: "open", CLOSE: "close", - START: "start", STOP: "stop", - DONE: "done", ERROR: "error", + 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", - BACK: "back", RED: "red", GREEN: "green", BLUE: "blue", YELLOW: "yellow", CYAN: "cyan", PURPLE: "purple", MAGENTA: "magenta", @@ -75,23 +74,26 @@ var aaa = { LOGIN: "login", LOGOUT: "logout", INVITE: "invite", } var mdb = { - PLUGIN: "plugin", RENDER: "render", SEARCH: "search", INPUTS: "inputs", - CREATE: "create", REMOVE: "remove", INSERT: "insert", DELETE: "delete", - MODIFY: "modify", SELECT: "select", - - 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", COUNT: "count", LIMIT: "limit", - INDEX: "index", VALUE: "value", EXTRA: "extra", EXPIRE: "expire", + 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", + + PLUGIN: "plugin", RENDER: "render", SEARCH: "search", ENGINE: "engine", + NEXT: "next", PREV: "prev", PAGE: "page", MAIN: "main", } var ssh = { SCRIPT: "script", } var nfs = { HTML: "html", CSS: "css", JS: "js", GO: "go", SH: "sh", CSV: "csv", JSON: "json", - PATH: "path", FILE: "file", LINE: "line", + PATH: "path", FILE: "file", LINE: "line", SIZE: "size", DIR: "dir", CAT: "cat", TRASH: "trash", DIR_ROOT: "dir_root", } @@ -107,11 +109,12 @@ var wiki = { TITLE: "title", BRIEF: "brief", REFER: "refer", SPARK: "spark", ORDER: "order", TABLE: "table", CHART: "chart", IMAGE: "image", VIDEO: "video", FIELD: "field", SHELL: "shell", LOCAL: "local", PARSE: "parse", + + NAVMENU: "navmenu", PREMENU: "premenu", } var chat = { - LIB: "lib", PAGE: "page", PANEL: "panel", PLUGIN: "plugin", OUTPUT: "output", - TOAST: "toast", CARTE: "carte", INPUT: "input", UPLOAD: "upload", - STORY: "story", FLOAT: "float", CONTEXTS: "contexts", + 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", @@ -137,8 +140,8 @@ var chat = { {name: "Header", help: "标题栏", pos: "head", state: ["time", "usernick", "avatar"]}, {name: "River", help: "群聊组", pos: "left", action: ["create", "refresh"]}, {name: "Action", help: "工作台", pos: "main"}, - {name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]}, {name: "Search", help: "搜索框", pos: "auto"}, + {name: "Footer", help: "状态条", pos: "foot", state: ["ncmd"]}, ], plugin_list: [ "/plugin/state.js", @@ -180,10 +183,11 @@ var html = { TABLE: "table", TR: "tr", TH: "th", TD: "td", BR: "br", UL: "ul", LI: "li", A: "a", LABEL: "label", INNER: "inner", TITLE: "title", - CLASS: "class", BLOCK: "block", NONE: "none", + CLASS: "class", BLOCK: "block", NONE: "none", FLOAT: "float", CLEAR: "clear", 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", + HIDDEN: "hidden", SELECT: "select", WSS: "wss", SVG: "svg", CANVAS: "canvas", IFRAME: "iframe", CHROME: "chrome", LIST: "list", ITEM: "item", MENU: "menu", NODE: "node", @@ -192,7 +196,7 @@ var html = { var lang = { STRING: "string", NUMBER: "number", OBJECT: "object", FUNCTION: "function", - ESCAPE: "Escape", ENTER: "Enter", + ESCAPE: "Escape", ENTER: "Enter", TAB: "Tab", } function shy(help, meta, list, cb) { var index = 0, args = arguments; function next(type) { @@ -317,9 +321,9 @@ Volcanos.meta._load = function(url, cb) { return document.body.appendChild(item), item } } -function cmd(tool) { +function can(tool) { Volcanos({name: "chat", panels: [ {name: "Header", help: "标题栏", pos: "hide", state: ["time", "usernick", "avatar"]}, - {name: "cmd", help: "工作台", pos: chat.MAIN, tool: tool}, + {name: "Action", help: "工作台", pos: chat.MAIN, tool: tool}, ]}) }