diff --git a/frame.js b/frame.js index f224c83d..da23d27c 100644 --- a/frame.js +++ b/frame.js @@ -18,8 +18,8 @@ Volcanos(chat.ONENGINE, {_init: function(can, meta, list, cb, target) { can.onengine.listen(can, chat.ONSEARCH, function(msg, arg) { arg[0] == ctx.COMMAND && can.run(msg, ["can.command"]) }) can.onengine.signal(can, chat.ONMAIN, can.request()), can.base.isFunc(cb) && cb(can) }) - can.onappend.topic(can, html.DARK), can.onappend.topic(can, html.LIGHT, {panel: "white", plugin: "aliceblue", legend: "lavender", input: "white", output: "white", table: "aliceblue", - hover: "aliceblue", border: "transparent", label: "black", text: "black", info: "blue", warn: "red"}) + can.onappend.topic(can, html.DARK), can.onappend.topic(can, html.LIGHT, {panel: cli.WHITE, plugin: cli.ALICEBLUE, legend: "lavender", input: cli.WHITE, output: cli.WHITE, table: cli.ALICEBLUE, + hover: cli.ALICEBLUE, border: cli.GLASS, label: cli.BLACK, text: cli.BLACK, info: cli.BLUE, warn: cli.RED}) }, _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) }) @@ -68,6 +68,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, _msg._can._target) return can.core.List(can.onengine.listen.meta[name], function(cb) { can.core.CallFunc(cb, {event: msg._event, msg: msg}) }).length }, @@ -115,7 +116,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { var action = can.page.SelectOne(can, field, html.DIV_ACTION) var output = can.page.SelectOne(can, field, html.DIV_OUTPUT) var status = can.page.SelectOne(can, field, html.DIV_STATUS) - meta.index && can.page.Append(can, option, [{view: [[html.ITEM, html.ICON], html.DIV, "\u2715"], onclick: function(event) { sub.onaction.close(event, sub) }}]) + meta.index && can.page.Append(can, option, [{view: [[html.ITEM, html.ICON], html.DIV, can.page.unicode.delete], onclick: function(event) { sub.onaction.close(event, sub) }}]) var sub = Volcanos(meta.name, {_root: can._root||can, _follow: can.core.Keys(can._follow, meta.name), _target: field, _legend: legend, _option: option, _action: action, _output: output, _status: status, _history: [], Status: function(key, value) { if (can.base.isObject(key)) { return can.core.Item(key, sub.Status), key } @@ -309,15 +310,19 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { return can.page.Append(can, target||can._output, [{view: [type, html.FIELDSET], list: [{text: [title, html.LEGEND]}, {view: [html.OPTION, html.FORM]}, html.ACTION, html.OUTPUT, html.STATUS]}]) }, input: function(can, item, value, target, style) { if ([html.BR, html.HR].indexOf(item.type) > -1) { return can.page.Append(can, target, [item]) } + var icon = [] var input = can.page.input(can, can.base.Copy({className: "", type: "", name: ""}, item), value); input.title = can.Conf(can.core.Keys(ctx.FEATURE, chat.TITLE, item.name))||"" if (item.type == html.SELECT && item.value) { input._init = function(target) { target.value = value||item.value } } if (item.type == html.TEXT) { input.onkeydown = item.onkeydown||function(event) { can.onkeymap.input(event, can), can.onkeymap.selectOutput(event, can), event.key == lang.ENTER && can.onkeymap.prevent(event) - } } + }, icon.push({text: can.page.unicode.delete, className: "icon delete", onclick: function(event) { + _input.value = ""; if (item.name == html.FILTER) { can.page.Select(can, can._output, html.TR, function(tr) { can.page.ClassList.del(can, tr, html.HIDE) }) } + }}) } if (item.range) { input._init = function(target) { can.onappend.figure(can, item, target, function(sub, value, old) { target.value = value, can.core.CallFunc([can.onaction, item.name], [event, can, item.name]) }) } } - return can.page.Append(can, target, [{view: [[html.ITEM, item.type, item.name].concat(style)], list: [input]}])[item.name] + var _input = can.page.Append(can, target, [{view: [[html.ITEM, item.type, item.name].concat(style)], list: [input].concat(icon)}])[item.name] + return _input }, table: function(can, msg, cb, target, keys) { if (!msg || msg.Length() == 0) { return } var meta = can.base.Obj(msg.Option(mdb.META)) var table = can.page.AppendTable(can, msg, target||can._output, msg.append, cb||function(value, key, index, line, array) { @@ -366,8 +371,10 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { } }); return list } function calc(item, size, total) { return !ui.size[item]? size: ui.size[item] < 1? total*ui.size[item]: ui.size[item] } - var defer = []; function layout(type, list, width, height) { var _width = width, _height = height; can.core.List(list, function(item) { - if (item == html.CONTENT) { return defer.push(function() { can.page.style(can, ui[item], html.HEIGHT, height, html.WIDTH, width) }) } + var defer = [], content_height, content_width; function layout(type, list, width, height) { var _width = width, _height = height; can.core.List(list, function(item) { + if (item == html.CONTENT) { content_height = height, content_width = width + return defer.push(function() { can.page.style(can, ui[item], html.HEIGHT, height, html.WIDTH, width) }) + } if (!can.page.isDisplay(ui[item])) { return } if (can.base.isObject(item)) { var meta = item; item = item._index } if (type == FLOW) { var h = calc(item, ui[item].offsetHeight, height) if (can.base.isObject(meta)) { meta.layout(width, h) } @@ -377,7 +384,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { can.page.style(can, ui[item], html.HEIGHT, h, html.WIDTH, w), width -= w } }), can.core.List(list, function(item) { if (can.base.isArray(item)) { layout(type == FLOW? FLEX: FLOW, item, width, height) } }) } - ui.layout = function(width, height, delay) { can.onmotion.delay(can, function() { defer = [], layout(type, ui.list, width, height), defer.forEach(function(cb) { cb() }) }, delay||0) } + ui.layout = function(width, height, delay, cb) { can.onmotion.delay(can, function() { defer = [], layout(type, ui.list, width, height), defer.forEach(function(cb) { cb() }), cb && cb(content_height, content_width) }, delay||0) } ui.list = append(target, type, list||[html.PROJECT, [[html.CONTENT, html.PROFILE], html.DISPLAY]]) return ui case "tabs-top": @@ -458,7 +465,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) { }, figure: function(can, meta, target, cb) { if (meta.type == html.BUTTON || meta.type == html.SELECT) { return } var input = meta.action||mdb.KEY, path = chat.PLUGIN_INPUT+input+nfs._JS; can.require([path], function(can) { - function _cb(sub, value, old) { if (value == old) { return } can.base.isFunc(cb)? cb(sub, value, old): can.onmotion.delay(can, function() { can.onmotion.focus(can, target, value||"") }) } + // function _cb(sub, value, old) { if (value == old) { return } can.base.isFunc(cb)? cb(sub, value, old): can.onmotion.delay(can, function() { can.onmotion.focus(can, target, value||"") }) } + function _cb(sub, value, old) { if (value == old) { return } can.base.isFunc(cb)? cb(sub, value, old): target.value = value } can.core.ItemCB(can.onfigure[input], function(key, on) { var last = target[key]||function(){}; target[key] = function(event) { can.misc.Event(event, can, function(msg) { function show(sub, cb) { can.base.isFunc(cb) && cb(sub, _cb), can.onlayout.figure(event, can, sub._target), can.onmotion.toggle(can, sub._target, true) } can.core.CallFunc(on, {event: event, can: can, meta: meta, cb: _cb, target: target, sub: target._can, last: last, cbs: function(cb) { @@ -631,6 +639,7 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) { var pos = can.page.Cache(target._cache_key = key, target); if (pos) { target.scrollTo && target.scrollTo(0, pos-1); return target } }).length > 0 }, + selectRange: function(target) { target && target.setSelectionRange && target.setSelectionRange(0, target.value.length) }, share: function(event, can, input, args) { var _args = args return can.user.input(event, can, input, function(args) { can.onengine.signal(can, chat.ONSHARE, can.request(event, {args: [mdb.TYPE, chat.FIELD].concat(_args||[], args||[])})) }) }, diff --git a/index.css b/index.css index 97f352ea..85d84224 100644 --- a/index.css +++ b/index.css @@ -329,12 +329,15 @@ div.project::-webkit-scrollbar { width:0 !important; height:0 !important; } div.content::-webkit-scrollbar { width:0 !important; height:0 !important; } .picker { box-shadow:4px 4px 20px 4px #626bd0; } -span.item:not(.string):not(.number):not(.boolean)>span.value { color:silver; } -div.item:not(.string):not(.number):not(.boolean)>span.value { color:silver; } -div.item.function>span.value { font-style:italic; } -div.item.target>span.value { font-style:italic; } div.view span.keyword { color:#5cadd4; } div.view span.string { color:#f29766; } -span.path { color:silver; } -body.dark span.path { color:gray; } -body.dark div.data div.item:not(.string):not(.number):not(.boolean)>span.value { color:gray; } +div.item:not(.string):not(.number):not(.boolean)>span.value { color:silver; font-style:italic; } +span.item:not(.string):not(.number):not(.boolean)>span.value { color:silver; font-style:italic; } +fieldset.debug span.path { color:silver; font-style:italic; } +body.dark fieldset.debug span.path { color:gray; } +body.dark fieldset.debug span.target { color:gray; } +body.dark div.item:not(.string):not(.number):not(.boolean)>span.value { color:gray; } +body.dark span.item:not(.string):not(.number):not(.boolean)>span.value { color:gray; } +form.option>div.item { position:relative; } +form.option>div.item>span.icon { font-size:20px; position:absolute; top:2px; right:10px; visibility:hidden; } +form.option>div.item:hover>span.icon { visibility:visible; } diff --git a/lib/page.js b/lib/page.js index a8b6286f..3090565e 100644 --- a/lib/page.js +++ b/lib/page.js @@ -249,15 +249,13 @@ Volcanos("page", {ClassList: { isDisplay: function(target) { return target && target.style.display != html.NONE && target.className.indexOf(html.HIDE) == -1 }, unicode: { open: "\u25BE", close: "\u25B8", inner: "..", + delete: "\u2715", }, AppendData: function(can, target, prefix, key, value, cb) { var open = can.page.unicode.open, close = can.page.unicode.close function short(value, length) { - if (length == undefined) { value.indexOf(ice.NL) > -1 && (value = value.split(ice.NL)[0]+"..") - return value - // if (value.length > 50) { return value.slice(0, 50)+can.page.unicode.inner } - } else { - if (length > 4) { return can.page.unicode.inner } - } + if (length == undefined) { value.indexOf(ice.NL) > -1 && (value = value.trim().split(ice.NL)[0]+can.page.unicode.inner) + return can.page.replace(can, value) + } else { if (length > 5) { return can.page.unicode.inner } } return value } function show(value, deep) { deep = deep == undefined? 2: 0; switch (typeof value) { @@ -265,9 +263,9 @@ Volcanos("page", {ClassList: { if (value._path) { return {value: "@\""+value._path+"\""} } if (value.tagName) { return {type: nfs.TARGET, value: "$ "+value.tagName.toLowerCase()+(value.className? ice.PT+value.className.replaceAll(ice.SP, ice.PT):"")} } if (deep < 0) { return {value: value.length == undefined? "{"+can.page.unicode.inner+"}": "["+can.page.unicode.inner+"]"} } - if (value.length != undefined) { return {value: (value.length > 3? value.length+ice.SP: "")+"["+can.core.List(value, function(value, index) { if (index < 5) { return short(show(value, deep-1).value, index+1) } }).join(ice.FS)+"]"} } - return {value: "{"+can.core.Item(value, function(key, val, list) { if (value.hasOwnProperty(key) && list.length < 6) { return short(key+ice.DF+show(val, deep-1).value, list.length) } }).join(ice.FS)+"}"} - case lang.STRING: return {open: "s", close: "s", value: "\""+short(value)+"\""} + if (value.length != undefined) { return {value: (value.length > 3? value.length+ice.SP: "")+"["+can.core.List(value, function(value, index) { if (index < 6) { return short(show(value, deep-1).value, index+1) } }).join(ice.FS)+"]"} } + return {value: "{"+can.core.Item(value, function(key, val, list) { if (value.hasOwnProperty(key) && list.length < 7) { return short(key+ice.DF+show(val, deep-1).value, list.length) } }).join(ice.FS)+"}"} + case lang.STRING: return {open: "s", close: "s", value: "\""+(deep == 2? value: short(value))+"\""} case lang.NUMBER: return {open: "n", close: "n", value: value} case lang.BOOLEAN: return {open: "b", close: "b", value: value} case lang.FUNCTION: return {open: "f", close: "f", value: deep == 2? (""+value).split(ice.NL)[0]: "function(..) {..}"} @@ -296,7 +294,7 @@ Volcanos("page", {ClassList: { return item.value == "" || item.value == item.name? {type: html.SPAN, list: [{text: ice.SP}, {text: item.name}]}: {type: html.SPAN, list: [{text: ice.SP}, {text: item.name}, {text: ice.EQ}, {className: code.STRING, text: "\""+item.value+"\""}]} }): [] } - var ui = {}; tag = tag||target.tagName.toLowerCase(), isclose = tag != "meta" && tag != "link", _field = field(target) + var ui = {}; tag = tag||target.tagName.toLowerCase(), isclose = tag != mdb.META && tag != mdb.LINK, _field = field(target) var inner = target.innerHTML? can.page.unicode.inner: ""; if (target && target.tagName) { target.innerText == target.innerHTML && (inner = target.innerText) } return {view: mdb.VIEW, list: [ {view: [[html.ITEM]], list: [ @@ -306,12 +304,9 @@ Volcanos("page", {ClassList: { isclose && {className: code.KEYWORD, text: can.page.replace(can, ice.LT+ice.PS+tag+ice.GT), _init: function(target) { ui._close = target }}, ], onclick: function(event) { ui.toggle.innerText = (can.onmotion.toggle(can, ui.list)? can.page.unicode.open: can.page.unicode.close)+ice.SP ui.inner && can.onmotion.toggle(can, ui.inner), can.onmotion.toggle(can, ui.close), can.onmotion.toggle(can, ui._close) - if (!loaded) { - if (can.page.tagis(target, "style", "script")) { can.page.Append(can, ui.list, [{text: target.innerHTML}]) } else { - can.page.Append(can, ui.list, can.core.List(target.children, function(node) { return can.page.AppendView(can, node, "", null, false, cb) })) - } - } loaded = true - can.base.isFunc(cb) && cb(target) + if (!loaded) { if (can.page.tagis(target, ctx.STYLE, nfs.SCRIPT)) { can.page.Append(can, ui.list, [{text: target.innerHTML}]) } else { + can.page.Append(can, ui.list, can.core.List(target.children, function(node) { return can.page.AppendView(can, node, "", null, false, cb) })) + } } loaded = true, can.base.isFunc(cb) && cb(target) }, onmouseenter: function() { can.page.Select(can, document.body, ".picker", function(target) { can.page.ClassList.del(can, target, "picker") }) !can.page.tagis(target, nfs.SCRIPT) && can.onappend.style(can, "picker", target) diff --git a/lib/user.js b/lib/user.js index 960f58eb..7de612b1 100644 --- a/lib/user.js +++ b/lib/user.js @@ -32,6 +32,7 @@ Volcanos("user", {info: {}, agent: { 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 }, + opens: function(url) { window.openurl? window.openurl(url): (window.open(url) || (location.href = url)) }, open: function(url) { window.open(url) || (location.href = url) }, close: function(url) { window.close() }, title: function(text) { if (window.webview) { return title(text) } return text && (document.title = text), document.title }, diff --git a/panel/footer.js b/panel/footer.js index bdfbf45e..669169b7 100644 --- a/panel/footer.js +++ b/panel/footer.js @@ -66,25 +66,44 @@ Volcanos(chat.ONEXPORT, {height: function(can) { return can._target.offsetHeight Volcanos(chat.ONPLUGIN, { alert: shy("提示", [wiki.CONTENT], function(can, msg, arg) { arg && arg.length > 0 && can.user.alert(arg[0]) }), toast: shy("提示", [wiki.CONTENT, wiki.TITLE], function(can, msg, arg) { arg && arg.length > 0 && can.user.toast(can, arg[0], arg[1]), msg.Copy(can[NTIP]), msg.StatusTimeCount() }), - debug: shy("日志", ["type:select=log,info,warn,error,debug,wss,onremote", "_text"], function(can, msg, arg) { can.onmotion.delay(can, function() { var _can = can, can = msg._can + debug: shy("网页日志", { + "prune": shy("清空", function(can) { while(can.misc._list.pop()) {} can.onmotion.clear(can) }), + "debug": shy("调试", function(can) { can.user.opens(location.href.replace("debug=true", "")) }), + "w3schools": shy("教程", function(can) { can.user.open("https://www.w3schools.com/colors/colors_names.asp") }), + "mozilla": shy("文档", function(can) { can.user.open("https://developer.mozilla.org/en-US/") }), + "w3": shy("标准", function(can) { can.user.open("https://www.w3.org/TR/?tag=css") }), + }, ["type:select=log,info,warn,error,debug,wss,onremote", "filter", "list", "prune", "debug", "w3schools", "mozilla", "w3"], function(can, msg, arg) { can.onmotion.delay(can, function() { var _can = can, can = msg._can + var stat = {} var ui = can.page.Appends(can, can._output, [{type: html.TABLE, className: html.CONTENT, list: [{type: html.TR, list: [ {type: html.TH, inner: mdb.TEXT}, - ]}].concat(can.core.List(can.misc._list, function(list) { return (!arg || !arg[0] || arg[0] == "log" || arg[0] == list[2]) && {type: html.TR, list: [ + ]}].concat(can.core.List(can.misc._list, function(list) { stat[list[2]] = ((stat[list[2]]||0)+1); return (!arg || !arg[0] || arg[0] == "log" || arg[0] == list[2]) && {type: html.TR, list: [ {type: html.TD, list: can.core.List(list.slice(0), function(item, index) { var vimer if (index == 1) { var _ls = /(https*:\/\/[^/]+)\/*([^:]+):([0-9]+):([0-9]+)/.exec(list[1]) - return {type: html.SPAN, list: [{text: can.page.unicode.close+ice.SP}, {text: [(_ls[1] == location.origin? _ls[2]: item).split("?")[0]+ice.SP, html.SPAN, nfs.PATH], onclick: function(event) { + return {view: [html.ITEM, html.SPAN], list: [{text: ice.SP+can.page.unicode.close+ice.SP}, {text: [(_ls[1] == location.origin? _ls[2].split("?")[0]+ice.DF+_ls[3]: item).split("?")[0], html.SPAN, nfs.PATH], onclick: function(event) { if (can.onexport.record(can, list[1], mdb.LINK, {time: list[0], link: list[1], type: list[2], path: ice.USR_VOLCANOS, file: _ls[2].split("?")[0], line: _ls[3]})) { return } if (vimer) { return can.page.Remove(can, vimer._target), vimer = null } vimer = can.onappend.plugin(_can, {index: "web.code.inner", args: [ice.USR_VOLCANOS, _ls[2], _ls[3]]}, function(sub) {}, event.target.parentNode) }}]} - } if (!can.base.isObject(item)) { return {text: item+ice.SP} } - return {view: [mdb.DATA, html.SPAN], _init: function(target) { can.page.AppendData(can, target, "", "", item)}} - } - )}, + } if (!can.base.isObject(item)) { return {text: (index > 0? ice.SP: "")+item} } + return {view: [mdb.DATA, html.SPAN], _init: function(target) { + if (item.tagName) { var detail; var ui = can.page.Append(can, target, [{text: ice.SP}, + {text: can.page.unicode.close+ice.SP, _init: function(target) { can.onmotion.delay(can, function() { ui.toggle = target }) }}, + {view: [[html.ITEM, nfs.TARGET], html.SPAN, item.tagName.toLowerCase()+(item.className? ice.PT+item.className.replaceAll(ice.SP, ice.PT): "")], onclick: function() { + if (detail) { return can.page.Remove(can, detail), detail = null, can.page.Modify(can, ui.toggle, can.page.unicode.close+ice.SP) } + detail = can.page.AppendData(can, target, "", "", item)._target, detail.click(), can.page.Modify(can, ui.toggle, can.page.unicode.open+ice.SP) + }}, + ]) } else { can.page.Append(can, target, [{text: ice.SP}]), can.page.AppendData(can, target, "", "", item) } + }} + })}, ]} })) }]); arg && arg[1] && can.page.Select(can, can._output, html.TR, function(tr) { can.page.ClassList.set(can, tr, html.HIDE, tr.innerText.indexOf(arg[1]) == -1) }) - can.onappend._status(can, [{name: mdb.TIME, value: can.base.Time()}, {name: mdb.COUNT, value: can.page.Select(can, can._output, html.TR+":not(.hide)").length+"x2"}]) + can.onappend._status(can, [ + {name: mdb.TIME, value: can.base.Time()}, + {name: mdb.COUNT, value: can.page.Select(can, can._output, html.TR+":not(.hide)").length+"x1"}, + ].concat(can.core.List(["onremote", "wss", "info", "warn", "error"], function(item) { + return {name: item, value: stat[item]||"0"} + }))) }) }), - data: shy("网页标签", [mdb.KEY], function(can, msg, arg) { can.onmotion.delay(can, function() { var can = msg._can + data: shy("网页数据", [mdb.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)), function(prefix, value) { can.Option(mdb.KEY, prefix) @@ -95,14 +114,18 @@ Volcanos(chat.ONPLUGIN, { })._target.click() } }) }), - 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", null, false, function(target) { - var list = []; for (var p = target; p && p.tagName; p = p.parentNode) { - list.push(p.tagName.toLowerCase()+(p.className? ice.PT+p.className.replaceAll(ice.SP, ice.PT): "")) - } can.page.Appends(can, can._action, [{view: [html.ITEM, html.DIV, list.reverse().join(ice.SP+ice.GT+ice.SP)]}]) - }), - ], true)]) + view: shy("网页标签", [mdb.KEY], function(can, msg, arg) { can.onmotion.delay(can, function() { var can = msg._can + if (can.Option(mdb.KEY)) { + can.page.Append(can, can._output, [can.page.AppendView(can, can.page.SelectOne(can, document.body, can.Option(mdb.KEY))||document.body)]) + } else { + 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", null, false, function(target) { + var list = []; for (var p = target; p && p.tagName && p != document.body; p = p.parentNode) { + list.push(p.tagName.toLowerCase()+(p.className? ice.PT+p.className.replaceAll(ice.SP, ice.PT).replace(".picker", ""): "")) + } can.Option(mdb.KEY, list.reverse().join(ice.SP+ice.GT+ice.SP)) + }), + ], true)]) + } }) }), }) })() diff --git a/plugin/input.js b/plugin/input.js index 19bfe21a..4bec186a 100644 --- a/plugin/input.js +++ b/plugin/input.js @@ -16,5 +16,16 @@ Volcanos(chat.ONACTION, { }, onkeyup: function(event, can) { if (event.key == lang.ENTER) { return can.onkeymap.prevent(event) } + if (can.Conf(mdb.NAME) == html.FILTER) { + can.user.toast(can, "filter out "+ + can.page.Select(can, can._output, html.TR, function(tr) { + if (!can.page.ClassList.set(can, tr, html.HIDE, tr.innerText.indexOf(event.target.value) == -1)) { + return tr + } + }).length+" lines") + } + }, + onfocus: function(event, can) { + can.Conf(mdb.TYPE) == html.TEXT && can.onmotion.selectRange(event.target) }, }) diff --git a/plugin/input/key.js b/plugin/input/key.js index 8d5bb161..275544c6 100644 --- a/plugin/input/key.js +++ b/plugin/input/key.js @@ -4,9 +4,7 @@ Volcanos(chat.ONFIGURE, {key: { if (msg.append[msg.append.length-1] == "cb") { msg.append = msg.append.slice(0, -1) } can.onmotion.clear(can), can.onappend.table(can, msg, function(value, key, index, line) { value = line[key] return {text: [value, html.TD, value == ""? "hr": ""], style: msg.append && msg.append.length == 1? kit.Dict(html.MIN_WIDTH, target.offsetWidth-16): {}, onclick: function(event) { - can.onmotion.delay(can, function() { - can.close() - }) + can.onmotion.delay(can, function() { target.blur(), can.close() }) if (msg.cb && msg.cb[index]) { return msg.cb[index](value) } can._delay_hidden = false, cb(can, value, target.value), msg.Option(ice.MSG_PROCESS) == ice.PROCESS_AGAIN && can.onmotion.delay(can, function() { can._load(event, can, cb, target, name, value) }) }} diff --git a/plugin/local/chat/iframe.js b/plugin/local/chat/iframe.js index efdc56a5..66802960 100644 --- a/plugin/local/chat/iframe.js +++ b/plugin/local/chat/iframe.js @@ -1,5 +1,5 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.current = msg.TableDetail(), can.onimport.layout(can) }, - layout: function(can) { var item = can.current; can.onexport.title(can, item.name||item.link.split("?")[0]) + layout: function(can) { var item = can.current; can.sup.onexport.title(can, item.name||item.link.split("?")[0]) can.page.Appends(can, can._output, [{type: html.IFRAME, src: item.link, height: can.ConfHeight(), width: can.ConfWidth(), style: {border: 0}}]) }, }) diff --git a/plugin/local/code/inner.css b/plugin/local/code/inner.css index 17013387..3c569c81 100644 --- a/plugin/local/code/inner.css +++ b/plugin/local/code/inner.css @@ -44,7 +44,7 @@ fieldset.inner.cmd>div.output>div.layout.flow>div.path.hide { display:none; } fieldset.inner.cmd>div.output>div.layout.flow>div.path span.view { font-size:22px; line-height:12px; padding:0 4px; float:right; cursor:pointer; } fieldset.inner.cmd>div.output>div.layout.flow>div.plug { height:31px; clear:both; } fieldset.inner.cmd>div.output>div.layout.flow>div.plug>legend { float:right; } -fieldset.inner.cmd>div.output fieldset.plug { bottom:31px; position:absolute; } +fieldset.inner.cmd>div.output fieldset.plug:not(.full) { bottom:31px; position:absolute; } fieldset.inner fieldset.story form.option div.icon { display:block; } body.black fieldset.inner>div.output div.content td.text span.comment { background-color:blue; color:cyan; } diff --git a/plugin/local/code/inner.js b/plugin/local/code/inner.js index 8bef62db..a774c0fd 100644 --- a/plugin/local/code/inner.js +++ b/plugin/local/code/inner.js @@ -9,12 +9,10 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl can.db = {paths: paths, tabview: {}, history: [], profile_size: {}, display_size: {}, toolkit: {}, extentions: {}}, can.onengine.plugin(can, can.onplugin) can.ui = can.onappend.layout(can, can._output, "", [html.PROJECT, [html.TABS, nfs.PATH, [html.CONTENT, html.PROFILE], html.DISPLAY, html.PLUG]]) can.ui._content = can.ui.content, can.ui._profile = can.ui.profile, can.ui._display = can.ui.display - can.onmotion.hidden(can, can.ui.plug) - var plug = can.base.Obj(msg.Option("plug"), []) - plug.length > 0 && can.run({}, [ctx.ACTION, ctx.COMMAND].concat(plug.reverse()), function(msg) { + var plug = can.base.Obj(msg.Option("plug"), []).concat(can.misc.Search(can, "debug") == ice.TRUE? ["can.debug", "log.debug"]: []) + plug.length > 0? can.run({}, [ctx.ACTION, ctx.COMMAND].concat(plug.reverse()), function(msg) { msg.Table(function(value) { can.onimport.toolkit(can, value) }) - }) - can.onengine.plugin(can, can.onplugin) + }): can.onmotion.hidden(can, can.ui.plug), can.onengine.plugin(can, can.onplugin) switch (can.Mode()) { case chat.SIMPLE: can.onmotion.hidden(can, can.ui.project); break case chat.FLOAT: can.onmotion.hidden(can, can.ui.project); break @@ -26,6 +24,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl }, function() { files.length > 1 && can.onimport._tabview(can, paths[0], files[0], "") if (can.user.isWebview) { var last = can.misc.localStorage(can, "web.code.inner:currentFile"); if (!last) { return } } var ls = can.core.Split(last, ice.DF); ls.length > 0 && can.onmotion.delayLong(can, function() { can.onimport._tabview(can, ls[0], ls[1], ls[2]) }) + can.core.List(can.base.Obj(msg.Option("tabs")), function(item) { can.onimport.tabview(can, can.Option(nfs.PATH), item, ctx.INDEX) }) }) }) } var hash = location.hash; can.db.tabview[can.onexport.keys(can)] = msg @@ -123,16 +122,16 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl } }, can.ui.path), can.onimport._tabFunc(can, can.ui.path) } - can.page.SelectChild(can, can.ui._content.parentNode, can.page.Keys(html.DIV_CONTENT, [[[html.IFRAME, html.CONTENT]]]), function(item) { + can.page.SelectChild(can, can.ui._content.parentNode, can.page.Keys(html.DIV_CONTENT, "fieldset.story", [[[html.IFRAME, html.CONTENT]]]), function(item) { if (can.onmotion.toggle(can, item, item == msg._content)) { can.ui.content = msg._content } - }), can.ui.content._plugin = msg._plugin, msg._plugin && can.onmotion.delay(can, function() { msg._plugin.Focus() }) + }), can.ui.content._plugin = msg._plugin can.page.SelectChild(can, can.ui._content.parentNode, can.page.Keys(html.DIV_PROFILE, [[[html.IFRAME, html.PROFILE]]]), function(item) { if (can.onmotion.toggle(can, item, item == msg._profile)) { can.ui.profile = msg._profile } }), can.ui.current && can.onmotion.toggle(can, can.ui.current, !isCommand() && !isDream()) var ls = can.db.file.split(ice.PS); if (ls.length > 4) { ls = [ls.slice(0, 2).join(ice.PS)+"/.../"+ls.slice(-2).join(ice.PS)] } can.Status(kit.Dict("文件", ls.join(ice.PS), "类型", can.db.parse)), can.onimport.layout(can) - can.onaction.selectLine(can, can.Option(nfs.LINE), true) -// if (!skip) { can.onaction.selectLine(can, can.Option(nfs.LINE), true) } +// can.onaction.selectLine(can, can.Option(nfs.LINE), true) + if (!skip) { can.onaction.selectLine(can, can.Option(nfs.LINE), true) } can.base.isFunc(cb) && cb(), cb = null }) } @@ -161,7 +160,9 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl }, profile: function(can, msg) { var sup = can.db.tabview[can.onexport.keys(can)] if (msg.Result().indexOf("