1
0
mirror of https://shylinux.com/x/volcanos synced 2025-04-26 01:04:06 +08:00
This commit is contained in:
IT 老营长 @云轩领航-创始人 2023-08-03 12:14:44 +08:00
parent 5caedfb8bb
commit fcbe972200
17 changed files with 135 additions and 168 deletions

View File

@ -261,9 +261,12 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
can.core.CallFunc([sub, chat.ONIMPORT, chat._INIT], {can: sub, msg: msg, cb: function(msg) { can.core.CallFunc([sub, chat.ONIMPORT, chat._INIT], {can: sub, msg: msg, cb: function(msg) {
action === false || can.onmotion.clear(can, can._action), sub.onappend._action(sub, can.Conf(ice.MSG_ACTION)||msg.Option(ice.MSG_ACTION), action||can._action) action === false || can.onmotion.clear(can, can._action), sub.onappend._action(sub, can.Conf(ice.MSG_ACTION)||msg.Option(ice.MSG_ACTION), action||can._action)
action === false || sub.onappend._status(sub, sub.onexport&&sub.onexport.list||msg.Option(ice.MSG_STATUS)), can.user.isMobile || sub.onappend.tools(sub, msg) action === false || sub.onappend._status(sub, sub.onexport&&sub.onexport.list||msg.Option(ice.MSG_STATUS)), can.user.isMobile || sub.onappend.tools(sub, msg)
can.onappend.style(sub, sub.Conf(ctx.STYLE)) can.onmotion.story.auto(can, can._output), can.onappend.style(sub, sub.Conf(ctx.STYLE))
if (can.isFullMode() || can.isCmdMode()) { can.onimport.size(can, can.page.height(), can.page.width(), true) } if (can.onimport.size) {
can.onmotion.story.auto(can, can._output), can.onexport.output(sub, msg), can.base.isFunc(cb) && cb(msg) if (can.isFullMode() || can.isCmdMode()) { can.onimport.size(can, can.page.height(), can.page.width(), true) }
can.onexport.output(sub, msg)
}
can.base.isFunc(cb) && cb(msg)
}, target: output}) }, target: output})
}) })
}, },
@ -275,83 +278,6 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
], onclick: function(event) { can.user.copy(event, can, item.value) }}]) ], onclick: function(event) { can.user.copy(event, can, item.value) }}])
}) })
}, },
theme: function(can, theme, color, style, list) { const PANEL_STYLE = "panel-style", PLUGIN_STYLE = "plugin-style"
const LEGEND_STYLE = "legend-style", INPUT_STYLE = "input-style", INPUT_HOVER_STYLE = "input-hover-style", OUTPUT_STYLE = "output-style", GLASS_STYLE = "glass-style"
const TABLE_HEAD_STYLE = "table-head-style", TABLE_HEAD_HOVER_STYLE = "table-head-hover-style", TABLE_ROW_HOVER_STYLE = "table-row-hover-style", TABLE_CELL_HOVER_STYLE = "table-cell-hover-style"
const ITEM_HOVER_STYLE = "item-hover-style", CARTE_ITEM_HOVER_STYLE = "carte-item-hover-style", CARTE_ITEM_STYLE = "carte-item-style"
const SOLID = " solid 1px", RADIUS = "border-radius", GLASS = "transparent", INPUT_COLOR = "#212121", OUTPUT_COLOR = "#0d1117"
function _bg(color) { return kit.Dict(html.BACKGROUND_COLOR, color, can.core.List(arguments).slice(1)) }
function _fg(color) { return kit.Dict(html.COLOR, color, can.core.List(arguments).slice(1)) }
function _b_r(size) { return kit.Dict(RADIUS, size) }
const TABLE_COLOR = can.user.isWebview? "#202324": cli.BLACK
color = kit.Dict(
chat.PANEL, TABLE_COLOR, chat.PLUGIN, TABLE_COLOR, html.LEGEND, INPUT_COLOR, html.INPUT, INPUT_COLOR, html.OUTPUT, OUTPUT_COLOR, html.TABLE, TABLE_COLOR,
html.HOVER, INPUT_COLOR, html.BORDER, cli.GRAY, html.LABEL, cli.SILVER, html.TEXT, cli.WHITE, log.INFO, cli.BLUE, log.WARN, cli.RED, color,
), style = kit.Dict(LEGEND_STYLE, _bg(color.legend),
INPUT_STYLE, _bg(color.input, html.COLOR, color.label, RADIUS, "5px", "outline", html.NONE, "box-shadow", html.NONE),
INPUT_HOVER_STYLE, _fg(color.text), OUTPUT_STYLE, _bg(color.output), GLASS_STYLE, _bg(GLASS),
TABLE_HEAD_STYLE, _bg(color.table, html.COLOR, color.label), TABLE_HEAD_HOVER_STYLE, _bg(color.table, html.COLOR, color.text),
TABLE_ROW_HOVER_STYLE, _bg(color.table), TABLE_CELL_HOVER_STYLE, _bg(color.output),
ITEM_HOVER_STYLE, _bg(color.hover, html.COLOR, color.text), CARTE_ITEM_HOVER_STYLE, _bg(color.input, html.COLOR, color.text),
PANEL_STYLE, _bg(color.panel, html.COLOR, color.label), PLUGIN_STYLE, _bg(color.plugin, RADIUS, "10px"), style,
), list = [{type: "", style: _fg(color.label)},
{type: html.LEGEND, style: [INPUT_STYLE, LEGEND_STYLE]}, {type: html.LEGEND, style: [INPUT_HOVER_STYLE]},
{type: html.SELECT, style: [INPUT_STYLE]}, {type: html.SELECT, style: [INPUT_HOVER_STYLE]},
{type: html.INPUT, style: [INPUT_STYLE]}, {type: html.INPUT, style: [INPUT_HOVER_STYLE]},
{type: html.INPUT+":not([type=button])", style: _b_r(0)}, {type: html.INPUT+":not([type=button])", name: [html.HOVER], style: {border: color.info+SOLID}},
{type: html.INPUT+":not([type=button]):focus", style: {border: color.info+SOLID}},
{type: html.INPUT+".select:focus", style: {border: color.info+SOLID}},
{type: html.INPUT+".select:hover", style: {border: color.info+SOLID}},
{type: html.TEXTAREA+":focus", style: {border: color.info+SOLID}},
{type: html.TEXTAREA+":hover", style: {border: color.info+SOLID}},
{type: html.TEXTAREA, style: [INPUT_STYLE]}, {type: html.TEXTAREA, style: _b_r(0)},
{type: html.FORM_OPTION, list: [{type: html.DIV_ITEM, name: [html.SELECT], style: [GLASS_STYLE]}]},
{type: html.FORM_OPTION, list: [{type: html.DIV_ITEM, name: [html.HOVER], style: [GLASS_STYLE]}]},
{type: html.DIV_OUTPUT, style: [OUTPUT_STYLE]}, {type: html.DIV_STATUS, style: kit.Dict(_bg(color.plugin), _fg(color.label))},
{type: html.DIV_ITEM, name: [html.SELECT], style: [ITEM_HOVER_STYLE]}, {type: html.DIV_ITEM, style: [ITEM_HOVER_STYLE]},
{type: html.SPAN_ITEM, name: [html.SELECT], style: [ITEM_HOVER_STYLE]}, {type: html.SPAN_ITEM, style: [ITEM_HOVER_STYLE]},
{type: html.DIV_TABS, list: [{type: html.DIV, style: _bg(color.plugin)}]},
{type: html.DIV_TABS, list: [{type: html.DIV, name: [html.HOVER], style: [OUTPUT_STYLE]}]},
{type: html.DIV_TABS, list: [{type: html.DIV, name: [html.HOVER], style: _fg(color.text)}]},
{type: html.DIV_TABS, list: [{type: html.DIV, name: [html.SELECT], style: [OUTPUT_STYLE]}]},
{type: html.DIV_PATH, style: [OUTPUT_STYLE]}, {type: html.DIV_PATH, list: [{type: html.SPAN, style: [ITEM_HOVER_STYLE]}]},
{type: html.DIV_PLUG, list: [{type: html.LEGEND, style: [OUTPUT_STYLE]}]},
{type: html.DIV_PLUG, list: [{type: html.LEGEND, name: [html.SELECT], style: [PLUGIN_STYLE]}]},
{type: "div.zone>div.item", style: [TABLE_HEAD_STYLE]}, {type: "div.zone>div.item", style: [TABLE_HEAD_HOVER_STYLE]},
{type: "div.zone>div.list>div.zone>div.item", style: [TABLE_HEAD_STYLE]}, {type: "div.zone>div.list>div.zone>div.item", style: [TABLE_HEAD_HOVER_STYLE]},
{type: "div.zone div.item>div.name", name: [html.HOVER], style: _fg(color.text)},
{type: "tr.line.select", style: [ITEM_HOVER_STYLE]}, {type: "tr.line", style: [ITEM_HOVER_STYLE]},
{type: "tr.line>td.line", style: [OUTPUT_STYLE]}, {type: "tr.line.select>td.line", style: [ITEM_HOVER_STYLE]},
{type: "div.complete>table", style: [TABLE_HEAD_STYLE]},
{type: html.TABLE_CONTENT, list: [{type: html.TR, style: [INPUT_HOVER_STYLE, TABLE_ROW_HOVER_STYLE]}]},
{type: html.TABLE_CONTENT, list: [{type: html.TH, style: [TABLE_HEAD_STYLE]}]},
{type: html.TABLE_CONTENT, name: [html.ACTION], list: [{type: html.TD+":last-child", style: [TABLE_HEAD_STYLE]}]},
{type: html.TABLE_CONTENT, list: [{type: html.TD, name: [html.SELECT], style: [TABLE_CELL_HOVER_STYLE]}]},
{type: html.TABLE_CONTENT, list: [{type: html.TD, style: [TABLE_CELL_HOVER_STYLE]}]},
{type: html.H1, style: [ITEM_HOVER_STYLE]}, {type: html.H2, style: [ITEM_HOVER_STYLE]}, {type: html.H3, style: [ITEM_HOVER_STYLE]},
{type: html.A, style: _fg(color.info)}, {type: html.LABEL, style: _fg(color.label)},
{type: html.FIELDSET_PANEL, style: [PANEL_STYLE]}, {type: html.FIELDSET_PANEL+ice.GT+html.DIV_OUTPUT, style: [PANEL_STYLE]},
{type: html.FIELDSET_PANEL, name: [chat.ACTION], list: [{type: html.DIV_OUTPUT, style: [OUTPUT_STYLE]}]},
{type: html.FIELDSET_PLUGIN, style: [PLUGIN_STYLE]}, {type: html.FIELDSET_PLUGIN, list: [{type: ice.GT+html.DIV_STATUS, style: {"border-top": color.border+SOLID}}]},
{type: html.FIELDSET_STORY, style: [PLUGIN_STYLE]}, {type: html.FIELDSET_STORY, list: [{type: ice.GT+html.DIV_STATUS, style: {"border-top": color.border+SOLID}}]},
{type: html.FIELDSET_INPUT, list: [{type: html.DIV_OUTPUT, style: [PLUGIN_STYLE]}], style: [PLUGIN_STYLE]}, {type: html.FIELDSET_INPUT, style: _b_r(0)},
{type: html.FIELDSET_INPUT, list: [{type: html.TD, name: [html.SELECT], style: _bg(color.output)}]},
{type: html.FIELDSET_INPUT, list: [{type: html.TD, name: [html.HOVER], style: _bg(color.hover)}]},
{type: html.FIELDSET_INPUT, list: [{type: html.TR, name: [html.HOVER], style: _bg(color.output)}]},
{type: html.FIELDSET_FLOAT, style: [PLUGIN_STYLE]}, {type: html.DIV_FLOAT, style: [PLUGIN_STYLE]},
{type: html.DIV_CARTE, list: [{type: html.DIV_ITEM, style: [TABLE_HEAD_STYLE, CARTE_ITEM_STYLE]}]},
{type: html.DIV_CARTE, list: [{type: html.DIV_ITEM, style: [CARTE_ITEM_HOVER_STYLE]}]},
].concat(list); const DF = nfs.DF, FS = ";"
function render(pre, list) { return can.core.List(list, function(item) { if (!item) { return } var type = item.type+can.core.List(item.name, function(name) { return (name==html.HOVER? nfs.DF: nfs.PT)+name }).join("")
if (!item.name && type.indexOf(nfs.PT+html.SELECT) == -1 && type.indexOf(nfs.DF+html.HOVER) == -1 && can.base.isArray(item.style) && item.style.join(mdb.FS).indexOf("-hover-") > -1) { type += nfs.DF+html.HOVER }
return (item.style? (pre+lex.SP+type+" { "+(can.base.isArray(item.style)? can.core.List(item.style, function(item) {
return can.core.Item(style[item], function(key, value) { return key&&value? key+DF+value: undefined }).join(FS)
}).join(FS): can.core.Item(can.base.Obj(item.style), function(key, value) { return key+DF+value }).join(FS))+" }"): "")+(item.list? render(pre+lex.SP+type, item.list): "")
}).join(lex.NL) }
var text = render(html.BODY+nfs.PT+theme, list)
can.page.Append(can, document.head, ctx.STYLE, {"innerText": text})
return text
},
style: function(can, style, target) { target = target||can._fields||can._target style: function(can, style, target) { target = target||can._fields||can._target
if (can.base.endWith(style, ".css")) { return can.require([style]) } if (can.base.endWith(style, ".css")) { return can.require([style]) }
can.base.isObject(style) && !can.base.isArray(style)? can.page.style(can, target, style): can.page.ClassList.add(can, target, style) can.base.isObject(style) && !can.base.isArray(style)? can.page.style(can, target, style): can.page.ClassList.add(can, target, style)
@ -401,7 +327,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
carte.close(), carte = null; if (target.value == button) { return } carte.close(), carte = null; if (target.value == button) { return }
target.value = button, select.value = button, select.onchange && select.onchange({target: select}) target.value = button, select.value = button, select.onchange && select.onchange({target: select})
}); can.onappend.style(can, [html.SELECT, item.name], carte._target), can.page.style(can, carte._target, html.MIN_WIDTH, event.target.offsetWidth) }); can.onappend.style(can, [html.SELECT, item.name], carte._target), can.page.style(can, carte._target, html.MIN_WIDTH, event.target.offsetWidth)
}, _init: function(target) { can.page.style(can, target, html.WIDTH, select.offsetWidth+10), can.onappend.style(can, html.HIDE, select) }}, {icon: mdb.SELECT}]) }, _init: function(target) { can.page.style(can, target, html.WIDTH, (select.offsetWidth||80)+10), can.onappend.style(can, html.HIDE, select) }}, {icon: mdb.SELECT}])
}, },
table: function(can, msg, cb, target, keys) { if (!msg || msg.Length() == 0) { return } var meta = can.base.Obj(msg.Option(mdb.META)) table: function(can, msg, cb, target, keys) { if (!msg || msg.Length() == 0) { return } var meta = can.base.Obj(msg.Option(mdb.META))
for (var i = 0; i < msg.append.length-1; i++) { if (msg.append[i] == ctx.ACTION) { msg.append[i] = msg.append[msg.append.length-1], msg.append[msg.append.length-1] = ctx.ACTION } } for (var i = 0; i < msg.append.length-1; i++) { if (msg.append[i] == ctx.ACTION) { msg.append[i] = msg.append[msg.append.length-1], msg.append[msg.append.length-1] = ctx.ACTION } }

View File

@ -192,7 +192,7 @@ svg g[fill] text { fill:unset; }
svg g[fill] rect { fill:unset; } svg g[fill] rect { fill:unset; }
/* output */ /* output */
div.project div.list { margin-left:10px; clear:both; } div.project div.list { margin-left:10px; clear:both; }
div.project div.item { padding:2px 10px; } div.project div.item { padding:2px 10px; white-space:nowrap; }
div.project div.item.filter { padding:0; } div.project div.item.filter { padding:0; }
div.project div.item.filter>input { width:100%; } div.project div.item.filter>input { width:100%; }
div.project div.item.filter>span.delete { top: 3px; right: 5px; } div.project div.item.filter>span.delete { top: 3px; right: 5px; }
@ -286,7 +286,7 @@ span.icon:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-c
div.action div.tabs:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } div.action div.tabs:hover { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
div.action div.tabs.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); } div.action div.tabs.select { background-color:var(--hover-bg-color); color:var(--hover-fg-color); }
fieldset>div.output { background-color:var(--output-bg-color); } fieldset>div.output { background-color:var(--output-bg-color); }
fieldset>div.status { border-top:var(--status-border); } fieldset>div.status { border-top:var(--status-border); height:32px; }
fieldset:not(.panel):not(.cmd) { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); } fieldset:not(.panel):not(.cmd) { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); }
fieldset:not(.panel) { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); } fieldset:not(.panel) { background-color:var(--plugin-bg-color); color:var(--plugin-fg-color); }
fieldset:not(.panel):not(.full):not(.cmd) { border-radius:var(--plugin-radius); box-shadow:var(--box-shadow); } fieldset:not(.panel):not(.full):not(.cmd) { border-radius:var(--plugin-radius); box-shadow:var(--box-shadow); }

View File

@ -64,6 +64,9 @@ Volcanos("misc", {
Defer: function(cb) { msg._defer = msg._defer||[] Defer: function(cb) { msg._defer = msg._defer||[]
if (arguments.length == 0) { msg._defer = can.core.List(msg._defer.reverse(), function(cb) { can.base.isFunc(cb) && cb() }) } else { msg._defer.push(cb) } if (arguments.length == 0) { msg._defer = can.core.List(msg._defer.reverse(), function(cb) { can.base.isFunc(cb) && cb() }) } else { msg._defer.push(cb) }
}, },
IsErr: function() {
return msg.result && msg.result[0] == "warn: "
},
_caller: function(skip) { msg.Option("log.caller") || msg.Option("log.caller", can.misc.fileLine((skip||2)+1).link); return msg }, _caller: function(skip) { msg.Option("log.caller") || msg.Option("log.caller", can.misc.fileLine((skip||2)+1).link); return msg },
}); return msg }, }); return msg },
Event: function(event, can, cb) { for (var i = 3; i < arguments.length; i++) { can.request(event, arguments[i]) } cb(can.request(event)) }, Event: function(event, can, cb) { for (var i = 3; i < arguments.length; i++) { can.request(event, arguments[i]) } cb(can.request(event)) },
@ -176,11 +179,11 @@ Volcanos("misc", {
}, },
localStorage: function(can, key, value) { localStorage: function(can, key, value) {
if (can.base.isUndefined(key)) { var res = {}; can.core.Item(localStorage, function(name, value) { can.base.isFunc(value) || name == "length" || (res[name] = value) }); return res } if (can.base.isUndefined(key)) { var res = {}; can.core.Item(localStorage, function(name, value) { can.base.isFunc(value) || name == "length" || (res[name] = value) }); return res }
if (!can.base.isUndefined(value)) { if (value === "") { return localStorage.removeItem(key) } localStorage.setItem(key, value) } return localStorage.getItem(key) if (!can.base.isUndefined(value)) { if (value === "") { return localStorage.removeItem(key) } localStorage.setItem(key, value) } return can.base.Obj(localStorage.getItem(key))
}, },
sessionStorage: function(can, key, value) { sessionStorage: function(can, key, value) {
if (can.base.isUndefined(key)) { var res = {}; can.core.Item(sessionStorage, function(name, value) { can.base.isFunc(value) || name == "length" || (res[name] = value) }); return res } if (can.base.isUndefined(key)) { var res = {}; can.core.Item(sessionStorage, function(name, value) { can.base.isFunc(value) || name == "length" || (res[name] = value) }); return res }
if (!can.base.isUndefined(value)) { if (value === "") { return sessionStorage.removeItem(key) } sessionStorage.setItem(key, value) } return sessionStorage.getItem(key) if (!can.base.isUndefined(value)) { if (value === "") { return sessionStorage.removeItem(key) } sessionStorage.setItem(key, value) } return can.base.Obj(sessionStorage.getItem(key))
}, },
Log: function() { var args = this._args("", arguments) Log: function() { var args = this._args("", arguments)
if (arguments[0].indexOf && arguments[0].indexOf("on") == 0) { args[1] = this.FileLine((arguments[0] == "onremote"? 4: 2)+this._skip) } if (arguments[0].indexOf && arguments[0].indexOf("on") == 0) { args[1] = this.FileLine((arguments[0] == "onremote"? 4: 2)+this._skip) }
@ -189,9 +192,7 @@ Volcanos("misc", {
}, },
Info: function() { var args = this._args(log.INFO, arguments); console.info.apply(console, args), this._signal(args) }, Info: function() { var args = this._args(log.INFO, arguments); console.info.apply(console, args), this._signal(args) },
Warn: function() { var args = this._args(log.WARN, arguments); console.warn.apply(console, args), this._signal(args); debugger }, Warn: function() { var args = this._args(log.WARN, arguments); console.warn.apply(console, args), this._signal(args); debugger },
Error: function() { Error: function() { var args = this._args(log.ERROR, arguments); args.push(lex.NL, this._stacks().slice(1).join(lex.NL)), console.error.apply(console, args), this._signal(args); debugger },
var args = this._args(log.ERROR, arguments); args.push(lex.NL, this._stacks().slice(1).join(lex.NL)), console.error.apply(console, args), this._signal(args); debugger
},
Debug: function() { var args = this._args(log.DEBUG, arguments); args.push(lex.NL, this._stacks().slice(1, 4).join(lex.NL)), console.debug.apply(console, args), this._signal(args) }, Debug: function() { var args = this._args(log.DEBUG, arguments); args.push(lex.NL, this._stacks().slice(1, 4).join(lex.NL)), console.debug.apply(console, args), this._signal(args) },
Trace: function() { var output = false Trace: function() { var output = false
for (var i in arguments) { var arg = arguments[i]; if (arg.Conf && arg.Conf("log.trace") == ice.TRUE || arg.Option && arg.Option("log.trace") == ice.TRUE) { output = true } } if (!output) { return } for (var i in arguments) { var arg = arguments[i]; if (arg.Conf && arg.Conf("log.trace") == ice.TRUE || arg.Option && arg.Option("log.trace") == ice.TRUE) { output = true } } if (!output) { return }

View File

@ -39,22 +39,17 @@ Volcanos("user", {
confirm: function(text) { return confirm(JSON.stringify(text)) }, confirm: function(text) { return confirm(JSON.stringify(text)) },
prompt: function(tip, def, cb, silent) { (text = silent? def: prompt(tip, def||"")) != undefined && typeof cb == lang.FUNCTION && cb(text); return text }, 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() }, reload: function(force) { (force || confirm("重新加载页面?")) && location.reload() },
jumps: function(url) { jumps: function(url) { location.href = url },
location.href = url
},
opens: function(url) { opens: function(url) {
if (location.search.indexOf("debug=true") > 0 && url.indexOf("debug=true") == -1) { if (location.search.indexOf("debug=true") > 0 && url.indexOf("debug=true") == -1) {
var ls = url.split("#"); ls[0] += (ls[0].indexOf("?") > 0? "&": "?") + "debug=true", url = ls.join("#") var ls = url.split("#"); ls[0] += (ls[0].indexOf("?") > 0? "&": "?") + "debug=true", url = ls.join("#")
} }
window.openurl? window.openurl(url): window.open(url) window.openurl? window.openurl(url): window.parent && window.parent.openurl? window.parent.openurl(url): window.open(url)
}, },
open: function(url) { open: function(url) {
if (window.open(url)) { return } if (window.open(url)) { return }
this.isMobile? location.href = url: null this.isMobile? location.href = url: null
}, },
// opens: function(url) { window.openurl? window.openurl(url): (window.open(url) || (location.href = url)) },
// open: function(url) { return window.open(url) || (location.href = url) },
// close: function(url) { return window.close() || history.back() },
close: function(url) { return window.close() }, close: function(url) { return window.close() },
theme: function(can, name) { can.base.isString(name) && (name = [name]) || name || [] theme: function(can, name) { can.base.isString(name) && (name = [name]) || name || []
name.indexOf(chat.BLACK) > -1 && name.push(html.DARK), name.indexOf(chat.WHITE) > -1 && name.push(chat.BLACK, html.LIGHT) name.indexOf(chat.BLACK) > -1 && name.push(html.DARK), name.indexOf(chat.WHITE) > -1 && name.push(chat.BLACK, html.LIGHT)
@ -76,7 +71,7 @@ Volcanos("user", {
cli.SYSTEM, "命令", cli.ORDER, "加载", cli.BUILD, "构建", cli.SYSTEM, "命令", cli.ORDER, "加载", cli.BUILD, "构建",
code.XTERM, "终端", code.INNER, "源码", chat.IFRAME, "浏览", chat.LOCATION, "地图", code.XTERM, "终端", code.INNER, "源码", chat.IFRAME, "浏览", chat.LOCATION, "地图",
html.PLUGIN, "插件", html.LABEL, "标签", html.HEIGHT, "高度", html.WIDTH, "宽度", ice.SHOW, "显示", ice.HIDE, "隐藏", chat.PROJECT, "项目", chat.PROFILE, "详情", chat.ACTIONS, "操作", html.PLUGIN, "插件", html.LABEL, "标签", html.HEIGHT, "高度", html.WIDTH, "宽度", ice.SHOW, "显示", ice.HIDE, "隐藏", chat.PROJECT, "项目", chat.PROFILE, "详情", chat.ACTIONS, "操作",
"full", "全屏", "Close", "关闭", "Close Other", "关闭其它", "full", "全屏", "Close", "关闭", "Close Other", "关闭其它", "Rename Tabs", "重命名",
"add", "添加", "opt", "优化", "fix", "修复", "message", "信息", "add", "添加", "opt", "优化", "fix", "修复", "message", "信息",
"max", "最大", "auto", "自动", "max", "最大", "auto", "自动",
"confirm", "确定", "confirm", "确定",
@ -283,18 +278,13 @@ Volcanos("user", {
header: function(can) { if (!can._root) { return } header: function(can) { if (!can._root) { return }
var header = can._root.Header var header = can._root.Header
var meta = { var meta = {
space: {view: [[html.ITEM, html.SPACE]], style: {"flex-grow": "1"}, _init: function(target) { space: {view: [[html.ITEM, html.SPACE]], style: {"flex-grow": "1"}},
}},
time: {view: [[html.ITEM, mdb.TIME]], _init: function(target) { time: {view: [[html.ITEM, mdb.TIME]], _init: function(target) {
can.core.Timer({interval: 100}, function() { can.page.Modify(can, target, can.user.time(can, null, "%H:%M:%S %w")) })
can.onappend.figure(can, {action: "date", _hold: true}, target, function(sub, value) {}) can.onappend.figure(can, {action: "date", _hold: true}, target, function(sub, value) {})
can.core.Timer({interval: 100}, function() { can.page.Modify(can, target, can.user.time(can, null, "%H:%M:%S %w")) })
}}, }},
avatar: {view: [[html.ITEM, aaa.AVATAR]], list: [{img: can.user.info.avatar}], onclick: function(event) { avatar: {view: [[html.ITEM, aaa.AVATAR]], list: [{img: can.user.info.avatar}], onclick: function(event) { header && header.onaction.avatar(event, header) }},
header && header.onaction.avatar(event, header) usernick: {view: [[html.ITEM, aaa.USERNICK], "", can.user.info.usernick], onclick: function(event) { header && header.onaction.usernick(event, header) }},
}},
usernick: {view: [[html.ITEM, aaa.USERNICK], "", can.user.info.usernick], onclick: function(event) {
header && header.onaction.usernick(event, header)
}},
}; return can.core.List(can.base.getValid(can.core.List(arguments).slice(1), [html.SPACE, mdb.TIME, aaa.AVATAR, aaa.USERNICK]), function(item) { return meta[item] }) }; return can.core.List(can.base.getValid(can.core.List(arguments).slice(1), [html.SPACE, mdb.TIME, aaa.AVATAR, aaa.USERNICK]), function(item) { return meta[item] })
} }
}) })

View File

@ -95,7 +95,7 @@ Volcanos(chat.ONACTION, {_init: function(can) {
carte: function(event, can, list, cb, trans) { return can.user.carte(event, can, can.onaction, list, cb, null, trans) }, carte: function(event, can, list, cb, trans) { return can.user.carte(event, can, can.onaction, list, cb, null, trans) },
share: function(event, can, args) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE].concat(args||[])) }, share: function(event, can, args) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE].concat(args||[])) },
avatar: function(event, can) { can.onaction.carte(event, can, [can.page.Format(html.IMG, can.onexport.avatar(can), can.page.height()/2)]) }, avatar: function(event, can) { can.onaction.carte(event, can, [can.page.Format(html.IMG, can.onexport.avatar(can), can.page.height()/2)]) },
usernick: function(event, can) { can.user.mod.isPod || can.user.isExtension || can.user.isLocalFile || can.onaction.carte(event, can, can.onaction._menus) }, usernick: function(event, can) { can.onaction.carte(event, can, can.onaction._menus) },
shareuser: function(event, can) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE, mdb.TYPE, aaa.LOGIN]) }, shareuser: function(event, can) { can.user.share(can, can.request(event), [ctx.ACTION, chat.SHARE, mdb.TYPE, aaa.LOGIN]) },
toimage: function(event, can) { can.onmotion.clearCarte(can), can.user.toimage(can, can.user.title(), can._target.parentNode) }, toimage: function(event, can) { can.onmotion.clearCarte(can), can.user.toimage(can, can.user.title(), can._target.parentNode) },
webpack: function(event, can) { can.onengine.signal(can, chat.ONWEBPACK, can.request(event)) }, webpack: function(event, can) { can.onengine.signal(can, chat.ONWEBPACK, can.request(event)) },

View File

@ -26,14 +26,19 @@ fieldset.inner>div.output>div.project>div.zone fieldset.plug { position:static;
fieldset.inner>div.output>div.layout>div.tabs { font-size:14px; display:none; } fieldset.inner>div.output>div.layout>div.tabs { font-size:14px; display:none; }
fieldset.inner>div.output>div.layout>div.path { font-size:14px; display:none; } fieldset.inner>div.output>div.layout>div.path { font-size:14px; display:none; }
fieldset.inner>div.output>div.layout>div.layout div.content * { font-family:monospace; font-size:14px; outline:none; } fieldset.inner>div.output>div.layout>div.layout div.content * { font-family:monospace; font-size:14px; outline:none; }
fieldset.inner>div.output>div.layout>div.layout>div.profile { max-width:unset; } fieldset.inner>div.output>div.layout>div.layout>div.profile { max-width:unset; box-shadow:var(--box-shadow); }
fieldset.inner>div.output>div.layout>div.layout>div.profile { max-width:unset; }
fieldset.inner>div.output>div.layout>div.layout>div.profile h1 { text-align:left; padding:10px 0; margin:20px 0; border-bottom:var(--box-border); } fieldset.inner>div.output>div.layout>div.layout>div.profile h1 { text-align:left; padding:10px 0; margin:20px 0; border-bottom:var(--box-border); }
fieldset.inner>div.output>div.layout>div.layout>div.profile h2 { padding:10px 0; margin:20px 0; border-bottom:var(--box-border); } fieldset.inner>div.output>div.layout>div.layout>div.profile h2 { padding:10px 0; margin:20px 0; border-bottom:var(--box-border); }
fieldset.inner>div.output>div.layout>div.layout>div.profile pre>code { border-left:blue solid 5px; padding-left:10px; display:block; }
fieldset.inner>div.output>div.layout>div.layout>div.profile>div.code { white-space:unset; padding:20px; } fieldset.inner>div.output>div.layout>div.layout>div.profile>div.code { white-space:unset; padding:20px; }
fieldset.inner>div.output>div.layout>div.display h1 { text-align:left; padding:10px 0; margin:20px 0; border-bottom:var(--box-border); }
fieldset.inner>div.output>div.layout>div.display h2 { padding:10px 0; margin:20px 0; border-bottom:var(--box-border); }
fieldset.inner>div.output>div.layout>div.display pre>code { border-left:blue solid 5px; padding-left:10px; display:block; }
fieldset.inner>div.output>div.layout>div.display>div.code { white-space:unset; padding:20px; }
fieldset.inner>div.output>div.layout>div.layout>iframe.profile { border-left:var(--box-border); } fieldset.inner>div.output>div.layout>div.layout>iframe.profile { border-left:var(--box-border); }
fieldset.inner>div.output>div.layout>div.layout>div.profile div.status>div { padding:5px; float:left; } fieldset.inner>div.output>div.layout>div.layout>div.profile div.status>div { padding:5px; float:left; }
fieldset.inner>div.output>div.layout>div.display div.status>div { padding:5px; float:left; } fieldset.inner>div.output>div.layout>div.display div.status>div { padding:5px; float:left; }
fieldset.inner>div.output>div.layout>div.display { box-shadow:var(--box-shadow); }
fieldset.inner>div.output>div.project>div.zone>div.item { font-style:italic; font-weight:bold; line-height:32px; } fieldset.inner>div.output>div.project>div.zone>div.item { font-style:italic; font-weight:bold; line-height:32px; }
fieldset.inner>div.output>div.project>div.zone>div.item>span.icon { font-style:normal; font-weight:normal; } fieldset.inner>div.output>div.project>div.zone>div.item>span.icon { font-style:normal; font-weight:normal; }
fieldset.inner.cmd>div.output>div.layout>div.tabs { height:38px; display:block; overflow:hidden; background-color:var(--plugin-bg-color); } fieldset.inner.cmd>div.output>div.layout>div.tabs { height:38px; display:block; overflow:hidden; background-color:var(--plugin-bg-color); }
@ -53,6 +58,7 @@ fieldset.inner.cmd>div.output>div.layout>div.path.hide { display:none; }
fieldset.inner.cmd>div.output>div.layout>div.path span.func { padding:5px 10px; margin-left:20px; } fieldset.inner.cmd>div.output>div.layout>div.path span.func { padding:5px 10px; margin-left:20px; }
fieldset.inner.cmd>div.output>div.layout>div.path span.mode { padding:5px 10px; margin-left:20px; } fieldset.inner.cmd>div.output>div.layout>div.path span.mode { padding:5px 10px; margin-left:20px; }
fieldset.inner.cmd>div.output>div.layout>div.path span.view { font-size:22px; line-height:12px; padding:0 4px; float:right; } fieldset.inner.cmd>div.output>div.layout>div.path span.view { font-size:22px; line-height:12px; padding:0 4px; float:right; }
fieldset.inner.cmd>div.output>div.layout>fieldset.plug { bottom:32px; }
fieldset.inner.cmd>div.output>div.layout>div.plug { height:32px; clear:both; position:fixed; bottom:0; right:0; } fieldset.inner.cmd>div.output>div.layout>div.plug { height:32px; clear:both; position:fixed; bottom:0; right:0; }
fieldset.inner.cmd>div.output>div.layout>div.plug>legend { font-size:1rem; padding:0 10px; float:right; } fieldset.inner.cmd>div.output>div.layout>div.plug>legend { font-size:1rem; padding:0 10px; float:right; }
fieldset.inner.cmd>div.output>div.layout>div.display>div.status { position:sticky; bottom:0; } fieldset.inner.cmd>div.output>div.layout>div.display>div.status { position:sticky; bottom:0; }

View File

@ -1,11 +1,12 @@
(function() { (function() {
const PROJECT_HIDE = "web.code.inner:project", TABVIEW_HIDE = "web.code.inner:tabview" const RECOVER_TABS = "recover:tabs"
const CURRENT_FILE = "web.code.inner:currentFile", SELECT_LINE = "web.code.inner:selectLine" const RECOVER_TOOL = "recover:tool"
const PROJECT_HIDE = "project:hide", TABVIEW_HIDE = "tabview:hide"
const PROFILE_ARGS = "profile:args:", DISPLAY_ARGS = "display:args:"
const CURRENT_FILE = "web.code.inner:currentFile", SELECT_LINE = "selectLine"
const VIEW_CREATE = "tabview.view.create", VIEW_REMOVE = "tabview.view.remove", LINE_SELECT = "tabview.line.select" const VIEW_CREATE = "tabview.view.create", VIEW_REMOVE = "tabview.view.remove", LINE_SELECT = "tabview.line.select"
Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Split(can.Option(nfs.PATH), mdb.FS); can.Option(nfs.PATH, paths[0]) Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Split(can.Option(nfs.PATH), mdb.FS); can.Option(nfs.PATH, paths[0])
switch (can.Mode()) { if (can.Mode() == ice.MSG_RESULT) { msg.result = msg.result||[can._output.innerHTML], can.Mode(chat.SIMPLE) }
case ice.MSG_RESULT: msg.result = msg.result||[can._output.innerHTML], can.Mode(chat.SIMPLE)
}
can.core.List(paths.concat(can.core.Split(msg.Option(nfs.REPOS))), function(p) { if (can.base.beginWith(p, nfs.USR_LOCAL_WORK) || can.base.endWith(p, "-dict/")) { return } can.core.List(paths.concat(can.core.Split(msg.Option(nfs.REPOS))), function(p) { if (can.base.beginWith(p, nfs.USR_LOCAL_WORK) || can.base.endWith(p, "-dict/")) { return }
if (p && paths.indexOf(p) == -1 && p[0] != nfs.PS) { paths.push(p) } if (p && paths.indexOf(p) == -1 && p[0] != nfs.PS) { paths.push(p) }
}), can.onmotion.clear(can), can.onappend.style(can, code.INNER), can.sup.onimport._process = function() {} }), can.onmotion.clear(can), can.onappend.style(can, code.INNER), can.sup.onimport._process = function() {}
@ -13,20 +14,29 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
can.ui = can.onappend.layout(can, [html.PROJECT, [html.TABS, nfs.PATH, [html.CONTENT, html.PROFILE], html.DISPLAY, html.PLUG]]) can.ui = can.onappend.layout(can, [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) 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)
can.onmotion.hidden(can, can.ui.profile), can.onmotion.hidden(can, can.ui.display) can.onmotion.hidden(can, can.ui.profile), can.onmotion.hidden(can, can.ui.display)
can.Conf(ctx.STYLE) == html.OUTPUT && can.onmotion.hidden(can, can.ui.project) if (can.Conf(ctx.STYLE) == html.OUTPUT) { can.onmotion.hidden(can, can.ui.project), can.page.style(can, can.ui.content, html.HEIGHT, "") }
can.Conf(ctx.STYLE) == html.OUTPUT && can.page.style(can, can.ui.content, html.HEIGHT, "")
switch (can.Mode()) { switch (can.Mode()) {
case chat.SIMPLE: // no break case chat.SIMPLE: // no break
case chat.FLOAT: can.onmotion.hidden(can, can.ui.project); break case chat.FLOAT: can.onmotion.hidden(can, can.ui.project); break
case chat.CMD: can.misc.sessionStorage(can, PROJECT_HIDE) == html.HIDE && can.onmotion.hidden(can, can.ui.project) case chat.CMD: can.onappend.style(can, html.OUTPUT)
if (can.misc.sessionStorage(can, TABVIEW_HIDE) == html.HIDE) { can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.tabs) } can.onexport.session(can, PROJECT_HIDE) == html.HIDE && can.onmotion.hidden(can, can.ui.project)
can.onappend.style(can, html.OUTPUT) if (can.onexport.session(can, TABVIEW_HIDE) == html.HIDE) { can.onmotion.hidden(can, can.ui.project), can.onmotion.hidden(can, can.ui.tabs) }
can.onengine.listen(can, chat.ONUNLOAD, function() {
can.onexport.recover(can)
})
case chat.FULL: // no break case chat.FULL: // no break
default: can.user.isMobile && can.onmotion.hidden(can, can.ui.project), can.onimport.project(can, paths), can.onimport._tabs(can) default: can.user.isMobile && can.onmotion.hidden(can, can.ui.project), can.onimport.project(can, paths), can.onimport._tabs(can)
} var args = can.misc.SearchHash(can) } var args = can.misc.SearchHash(can), tabs = can.onexport.session(can, RECOVER_TABS), tool = can.onexport.session(can, RECOVER_TOOL)
can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE), function() { if (args.length > 0 && can.isCmdMode()) { can.onimport.tabview(can, can.Option(nfs.PATH), can.Option(nfs.FILE), can.Option(nfs.LINE), function() { if (!can.isCmdMode()) { return }
can.onimport._tabview(can, args[args.length-3], args[args.length-2]||can.Option(nfs.FILE), args[args.length-1]) if (tabs) {
} }), can.onkeymap._build(can) can.core.Next(tabs, function(item, next) { can.onimport.tabview(can, item[0], item[1], item[2], next) }, function() {
args.length > 0 && can.onimport._tabview(can, args[args.length-3], args[args.length-2]||can.Option(nfs.FILE), args[args.length-1])
})
} else {
args.length > 0 && can.onimport._tabview(can, args[args.length-3], args[args.length-2]||can.Option(nfs.FILE), args[args.length-1])
}
tool && can.core.Next(tool, function(item, next) { can.onimport.toolkit(can, item, next) })
}), can.onkeymap._build(can)
can.ui.profile.onclick = function(event) { if (can.page.tagis(event.target, html.A)) { can.ui.profile.onclick = function(event) { if (can.page.tagis(event.target, html.A)) {
var link = can.misc.ParseURL(can, event.target.href); if (!link.cmd) { return } can.onkeymap.prevent(event) var link = can.misc.ParseURL(can, event.target.href); if (!link.cmd) { return } can.onkeymap.prevent(event)
link.cmd == web.CODE_VIMER? can.onimport.tabview(can, link.path, link.file, link.line): can.onimport.tabview(can, link.path, link.cmd, ctx.INDEX) link.cmd == web.CODE_VIMER? can.onimport.tabview(can, link.path, link.file, link.line): can.onimport.tabview(can, link.path, link.cmd, ctx.INDEX)
@ -44,7 +54,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
}, target), can.onimport._tabFunc(can, target, cache), can.onimport._tabMode(can), can.onimport._tabIcon(can) }, target), can.onimport._tabFunc(can, target, cache), can.onimport._tabMode(can), can.onimport._tabIcon(can)
target.ondblclick = function(event) { target.ondblclick = function(event) {
var show = can.onmotion.toggle(can, can.ui.tabs); can.onmotion.toggle(can, can.ui.project, show), can.onimport.layout(can) var show = can.onmotion.toggle(can, can.ui.tabs); can.onmotion.toggle(can, can.ui.project, show), can.onimport.layout(can)
can.isCmdMode() && can.misc.sessionStorage(can, TABVIEW_HIDE, show? "": html.HIDE) can.isCmdMode() && can.onexport.session(can, TABVIEW_HIDE, show? "": html.HIDE)
} }
}, },
_tabPath: function(can, ps, key, value, cb, target) { var args = value.split(mdb.FS); can.onmotion.clear(can, can.ui.path) _tabPath: function(can, ps, key, value, cb, target) { var args = value.split(mdb.FS); can.onmotion.clear(can, can.ui.path)
@ -100,7 +110,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
}), }),
"\u25E7": function(event) { "\u25E7": function(event) {
var show = can.onmotion.toggle(can, can.ui.project); can.onimport.layout(can) var show = can.onmotion.toggle(can, can.ui.project); can.onimport.layout(can)
can.isCmdMode() && can.misc.sessionStorage(can, PROJECT_HIDE, show? "": html.HIDE) can.isCmdMode() && can.onexport.session(can, PROJECT_HIDE, show? "": html.HIDE)
}, },
"\u2756": shy({"font-size": "20px", translate: "0 2px"}, function(event) { can.onaction.plug(event, can) }), "\u2756": shy({"font-size": "20px", translate: "0 2px"}, function(event) { can.onaction.plug(event, can) }),
"\u271A": shy({"font-size": "20px", translate: "0 2px"}, function(event) { can.onaction.open(event, can) }), "\u271A": shy({"font-size": "20px", translate: "0 2px"}, function(event) { can.onaction.open(event, can) }),
@ -113,7 +123,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
tabview: function(can, path, file, line, cb) { path = path||can.Option(nfs.PATH); var key = can.onexport.keys(can, path, file) tabview: function(can, path, file, line, cb) { path = path||can.Option(nfs.PATH); var key = can.onexport.keys(can, path, file)
function isIndex() { return line == ctx.INDEX } function isSpace() { return line == web.SPACE } function isIndex() { return line == ctx.INDEX } function isSpace() { return line == web.SPACE }
function show(skip) { can._msg && can._msg.Option && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.db.tabview[key] function show(skip) { can._msg && can._msg.Option && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.db.tabview[key]
can.Option(can.onimport.history(can, {path: path, file: file, line: line||can.misc.sessionStorage(can, SELECT_LINE+nfs.DF+path+file)||can._msg.Option(nfs.LINE)||1})) can.Option(can.onimport.history(can, {path: path, file: file, line: line||can.onexport.session(can, SELECT_LINE+nfs.DF+path+file)||can._msg.Option(nfs.LINE)||1}))
can.onsyntax._init(can, can._msg, function(content) { var msg = can._msg; can.onexport.hash(can) can.onsyntax._init(can, can._msg, function(content) { var msg = can._msg; can.onexport.hash(can)
can.isCmdMode() && can.onexport.title(can, (isIndex()||isSpace()? "": path)+file), can.onmotion.select(can, can.ui.tabs, html.DIV_TABS, msg._tab), can.isCmdMode() && msg._tab.scrollIntoView() can.isCmdMode() && can.onexport.title(can, (isIndex()||isSpace()? "": path)+file), can.onmotion.select(can, can.ui.tabs, html.DIV_TABS, msg._tab), can.isCmdMode() && msg._tab.scrollIntoView()
if (isSpace()) { if (isSpace()) {
@ -142,7 +152,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
} else { } else {
name = file.split(mdb.FS)[0].split(isIndex()? nfs.PT: nfs.PS).pop() name = file.split(mdb.FS)[0].split(isIndex()? nfs.PT: nfs.PS).pop()
} }
can.onimport.tabs(can, [{name: name, text: file, _menu: shy([ var tabs = can.onimport.tabs(can, [{name: name, text: file, _menu: shy([
nfs.SAVE, nfs.TRASH, web.REFRESH, nfs.SAVE, nfs.TRASH, web.REFRESH,
], function(event, button, meta) { ], function(event, button, meta) {
can.onaction[button](event, can, button) can.onaction[button](event, can, button)
@ -152,7 +162,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
msg.__content || can.page.Remove(can, msg._content), msg._profile != can.ui._profile && can.page.Remove(can, msg._profile) msg.__content || can.page.Remove(can, msg._content), msg._profile != can.ui._profile && can.page.Remove(can, msg._profile)
can.ui._profile._cache && delete(can.ui._profile._cache[key]), can.ui._display._cache && delete(can.ui._display._cache[key]) can.ui._profile._cache && delete(can.ui._profile._cache[key]), can.ui._display._cache && delete(can.ui._display._cache[key])
delete(can.db.tabview[key]), can._cache_data && delete(can._cache_data[key]) delete(can.db.tabview[key]), can._cache_data && delete(can._cache_data[key])
}, can.ui.tabs) can.onmotion.delay(can, function() { can.user.isWebview && can.onexport.recover(can) })
}, can.ui.tabs); tabs._list = [path, file, line], can.user.isWebview && can.onexport.recover(can)
} }
if (can.db.tabview[key]) { return !can._msg._tab && !can.isSimpleMode()? load(can.db.tabview[key]): show() } if (can.db.tabview[key]) { return !can._msg._tab && !can.isSimpleMode()? load(can.db.tabview[key]): show() }
isIndex()||isSpace()? load(can.request({}, {index: file, line: line})): can.run({}, [path, file], load, true) isIndex()||isSpace()? load(can.request({}, {index: file, line: line})): can.run({}, [path, file], load, true)
@ -170,11 +181,11 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
can.ui.profile = _msg._profile = can.page.Append(can, can.ui._profile.parentNode, [{view: [html.PROFILE, html.IFRAME], src: src, style: {height: height, width: width}}])._target can.ui.profile = _msg._profile = can.page.Append(can, can.ui._profile.parentNode, [{view: [html.PROFILE, html.IFRAME], src: src, style: {height: height, width: width}}])._target
can.onmotion.toggle(can, can.ui.profile, true), can.onmotion.delay(can, function() { can.onimport.layout(can)}) can.onmotion.toggle(can, can.ui.profile, true), can.onmotion.delay(can, function() { can.onimport.layout(can)})
} else { } else {
can.page.style(can, can.ui.profile, html.MAX_HEIGHT, height, html.MAX_WIDTH, width), can.ui.profile = _msg._profile = can.ui._profile can.page.style(can, can.ui.profile, html.HEIGHT, height, html.WIDTH, width), can.ui.profile = _msg._profile = can.ui._profile
can.onimport.process(can, msg, can.ui.profile, height, width-border, function(sub) { can.page.style(can, sub._output, html.MAX_WIDTH, ""), can.ui.profile._plugin = _msg._profile = sub can.onimport.process(can, msg, can.ui.profile, height, width-border, function(sub) { can.page.style(can, sub._output, html.MAX_WIDTH, ""), can.ui.profile._plugin = _msg._profile = sub
sub.Conf(ctx.ARGS) && can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE), JSON.stringify(sub.Conf(ctx.ARGS)))
if (sub._index == web.WIKI_WORD) { can.page.style(can, can.ui.profile, html.WIDTH, width+border, html.MAX_WIDTH, width+border), can.onimport.layout(can); return } if (sub._index == web.WIKI_WORD) { can.page.style(can, can.ui.profile, html.WIDTH, width+border, html.MAX_WIDTH, width+border), can.onimport.layout(can); return }
can.page.style(can, can.ui.profile, html.WIDTH, width+border, html.MAX_WIDTH, width+border), can.onimport.layout(can); return can.page.style(can, can.ui.profile, html.WIDTH, width+border, html.MAX_WIDTH, width+border), can.onimport.layout(can)
var _width = can.base.Max(sub._target.offsetWidth+border, width); _msg.Option(html.WIDTH, _width), sub.onimport.size(sub, height, _width-border, true), can.onimport.layout(can)
}) })
} }
}, },
@ -182,6 +193,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
var height = can.onexport.size(can, _msg.Option(html.HEIGHT)||0.5, can.ui.project.offsetHeight||can.ConfHeight())+border, width = can.ConfWidth()-can.ui.project.offsetWidth var height = can.onexport.size(can, _msg.Option(html.HEIGHT)||0.5, can.ui.project.offsetHeight||can.ConfHeight())+border, width = can.ConfWidth()-can.ui.project.offsetWidth
can.page.style(can, can.ui.display, html.MAX_HEIGHT, height, html.MAX_WIDTH, width), can.ui.display = _msg._display = can.ui._display can.page.style(can, can.ui.display, html.MAX_HEIGHT, height, html.MAX_WIDTH, width), can.ui.display = _msg._display = can.ui._display
can.onimport.process(can, msg, can.ui.display, height-border, width, function(sub) { can.page.style(can, sub._output, html.MAX_HEIGHT, ""), can.ui.display._plugin = _msg._display = sub can.onimport.process(can, msg, can.ui.display, height-border, width, function(sub) { can.page.style(can, sub._output, html.MAX_HEIGHT, ""), can.ui.display._plugin = _msg._display = sub
sub.Conf(ctx.ARGS) && can.onexport.session(can, DISPLAY_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE), JSON.stringify(sub.Conf(ctx.ARGS)))
if (sub._index == web.WIKI_WORD) { can.page.style(can, can.ui.display, html.HEIGHT, height+border, html.MAX_HEIGHT, height+border), can.onimport.layout(can); return } if (sub._index == web.WIKI_WORD) { can.page.style(can, can.ui.display, html.HEIGHT, height+border, html.MAX_HEIGHT, height+border), can.onimport.layout(can); return }
var _height = can.base.Max(sub._target.offsetHeight+border, height); _msg.Option(html.HEIGHT, _height), sub.onimport.size(sub, _height-border, width, true), can.onimport.layout(can) var _height = can.base.Max(sub._target.offsetHeight+border, height); _msg.Option(html.HEIGHT, _height), sub.onimport.size(sub, _height-border, width, true), can.onimport.layout(can)
}) })
@ -216,7 +228,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { var paths = can.core.Sp
} return can.onmotion.toggle(can, target, true), can.onmotion.delay(can, function() { can.onimport.layout(can), can.user.toastSuccess(can) }) } return can.onmotion.toggle(can, target, true), can.onmotion.delay(can, function() { can.onimport.layout(can), can.user.toastSuccess(can) })
}, },
toolkit: function(can, meta, cb) { toolkit: function(can, meta, cb) {
can.onimport.tool(can, [meta], function(sub) { sub.onexport.record = function(sub, value, key, item) { if (!item.file) { return } can.onimport.tool(can, [meta], function(sub) { sub._legend._list = {index: meta.index, args: meta.args}, sub.onexport.record = function(sub, value, key, item) { if (!item.file) { return }
can.user.isWebview && can.onexport.recover(can)
if (item.file.indexOf("require/src") == 0) { item.path = nfs.SRC, item.file = line.file.slice(12) } if (item.file.indexOf("require/src") == 0) { item.path = nfs.SRC, item.file = line.file.slice(12) }
can.onimport.tabview(can, item.path, can.base.trimPrefix(item.file, nfs.PWD), parseInt(item.line)); return true can.onimport.tabview(can, item.path, can.base.trimPrefix(item.file, nfs.PWD), parseInt(item.line)); return true
}, can.base.isFunc(cb) && cb(sub) }, can.ui.plug.parentNode, can.ui.plug), can.page.isDisplay(can.ui.plug) || can.onmotion.toggle(can, can.ui.plug, true) && can.onimport.layout(can) }, can.base.isFunc(cb) && cb(sub) }, can.ui.plug.parentNode, can.ui.plug), can.page.isDisplay(can.ui.plug) || can.onmotion.toggle(can, can.ui.plug, true) && can.onimport.layout(can)
@ -347,6 +360,7 @@ Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) { var key = can.onexport.
var p = can.onsyntax[parse]; if (!p) { return can.page.trans(can, line) } p = can.onsyntax[p.link]||p, p.split = p.split||{}, p.keyword = p.keyword||{} var p = can.onsyntax[parse]; if (!p) { return can.page.trans(can, line) } p = can.onsyntax[p.link]||p, p.split = p.split||{}, p.keyword = p.keyword||{}
if (p.prefix && can.core.Item(p.prefix, function(pre, type) { if (can.base.beginWith(line, pre)) { return line = wrap(line, type) } }).length > 0) { return line } if (p.prefix && can.core.Item(p.prefix, function(pre, type) { if (can.base.beginWith(line, pre)) { return line = wrap(line, type) } }).length > 0) { return line }
if (p.suffix && can.core.Item(p.suffix, function(end, type) { if (can.base.endWith(line, end)) { return line = wrap(line, type) } }).length > 0) { return line } if (p.suffix && can.core.Item(p.suffix, function(end, type) { if (can.base.endWith(line, end)) { return line = wrap(line, type) } }).length > 0) { return line }
if (p.parse) { var text = p.parse(can, line, wrap); if (text != undefined) { return text } }
if (!p.keyword) { return line } if (!p.keyword) { return line }
line = can.core.List(can.core.Split(line, p.split.space||"\t ", p.split.operator||"{[(.,:;!?|$@&*+-<=>)]}", {detail: true}), function(item, index, array) { line = can.core.List(can.core.Split(line, p.split.space||"\t ", p.split.operator||"{[(.,:;!?|$@&*+-<=>)]}", {detail: true}), function(item, index, array) {
item = can.base.isObject(item)? item: {text: item}; var text = item.text, type = p.keyword[text] item = can.base.isObject(item)? item: {text: item}; var text = item.text, type = p.keyword[text]
@ -400,7 +414,7 @@ Volcanos(chat.ONSYNTAX, {_init: function(can, msg, cb) { var key = can.onexport.
}, },
}) })
Volcanos(chat.ONACTION, { Volcanos(chat.ONACTION, {
_trans: {show: "预览", exec: "输出"}, _trans: {show: "预览", exec: "展示"},
_getLine: function(can, line) { return can.page.Select(can, can.ui.content, "tr.line>td.line", function(td, index) { if (td.parentNode == line || index+1 == line) { return td.parentNode } })[0] }, _getLine: function(can, line) { return can.page.Select(can, can.ui.content, "tr.line>td.line", function(td, index) { if (td.parentNode == line || index+1 == line) { return td.parentNode } })[0] },
_getContent: function(can, line) { _getContent: function(can, line) {
can.ui.content = line.parentNode, can._msg = can.ui.content._msg, can.Option(nfs.PATH, can._msg.Option(nfs.PATH)), can.Option(nfs.FILE, can._msg.Option(nfs.FILE)) can.ui.content = line.parentNode, can._msg = can.ui.content._msg, can.Option(nfs.PATH, can._msg.Option(nfs.PATH)), can.Option(nfs.FILE, can._msg.Option(nfs.FILE))
@ -435,7 +449,7 @@ Volcanos(chat.ONACTION, {
return parseFloat((can.current.line.offsetTop-content.scrollTop)/can.current.line.offsetHeight) return parseFloat((can.current.line.offsetTop-content.scrollTop)/can.current.line.offsetHeight)
}, window: function() { return parseFloat(content.offsetHeight/can.current.line.offsetHeight) }, }, window: function() { return parseFloat(content.offsetHeight/can.current.line.offsetHeight) },
}, can.onimport.history(can, {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()}) }, can.onimport.history(can, {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()})
can.isCmdMode() && can.misc.sessionStorage(can, SELECT_LINE+nfs.DF+can.Option(nfs.PATH)+can.Option(nfs.FILE), can.onexport.line(can, can.current.line)) can.isCmdMode() && can.onexport.session(can, SELECT_LINE+nfs.DF+can.Option(nfs.PATH)+can.Option(nfs.FILE), can.onexport.line(can, can.current.line))
can.onexport.hash(can), scroll && can.onaction.scrollIntoView(can), can.onengine.signal(can, LINE_SELECT, can._msg) can.onexport.hash(can), scroll && can.onaction.scrollIntoView(can), can.onengine.signal(can, LINE_SELECT, can._msg)
}); return can.onexport.line(can, line) }); return can.onexport.line(can, line)
}, },
@ -447,16 +461,18 @@ Volcanos(chat.ONACTION, {
}) })
}), can.page.Select(can, tr, "td.text", function(td) { offset += td.innerText.length+1 }) }), can.page.Select(can, tr, "td.text", function(td) { offset += td.innerText.length+1 })
}) }, }) },
show: function(event, can) { can.runAction(can.request(event, {_toast: "渲染中..."}), mdb.RENDER, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.profile(can, msg) }) }, show: function(event, can) { can.runAction(can.request(event, {_toast: "渲染中...", args: can.onexport.session(can, PROFILE_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE))}), mdb.RENDER, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.profile(can, msg) }) },
exec: function(event, can) { can.runAction(can.request(event, {_toast: "执行中..."}), mdb.ENGINE, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.display(can, msg) }) }, exec: function(event, can) { can.runAction(can.request(event, {_toast: "执行中...", args: can.onexport.session(can, DISPLAY_ARGS+can.Option(nfs.PATH)+can.Option(nfs.FILE))}), mdb.ENGINE, [can.onexport.parse(can), can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) { can.onimport.display(can, msg) }) },
plug: function(event, can) { plug: function(event, can) {
function show(value) { input.cancel(); var sub = can.db.toolkit[value]; if (sub) { sub.select(); return } can.onimport.toolkit(can, {index: value}, function(sub) { can.db.toolkit[value] = sub.select() }) } function show(index, args) { input.cancel();
var sub = can.db.toolkit[index]; if (sub) { sub.select(); return } can.onimport.toolkit(can, {index: index, args: can.core.Split(args||"")}, function(sub) { can.db.toolkit[index] = sub.select() }) }
var input = can.user.input(event, can, [{type: html.TEXT, name: ctx.INDEX, run: function(event, cmds, cb) { can.run(event, cmds, function(msg) { var input = can.user.input(event, can, [{type: html.TEXT, name: ctx.INDEX, run: function(event, cmds, cb) { can.run(event, cmds, function(msg) {
if (cmds[0] == ctx.ACTION && cmds[1] == mdb.INPUTS && cmds[2] == ctx.INDEX) { var _msg = can.request({}) if (cmds[0] == ctx.ACTION && cmds[1] == mdb.INPUTS && cmds[2] == ctx.INDEX) { var _msg = can.request({})
can.core.Item(can.db.toolkit, function(index) { _msg.Push(ctx.INDEX, index).Push("cb", show) }), _msg.Push(ctx.INDEX, "").Push("cb", show) can.core.Item(can.db.toolkit, function(index) { _msg.Push(ctx.INDEX, index) }), _msg.Push(ctx.INDEX, "")
can.core.List(msg.index, function() { msg.Push("cb", show) }), _msg.Copy(msg), cb(_msg) // can.core.List(msg.index, function() { msg.Push("cb", show) })
_msg.Copy(msg), cb(_msg)
} else { cb(msg) } } else { cb(msg) }
}, true) }}], function(list) { show(list[0]) }) }, true) }}, ctx.ARGS], function(list) { show(list[0], list[1]) })
}, },
open: function(event, can) { open: function(event, can) {
var input = can.user.input(event, can, [{name: nfs.FILE, style: {width: (can._output.offsetWidth-can.ui.project.offsetWidth)/2}, select: function(item) { input.submit(event, can, web.SUBMIT) }, run: function(event, cmds, cb) { var input = can.user.input(event, can, [{name: nfs.FILE, style: {width: (can._output.offsetWidth-can.ui.project.offsetWidth)/2}, select: function(item) { input.submit(event, can, web.SUBMIT) }, run: function(event, cmds, cb) {
@ -536,9 +552,11 @@ Volcanos(chat.ONEXPORT, {list: [nfs.FILE, nfs.LINE, ice.BACK],
selection: function(can, str) { var s = document.getSelection().toString(), begin = str.indexOf(s), end = begin+s.length selection: function(can, str) { var s = document.getSelection().toString(), begin = str.indexOf(s), end = begin+s.length
for (var i = begin; i >= 0; i--) { if (str[i].match(/[a-zA-Z0-9_.]/)) { s = str.slice(i, end) } else { break } } return s for (var i = begin; i >= 0; i--) { if (str[i].match(/[a-zA-Z0-9_.]/)) { s = str.slice(i, end) } else { break } } return s
}, },
parse: function(can) { recover: function(can) {
return can._msg.Option("parse")||can.base.Ext(can.Option(nfs.FILE)) can.onexport.session(can, RECOVER_TABS, can.page.SelectChild(can, can.ui.tabs, "", function(target) { return target._list }))
can.onexport.session(can, RECOVER_TOOL, can.page.SelectChild(can, can.ui.plug, "", function(target) { return target._list }))
}, },
parse: function(can) { return can._msg.Option("parse")||can.base.Ext(can.Option(nfs.FILE)) },
split: function(can, file) { var ls = file.split(nfs.PS); if (ls.length == 1) { return [nfs.PWD, ls[0]] } split: function(can, file) { var ls = file.split(nfs.PS); if (ls.length == 1) { return [nfs.PWD, ls[0]] }
if (ls[0] == ice.USR) { return [ls.slice(0, 2).join(nfs.PS)+nfs.PS, ls.slice(2).join(nfs.PS)] } if (ls[0] == ice.USR) { return [ls.slice(0, 2).join(nfs.PS)+nfs.PS, ls.slice(2).join(nfs.PS)] }
return [ls.slice(0, 1).join(nfs.PS)+nfs.PS, ls.slice(1).join(nfs.PS)] return [ls.slice(0, 1).join(nfs.PS)+nfs.PS, ls.slice(1).join(nfs.PS)]

View File

@ -7,9 +7,10 @@ Volcanos(chat.ONSYNTAX, {
"define": code.KEYWORD, "endef": code.KEYWORD, "define": code.KEYWORD, "endef": code.KEYWORD,
"shell": code.KEYWORD, "shell": code.KEYWORD,
"PHONY": code.FUNCTION, "PHONY": code.FUNCTION,
}, include: ["sh"], func: function(can, push, text, indent) { }, include: ["sh"], func: function(can, push, text, indent) { var ls = can.core.Split(text, "", ":=")
var ls = can.core.Split(text, "", ":=")
if (indent == 0 && ls[1] == ":" && ls[2] != "=") { push(text) } if (indent == 0 && ls[1] == ":" && ls[2] != "=") { push(text) }
}, parse: function(can, text, wrap) { var ls = can.core.Split(text, "", ":=")
if (ls[1] == ":" && ls[2] != "=" && can.base.beginWith(text, ls[0])) { return wrap(text, code.OBJECT) }
}}, }},
man: {prefix: { man: {prefix: {
"NAME": code.KEYWORD, "NAME": code.KEYWORD,

View File

@ -63,7 +63,7 @@ Volcanos(chat.ONFIGURE, {
}) }, }) },
}) })
Volcanos(chat.ONACTION, {list: ["编译", "构建", "路由", "终端", "源码", "文档", "计划", "流程", "桌面", "后台", "官网"], Volcanos(chat.ONACTION, {list: ["编译", "构建", "路由", "终端", "源码", "文档", "计划", "流程", "桌面", "后台", "官网"],
_trans: {show: "预览", exec: "输出"}, _trans: {show: "预览", exec: "展示"},
_run: function(event, can, button, args, cb) { can.runAction(event, button, args, cb||function(msg) { _run: function(event, can, button, args, cb) { can.runAction(event, button, args, cb||function(msg) {
can.onimport.tabview(can, msg.Option(nfs.PATH), msg.Option(nfs.FILE)), can.user.toastSuccess(can, button) can.onimport.tabview(can, msg.Option(nfs.PATH), msg.Option(nfs.FILE)), can.user.toastSuccess(can, button)
can.ui.zone.source.refresh() can.ui.zone.source.refresh()
@ -92,11 +92,11 @@ Volcanos(chat.ONACTION, {list: ["编译", "构建", "路由", "终端", "源码"
if (msg.Length() > 0 || msg.Result()) { return can.onimport.exts(can, "inner/search.js", function(sub) { can.onappend._output(sub, msg, sub.Conf(ctx.DISPLAY)), sub.select() }) } if (msg.Length() > 0 || msg.Result()) { return can.onimport.exts(can, "inner/search.js", function(sub) { can.onappend._output(sub, msg, sub.Conf(ctx.DISPLAY)), sub.select() }) }
var toast = can.user.toastProcess(can, "重启中..."); can.onmotion.delay(can, function() { toast.close(), can.user.toastSuccess(can) }, 3000) var toast = can.user.toastProcess(can, "重启中..."); can.onmotion.delay(can, function() { toast.close(), can.user.toastSuccess(can) }, 3000)
}) }, }) },
"命令": function(event, can) { "命令": function(event, can) { can.user.input(event, can, [{name: ctx.INDEX, need: "must"}, ctx.ARGS], function(list) {
can.user.input(event, can, [ctx.INDEX, ctx.ARGS], function(list) { can.onimport.tabview(can, "", list[0]+(list[1]? mdb.FS+list[1]: ""), ctx.INDEX) }) can.onimport.tabview(can, "", list[0]+(list[1]? mdb.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 } "插件": function(event, can) { can.user.input(event, can, [{name: ctx.INDEX, need: "must"}, ctx.ARGS], function(list) { var sub = can.db.toolkit[list.join(",")]; if (sub) { sub.select(); return }
can.onimport.toolkit(can, {index: list[0]}, function(sub) { can.db.toolkit[list[0]] = sub.select() }) can.onimport.toolkit(can, {index: list[0], args: can.core.Split(list[1]||"")}, function(sub) { can.db.toolkit[list.join(",")] = sub.select() })
}) }, }) },
"扩展": function(event, can) { can.user.input(can.request(event, {action: "extension"}), can, ["url"], function(list) { "扩展": function(event, can) { can.user.input(can.request(event, {action: "extension"}), can, ["url"], function(list) {
var sub = can.db.toolkit[list[0]]; sub? sub.select(): can.onimport.exts(can, list[0]) var sub = can.db.toolkit[list[0]]; sub? sub.select(): can.onimport.exts(can, list[0])

View File

@ -1,3 +1,5 @@
(function() {
const RECOVER_STORE = "recover:"
Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireModules(can, ["xterm/css/xterm.css", "xterm", "xterm-addon-fit", "xterm-addon-web-links"], function() { Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireModules(can, ["xterm/css/xterm.css", "xterm", "xterm-addon-fit", "xterm-addon-web-links"], function() {
var item = msg.TableDetail(); item.hash = item.hash||can.Option(mdb.HASH), can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg), can.onappend._status(can), can.onkeymap._build(can) var item = msg.TableDetail(); item.hash = item.hash||can.Option(mdb.HASH), can.onmotion.clear(can), can.base.isFunc(cb) && cb(msg), can.onappend._status(can), can.onkeymap._build(can)
if (item.type == html.LAYOUT) { can.onimport._layout(can, item) } else { can.onimport._connect(can, item, can._output) } can.onimport.layout(can) if (item.type == html.LAYOUT) { can.onimport._layout(can, item) } else { can.onimport._connect(can, item, can._output) } can.onimport.layout(can)
@ -34,8 +36,8 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireModules
_theme: function(can, item) { return can.base.Obj(item.theme)||( _theme: function(can, item) { return can.base.Obj(item.theme)||(
can.getHeaderTheme() == html.LIGHT? {background: cli.WHITE, foreground: cli.BLACK, cursor: cli.BLUE}: can.getHeaderTheme() == html.LIGHT? {background: cli.WHITE, foreground: cli.BLACK, cursor: cli.BLUE}:
can.getHeaderTheme() == html.DARK? {foreground:"silver", cursor: "silver"}: can.getHeaderTheme() == html.DARK? {foreground:"silver", cursor: "silver"}:
can.getHeaderTheme() == chat.BLACK? {background: "#061c3c9e", foreground:cli.WHITE, cursor: cli.WHITE}: can.getHeaderTheme() == chat.BLACK? {background: "#061c3c9e", foreground:cli.WHITE, cursor: cli.WHITE}:
{background: "#d5cfcf3b", foreground: cli.BLACK, cursor: cli.BLUE} {background: "#d5cfcf3b", foreground: cli.BLACK, cursor: cli.BLUE}
) }, ) },
_connect: function(can, item, output, tabs, text) { var term = new Terminal({tabStopWidth: 4, cursorBlink: true, theme: can.onimport._theme(can, item)}) _connect: function(can, item, output, tabs, text) { var term = new Terminal({tabStopWidth: 4, cursorBlink: true, theme: can.onimport._theme(can, item)})
term._item = item, term._output = output, output._term = term, output._tabs || (tabs? (output._tabs = tabs): can.onimport._tabs(can, item, output)) term._item = item, term._output = output, output._term = term, output._tabs || (tabs? (output._tabs = tabs): can.onimport._tabs(can, item, output))
@ -45,22 +47,34 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireModules
term.onData(function(data) { can.onimport._input(can, term, data) }) term.onData(function(data) { can.onimport._input(can, term, data) })
term.onCursorMove(function() { can.onexport.term(can, term) }) term.onCursorMove(function() { can.onexport.term(can, term) })
term.loadAddon(new WebLinksAddon.WebLinksAddon()) term.loadAddon(new WebLinksAddon.WebLinksAddon())
can.onmotion.clear(can, output), term.open(output), term.focus(), text && can.onmotion.delay(can, function() { term.write(text.replaceAll(lex.NL, "\r\n")) }) can.onmotion.clear(can, output), term.open(output), term.focus()
can.onengine.listen(can, chat.ONTHEMECHANGE, function() { can = can.core.Value(can.sup, chat._OUTPUTS_CURRENT) can.onengine.listen(can, chat.ONTHEMECHANGE, function() { can = can.core.Value(can.sup, chat._OUTPUTS_CURRENT)
term.selectAll(), can.onimport._connect(can, item, output, tabs, can.base.trimSuffix(term.getSelection(), lex.NL)) term.selectAll(), can.onimport._connect(can, item, output, tabs, can.base.trimSuffix(term.getSelection(), lex.NL))
}), can.page.style(can, output, html.BACKGROUND_COLOR, term._publicOptions.theme.background||cli.BLACK) }), can.onimport._recover(can, item, term, text)
can.page.style(can, output, html.BACKGROUND_COLOR, term._publicOptions.theme.background||cli.BLACK)
output.onclick = function() { output._tabs._current = output, term.focus(), can.onexport.term(can, term) output.onclick = function() { output._tabs._current = output, term.focus(), can.onexport.term(can, term)
can.page.Select(can, can._fields, html.DIV_OUTPUT, function(target) { can.page.ClassList.set(can, target, html.SELECT, target == output) }) can.page.Select(can, can._fields, html.DIV_OUTPUT, function(target) { can.page.ClassList.set(can, target, html.SELECT, target == output) })
}; return can.db = can.db||{}, can.db[item.hash] = term }; return can.db = can.db||{}, can.db[item.hash] = term
}, },
_resize: function(can, term, size) { can.runAction(can.request({}, size, term._item), web.RESIZE, [], function() { can.onexport.term(can, term) }) }, _recover: function(can, item, term, text) { var recover = can.onexport.session(can, RECOVER_STORE+item.hash)
if (recover) { can.onexport.session(can, RECOVER_STORE+item.hash, ""), can.onmotion.delay(can, function() { term.write(recover.replaceAll(lex.NL, "\r\n")) }) }
can.onengine.listen(can, chat.ONUNLOAD, function(msg) { term.selectAll(), can.onexport.session(can, RECOVER_STORE+item.hash, JSON.stringify(can.base.trimSuffix(term.getSelection(), lex.NL)+lex.NL)) })
text && can.onmotion.delay(can, function() { term.write(text.replaceAll(lex.NL, "\r\n")) })
},
_resize: function(can, term, size) { can.runAction(can.request({}, size, term._item), web.RESIZE, [], function(msg) {
if (msg.IsErr()) { can.misc.Warn(msg.Result()) }
can.onexport.term(can, term) }) },
_input: function(can, term, data) { _input: function(can, term, data) {
if (data == "\u0013") { can._delay = true if (data == "\u0013") { can._delay = true
can.onmotion.delay(can, function() { can._delay && can.runAction(can.request({}, term._item), web.INPUT, [btoa(data)], function() {}) }) can.onmotion.delay(can, function() { can._delay && can.runAction(can.request({}, term._item), web.INPUT, [btoa(data)], function(msg) {
if (msg.IsErr()) { can.misc.Warn(msg.Result()) }
}) })
} else { } else {
if (can._delay) { can._delay = false; var msg = can.request({}, {_handle: ice.TRUE}, term._item) if (can._delay) { can._delay = false; var msg = can.request({}, {_handle: ice.TRUE}, term._item)
can._keylist = can.onkeymap._parse({key: data, _msg: msg}, can, mdb.NORMAL, can._keylist||[], term); return can._keylist = can.onkeymap._parse({key: data, _msg: msg}, can, mdb.NORMAL, can._keylist||[], term); return
} can._output = term._output, can.runAction(can.request({}, {rows: term.rows, cols: term.cols}, term._item), web.INPUT, [btoa(data)], function() {}) } can._output = term._output, can.runAction(can.request({}, {rows: term.rows, cols: term.cols}, term._item), web.INPUT, [btoa(data)], function(msg) {
if (msg.IsErr()) { can.misc.Warn(msg.Result()) }
})
} }
}, },
grow: function(can, msg) { var arg = msg.detail.slice(1), term = can.db[arg[0]]; arg[1] == "~~~end~~~"? can.onaction.delete(can, term._output): term.write(arg[1]); msg.Option(ice.LOG_DISABLE, ice.TRUE) }, grow: function(can, msg) { var arg = msg.detail.slice(1), term = can.db[arg[0]]; arg[1] == "~~~end~~~"? can.onaction.delete(can, term._output): term.write(arg[1]); msg.Option(ice.LOG_DISABLE, ice.TRUE) },
@ -158,4 +172,8 @@ Volcanos(chat.ONEXPORT, {list: [mdb.TIME, mdb.HASH, mdb.TYPE, mdb.NAME, "rows",
} else { var item = target._term._item; return {type: item.type, name: name, text: item.text, hash: item.hash} } } else { var item = target._term._item; return {type: item.type, name: name, text: item.text, hash: item.hash} }
} return show(target._output) }) }, } return show(target._output) }) },
title: function(can, term, title) { can.page.Modify(can, can.page.SelectOne(can, term._output._tabs, html.SPAN_NAME), title), can.Status(mdb.NAME, title), can.sup.onexport.title(can.sup, title) }, title: function(can, term, title) { can.page.Modify(can, can.page.SelectOne(can, term._output._tabs, html.SPAN_NAME), title), can.Status(mdb.NAME, title), can.sup.onexport.title(can.sup, title) },
recover: function(can, key, value) {
},
}) })
})()

View File

@ -11,6 +11,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(
return can.onimport._task(can, msg, get(begin_time, col, row, hash), set(begin_time, col, row)) return can.onimport._task(can, msg, get(begin_time, col, row, hash), set(begin_time, col, row))
})} })}
}) }] }])._target, can.onmotion.delay(can, function() { var target = can.sup.task && can.sup.task._target; target && target.click(), can.Status(mdb.COUNT, msg.Length()) }) }) }] }])._target, can.onmotion.delay(can, function() { var target = can.sup.task && can.sup.task._target; target && target.click(), can.Status(mdb.COUNT, msg.Length()) })
can.ui.toggle = can.onappend.toggle(can, can.ui.content)
}, },
_task: function(can, msg, list, time) { return {type: html.TD, className: time == can.base.Time().slice(0, time.length)? html.SELECT: "", _task: function(can, msg, list, time) { return {type: html.TD, className: time == can.base.Time().slice(0, time.length)? html.SELECT: "",
ondblclick: function(event) { can.onaction.insertTask(event, can, time+can.base.Time().slice(time.length)) }, ondblclick: function(event) { can.onaction.insertTask(event, can, time+can.base.Time().slice(time.length)) },
@ -109,6 +110,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(
can.ui.layout(can.ConfHeight(), can.ConfWidth()) can.ui.layout(can.ConfHeight(), can.ConfWidth())
can.user.isMobile && can.page.style(can, can.ui.content, html.HEIGHT, "") can.user.isMobile && can.page.style(can, can.ui.content, html.HEIGHT, "")
var sub = can._plugin_display; sub && sub.onimport.size(sub, can.ConfHeight()/2, can.ConfWidth()-can.ui.project.offsetWidth, true) var sub = can._plugin_display; sub && sub.onimport.size(sub, can.ConfHeight()/2, can.ConfWidth()-can.ui.project.offsetWidth, true)
can.ui.toggle && can.ui.toggle.layout()
return return
can.page.styleHeight(can, can._output, can.ConfHeight()), can.page.styleHeight(can, can.ui.project, can.ConfHeight()) can.page.styleHeight(can, can._output, can.ConfHeight()), can.page.styleHeight(can, can.ui.project, can.ConfHeight())
var height = can._display_heights[can.sup.task? [can.sup.task.zone, can.sup.task.id].join(mdb.FS): ""]||html.ACTION_HEIGHT var height = can._display_heights[can.sup.task? [can.sup.task.zone, can.sup.task.id].join(mdb.FS): ""]||html.ACTION_HEIGHT

View File

@ -42,4 +42,5 @@ fieldset.word.play.float div.content div.page ul { text-align:left; }
fieldset.word.play.float div.content.grid div.page { background-color:#a4cbecb5; margin:10px; height:320px; width:30%; overflow:auto; display:block; float:left; } fieldset.word.play.float div.content.grid div.page { background-color:#a4cbecb5; margin:10px; height:320px; width:30%; overflow:auto; display:block; float:left; }
fieldset.word.play.float h1 { text-align:center; } fieldset.word.play.float h1 { text-align:center; }
fieldset.word.play.float h2 { text-align:center; } fieldset.word.play.float h2 { text-align:center; }
fieldset.word.play.float svg { display:block; margin:0 auto; }
fieldset.word.play.float h3 { text-align:center; } fieldset.word.play.float h3 { text-align:center; }

View File

@ -78,7 +78,7 @@ Volcanos(chat.ONACTION, {_trans: {view: "视图"},
onkeydown: function(event, can) { can.keylist = can.onkeymap._parse(event, can, "normal", can.keylist) }, onkeydown: function(event, can) { can.keylist = can.onkeymap._parse(event, can, "normal", can.keylist) },
play: function(event, can) { var list = [], current = [] play: function(event, can) { var list = [], current = []
can.page.Select(can, can._output, wiki.STORY_ITEM, function(item) { can.page.tagis(item, "h1", "h2", "h3") && list.push(current = []), current.push(item) }) can.page.Select(can, can._output, wiki.STORY_ITEM, function(item) { can.page.tagis(item, "h1", "h2", "h3") && list.push(current = []), current.push(item) })
can.onappend._init(can, {type: "story word play float"}, [], function(sub) { sub._legend.onclick = can._legend.onclick can.onappend._init(can, {type: "story word play float", height: can.page.height(), width: can.page.width(), padding: 10}, [], function(sub) { sub._legend.onclick = can._legend.onclick
sub.run = can.run, sub.sup = can, can.sub = sub, can.onappend._action(sub, can.user.isMobile && can.page.height() > can.page.width()? [ sub.run = can.run, sub.sup = can, can.sub = sub, can.onappend._action(sub, can.user.isMobile && can.page.height() > can.page.width()? [
"大纲", "上一页", "下一页", "结束", "大纲", "上一页", "下一页", "结束",
]: [ ]: [

View File

@ -61,7 +61,7 @@ Volcanos(chat.ONIMPORT, {
_close: function(can, msg) { return can.user.close() || history.back() }, _close: function(can, msg) { return can.user.close() || history.back() },
size: function(can, height, width, auto, mode) { height -= can.onexport.actionHeight(can)+can.onexport.statusHeight(can) size: function(can, height, width, auto, mode) { height -= can.onexport.actionHeight(can)+can.onexport.statusHeight(can)
auto? (can.page.style(can, can._output, html.HEIGHT, "", html.WIDTH, "", html.MAX_HEIGHT, height? can.ConfHeight(height): "", html.MAX_WIDTH, can.ConfWidth(width)), auto? (can.page.style(can, can._output, html.HEIGHT, "", html.WIDTH, "", html.MAX_HEIGHT, height? can.ConfHeight(height): "", html.MAX_WIDTH, can.ConfWidth(width)),
can.page.style(can, can._target, html.WIDTH, "")): can.page.style(can, can._target, html.HEIGHT, "", html.WIDTH, "")):
(can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(height), html.WIDTH, can.ConfWidth(width), html.MAX_HEIGHT, "", html.MAX_WIDTH, ""), (can.page.style(can, can._output, html.HEIGHT, can.ConfHeight(height), html.WIDTH, can.ConfWidth(width), html.MAX_HEIGHT, "", html.MAX_WIDTH, ""),
can.page.style(can, can._target, html.WIDTH, can.ConfWidth(width))) can.page.style(can, can._target, html.WIDTH, can.ConfWidth(width)))
var sub = can.core.Value(can, chat._OUTPUTS_CURRENT); if (!sub) { return can.Mode(mode), auto } sub.ConfHeight(can.ConfHeight()), sub.ConfWidth(can.ConfWidth()) var sub = can.core.Value(can, chat._OUTPUTS_CURRENT); if (!sub) { return can.Mode(mode), auto } sub.ConfHeight(can.ConfHeight()), sub.ConfWidth(can.ConfWidth())
@ -122,7 +122,7 @@ Volcanos(chat.ONACTION, {list: [
"共享工具": function(event, can) { var meta = can.Conf(); can.onmotion.share(event, can, [ "共享工具": function(event, can) { var meta = can.Conf(); can.onmotion.share(event, can, [
{name: chat.TITLE, value: meta.name}, {name: chat.THEME, values: [can.getHeader(chat.THEME), html.DARK, html.LIGHT, cli.WHITE, cli.BLACK]}, {name: chat.TITLE, value: meta.name}, {name: chat.THEME, values: [can.getHeader(chat.THEME), html.DARK, html.LIGHT, cli.WHITE, cli.BLACK]},
], [mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input())]) }, ], [mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input())]) },
"打开链接": function(event, can) { can.user.open(can.onexport.link(can)) }, "打开链接": function(event, can) { can.user.opens(can.onexport.link(can)) },
"生成链接": function(event, can) { can.onmotion.share(event, can, [], [mdb.LINK, can.user.copy(event, can, can.onexport.link(can))]) }, "生成链接": function(event, can) { can.onmotion.share(event, can, [], [mdb.LINK, can.user.copy(event, can, can.onexport.link(can))]) },
"生成脚本": function(event, can) { var conf = can.Conf(), args = can.Input().join(lex.SP), list = [ "生成脚本": function(event, can) { var conf = can.Conf(), args = can.Input().join(lex.SP), list = [
"export ctx_dev="+location.origin+"; ctx_temp=$(mktemp); curl -o $ctx_temp -fsSL $ctx_dev;"+" source $ctx_temp cmd "+(conf.index||"")+lex.SP+args, "export ctx_dev="+location.origin+"; ctx_temp=$(mktemp); curl -o $ctx_temp -fsSL $ctx_dev;"+" source $ctx_temp cmd "+(conf.index||"")+lex.SP+args,

View File

@ -1,6 +1,6 @@
div.output.json div.item:hover { background-color:transparent; color:unset; } div.json div.item:hover { background-color:transparent; color:unset; }
div.output.json div.item div.item { padding-left:15px; border:transparent solid 1px; border-left:lightblue dashed 1px; margin-left:5px; } div.json div.item div.item { padding-left:15px; border:transparent solid 1px; border-left:lightblue dashed 1px; margin-left:5px; }
div.output.json div.item div.item:hover { border:var(--box-border); } div.json div.item div.item:hover { border:var(--box-border); }
div.output.json div.item label.nonce { color:#9cbeca4f; } div.json div.item label.nonce { color:#9cbeca4f; }
div.output.json div.item span.string { color:orange; } div.json div.item span.string { color:orange; }
div.output.json label { user-select:none; } div.json label { user-select:none; }

View File

@ -61,13 +61,15 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, target) { can.onmotion.clear(
tool: function(can, list, cb, target, status) { target = target||can._output, status = status||can._status tool: function(can, list, cb, target, status) { target = target||can._output, status = status||can._status
can.core.List(list.reverse(), function(meta) { can.base.isString(meta) && (meta = {index: meta}), meta.mode = html.FLOAT can.core.List(list.reverse(), function(meta) { can.base.isString(meta) && (meta = {index: meta}), meta.mode = html.FLOAT
can.onimport.plug(can, meta, function(sub) { can.onmotion.hidden(can, sub._target), sub._legend._target = sub._target can.onimport.plug(can, meta, function(sub) { can.onmotion.hidden(can, sub._target), sub._legend._target = sub._target
status.appendChild(sub._legend), sub._legend.onclick = function(event) { can.misc.Event(event, can, function(msg) { status.appendChild(sub._legend), sub._legend.oncontextmenu = sub._legend.onclick, sub._legend.onclick = function(event) { can.misc.Event(event, can, function(msg) {
if (can.page.SelectOne(can, status, nfs.PT+html.SELECT, function(target) { can.onmotion.hidden(can, target._target), can.page.ClassList.del(can, target, html.SELECT); return target }) == sub._legend) { return } if (can.page.SelectOne(can, status, nfs.PT+html.SELECT, function(target) { can.onmotion.hidden(can, target._target), can.page.ClassList.del(can, target, html.SELECT); return target }) == sub._legend) { return }
sub.onimport.size(sub, can.ConfHeight()/2-html.ACTION_HEIGHT, (can.ConfWidth()-(can.ui && can.ui.project? can.ui.project.offsetWidth: 0))/2)
sub.onaction._close = function() { can.page.Remove(can, sub._target), can.page.Remove(can, sub._legend) }
can.onmotion.select(can, status, html.LEGEND, sub._legend), can.onmotion.toggle(can, sub._target, true), sub.Focus() can.onmotion.select(can, status, html.LEGEND, sub._legend), can.onmotion.toggle(can, sub._target, true), sub.Focus()
if (sub._delay_init || meta.msg) { sub._delay_init = false, meta.msg = false, sub.Update() } if (sub._delay_init || meta.msg) { sub._delay_init = false, meta.msg = false, sub.Update() }
}) }, sub._delay_init = true, sub.onaction.close = function() { sub.select() }, sub.select = function() { return sub._legend.click(), sub } }) }, sub._delay_init = true, sub.onaction.close = function() { sub.select() }, sub.select = function() { return sub._legend.click(), sub }
sub.hidden = function() { can.onmotion.hidden(can, sub._target), can.page.ClassList.del(can, sub._legend, html.SELECT) } sub.hidden = function() { can.onmotion.hidden(can, sub._target), can.page.ClassList.del(can, sub._legend, html.SELECT) }
sub.onimport.size(sub, can.ConfHeight()/2, can.ConfWidth()-(can.ui && can.ui.project? can.ui.project.offsetWidth: 0), true), can.base.isFunc(cb) && cb(sub) can.base.isFunc(cb) && cb(sub)
}, target) }, target)
}) })
}, },
@ -190,4 +192,5 @@ Volcanos(chat.ONEXPORT, {
var res = [msg.append && msg.append.join(mdb.FS)]; msg.Table(function(line, index, array) { res.push(can.core.Item(line, function(key, value) { return value }).join(ice.FS)) }); return res.join(lex.NL) var res = [msg.append && msg.append.join(mdb.FS)]; msg.Table(function(line, index, array) { res.push(can.core.Item(line, function(key, value) { return value }).join(ice.FS)) }); return res.join(lex.NL)
}, },
board: function(can) { var msg = can._msg; return msg.Result() }, board: function(can) { var msg = can._msg; return msg.Result() },
session: function(can, key, value) { return can.misc[can.user.isWebview? "localStorage": "sessionStorage"](can, [can.Conf(ctx.INDEX), key, location.pathname].join(":"), JSON.stringify(value)) },
}) })

View File

@ -216,6 +216,7 @@ var chat = {
ONACTION_REMOVE: "onaction_remove", ONACTION_REMOVE: "onaction_remove",
ONOPENSEARCH: "onopensearch", ONSEARCH_FOCUS: "onsearch_focus", ONCOMMAND_FOCUS: "oncommand_focus", ONOPENSEARCH: "onopensearch", ONSEARCH_FOCUS: "onsearch_focus", ONCOMMAND_FOCUS: "oncommand_focus",
ONTHEMECHANGE: "onthemechange", ONTHEMECHANGE: "onthemechange",
ONUNLOAD: "onunload",
ONLAYOUT: "onlayout", ONLAYOUT: "onlayout",
ONWEBPACK: "onwebpack", ONWEBPACK: "onwebpack",
ONTOAST: "ontoast", ONDEBUG: "ondebug", ONSHARE: "onshare", ONPRINT: "onprint", ONTOAST: "ontoast", ONDEBUG: "ondebug", ONSHARE: "onshare", ONPRINT: "onprint",
@ -416,7 +417,7 @@ try { if (typeof(window) == lang.OBJECT) { var meta = Volcanos.meta
window.ondblclick = function(event) { can.onkeymap.prevent(event) } window.ondblclick = function(event) { can.onkeymap.prevent(event) }
window.onkeydown = function(event) { if (event.key == lang.ESCAPE && !can.page.tagis(event.target, html.INPUT)) { can.onkeymap.prevent(event) } } window.onkeydown = function(event) { if (event.key == lang.ESCAPE && !can.page.tagis(event.target, html.INPUT)) { can.onkeymap.prevent(event) } }
window.onerror = function(message, source, lineno, colno, error) { debug? alert([message].concat(can.misc._stacks(0, error)).join(lex.NL)): can.misc.Error(message, lex.NL+[source, lineno, colno].join(ice.DF), error) } window.onerror = function(message, source, lineno, colno, error) { debug? alert([message].concat(can.misc._stacks(0, error)).join(lex.NL)): can.misc.Error(message, lex.NL+[source, lineno, colno].join(ice.DF), error) }
window.onbeforeunload = function() { can.Action._socket && can.Action._socket.close() } window.onbeforeunload = function() { can.onengine.signal(can, chat.ONUNLOAD) }
var last = can.page.width() < can.page.height(); window.onresize = function(event) { can.misc.Event(event, can, function(msg) { var last = can.page.width() < can.page.height(); window.onresize = function(event) { can.misc.Event(event, can, function(msg) {
if (can.user.isMobile && last === can.page.width() < can.page.height()) { return } last = can.page.width() < can.page.height() if (can.user.isMobile && last === can.page.width() < can.page.height()) { return } last = can.page.width() < can.page.height()
can.onmotion.delayOnce(can, function() { can.onengine.signal(can, chat.ONRESIZE, can.request(event, kit.Dict(html.HEIGHT, window.innerHeight, html.WIDTH, window.innerWidth))) }, 100, can._delay_resize = can._delay_resize||[]) can.onmotion.delayOnce(can, function() { can.onengine.signal(can, chat.ONRESIZE, can.request(event, kit.Dict(html.HEIGHT, window.innerHeight, html.WIDTH, window.innerWidth))) }, 100, can._delay_resize = can._delay_resize||[])