diff --git a/frame.js b/frame.js index 900ff3db..3ed07253 100644 --- a/frame.js +++ b/frame.js @@ -67,7 +67,7 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { }), listen: shy(function(can, name, cb) { arguments.callee.meta[name] = (arguments.callee.meta[name]||[]).concat(cb) }), signal: function(can, name, msg) { msg = msg||can.request(); var _msg = name == chat.ONREMOTE? msg.Option("_msg"): msg - _msg.Option(ice.LOG_DISABLE) == ice.TRUE || can.misc.Log(name, can._name, (msg._cmds||[]).join(ice.SP), name == chat.ONMAIN? can: _msg) + _msg.Option(ice.LOG_DISABLE) == ice.TRUE || can.misc.Log(name, can._name, (msg._cmds||[]).join(ice.SP), name == chat.ONMAIN? can: _msg, can._target) return can.core.List(can.onengine.listen.meta[name], function(cb) { can.core.CallFunc(cb, {event: msg._event, msg: msg}) }).length }, }) diff --git a/index.css b/index.css index 8a765ad9..982277e0 100644 --- a/index.css +++ b/index.css @@ -327,4 +327,6 @@ div.story[data-type=spark]::-webkit-scrollbar { width:0 !important; height:0 !im div.project::-webkit-scrollbar { width:0 !important; height:0 !important; } div.content::-webkit-scrollbar { width:0 !important; height:0 !important; } -fieldset.data div.item:not(.string):not(.number):not(.boolean)>span.value { color:silver; } +div.item:not(.string):not(.number):not(.boolean)>span.value { color:silver; } +span.string { color:#f29766; } +span.tag { color:#5cadd4; } diff --git a/lib/page.js b/lib/page.js index 8c45cc89..bab5f6bd 100644 --- a/lib/page.js +++ b/lib/page.js @@ -247,4 +247,61 @@ Volcanos("page", {ClassList: { width: function() { return window.innerWidth }, ismodkey: function(event) { return [lang.META, lang.ALT, lang.CONTROL, lang.SHIFT].indexOf(event.key) > -1 }, isDisplay: function(target) { return target && target.style.display != html.NONE && target.className.indexOf(html.HIDE) == -1 }, + AppendData: function(can, target, prefix, key, value, cb) { + var open = "\u25BE ", close = "\u25B8 " + function show(value, skip) { switch (typeof value) { + case "object": if (!value) { return {} } + if (value._path) { return {type: "plugin", open: open, close: close, value: "\""+value._path+"\""} } + if (value.tagName) { return {type: "html", open: open, close: close, value: value.tagName.toLowerCase()+(value.className? ice.PT+value.className.replaceAll(ice.SP, ice.PT):"")} } + if (skip) { return {value: value.length == undefined? "{...}": "[...]"} } + if (value.length != undefined) { return {type: "array", open: open, close: close, value: value.length+" ["+can.core.List(value, function(value) { return show(value).value }).join(",")+"]"} } + return {type: typeof value, open: open, close: close, value: "{"+can.core.Item(value, function(key, val) { + if (value.hasOwnProperty(key)) { return key+":"+show(val, true).value } + }).join(",")+"}"} + case "string": return {type: typeof value, open: "s ", close: "s ", value: "\""+value+"\""} + case "number": return {type: typeof value, open: "n ", close: "n ", value: value} + case "boolean": return {type: typeof value, open: "b ", close: "b ", value: value} + case "function": return {type: typeof value, open: "f ", close: "f ", value: (""+value).split(ice.NL)[0]} + default: return {type: typeof value, open: " ", close: " ", value: value} + } } + var loaded = false, _show = show(value) + var ui = can.page.Append(can, target, [{view: [[html.ITEM, _show.type]], list: [ + {view: [html.ICON, html.SPAN, _show.close]}, {view: [mdb.NAME, html.SPAN, key || key === 0? key+ice.SP: ""]}, {view: [mdb.VALUE, html.SPAN, _show.value]}, + ], onclick: function() { if (typeof value != "object") { return } cb && cb(prefix, value) + if (loaded) { return ui.icon.innerText = can.onmotion.toggle(can, ui.list)? _show.open: _show.close } loaded = true, ui.icon.innerText = _show.open + if (value.tagName) { can.page.Append(can, ui.list, [can.page.AppendView(can, value)]) + can.core.List(can.core.Item(target, function(key, value) { if (["innerText", "outerText", "innerHTML", "outerHTML", "textContent"].indexOf(key) > -1 || typeof value == "function") { return } return key }).sort(), function(key) { + key.toUpperCase() != key && target[key] && can.page.AppendData(can, ui.list, can.core.Keys(prefix, key), key, target[key]) + }) + } else if (value.length != undefined) { + can.core.List(value, function(value, index) { can.page.AppendData(can, ui.list, can.core.Keys(prefix, index), index, value) }) + } else { + can.core.List(can.core.Item(value, function(key) { if (value.hasOwnProperty(key)) { return key } }).sort(), function(key) { can.page.AppendData(can, ui.list, can.core.Keys(prefix, key), key, value[key]) }) + value.__proto__ && can.core.Item(value.__proto__).length > 0 && can.page.AppendData(can, ui.list, can.core.Keys(prefix, "__proto__"), "__proto__", value.__proto__) + } + }}, {view: html.LIST, style: {"margin-left": "20px"}}]) + }, + AppendView: function(can, target, tag, list, loaded) { + function field(target) { return target? can.core.List(target.attributes, function(item) { + return item.value == "" || item.value == item.name? {type: html.SPAN, list: [{text: " "}, {text: item.name}]}: + {type: html.SPAN, list: [{text: " "}, {text: item.name}, {text: "="}, {className: "string", text: "\""+item.value+"\""}]} + }): [] } + function show(target, tag, list, loaded) { var ui = {}; tag = tag||target.tagName.toLowerCase() + var inner = target.innerHTML? "...": ""; if (target && target.tagName) { target.innerText == target.innerHTML && (inner = target.innerText) } + var open = "\u25BE ", close = "\u25B8 ", isclose = tag != "meta" && tag != "link", _field = field(target) + return {view: "some", list: [ + {view: [[html.ITEM]], list: [ + {text: target.children.length > 0? close: " ", _init: function(target) { ui.toggle = target }}, + {className: "tag", text: can.page.replace(can, "<")}, {className: "tag", text: tag}, {type: html.SPAN, list: _field}, + {className: "tag", text: can.page.replace(can, ">")}, inner && {text: inner, _init: function(target) { ui.inner = target }}, + isclose && {className: "tag", text: can.page.replace(can, ""), _init: function(target) { ui._close = target }}, + ], onclick: function(event) { ui.toggle.innerText = can.onmotion.toggle(can, ui.list)? open: close + ui.inner && can.onmotion.toggle(can, ui.inner), can.onmotion.toggle(can, ui.close), can.onmotion.toggle(can, ui._close) + if (!loaded) { can.page.Append(can, ui.list, can.core.List(target.children, function(node) { return show(node, node.tagName.toLowerCase()) })) } loaded = true + }, _init: function(target) { can.onmotion.delay(can, function() { loaded && target.click() }) }}, + isclose && {view: [[html.LIST, html.HIDE]], style: {"margin-left": "20px"}, _init: function(target) { ui.list = target }, list: list}, + isclose && {view: [[html.ITEM, html.HIDE]], list: [{text: " "}, {className: "tag", text: can.page.replace(can, "")}], _init: function(target) { ui.close = target }}, + ]} + } return show(target, tag, list, loaded) + }, }) diff --git a/panel/action.js b/panel/action.js index 4525e697..dc1ff34d 100644 --- a/panel/action.js +++ b/panel/action.js @@ -235,43 +235,6 @@ Volcanos(chat.ONPLUGIN, { can.Option(chat.LAYOUT, can.getAction(chat.LAYOUT)||ice.AUTO) }, }, ["layout:select=auto,tabs,tabview,horizon,vertical,free,grid,flow,page", ice.RUN], function(can, msg, arg) { can.onaction.layout(can, arg[0], true) }), - data: shy("网页标签", function(can, msg, arg) { - can.onmotion.delay(can, function() { var can = msg._can - function show(value) { switch (typeof value) { - case "object": - if (value._path) { - return {type: "plugin", open: "- ", close: "+ ", value: "\""+value._path+"\""} - } - if (value.tagName) { - return {type: "html", open: "- ", close: "+ ", value: value.tagName.toLowerCase()+ice.PT+value.className.replaceAll(ice.SP, ice.PT)} - } - if (value.length != undefined) { - return {type: "array", open: "- ", close: "+ ", value: "["+can.core.List(value, function(value) { return show(value).value }).join(",")+"]"} - } - return {type: typeof value, open: "- ", close: "+ ", value: ""} - case "string": return {type: typeof value, open: "s ", close: "s ", value: "\""+value+"\""} - case "number": return {type: typeof value, open: "n ", close: "n ", value: value} - case "boolean": return {type: typeof value, open: "b ", close: "b ", value: value} - case "function": return {type: typeof value, open: "f ", close: "f ", value: (""+value).split(ice.NL)[0]} - default: return {type: typeof value, open: " ", close: " ", value: value} - } } - function add(target, key, value) { var loaded = false, _show = show(value) - var ui = can.page.Append(can, target, [{view: [[html.ITEM, _show.type]], list: [ - {view: [html.ICON, html.SPAN, _show.close]}, - {view: [mdb.NAME, html.SPAN, key+" "]}, - {view: [mdb.VALUE, html.SPAN, _show.value]}, - ], onclick: function() { if (typeof value != "object") { return } - if (loaded) { return ui.icon.innerText = can.onmotion.toggle(can, ui.list)? _show.open: _show.close } loaded = true, ui.icon.innerText = _show.open - can.core.List(can.core.Item(value, function(key) { if (value.hasOwnProperty(key)) { return key } }).sort(), function(key) { add(ui.list, key, value[key]) }) - }}, {view: html.LIST, style: {"margin-left": "20px"}}]) - } add(can._output, can._root._name, can._root) - }) - }), - view: shy("网页标签", function(can, msg, arg) { - can.onmotion.delay(can, function() { var can = msg._can - can.page.Append(can, can._output, [{view: [html.ITEM, html.DIV, "html"]}]) - }) - }), "parse": shy("生成网页", { "show": function(can, msg, arg) { var name = arg[1]||ice.CAN; can.isCmdMode() && can.user.title(name) arg && arg[0] && Volcanos(name, {_follow: can.core.Keys(can._follow, name)}, [chat.PLUGIN_STORY+"parse.js"], function(sub) { diff --git a/panel/footer.js b/panel/footer.js index f7e349c7..b65cbf2b 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -68,8 +68,8 @@ Volcanos(chat.ONPLUGIN, { }), debug: shy("日志", ["type:select=Info,Warn,Error,Debug", "_text"], function(can, msg, arg) { arg && arg.length > 1 && can.misc[arg[0]](can, arg[1]) - can.onmotion.delay(can, function() { var sub = msg._can; sub.page.style(can, sub._output, html.MAX_HEIGHT, 200) - can.page.Append(can, sub._output, [{type: html.TABLE, className: html.CONTENT, list: [{type: html.TR, list: [ + can.onmotion.delay(can, function() { var can = msg._can + can.page.Append(can, can._output, [{type: html.TABLE, className: html.CONTENT, list: [{type: html.TR, list: [ {type: html.TH, inner: mdb.TIME}, {type: html.TH, inner: nfs.FILE}, {type: html.TH, inner: mdb.TYPE}, @@ -78,20 +78,16 @@ Volcanos(chat.ONPLUGIN, { {type: html.TD, inner: list[0]}, {type: html.TD, inner: list[1].indexOf(location.origin) == 0? list[1].slice(location.origin.length+1): list[1]}, {type: html.TD, inner: list[2]}, - {type: html.TD, inner: can.core.List(list.slice(3), function(item) { - if (item.Conf) { - return "can" - } else if (item.Option) { - return "msg" - } else if (can.base.isString(item)) { - return item - } else { - return JSON.stringify(item) - } - }).join(ice.SP)}, + {type: html.TD, list: can.core.List(list.slice(3), function(item) { if (can.base.isString(item)) { return {text: item} } + return {view: "data", _init: function(target) { can.page.AppendData(can, target, "", "", item, function(prefix, value) { + can.Option(mdb.KEY, prefix) + })}} + }), onclick: function(event) { + can.onkeymap.prevent(event) + }}, ], onclick: function(event) { var _ls = /(https*:\/\/[^/]+)*([^:]+):([0-9]+):([0-9]+)/.exec(list[1]) - sub.onexport.record(sub, list[1], mdb.LINK, { + can.onexport.record(can, list[1], mdb.LINK, { time: list[0], link: list[1], type: list[2], @@ -100,6 +96,26 @@ Volcanos(chat.ONPLUGIN, { line: _ls[3], }) }} })) }]) + can.onappend._status(can, [{name: mdb.TIME, value: can.base.Time()}, {name: mdb.COUNT, value: can.misc._list.length+"x4"}]) + }) + }), + data: shy("网页标签", ["key"], function(can, msg, arg) { + can.onmotion.delay(can, function() { var can = msg._can + if (can.Option(mdb.KEY)) { + can.page.AppendData(can, can._output, can.Option(mdb.KEY), can.Option(mdb.KEY).split(ice.PT).pop(), can.core.Value(can._root, can.Option(mdb.KEY))) + } else { + can.page.AppendData(can, can._output, "", can._root._name, can._root) + } + }) + }), + view: shy("网页标签", function(can, msg, arg) { + can.onmotion.delay(can, function() { var can = msg._can + can.page.Append(can, can._output, [ + can.page.AppendView(can, document, "html", [ + can.page.AppendView(can, document.head, "head"), + can.page.AppendView(can, document.body, "body"), + ], true) + ]) }) }), }) diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 29753075..34be4eed 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -282,7 +282,7 @@ Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) { }) }, _index: function(can, msg, cb) { - if (can.Option(nfs.LINE) == web.DREAM) { can.ui.dream && can.onmotion.delay(can, function() { can.ui.dream.refresh() }, 5000) + if (can.Option(nfs.LINE) == web.DREAM) { can.ui.zone.dream && can.onmotion.delay(can, function() { can.ui.dream.refresh() }, 5000) return can.base.isFunc(cb) && cb(msg._content = msg._content||can.page.insertBefore(can, [{view: [html.CONTENT, html.IFRAME], src: can.misc.MergePodCmd(can, {pod: can.Option(nfs.FILE)}), height: can.ui.content.offsetHeight, width: can.ui.content.offsetWidth}], can.ui._content)) } var meta = {type: "story", index: msg.Option(ctx.INDEX), args: can.Option(nfs.PATH) == ctx.COMMAND && can.Option(nfs.LINE) != ctx.INDEX? [can.Option(nfs.LINE)]: []} diff --git a/plugin/local/code/vimer.js b/plugin/local/code/vimer.js index 7e0c49d8..caf02352 100644 --- a/plugin/local/code/vimer.js +++ b/plugin/local/code/vimer.js @@ -29,7 +29,7 @@ Volcanos(chat.ONFIGURE, { source: function(can, target, zone, path) { var args = can.base.getValid(can.misc.SearchHash(can), [can.Option(nfs.PATH), can.Option(nfs.FILE)]) zone._icon({"+": function(event) { can.user.carteRight(event, can, {}, ["script", "autogen"]) } }) function show(target, zone, path) { can.run(can.request({}, {dir_root: path, dir_deep: true}), [nfs.PWD], function(msg) { can.onmotion.clear(can, target) - if (path == nfs.SRC) { can.ui.source.refresh = function() { show(target, zone, path) } } + if (path == nfs.SRC) { can.ui.zone.source.refresh = function() { show(target, zone, path) } } var total, node; function add(list) { can.core.List(list, function(item) { if (path == args[0] && args[1].indexOf(item.path) == 0) { item.expand = true } item._menu = shy({ create: function(event) { can.user.input(event, can, ["filename"], function(list) { @@ -79,17 +79,17 @@ Volcanos(chat.ONACTION, {list: ["首页", "官网", "文档"], _daemon: function(event, can, arg) { switch (arg[0]) { case web.DREAM: can.runAction({}, arg[0], arg.slice(1), function(msg) { can.onimport.tabview(can, can.Option(nfs.PATH), can.core.Keys(can.misc.Search(can, ice.POD), msg.Option(mdb.NAME)), web.DREAM) }); break case code.XTERM: can.runAction({}, arg[0], arg.slice(1), function(msg) { can.onimport.tabview(can, ctx.COMMAND, code.XTERM, msg.Result()) }); break - default: can.runAction({}, arg[0], arg.slice(1), function(msg) { can.onimport.tabview(can, msg.Option(nfs.PATH)||can.Option(nfs.PATH), msg.Option(nfs.FILE)), can.ui.source.refresh() }) + default: can.runAction({}, arg[0], arg.slice(1), function(msg) { can.onimport.tabview(can, msg.Option(nfs.PATH)||can.Option(nfs.PATH), msg.Option(nfs.FILE)), can.ui.zone.source.refresh() }) } }, _run: function(event, can, button, args, cb) { can.runAction(event, button, args, cb||function(msg) { - can.onimport.tabview(can, msg.Option(nfs.PATH)||can.Option(nfs.PATH), msg.Option(nfs.FILE)), can.ui.source.refresh(), can.user.toastSuccess(can, button) + can.onimport.tabview(can, msg.Option(nfs.PATH)||can.Option(nfs.PATH), msg.Option(nfs.FILE)), can.ui.zone.source.refresh(), can.user.toastSuccess(can, button) }) }, _runs: function(event, can, button, cb) { var meta = can.Conf(); can.request(event, {action: button}) can.user.input(event, can, meta.feature[button], function(args) { can.onaction._run(event, can, button, args, cb) }) }, autogen: function(event, can, button) { can.onaction._runs(can.request(event, {path: nfs.SRC}), can, button, function(msg) { can.onimport.tabview(can, msg.Option(nfs.PATH), msg.Option(cli.MAIN), "", function() { - can.onimport.tabview(can, msg.Option(nfs.PATH), msg.Option(nfs.FILE)), can.ui.source.refresh(), can.user.toastSuccess(can) + can.onimport.tabview(can, msg.Option(nfs.PATH), msg.Option(nfs.FILE)), can.ui.zone.source.refresh(), can.user.toastSuccess(can) }, true) }) }, script: function(event, can, button) { @@ -97,7 +97,7 @@ Volcanos(chat.ONACTION, {list: ["首页", "官网", "文档"], }, dream: function(event, can, button) { can.onaction._runs(can.request(event, {name: can.base.trimSuffix(can.Option(nfs.FILE).split(ice.PS).pop(), ice.PT+can.base.Ext(can.Option(nfs.FILE)))}), can, button, function(msg) { - can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option(mdb.NAME), web.DREAM), can.ui.dream.refresh(), can.user.toastSuccess(can) + can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option(mdb.NAME), web.DREAM), can.ui.zone.dream.refresh(), can.user.toastSuccess(can) }) }, website: function(event, can, button) { diff --git a/plugin/table.js b/plugin/table.js index c67b9615..ec02b227 100644 --- a/plugin/table.js +++ b/plugin/table.js @@ -112,7 +112,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear( } }, onfocus: function(event) { var target = event.target; target.setSelectionRange && target.setSelectionRange(0, target.value.length) }}], target, {}) }}, - {view: html.LIST, _init: function(target) { can.ui[zone.name] = zone, zone._target = target, zone.refresh = function() { can.onmotion.clear(can, target), zone._init(target, zone) } + {view: html.LIST, _init: function(target) { can.ui.zone = can.ui.zone||{}, can.ui.zone[zone.name] = zone, zone._target = target, zone.refresh = function() { can.onmotion.clear(can, target), zone._init(target, zone) } zone._total = function(total) { return can.page.Modify(can, zone._search, {placeholder: "search in "+total+" item"}), total } zone._icon = function(list) { can.page.Select(can, zone._legend, "span.icon", function(target) { can.page.Remove(can, target) })