1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-25 16:58:06 +08:00

opt can.debug

This commit is contained in:
harveyshao 2023-01-23 14:20:29 +08:00
parent 05461aeba5
commit 225747a388
14 changed files with 133 additions and 80 deletions

View File

@ -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||[])})) })
},

View File

@ -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; }

View File

@ -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 {
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)
} } 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)

View File

@ -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 },

View File

@ -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
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 = 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)]}])
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)])
}
}) }),
})
})()

View File

@ -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)
},
})

View File

@ -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) })
}}

View File

@ -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}}])
},
})

View File

@ -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; }

View File

@ -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("<iframe ") > -1) { if (sup._profile != can.ui._profile) { can.page.Remove(can, sup._profile) }
can.ui.profile = sup._profile = can.page.Append(can, can.ui._profile.parentNode, [{view: [html.PROFILE, html.IFRAME], src: msg.Append(mdb.LINK)}])._target
var src = can.page.Select(can, can.page.Create(can, html.DIV, msg.Result()), html.IFRAME, function(target) { return target.src })[0]
can.ui.profile = sup._profile = can.page.Append(can, can.ui._profile.parentNode, [{view: [html.PROFILE, html.IFRAME], src: src}])._target
can.db.profile_size[can.onexport.keys(can)] = 0.8
can.onmotion.toggle(can, can.ui.profile, true), can.onimport.layout(can)
} else { can.ui.profile = sup._profile = can.ui._profile
can.onimport.process(can, msg, can.ui.profile, can.ui.profile.offsetHeight||can.ui.content.offsetHeight, can.db.profile_size[can.onexport.keys(can)]||(can.ConfWidth()-can.ui.project.offsetWidth)/2, function(sub) {
@ -232,8 +233,10 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl
var height = can.user.isMobile && can.isFloatMode()? can.page.height()-2*html.ACTION_HEIGHT: can.base.Min(can.ConfHeight(), 320)-1
can.user.isMobile && can.isCmdMode() && can.page.style(can, can._output, html.MAX_HEIGHT, height)
can.ui.size = {profile: can.db.profile_size[can.onexport.keys(can)]||0.5, display: can.db.display_size[can.onexport.keys(can)]||3*html.ACTION_HEIGHT}
can.ui.layout(width, height, 0)
var sub = can.ui.content._plugin; sub && sub.onimport.size(sub, can.ui.content.offsetHeight-2*html.ACTION_HEIGHT, can.ui.content.offsetWidth, true)
can.ui.layout(width, height, 10, function(content_height, content_width) { var sub = can.ui.content._plugin; if (!sub) { return }
if (content_height == sub.ConfHeight()+2*html.ACTION_HEIGHT && content_width == sub.ConfWidth()) { return }
sub.onimport.size(sub, can.ui.content.offsetHeight-2*html.ACTION_HEIGHT, can.ui.content.offsetWidth, true)
})
},
exts: function(can, url, cb) {
can.onimport.toolkit(can, {index: "can._plugin", display: (url[0] == ice.PS || url.indexOf(ice.HTTP) == 0? "": can.base.Dir(can._path))+url}, function(sub) {
@ -289,10 +292,14 @@ Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) {
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)]: []}
} var index = msg.Option(ctx.INDEX).split(ice.FS); var meta = {type: "story", name: index[0], index: index[0], args: index.slice(1)}
if (msg._content) { return can.base.isFunc(cb) && cb(msg._content) }
return can.onimport.plug(can, meta, function(sub) {
can.page.ClassList.del(sub, sub._target, html.HIDE)
sub.onaction.close = function() { can.onaction.back(can), msg._tab._close() }
sub.onaction["打开链接"] = function() {
can.onimport.tabview(can, can.Option(nfs.PATH), [meta.index].concat(sub.Input([], false)).join(ice.FS), ctx.INDEX)
}
sub.onexport.title = function(_, title) { can.page.Modify(can, msg._tab, title) }
sub.onexport.record = function(_, value, key, line) {
line.path && can.onimport.tabview(can, line.path, line.file, line.line)
@ -303,8 +310,9 @@ Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) {
return can.onimport.tabview(can, can.Option(nfs.PATH), ls[1].split(ice.PS)[0], web.DREAM), sub.Update()
} return can.user.open(_arg), sub.Update()
}, sub.onimport.size(sub, sub.ConfHeight(can.ui.content.offsetHeight-2*html.ACTION_HEIGHT), sub.ConfWidth(can.ui.content.offsetWidth), true)
msg._plugin = sub, can.base.isFunc(cb) && cb(msg._content = can.ui._content), can.onmotion.delay(can, function() { sub.Focus() })
}, can.ui._content)
can.onimport.layout(can)
msg._plugin = sub, can.base.isFunc(cb) && cb(msg._content = sub._target), can.onmotion.delay(can, function() { sub.Focus() })
}, can.ui._content.parentNode)
},
_parse: function(can, line) { line = can.page.replace(can, line||"")
function wrap(text, type) { return can.page.Format(html.SPAN, text, type) }

View File

@ -75,7 +75,7 @@ Volcanos(chat.ONFIGURE, {
}, target), zone._total(total)
},
})
Volcanos(chat.ONACTION, {list: ["调试", "首页", "官网", "文档"],
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
@ -137,10 +137,14 @@ Volcanos(chat.ONACTION, {list: ["调试", "首页", "官网", "文档"],
xterm: function(event, can, button) { can.onaction._runs(can.request(event, can.Option()), can, button, function(msg) {
can.onimport.tabview(can, can.Option(nfs.PATH), msg.Result(), code.XTERM), can.ui.xterm.refresh(), can.user.toastSuccess(can)
}) },
"首页": function(event, can) { can.onaction._open(can, location.protocol+"//"+location.host) },
"官网": function(event, can) { can.onaction._open(can, "https://shylinux.com/") },
"文档": function(event, can) { can.onaction._open(can, "https://developer.mozilla.org/") },
"命令": function(event, can) { can.user.input(event, can, [ctx.INDEX], function(list) { can.onimport.tabview(can, can.Option(nfs.PATH), list[0], ctx.INDEX) }) },
"首页": function(event, can) { can.user.open(location.protocol+"//"+location.host) },
"官网": function(event, can) { can.user.open("https://shylinux.com/") },
"调试": function(event, can) { can.user.opens(location.href) },
"文档": function(event, can) { can.user.opens("https://developer.mozilla.org/") },
"百度": function(event, can) { can.user.opens("https://baidu.com/") },
"命令": function(event, can) {
can.user.input(event, can, [ctx.INDEX, ctx.ARGS], function(list) { can.onimport.tabview(can, can.Option(nfs.PATH), list[0]+(list[1]? ice.FS+list[1]: ""), ctx.INDEX) })
},
"插件": function(event, can) { can.user.input(event, can, [ctx.INDEX], function(list) { var sub = can.db.toolkit[list[0]]; if (sub) { sub.select(); return }
can.onimport.toolkit(can, {index: list[0]}, function(sub) { can.db.toolkit[list[0]] = sub.select() })
}) },
@ -151,7 +155,6 @@ Volcanos(chat.ONACTION, {list: ["调试", "首页", "官网", "文档"],
"日志": function(event, can) { window.opencmd("cd ~/contexts; tail -f var/log/bench.log") },
"编辑器": function(event, can) { window.opencmd("cd ~/contexts; vim +"+can.Option(nfs.LINE)+" "+can.Option(nfs.PATH)+can.Option(nfs.FILE)) },
"浏览器": function(event, can) { window.openurl(location.href) },
"调试": function(event, can) { window.openurl(location.href) },
_open: function(can, url) { can.user.isWebview? window.openurl(url): window.open(url) },
_complete: function(event, can, target) { if (event == undefined || event.type == "click") { return } target = target||can.ui.complete
var pre = can.ui.current.value.slice(0, can.ui.current.selectionStart), key = can.core.Split(pre, "\t .[]", " ").pop()||"", end = can.ui.current.value.slice(can.ui.current.selectionStart)

View File

@ -245,6 +245,7 @@ Volcanos(chat.ONACTION, {list: [
},
})
Volcanos(chat.ONEXPORT, {
title: function(can, title) {},
output: function(can, msg) {},
action: function(can, button, line) {},
record: function(can, value, key, line) {},

View File

@ -56,7 +56,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(
function close(target) { var next = target.nextSibling||target.previousSibling; if (!next) { return }
next.click(), can.onmotion.delay(can, function() { can.base.isFunc(cbs) && cbs(tabs), can.page.Remove(can, target) })
}
return {view: html.TABS, title: tabs.text, list: [{text: [tabs.name, html.SPAN]}, {text: ["\u2715", html.SPAN, html.ICON], onclick: function(event) {
return {view: html.TABS, title: tabs.text, list: [{text: [tabs.name, html.SPAN]}, {text: [can.page.unicode.delete, html.SPAN, html.ICON], onclick: function(event) {
close(event.target.parentNode), can.onkeymap.prevent(event)
}}], onclick: function(event) {
can.onmotion.select(can, action, html.DIV_TABS, tabs._target), can.base.isFunc(cb) && cb(event, tabs)
@ -84,13 +84,13 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(
}, target)
})
},
plug: function(can, meta, cb, target) { if (!meta || !meta.index) { return }
plug: function(can, meta, cb, target, field) { if (!meta || !meta.index) { return }
meta.type = meta.type||html.PLUG, meta.name = meta.index, can.onappend.plugin(can, meta, function(sub) { sub.sup = can
sub.ConfHeight(can.ConfHeight()-2*html.ACTION_HEIGHT), sub.ConfWidth(can.ConfWidth()), can.page.style(can, sub._output, html.MAX_HEIGHT, sub.ConfHeight(), html.MAX_WIDTH, sub.ConfWidth())
sub.run = function(event, cmds, cb) { if (can.page.Select(can, sub._option, "input[name=path]").length > 0 && sub.Option(nfs.PATH) == "") { sub.request(event, {path: "./"}) }
can.runActionCommand(can.request(event, can.Option()), meta.index, cmds, cb)
}, sub.onaction.close = function() { can.onmotion.hidden(can, target) }, can.base.isFunc(cb) && cb(sub)
}, target)
}, target, field)
},
icon: function(can, name, button, target) {
can.page.Append(can, target, [{text: [name, html.SPAN, html.ICON], onclick: function(event) {

View File

@ -110,7 +110,7 @@ var nfs = {
PATH: "path", FILE: "file", LINE: "line", SIZE: "size", ROOT: "root",
COPY: "copy", EDIT: "edit", SAVE: "save", LOAD: "load", FIND: "find", GREP: "grep", TAGS: "tags",
DIR: "dir", CAT: "cat", DEFS: "defs", TRASH: "trash", DIR_ROOT: "dir_root", PWD: "./",
CONTENT: "content", SOURCE: "source", SCRIPT: "script", MODULE: "module", RECENT: "recent",
CONTENT: "content", SOURCE: "source", SCRIPT: "script", TARGET: "target", MODULE: "module", RECENT: "recent",
HTML: "html", CSS: "css", JS: "js", GO: "go", SH: "sh", CSV: "csv", JSON: "json",
ZML: "zml", IML: "iml", TXT: "txt", PNG: "png", WEBM: "webm",
_CSS: ".css", _JS: ".js",
@ -122,7 +122,7 @@ var cli = {
BEGIN: "begin", START: "start", OPEN: "open", CLOSE: "close", STOP: "stop", END: "end", RESTART: "restart",
COLOR: "color", WHITE: "white", BLACK: "black", RED: "red", GREEN: "green", BLUE: "blue",
YELLOW: "yellow", CYAN: "cyan", PURPLE: "purple", MAGENTA: "magenta", GLASS: "transparent",
GRAY: "gray",
GRAY: "gray", ALICEBLUE: "aliceblue",
MAKE: "make", MAIN: "main", EXEC: "exec", DONE: "done", COST: "cost", FROM: "from", CLEAR: "clear",
}
var log = {
@ -227,6 +227,7 @@ var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 31, ACTION_MARGIN: 200,
LIGHT: "light", DARK: "dark",
PANEL: "panel",
FILTER: "filter",
VIEW: "view",
PLUG: "plug",
DIV_PLUG: "div.plug",