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

opt xterm.js

This commit is contained in:
IT 老营长 @云轩领航-创始人 2023-03-14 12:08:55 +08:00
parent 24403b7292
commit b02f8be174
12 changed files with 176 additions and 90 deletions

View File

@ -146,6 +146,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
msg.RunAction(event, can.core.Value(sub, chat._OUTPUTS_CURRENT), [ctx.ACTION, button]) || msg.RunAction(event, sub, [ctx.ACTION, button]) || sub.runAction(event, button) msg.RunAction(event, can.core.Value(sub, chat._OUTPUTS_CURRENT), [ctx.ACTION, button]) || msg.RunAction(event, sub, [ctx.ACTION, button]) || sub.runAction(event, button)
}) }) }) })
}), can.base.isFunc(cb) && cb(sub) }), can.base.isFunc(cb) && cb(sub)
sub.isCmdMode() && meta.index != web.CODE_VIMER && can.page.insertBefore(can, can.user.header(can), sub._output, sub._fields)
}); return sub }); return sub
}, },
_option: function(can, meta, option, skip) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []), opts = can.base.Obj(meta.opts, {}) _option: function(can, meta, option, skip) { var index = -1, args = can.base.Obj(meta.args||meta.arg, []), opts = can.base.Obj(meta.opts, {})
@ -155,11 +156,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
list: {name: web.REFRESH, cb: function(event) { can.Update(event) }}, list: {name: web.REFRESH, cb: function(event) { can.Update(event) }},
back: {name: "goback", cb: function(event) { can.onimport._back(can) }}, back: {name: "goback", cb: function(event) { can.onimport._back(can) }},
refresh: {name: web.REFRESH, cb: function(event) { can.Update(event) }}, refresh: {name: web.REFRESH, cb: function(event) { can.Update(event) }},
next: {name: mdb.NEXT}, next: {name: mdb.NEXT}, prev: {name: mdb.PREV}, play: {name: web.PLAY},
prev: {name: mdb.PREV}, // create: {name: mdb.CREATE}, insert: {name: mdb.CREATE},
// create: {name: mdb.CREATE},
// insert: {name: mdb.CREATE},
play: {name: web.PLAY},
"": {name: mdb.DELETE, cb: function(event) { can.onaction.close(event, can) }}, "": {name: mdb.DELETE, cb: function(event) { can.onaction.close(event, can) }},
}[item.name||""]; if (!icon) { return } item.style = "icons" }[item.name||""]; if (!icon) { return } item.style = "icons"
can.page.Append(can, option, [{view: [[html.ITEM, html.ICON, icon.name, item.name], html.DIV, can.page.unicode[icon.name]], title: item.name, onclick: icon.cb||function(event) { can.page.Append(can, option, [{view: [[html.ITEM, html.ICON, icon.name, item.name], html.DIV, can.page.unicode[icon.name]], title: item.name, onclick: icon.cb||function(event) {
@ -167,6 +165,8 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
msg.RunAction(event, can.core.Value(can, chat._OUTPUTS_CURRENT), cmds) || msg.RunAction(event, can, cmds) || can.Update(event, cmds) msg.RunAction(event, can.core.Value(can, chat._OUTPUTS_CURRENT), cmds) || msg.RunAction(event, can, cmds) || can.Update(event, cmds)
}}]) }}])
}) })
can.core.List(args.slice(can.core.List(meta.inputs, function(item) { if (item.type == mdb.TEXT) { return item } }).length), function(item, index) { meta.inputs.push({type: mdb.TEXT, name: "args"+index, value: item}) })
function add(item, next) { item = can.base.isString(item)? {type: html.TEXT, name: item}: item, item.type != html.BUTTON && index++ function add(item, next) { item = can.base.isString(item)? {type: html.TEXT, name: item}: item, item.type != html.BUTTON && index++
return Volcanos(item.name, {_root: can._root, _follow: can.core.Keys(can._follow, item.name), return Volcanos(item.name, {_root: can._root, _follow: can.core.Keys(can._follow, item.name),
_target: can.onappend.input(can, item, args[index]||opts[item.name], option||can._option), _option: option||can._option, _action: can._action, _output: can._output, _status: can._status, _target: can.onappend.input(can, item, args[index]||opts[item.name], option||can._option), _option: option||can._option, _action: can._action, _output: can._output, _status: can._status,
@ -179,9 +179,9 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
can.core.ItemCB(sub.onaction, function(key, cb) { sub._target[key] = function(event) { can.misc.Event(event, can, function(msg) { cb(event, sub, sub._target) })} }) can.core.ItemCB(sub.onaction, function(key, cb) { sub._target[key] = function(event) { can.misc.Event(event, can, function(msg) { cb(event, sub, sub._target) })} })
can.core.ItemCB(item, function(key, cb) { sub._target[key] = function(event) { can.misc.Event(event, can, function(msg) { cb(event, sub, sub._target) })} }) can.core.ItemCB(item, function(key, cb) { sub._target[key] = function(event) { can.misc.Event(event, can, function(msg) { cb(event, sub, sub._target) })} })
item.action && can.onappend.figure(sub, item, sub._target, function(_sub, value) { sub._target.value = value, can.Update() }) item.action && can.onappend.figure(sub, item, sub._target, function(_sub, value) { sub._target.value = value, can.Update() })
skip? next(): can.core.CallFunc([sub.onaction, chat._INIT], {can: sub, meta: item, cb: next, target: sub._target}) if (skip) { return } item.type == html.BUTTON && item.action == ice.AUTO && can.base.isUndefined(can._delay_init) && (auto = sub._target), next()
}) })
} can.core.Next(can.core.Value(can, [chat.ONIMPORT, mdb.LIST])||meta.inputs, add) }; var auto; can.core.Next(can.core.Value(can, [chat.ONIMPORT, mdb.LIST])||meta.inputs, add, function() { auto && auto.click() })
}, },
_action: function(can, list, action, meta) { meta = meta||can.onaction||{}, action = action||can._action, can.onmotion.clear(can, action) _action: function(can, list, action, meta) { meta = meta||can.onaction||{}, action = action||can._action, can.onmotion.clear(can, action)
function run(event, button) { can.misc.Event(event, can, function(msg) { var _can = can._fields? can.sup: can function run(event, button) { can.misc.Event(event, can, function(msg) { var _can = can._fields? can.sup: can
@ -232,6 +232,7 @@ Volcanos(chat.ONAPPEND, {_init: function(can, meta, list, cb, target, field) {
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.isCmdMode() && can.onappend.style(can, can.misc.Search(can, ctx.STYLE), can._target) can.isCmdMode() && can.onappend.style(can, can.misc.Search(can, ctx.STYLE), can._target)
can.page.style(can, can._output, html.HEIGHT, "", html.WIDTH, "")
if (can.isCmdMode()) { can.onimport.size(can, can.page.height(), can.page.width(), true) } if (can.isCmdMode()) { can.onimport.size(can, can.page.height(), can.page.width(), true) }
can.core.List([chat.FLOAT, chat.FULL, chat.CMD], function(mode) { can.page.ClassList.has(can, can._target, mode) && sub.onlayout[mode](sub) }) can.core.List([chat.FLOAT, chat.FULL, chat.CMD], function(mode) { can.page.ClassList.has(can, can._target, mode) && sub.onlayout[mode](sub) })
can.onmotion.story.auto(can, can._output), can.onexport.output(can, msg), can.base.isFunc(cb) && cb(msg) can.onmotion.story.auto(can, can._output), can.onexport.output(can, msg), can.base.isFunc(cb) && cb(msg)
@ -657,11 +658,13 @@ Volcanos(chat.ONMOTION, {_init: function(can, target) {
Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||document.body Volcanos(chat.ONKEYMAP, {_init: function(can, target) { target = target||document.body
can.onkeymap._build(can), target.onkeydown = function(event) { can.misc.Event(event, can, function(msg) { can.onkeymap._build(can), target.onkeydown = function(event) { can.misc.Event(event, can, function(msg) {
if (can.user.isWindows && event.ctrlKey) { can.onkeymap.prevent(event) } if (can.user.isWindows && event.ctrlKey) { can.onkeymap.prevent(event) }
if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } if (can.page.tagis(event.target, html.SELECT, html.INPUT)) { return }
// if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return }
can.onengine.signal(can, chat.ONKEYDOWN, can.request(event, {"model": can.user.isWebview && event.metaKey? "webview": "normal"})) can.onengine.signal(can, chat.ONKEYDOWN, can.request(event, {"model": can.user.isWebview && event.metaKey? "webview": "normal"}))
}) }, target.onkeyup = function(event) { can.misc.Event(event, can, function(msg) { }) }, target.onkeyup = function(event) { can.misc.Event(event, can, function(msg) {
if (can.user.isWindows && event.ctrlKey) { can.onkeymap.prevent(event) } if (can.user.isWindows && event.ctrlKey) { can.onkeymap.prevent(event) }
if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return } if (can.page.tagis(event.target, html.SELECT, html.INPUT)) { return }
// if (can.page.tagis(event.target, html.SELECT, html.INPUT, html.TEXTAREA)) { return }
can.onengine.signal(can, chat.ONKEYUP, can.request(event, {"model": "normal"})) can.onengine.signal(can, chat.ONKEYUP, can.request(event, {"model": "normal"}))
}) } }) }
}, },

View File

@ -41,7 +41,7 @@ table.content thead { position:sticky; top:2px; }
table.content th { background-color:steelblue; padding:2px 5px; } table.content th { background-color:steelblue; padding:2px 5px; }
table.content td { padding:2px 5px; } table.content td { padding:2px 5px; }
table.content.action th:last-child { position:sticky; right:2px; } table.content.action th:last-child { position:sticky; right:2px; }
table.content.action td:last-child { background-color:steelblue; max-width:150px; position:sticky; right:2px; } table.content.action td:last-child { background-color:steelblue; max-width:200px; position:sticky; right:2px; }
table.content.full { width:100%; } table.content.full { width:100%; }
div.code { background-color:#5066b945; font-size:14px; } div.code { background-color:#5066b945; font-size:14px; }
div.story[data-type=spark] { background-color:#2169a9a6; color:white; padding:5px 10px; border-left:blue solid 5px; } div.story[data-type=spark] { background-color:#2169a9a6; color:white; padding:5px 10px; border-left:blue solid 5px; }
@ -90,6 +90,7 @@ fieldset.input.date div.output td span.lunar.fest { color:red; }
fieldset.input.date div.status { text-align:center; } fieldset.input.date div.status { text-align:center; }
/* float */ /* float */
body div.float { background-color:#061c3ceb; padding:5px; overflow:auto; } body div.float { background-color:#061c3ceb; padding:5px; overflow:auto; }
// body div.float { background-color:#061c3ceb; padding:5px; overflow:auto; top:100px; }
body>div.toast div.title { color:blue; float:left; } body>div.toast div.title { color:blue; float:left; }
body>div.toast div.duration { color:gray; float:right; } body>div.toast div.duration { color:gray; float:right; }
body>div.toast div.content { color:blue; text-align:center; } body>div.toast div.content { color:blue; text-align:center; }
@ -123,7 +124,7 @@ legend>span.delete { font-size:1rem; margin-left:5px; margin-right:-15px; visibi
select, input { font-size:1rem; height:32px; } textarea { tab-size:2; height:93px; } input::placeholder { font-style:italic; } select, input { font-size:1rem; height:32px; } textarea { tab-size:2; height:93px; } input::placeholder { font-style:italic; }
table.content, div.item, div.code, div.story[data-type=spark] { white-space:pre; text-align:left; } table.content, div.item, div.code, div.story[data-type=spark] { white-space:pre; text-align:left; }
table.content, div.item, div.code, div.story[data-type=spark] { font-family:monospace; } table.content, div.item, div.code, div.story[data-type=spark] { font-family:monospace; }
fieldset>div.action>div.tabs { padding:5px; height:32px; } fieldset>div.action>div.tabs { font-style:italic; line-height:22px; padding:5px; height:32px; }
fieldset>div.status>div.item { padding:5px; height:31px; float:left; } fieldset>div.status>div.item { padding:5px; height:31px; float:left; }
fieldset>div.status>div.item>label { font-size:0.6rem; } fieldset>div.status>div.item>label { font-size:0.6rem; }
/* display */ /* display */
@ -142,9 +143,10 @@ fieldset.plug div.output table.content { width:100%; }
// fieldset.plugin>div.output>fieldset.story { position:sticky; left:0; } // fieldset.plugin>div.output>fieldset.story { position:sticky; left:0; }
div.output { position:relative; } div.output { position:relative; }
div.tabs { position:relative; } div.tabs { position:relative; }
div.tabs span.icon { margin-left:5px; visibility:hidden; } div.tabs span.icon { margin-left:10px; visibility:hidden; }
div.tabs span.icon:hover { background-color:aliceblue; color:black; } div.tabs span.icon:hover { background-color:aliceblue; color:black; }
div.tabs>div:hover span.icon { visibility:visible; } div.tabs>div:hover span.icon { visibility:visible; }
div.action>div.tabs:hover span.icon { visibility:visible; }
div.tabs>div.select span.icon { visibility:visible; } div.tabs>div.select span.icon { visibility:visible; }
div.code { position:sticky; left:0; } div.code { position:sticky; left:0; }
div.plug { font-style:italic; } div.plug { font-style:italic; }
@ -282,6 +284,10 @@ body.mobile fieldset.Footer input[name=cmd] { height:3rem; }
body.mobile fieldset.input.date div.output td { padding:8px 20px; } body.mobile fieldset.input.date div.output td { padding:8px 20px; }
body.mobile fieldset.word.float>div.output>div.project { top:38px; } body.mobile fieldset.word.float>div.output>div.project { top:38px; }
/* misc */ /* misc */
fieldset.cmd>div.item.time { padding:5px 10px; line-height:22px; float:right; }
fieldset.cmd>div.item.avatar { padding:0; float:right; height:32px; }
fieldset.cmd>div.item.avatar>img { height:32px; }
fieldset.cmd>div.item.usernick { padding:5px 10px; line-height:22px; float:right; }
fieldset.panel.Action.cmd>div.toggle.project { display:none; } fieldset.panel.Action.cmd>div.toggle.project { display:none; }
fieldset.panel.Search div.story[data-type=spark] { margin:0; } fieldset.panel.Search div.story[data-type=spark] { margin:0; }
fieldset.panel.Search a { color:yellow; } fieldset.panel.Search a { color:yellow; }
@ -296,10 +302,10 @@ fieldset.plugin.inner.cmd>div.action { display:none; }
fieldset.plugin.inner.cmd>form.option { display:none; } fieldset.plugin.inner.cmd>form.option { display:none; }
fieldset.plugin.inner.cmd fieldset.xterm>form.option>div.item.text>input { width:320px; } fieldset.plugin.inner.cmd fieldset.xterm>form.option>div.item.text>input { width:320px; }
fieldset.plan div.output table.content { height:100%; width:100%; } fieldset.plan div.output table.content { height:100%; width:100%; }
fieldset.xterm div.toggle { display:none; }
fieldset.xterm div.output.select { border:blue solid 1px; }
fieldset.xterm.output>div.output { overflow:hidden; }
fieldset.xterm div.output { border-left:gray solid 1px; border-top:gray solid 1px; } fieldset.xterm div.output { border-left:gray solid 1px; border-top:gray solid 1px; }
fieldset.xterm div.output.select { border:blue solid 1px; }
fieldset.xterm div.action>div.tabs.select { color:blue; }
fieldset.xterm.output>div.output { overflow:hidden; }
div.layout.flex>div.output { float:left; clear:none; } div.layout.flex>div.output { float:left; clear:none; }
fieldset>div.layout { clear:both; } fieldset>div.layout { clear:both; }
fieldset.draw td.content { position:relative; } fieldset.draw td.content { position:relative; }

View File

@ -175,7 +175,9 @@ 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() { var args = this._args(log.ERROR, arguments); args.push(ice.NL, this._stacks().slice(1).join(ice.NL)), console.error.apply(console, args), this._signal(args); debugger }, Error: function() {
var args = this._args(log.ERROR, arguments); args.push(ice.NL, this._stacks().slice(1).join(ice.NL)), console.error.apply(console, args), this._signal(args); debugger
},
Debug: function() { var args = this._args(log.DEBUG, arguments); args.push(ice.NL, this._stacks().slice(1, 4).join(ice.NL)), console.debug.apply(console, args), this._signal(args) }, Debug: function() { var args = this._args(log.DEBUG, arguments); args.push(ice.NL, this._stacks().slice(1, 4).join(ice.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 }
@ -193,10 +195,11 @@ Volcanos("misc", {
for (var i = -depth+1; i < list.length; i++) { var pos = split(i); if (pos.path != current.path) { return pos } } for (var i = -depth+1; i < list.length; i++) { var pos = split(i); if (pos.path != current.path) { return pos } }
} return split(depth)||{} } return split(depth)||{}
}, },
_stacks: function() { var list = ((new Error()).stack||"").split(ice.NL).slice(2) _stacks: function(n, s) { var list = ((s||(new Error())).stack||"").split(ice.NL).slice(typeof n == undefined? 2: n)
for (var i = 0; i < list.length; i++) { var ls = list[i].trim().split(ice.SP) for (var i = 0; i < list.length; i++) { var ls = list[i].trim().split(ice.SP)
list[i] = ls.pop().trim(); if (list[i][0] == "(") { list[i] = list[i].slice(1, -1) } list[i] = ls.pop().trim(); if (list[i][0] == "(") { list[i] = list[i].slice(1, -1) }
list[i] = ice.TB+list[i]; if (ls.length > 1) { list[i] += ice.TB+ls.pop() } list[i] = ice.TB+list[i]; if (ls.length > 1) { list[i] += ice.TB+ls.pop() }
list[i] = list[i].replace(/\?[^:]+/, "").replace(location.origin, "")
} return list } return list
}, _stack: function() { return ((new Error()).stack||"").split(ice.NL).slice(2) }, }, _stack: function() { return ((new Error()).stack||"").split(ice.NL).slice(2) },
_time: function() { var now = new Date() _time: function() { var now = new Date()

View File

@ -225,9 +225,10 @@ Volcanos("page", {
while (list.node.childNodes.length > 0) { var item = list.node.childNodes[0]; item.parentNode.removeChild(item), output.appendChild(item) } while (list.node.childNodes.length > 0) { var item = list.node.childNodes[0]; item.parentNode.removeChild(item), output.appendChild(item) }
return delete(cache[name]), list.data return delete(cache[name]), list.data
}, },
insertBefore: function(can, list, before, parent) { parent = parent||before.parentNode insertBefore: function(can, target, before, parent) { parent = parent||before.parentNode
var target = can.base.isArray(list)? can.page.Append(can, parent, list)._target: list if (can.base.isArray(target)) {
return before && parent.insertBefore(target, before), target return can.core.List(target, function(item) { var target = can.page.Append(can, parent, [item])._target; return parent.insertBefore(target, before), target })[0]
} return before && parent.insertBefore(target, before), target
}, },
styleHeight: function(can, target, value) { return can.page.style(can, target, html.HEIGHT, value), target.offsetHeight }, styleHeight: function(can, target, value) { return can.page.style(can, target, html.HEIGHT, value), target.offsetHeight },
styleWidth: function(can, target, value) { return can.page.style(can, target, html.WIDTH, value), target.offsetWidth }, styleWidth: function(can, target, value) { return can.page.style(can, target, html.WIDTH, value), target.offsetWidth },

View File

@ -65,7 +65,7 @@ Volcanos("user", {
return fmt == "%W"? list: can.base.Time(time, (fmt||"%y-%m-%d %H:%M:%S").replace("%w", list[now.getDay()])) return fmt == "%W"? list: can.base.Time(time, (fmt||"%y-%m-%d %H:%M:%S").replace("%w", list[now.getDay()]))
}, },
toastConfirm: function(can, content, title, action) { toastConfirm: function(can, content, title, action) {
if (!action.list || action.list.length == 0) { action = shy({confirm: action}, ["confirm", "cancel"], function() {}) } if (!action.list || action.list.length == 0) { action = shy({confirm: action}, ["confirm", web.CANCEL], function() {}) }
var carte = can.user.toast(can, {content: content, title: title, action: action||[cli.CLOSE], duration: -1}) var carte = can.user.toast(can, {content: content, title: title, action: action||[cli.CLOSE], duration: -1})
can.page.style(can, carte._target, html.TOP, 200, html.BOTTOM, ""); return carte can.page.style(can, carte._target, html.TOP, 200, html.BOTTOM, ""); return carte
}, },
@ -153,7 +153,7 @@ Volcanos("user", {
})}]}, html.ACTION, })}]}, html.ACTION,
]}]) ]}])
var action = can.onappend._action(can, button||[html.SUBMIT, html.CANCEL], ui.action, { var action = can.onappend._action(can, button||[html.SUBMIT, html.CANCEL], ui.action, {
_trans: {submit: msg.Option("submit")}, _trans: {submit: msg.Option(web.SUBMIT)},
focus: function() { can.onmotion.focus(can, can.page.Select(can, ui._target, html.INPUT_ARGS)[0]) }, focus: function() { can.onmotion.focus(can, can.page.Select(can, ui._target, html.INPUT_ARGS)[0]) },
cancel: function() { can.page.Remove(can, ui._target) }, cancel: function() { can.page.Remove(can, ui._target) },
submit: function(event, can, button) { var args = [], data = {}, err = false submit: function(event, can, button) { var args = [], data = {}, err = false
@ -196,7 +196,7 @@ Volcanos("user", {
}, },
toimage: function(can, name, target, silent) { var toast = can.user.toastProcess(can, "生成中...") toimage: function(can, name, target, silent) { var toast = can.user.toastProcess(can, "生成中...")
can.require(["https://cdn.jsdelivr.net/npm/html2canvas@1.0.0-rc.5/dist/html2canvas.min.js"], function() { toast.close() can.require(["https://cdn.jsdelivr.net/npm/html2canvas@1.0.0-rc.5/dist/html2canvas.min.js"], function() { toast.close()
html2canvas(target||can._target).then(function (canvas) { var url = canvas.toDataURL("image/png") html2canvas(target||can._target).then(function (canvas) { var url = canvas.toDataURL(web.IMAGE_PNG)
silent? (can.user.download(can, url, name, nfs.PNG), can.user.toastSuccess(can)): can.user.toastImage(can, name, url) silent? (can.user.download(can, url, name, nfs.PNG), can.user.toastSuccess(can)): can.user.toastImage(can, name, url)
}) })
}) })
@ -217,8 +217,7 @@ Volcanos("user", {
]} } ]} }
var ui = can.onappend.tabview(can, { var ui = can.onappend.tabview(can, {
"扫码授权": function(target) { can.misc.WSS(can, {type: aaa.LOGIN, name: "", "sess.theme": can.getHeaderTheme()}, function(cmd, arg) { "扫码授权": function(target) { can.misc.WSS(can, {type: aaa.LOGIN, name: "", "sess.theme": can.getHeaderTheme()}, function(cmd, arg) {
var _cmd = " space login "+arg[0] if (cmd == cli.PWD) { var _cmd = " space login "+arg[0]; return can.page.Modify(can, target, arg[2]), can.page.Append(can, target, [
if (cmd == cli.PWD) { return can.page.Modify(can, target, arg[2]), can.page.Append(can, target, [
{text: "<br/>请授权: "+_cmd, title: "点击复制,并后台执行此命令,即可登录", style: {cursor: "copy"}, onclick: function() { can.user.copy(event, can, _cmd) }}, {text: "<br/>请授权: "+_cmd, title: "点击复制,并后台执行此命令,即可登录", style: {cursor: "copy"}, onclick: function() { can.user.copy(event, can, _cmd) }},
]), can.onmotion.delay(can, function() { layout() }, 10) } ]), can.onmotion.delay(can, function() { layout() }, 10) }
if (cmd == ice.MSG_SESSID) { return can.misc.CookieSessid(can, arg[0]), can.page.Remove(can, ui._target), can.base.isFunc(cb) && cb() } if (cmd == ice.MSG_SESSID) { return can.misc.CookieSessid(can, arg[0]), can.page.Remove(can, ui._target), can.base.isFunc(cb) && cb() }
@ -234,7 +233,21 @@ Volcanos("user", {
}, can.base.Obj(method, can.user.isMobile? ["密码登录"]: ["扫码授权"]), can.page.Append(can, document.body, [{view: "input login float"}])._target) }, can.base.Obj(method, can.user.isMobile? ["密码登录"]: ["扫码授权"]), can.page.Append(can, document.body, [{view: "input login float"}])._target)
can.onmotion.delay(can, function() { layout() }) can.onmotion.delay(can, function() { layout() })
}, },
logout: function(can) { can.user.toastConfirm(can, "logout", "", function() { can.runAction({}, aaa.LOGOUT, [], function(msg) { logout: function(can) { can.user.toastConfirm(can, aaa.LOGOUT, "", function() { can.runAction({}, aaa.LOGOUT, [], function(msg) {
can.misc.Search(can, chat.SHARE)? can.misc.Search(can, chat.SHARE, ""): can.user.reload(true) can.misc.Search(can, chat.SHARE)? can.misc.Search(can, chat.SHARE, ""): can.user.reload(true)
}) }) }, }) }) },
header: function(can) { var header = can._root.Header
var meta = {
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) {})
}},
avatar: {view: [[html.ITEM, aaa.AVATAR]], list: [{img: can.user.info.avatar}], onclick: function(event) {
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)
}},
}; return can.core.List(can.base.getValid(can.core.List(arguments).slice(1), [mdb.TIME, aaa.AVATAR, aaa.USERNICK]), function(item) { return meta[item] })
}
}) })

View File

@ -59,7 +59,9 @@ Volcanos(chat.ONACTION, {_init: function(can, target) {
if (arg[0] == mdb.PLUGIN) { can.onexport.plugin(can, msg, arg, fields) } if (arg[0] == mdb.PLUGIN) { can.onexport.plugin(can, msg, arg, fields) }
if (arg[0] == ctx.COMMAND) { can.onexport.command(can, msg, arg, fields) } if (arg[0] == ctx.COMMAND) { can.onexport.command(can, msg, arg, fields) }
}, },
onkeydown: function(can, msg, model) { if (can.isCmdMode() && !msg._event.metaKey) { return } onkeydown: function(can, msg, model) { if (can.isCmdMode() && !msg._event.metaKey) {
var sub = can.core.Value(can._plugins[0], chat._OUTPUTS_CURRENT); sub && can.core.CallFunc([sub, "onaction.onkeydown"], {event: msg._event, can: sub}); return
}
if (can.onkeymap.selectCtrlN(msg._event, can, can._action, html.DIV_ITEM)) { return } if (can.onkeymap.selectCtrlN(msg._event, can, can._action, html.DIV_ITEM)) { return }
can._keylist = can.onkeymap._parse(msg._event, can, model, can._keylist||[], can._output) can._keylist = can.onkeymap._parse(msg._event, can, model, can._keylist||[], can._output)
}, },

View File

@ -8,7 +8,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg) { can.onmotion.clear(can, can
_size: function(can) { can.getActionSize(function(left, top, width, height) { _size: function(can) { can.getActionSize(function(left, top, width, height) {
can.page.style(can, can._target, {left: left||0, top: top||0, width: width}), can.page.style(can, can._output, html.MAX_HEIGHT, height -= 2*html.PLUGIN_MARGIN+html.ACTION_HEIGHT+can.onexport.statusHeight(can)) can.page.style(can, can._target, {left: left||0, top: top||0, width: width}), can.page.style(can, can._output, html.MAX_HEIGHT, height -= 2*html.PLUGIN_MARGIN+html.ACTION_HEIGHT+can.onexport.statusHeight(can))
can.core.List([can.ui.content, can.ui.display], function(target) { can.page.style(can, target, html.MAX_WIDTH, can.ConfWidth(width-2*html.PLUGIN_MARGIN)) }) can.core.List([can.ui.content, can.ui.display], function(target) { can.page.style(can, target, html.MAX_WIDTH, can.ConfWidth(width-2*html.PLUGIN_MARGIN)) })
can.ConfHeight(can.base.Min(height-can.ui.content.offsetHeight-can.ui.display.offsetHeight+can.onexport.statusHeight(can)-1, 320)) can.ConfHeight(can.base.Min(height-can.ui.content.offsetHeight-can.ui.display.offsetHeight+can.onexport.statusHeight(can)-1, height/2))
}) }, }) },
_input: function(can, msg, arg, fields) { if (can.base.contains(arg[1], ";")) { arg = can.core.Split(arg[1], "\t ;", "\t ;") } _input: function(can, msg, arg, fields) { if (can.base.contains(arg[1], ";")) { arg = can.core.Split(arg[1], "\t ;", "\t ;") }
can.run(can.request({}, {fields: fields.join(ice.FS)}, msg), arg, function(res) { can.db.type = arg[0] can.run(can.request({}, {fields: fields.join(ice.FS)}, msg), arg, function(res) { can.db.type = arg[0]

View File

@ -37,10 +37,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl
can.onimport._tabview(can, args[args.length-3]||can.Option(nfs.PATH), args[args.length-2]||can.Option(nfs.FILE), args[args.length-1]) can.onimport._tabview(can, args[args.length-3]||can.Option(nfs.PATH), args[args.length-2]||can.Option(nfs.FILE), args[args.length-1])
} }), can.base.isFunc(cb) && cb(msg) } }), can.base.isFunc(cb) && cb(msg)
}, },
_keydown: function(can) { can.onkeymap._build(can), can._root.onengine.listen(can, chat.ONKEYDOWN, function(event) { _keydown: function(can) { can.onkeymap._build(can) },
if (can.onkeymap.selectCtrlN(event, can, can.ui.tabs, html.DIV_TABS)) { return }
can.db._key_list = can.onkeymap._parse(event, can, mdb.PLUGIN, can.db._key_list, can.ui.content)
}) },
_tabs: function(can) { if (!can.isCmdMode()) { return can.ui.tabs = can._action } _tabs: function(can) { if (!can.isCmdMode()) { return can.ui.tabs = can._action }
can.user.isMobile || can.core.List([ can.user.isMobile || can.core.List([
{name: can.page.unicode.menu, onclick: function() { {name: can.page.unicode.menu, onclick: function() {
@ -60,12 +57,7 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb, target) { can.onmotion.cl
}) })
}}, }},
], function(item) { can.page.Append(can, can.ui.tabs, [can.base.Copy(item, {view: [[html.ICON, web.WEBSITE], html.DIV, item.name]})]) }) ], function(item) { can.page.Append(can, can.ui.tabs, [can.base.Copy(item, {view: [[html.ICON, web.WEBSITE], html.DIV, item.name]})]) })
can.user.isMobile || can.page.Append(can, can.ui.tabs, [{view: mdb.TIME, _init: function(target) { can.page.Append(can, can.ui.tabs, can.user.header(can))
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.page.Append(can, can.ui.tabs, [{view: aaa.AVATAR, list: [{img: can.user.info.avatar}], onclick: function(event) { can._root.Header.onaction.avatar(event, can._root.Header) }}])
can.page.Append(can, can.ui.tabs, [{view: [aaa.USERNICK, "", can.user.info.usernick], onclick: function(event) { can._root.Header.onaction.usernick(event, can._root.Header) }}])
}, },
__tabPath: function(can, skip) { can.onmotion.clear(can, can.ui.path) __tabPath: function(can, skip) { can.onmotion.clear(can, can.ui.path)
can.onimport._tabPath(can, ice.PS, nfs.PATH, can.base.Path(can.Option(nfs.PATH), can.Option(nfs.FILE)), function(ls) { can.onimport._tabPath(can, ice.PS, nfs.PATH, can.base.Path(can.Option(nfs.PATH), can.Option(nfs.FILE)), function(ls) {
@ -531,6 +523,10 @@ Volcanos(chat.ONACTION, {list: ["调试", "首页", "官网", "源码", "百度"
}, close: function() { can.page.Remove(can, ui._target) }, }, close: function() { can.page.Remove(can, ui._target) },
}); var from, to }); var from, to
}, },
onkeydown: function(event, can) {
if (can.onkeymap.selectCtrlN(event, can, can.ui.tabs, html.DIV_TABS)) { return }
can.db._key_list = can.onkeymap._parse(event, can, mdb.PLUGIN, can.db._key_list, can.ui.content)
},
}) })
Volcanos(chat.ONEXPORT, {list: [mdb.COUNT, mdb.TYPE, nfs.FILE, nfs.LINE, ice.BACK], Volcanos(chat.ONEXPORT, {list: [mdb.COUNT, mdb.TYPE, nfs.FILE, nfs.LINE, ice.BACK],
size: function(can, size, full) { if (size > 1) { return size } if (size > 0) { return size*full } }, size: function(can, size, full) { if (size > 1) { return size } if (size > 0) { return size*full } },
@ -556,39 +552,43 @@ Volcanos(chat.ONEXPORT, {list: [mdb.COUNT, mdb.TYPE, nfs.FILE, nfs.LINE, ice.BAC
} } } } } }
var package = "", block = "", current = can.Option(nfs.LINE), percent = " = "+parseInt(can.Option(nfs.LINE)*100/(can.db.max||1))+"%" var package = "", block = "", current = can.Option(nfs.LINE), percent = " = "+parseInt(can.Option(nfs.LINE)*100/(can.db.max||1))+"%"
can.page.Select(can, can.ui.content, "tr.line>td.text", function(item, index) { var text = item.innerText, _indent = indent(text) can.page.Select(can, can.ui.content, "tr.line>td.text", function(item, index) { var text = item.innerText, _indent = indent(text)
function push(item) { list.push(item); if (index < can.Option(nfs.LINE)) { current = list[list.length-1], percent = " = "+parseInt((index+1)*100/(can.db.max||1))+"%" } } function push(item) { list.push(item+(item? ice.DF+(index+1): "")); if (index < can.Option(nfs.LINE)) { current = list[list.length-1], percent = " = "+parseInt((index+1)*100/(can.db.max||1))+"%" } }
if (can.db.parse == nfs.JS) { var ls = can.core.Split(text, "\t (,", ice.DF) if (can.db.parse == nfs.CSS) {
if (text.indexOf("/* ") == 0) {
push(can.base.trimPrefix(can.base.trimSuffix(text, " */"), "/* "))
}
} else if (can.db.parse == nfs.JS) { var ls = can.core.Split(text, "\t (,", ice.DF)
if (_indent == 0 && can.base.beginWith(text, "Volcanos")) { if (_indent == 0 && can.base.beginWith(text, "Volcanos")) {
var _block = can.base.trimPrefix(ls[1], "chat.").toLowerCase() var _block = can.base.trimPrefix(ls[1], "chat.").toLowerCase()
if (_block != block) { push("") } block = _block if (_block != block) { push("") } block = _block
if (text.indexOf(chat._INIT) > -1) { push(block+ice.PT+chat._INIT+ice.DF+(index+1)) } if (text.indexOf(chat._INIT) > -1) { push(block+ice.PT+chat._INIT) }
} else if (_indent == 0 && can.base.beginWith(text, "var ")) { } else if (_indent == 0 && can.base.beginWith(text, "var ")) {
block = ls[1] block = ls[1]
} else if (_indent == 4 && ls[1] == ice.DF) { } else if (_indent == 4 && ls[1] == ice.DF) {
ls[0] && push(block+ice.PT+ls[0]+ice.DF+(index+1)) ls[0] && push(block+ice.PT+ls[0])
} }
} else if (can.db.parse == nfs.SH) { } else if (can.db.parse == nfs.SH) {
if (can.base.endWith(text, "() {")) { if (can.base.endWith(text, "() {")) {
var ls = can.core.Split(text, "\t (){") var ls = can.core.Split(text, "\t (){")
push(ls[0]+ice.DF+(index+1)) push(ls[0])
} }
} else if (can.db.parse == nfs.GO) { var ls = can.core.Split(text, "\t *", "({:})") } else if (can.db.parse == nfs.GO) { var ls = can.core.Split(text, "\t *", "({:})")
if (_indent == 0) { if (_indent == 0) {
switch (ls[0]) { switch (ls[0]) {
case "package": package = ls[1]; break case "package": package = ls[1]; break
case "func": if (ls[1] == "(") { ls[1] = ls[2]+ice.PT+ls[5] case "func": if (ls[1] == "(") { ls[1] = ls[2]+ice.PT+ls[5]
if (ls[5].toLowerCase()[0] == ls[5][0]) { push("- "+ls[1]+ice.DF+(index+1)) } else { push("+ "+ls[1]+ice.DF+(index+1)) } break if (ls[5].toLowerCase()[0] == ls[5][0]) { push("- "+ls[1]) } else { push("+ "+ls[1]) } break
} }
case "type": case "type":
case "var": case "var":
if (ls[1].toLowerCase()[0] == ls[1][0]) { push("- "+ls[1]+ice.DF+(index+1)) } else { push("+ "+package+ice.PT+ls[1]+ice.DF+(index+1)) } break if (ls[1].toLowerCase()[0] == ls[1][0]) { push("- "+ls[1]) } else { push("+ "+package+ice.PT+ls[1]) } break
} }
} else if (_indent == 4) { } else if (_indent == 4) {
if (text.indexOf("MergeCommands(") > -1) { block = "cmds" } else if (text == "})") { block = "" } if (text.indexOf("MergeCommands(") > -1) { block = "cmds" } else if (text == "})") { block = "" }
} else if (_indent == 8) { } else if (_indent == 8) {
if (block == "cmds" && ls[1] == ice.DF) { push("+ "+package+ice.PT+ls[0]+ice.DF+(index+1)), block = package+ice.PT+ls[0] } if (block == "cmds" && ls[1] == ice.DF) { push("+ "+package+ice.PT+ls[0]), block = package+ice.PT+ls[0] }
} else if (_indent == 12) { } else if (_indent == 12) {
if (block && ls[1] == ice.DF) { push("+ "+block+ice.SP+ls[0]+ice.DF+(index+1)) } if (block && ls[1] == ice.DF) { push("+ "+block+ice.SP+ls[0]) }
} }
} }
}); return {list: list, current: current, percent: percent} }); return {list: list, current: current, percent: percent}

View File

@ -233,7 +233,6 @@ Volcanos(chat.ONKEYMAP, {
g: shy("查找搜索", function(event, can) { can.onaction.find(event, can) }), g: shy("查找搜索", function(event, can) { can.onaction.find(event, can) }),
}, },
normal: { normal: {
f: shy("打开文件", function(event, can) { can.onaction.open(event, can) }),
s: shy("保存文件", function(event, can) { can.onaction.save(event, can, nfs.SAVE) }), s: shy("保存文件", function(event, can) { can.onaction.save(event, can, nfs.SAVE) }),
c: shy("编译项目", function(event, can) { can.onaction.compile(event, can, code.COMPILE) }), c: shy("编译项目", function(event, can) { can.onaction.compile(event, can, code.COMPILE) }),

View File

@ -1,14 +1,18 @@
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) 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)
can.sup.onexport.link = function() { return can.misc.MergePodCmd(can, {cmd: web.CODE_XTERM, hash: item.hash, style: html.OUTPUT}) } can.sup.onexport.link = function() { return can.misc.MergePodCmd(can, {pod: can.Conf(ice.POD), cmd: web.CODE_XTERM, hash: item.hash, style: html.OUTPUT}) }
}) }, }) },
_layout: function(can, item) { _layout: function(can, item) {
function connect(item, output, tabs) { can.run(can.request({}, item), [item.hash], function(msg) {
can.core.Item(msg.TableDetail(), function(key, value) { item[key] = value })
can.onappend._status(can), can.onimport._connect(can, item, output, tabs)
}, true); return output }
function show(list, target, root, tabs) { root = root||target, can.core.List(list, function(item) { function show(list, target, root, tabs) { root = root||target, can.core.List(list, function(item) {
if (item.type.indexOf(html.LAYOUT) == 0) { if (item.type.indexOf(html.LAYOUT) == 0) {
show(item.list, can.page.Append(can, target, [item.type])._target, root, tabs)._root = root show(item.list, can.page.Append(can, target, [item.type])._target, root, tabs)._root = root
} else { } else {
can.onimport._connect(can, item, can.page.Append(can, target, [html.OUTPUT])._target, tabs)._output._root = root connect(item, can.page.Append(can, target, [html.OUTPUT])._target, tabs)._root = root
} }
}); return target } }); return target }
var main, output = can._output; can.core.List(can.base.Obj(item.text), function(item) { var main, output = can._output; can.core.List(can.base.Obj(item.text), function(item) {
@ -16,77 +20,129 @@ Volcanos(chat.ONIMPORT, {_init: function(can, msg, cb) { can.page.requireModules
var target = show(item.list, can.page.insertBefore(can, [item.type], can._status), null, tabs); target._tabs = tabs, tabs._output = target var target = show(item.list, can.page.insertBefore(can, [item.type], can._status), null, tabs); target._tabs = tabs, tabs._output = target
if (item.type.indexOf(html.HIDE) == -1) { main = target } if (item.type.indexOf(html.HIDE) == -1) { main = target }
} else { } else {
main = main||can.onimport._connect(can, item, output||can.page.insertBefore(can, [html.OUTPUT], can._status))._output, output = null var target = connect(item, output||can.page.insertBefore(can, [html.OUTPUT], can._status)); output = null
main = main||target
} }
}), can.onaction.select(can, main) }), can.onaction.select(can, main)
}, },
_tabs: function(can, item, output) { if (output != output._root && output._root) { return output._tabs = output._root._tabs } _tabs: function(can, item, output) { if (output != output._root && output._root) { return output._tabs = output._root._tabs }
var tabs = can.page.Append(can, can._action, [{view: [html.TABS, "", item.name||item.type||item.hash], onclick: function() { var tabs = can.onimport.tabs(can, [{name: item.name||item.type||item.hash}], function() {
can.onaction.select(can, tabs._output) can.onmotion.delay(can, function() { var output = tabs._output; can.onaction.select(can, output._root||output) })
}}])._target; return tabs._output = output, output._tabs = tabs }, function() { can.onaction.delete(can, tabs._output) }); return tabs._output = output, output._tabs = tabs
}, },
_theme: function(can, item) { return can.base.Obj(item.theme)||(can.getHeaderTheme() == html.LIGHT? {background: cli.WHITE, foreground: cli.BLACK, cursor: cli.BLUE}: {}) }, _theme: function(can, item) { return can.base.Obj(item.theme)||(can.getHeaderTheme() == html.LIGHT? {background: cli.WHITE, 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))
var fitAddon = new FitAddon.FitAddon(); term.loadAddon(fitAddon), term._fit = fitAddon, can.onmotion.delay(can, function() { fitAddon.fit() }) var fitAddon = new FitAddon.FitAddon(); term.loadAddon(fitAddon), term._fit = fitAddon, can.onmotion.delay(can, function() { fitAddon.fit() })
term.onTitleChange(function(title) { can.onexport.title(can, title) }), can.onexport.title(can, item.name) term.onTitleChange(function(title) { can.onexport.title(can, term, title) }), can.onexport.title(can, term, item.name)
term.onResize(function(size) { can.onimport._resize(can, term, size) }) term.onResize(function(size) { can.onimport._resize(can, term, size) })
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())
term._item = item, term._output = output, output._term = term, output._tabs || (tabs? (output._tabs = tabs): can.onimport._tabs(can, item, output)) can.onmotion.clear(can, output), term.open(output), term.focus(), text && can.onmotion.delay(can, function() { term.write(text.replaceAll(ice.NL, "\r\n")) })
term.open(output), term.focus(), text && term.write(text.replaceAll(ice.NL, "\r\n"))
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(), ice.NL)) term.selectAll(), can.onimport._connect(can, item, output, tabs, can.base.trimSuffix(term.getSelection(), ice.NL))
}), can.page.style(can, output, html.BACKGROUND_COLOR, term._publicOptions.theme.background||cli.BLACK) }), can.page.style(can, output, html.BACKGROUND_COLOR, term._publicOptions.theme.background||cli.BLACK)
output.onclick = function() { can.onmotion.select(can, can._fields, html.DIV_OUTPUT, can._output = output), can.onexport.term(can, term) } output.onclick = function() { output._tabs._current = output
return can.db = can.db||{}, can.db[item.hash] = term can.onmotion.select(can, can._fields, html.DIV_OUTPUT, can._output = output), term.focus(), can.onexport.term(can, 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) }) }, _resize: function(can, term, size) { can.runAction(can.request({}, size, term._item), web.RESIZE, [], function() { can.onexport.term(can, term) }) },
_input: function(can, term, data) { can._output = term._output, can.runAction(can.request({}, term._item), web.INPUT, [btoa(data)], function() {}) }, _input: function(can, term, data) {
if (data == "\u0013") { can._delay = true
can.onmotion.delay(can, function() { can._delay && can.runAction(can.request({}, term._item), web.INPUT, [btoa(data)], function() {}) })
} else {
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._output = term._output, can.runAction(can.request({}, term._item), web.INPUT, [btoa(data)], function() {})
}
},
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]) }, 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]) },
layout: function(can) { function show(target, height, width) { var list = can.page.SelectChild(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT)) layout: function(can) { function show(target, height, width) { var list = can.page.SelectChild(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT))
var h = height/list.length, w = width; if (can.page.ClassList.has(can, target, html.FLEX)) { h = height, w = width/list.length } if (target == can._fields) { h = height, w = width } var h = height/list.length, w = width; if (can.page.ClassList.has(can, target, html.FLEX)) { h = height, w = width/list.length } if (target == can._fields) { h = height, w = width }
can.core.List(list, function(target) { can.page.style(can, target, html.HEIGHT, h, html.WIDTH, w), can.page.ClassList.has(can, target, html.LAYOUT)? show(target, h, w): target._term && target._term._fit.fit() }) can.core.List(list, function(target) { can.page.style(can, target, html.HEIGHT, h, html.WIDTH, w), can.page.ClassList.has(can, target, html.LAYOUT)? show(target, h, w): target._term && target._term._fit.fit() })
} show(can._fields, can.ConfHeight(), can.ConfWidth()) }, } show(can._fields, can.ConfHeight(), can.ConfWidth()) },
}) })
Volcanos(chat.ONACTION, {list: ["+", "-", "/", "sess"], Volcanos(chat.ONKEYMAP, {
"+": function(event, can) { can.Update(event, [ctx.ACTION, mdb.CREATE], function(msg) { can.Update(event, [msg.Result()], function(msg) { _mode: {
normal: {
u: function(event, can) { can.onaction.split(event, can, html.FLOW) },
v: function(event, can) { can.onaction.split(event, can, html.FLEX) },
j: function(event, can) { can.onaction.selectSibling(can, html.FLOW) },
k: function(event, can) { can.onaction.selectSibling(can, html.FLOW, true) },
h: function(event, can) { can.onaction.selectSibling(can, html.FLEX, true) },
l: function(event, can) { can.onaction.selectSibling(can, html.FLEX) },
c: function(event, can) { can.onaction.tabnew(event, can) },
e: function(event, can) { can.user.input({target: can._output._tabs}, can, [mdb.NAME], function(list) { can.onexport.title(can, can._output._term, list[0]) }) },
n: function(event, can) { can._output._tabs.nextSibling && can._output._tabs.nextSibling.click() },
p: function(event, can) { can._output._tabs.previousSibling && can._output._tabs.previousSibling.click() },
s: function(event, can) { can.onaction.sess(event, can) },
t: function(event, can) { can.user.input({target: can._output._tabs}, can, [ctx.INDEX, ctx.ARGS], function(list, data) { can.onimport.tool(can, [data], function(sub) {
sub.select(), sub.onexport.record = function(_, value) { can.onimport._input(can, can._output._term, value+ice.NL) }
}, can._fields) }) },
f: function(event, can) {
var input = can.user.input({target: can._output._tabs}, can, [{type: mdb.TEXT, name: mdb.NAME, select: function(item) {
input.submit(event, can, "submit")
}, run: function(event, cmds, cb) { var msg = can.request(event)
can.page.Select(can, can._action, [html.DIV_TABS, html.SPAN_NAME], function(target) { msg.Push(mdb.NAME, target.innerText) })
cb(msg)
}}], function(list) {
})
},
},
}, _engine: {},
})
Volcanos(chat.ONACTION, {
tabnew: function(event, can) { can.Update(event, [ctx.ACTION, mdb.CREATE], function(msg) { can.Update(event, [msg.Result()], function(msg) {
can.onaction.select(can, can._output = can.page.insertBefore(can, [html.OUTPUT], can._status)), can.onimport._init(can, msg) can.onaction.select(can, can._output = can.page.insertBefore(can, [html.OUTPUT], can._status)), can.onimport._init(can, msg)
}) }) }, }) }) },
"-": function(event, can) { can.onaction.split(event, can, html.FLOW) },
"/": function(event, can) { can.onaction.split(event, can, html.FLEX) },
split: function(event, can, button) { can.Update(event, [ctx.ACTION, mdb.CREATE], function(msg) { can.Update(event, [msg.Result()], function(msg) { split: function(event, can, button) { can.Update(event, [ctx.ACTION, mdb.CREATE], function(msg) { can.Update(event, [msg.Result()], function(msg) {
if (can.page.ClassList.has(can, can._output.parentNode, button)) { var layout = can._output.parentNode } else { if (can.page.ClassList.has(can, can._output.parentNode, button)) { var layout = can._output.parentNode } else {
var layout = can.page.insertBefore(can, [{view: [[html.LAYOUT, button]]}], can._output); layout.appendChild(can._output) var layout = can.page.insertBefore(can, [{view: [[html.LAYOUT, button]]}], can._output); layout.appendChild(can._output)
} } var root = can._output._root||layout, tabs = can._output._tabs; tabs._output = root, root._tabs = tabs
var root = can._output._root||layout, tabs = can._output._tabs; tabs._output = root, root._tabs = tabs
can._output._root = root, can._output = can.page.insertBefore(can, [html.OUTPUT], can._output.nextSibling, layout) can._output._root = root, can._output = can.page.insertBefore(can, [html.OUTPUT], can._output.nextSibling, layout)
can._output._root = root, can._output._tabs = tabs, can.onimport._init(can, msg) can._output._root = root, can._output._tabs = tabs, can.onimport._init(can, msg), can.onmotion.delay(can, function() { can._output.click() })
}) }) }, }) }) },
delete: function(can, output) { delete: function(can, output) {
if (output == can.sup._output) { if (output == can.sup._output) { can.onmotion.clear(can, output) } else {
can.onmotion.clear(can, output) while (output && output.parentNode.children.length == 1) { output = output.parentNode }
} else { var next = output.parentNode; can.onmotion.delay(can, function() { can.page.Select(can, next, html.DIV_OUTPUT, function(target) { target.click() }) })
while (output && output.parentNode.children.length == 1) { output = output.parendNode }
can.page.Remove(can, output) can.page.Remove(can, output)
} can.onimport.layout(can) } can.onimport.layout(can)
}, },
select: function(can, output) { can.page.SelectChild(can, can._fields, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT), function(target) { can.onmotion.hidden(can, target, target == output || target == output._root) select: function(can, output) { can.page.SelectChild(can, can._fields, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT), function(target) { can.onmotion.hidden(can, target, target == output || target == output._root)
can.onmotion.delay(can, function() { can.page.Select(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT), function(target) { target._term && target._term._fit.fit() }) }) can.onmotion.delay(can, function() {
output._tabs._current? output._tabs._current.click(): (target.click(), can.page.SelectOne(can, target, html.DIV_OUTPUT, function(target) { target.click() }))
can.page.Select(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT), function(target) { target._term && target._term._fit.fit() })
})
}) }, }) },
sess: function(can) { can.runAction({}, mdb.CREATE, [mdb.TYPE, html.LAYOUT, mdb.TEXT, can.base.Format(can.onexport.sess(can))], function() {}, true) }, selectSibling: function(can, layout, prev) { var key = prev? "previousSibling": "nextSibling"
var output = can._output; while ((!output[key] || !can.page.ClassList.has(can, output.parentNode, layout)) && output != can._fields) { output = output.parentNode }
if (can.page.ClassList.has(can, output.parentNode, layout) && output[key]) {
can.page.SelectOne(can, output[key], html.DIV_OUTPUT, function(target) { target.click() })||output[key].click()
}
},
sess: function(event, can) { can.user.input(event, can, [mdb.NAME], function(list) {
can.runAction({}, mdb.CREATE, [mdb.TYPE, html.LAYOUT, mdb.NAME, list[0], mdb.TEXT, can.base.Format(can.onexport.sess(can))], function(msg) {
can.user.toastSuccess(can, can.user.trans(can, nfs.SAVE)+ice.SP+msg.Result())
}, true)
}) },
onkeydown: function(event, can) {
if (can.onkeymap.selectCtrlN(event, can, can._action, html.DIV_TABS)) { return }
can._keylist = can.onkeymap._parse(event, can, mdb.NORMAL, can._keylist||[], can._output._term)
},
}) })
Volcanos(chat.ONEXPORT, {list: [mdb.TIME, mdb.HASH, mdb.TYPE, mdb.NAME, "rows", "cols", "cursorY", "cursorX"], Volcanos(chat.ONEXPORT, {list: [mdb.TIME, mdb.HASH, mdb.TYPE, mdb.NAME, "rows", "cols", "cursorY", "cursorX"],
term: function(can, term) { item = term._item term: function(can, term) { item = term._item
can.core.List(can.onexport.list, function(key) { can.Status(key, can.base.getValid(item[key], term[key], term.buffer.active[key], "")+"") }) can.core.List(can.onexport.list, function(key) { can.Status(key, can.base.getValid(item[key], term[key], term.buffer.active[key], "")+"") })
can.core.List([mdb.HASH, mdb.TYPE, mdb.NAME], function(key) { can.Status(key, item[key]||"") }) can.core.List([mdb.TIME, mdb.HASH, mdb.TYPE, mdb.NAME], function(key) { can.Status(key, item[key]||"") })
}, },
sess: function(can) { return can.page.Select(can, can._action, html.DIV_TABS, function(target) { function show(target) { sess: function(can) { return can.page.Select(can, can._action, html.DIV_TABS, function(target) { function show(target) {
var name = can.page.SelectOne(can, target._tabs, html.SPAN_NAME).innerText
if (can.page.ClassList.has(can, target, html.LAYOUT)) { if (can.page.ClassList.has(can, target, html.LAYOUT)) {
return {type: target.className, name: target._tabs? target._tabs.innerText: "", list: can.page.SelectChild(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT), function(target) { return show(target) })} return {type: target.className, name: name, list: can.page.SelectChild(can, target, can.page.Keys(html.DIV_OUTPUT, html.DIV_LAYOUT), function(target) { return show(target) })}
} else { } else { var item = target._term._item; return {type: item.type, name: name, text: item.text, hash: item.hash} }
var item = target._term._item; return {type: item.type, name: target._tabs.innerText, text: item.text, hash: item.hash}
}
} return show(target._output) }) }, } return show(target._output) }) },
title: function(can, title) { can.page.Modify(can, can._output._tabs, 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) },
}) })

View File

@ -12,14 +12,15 @@ Volcanos(chat.ONIMPORT, {
_clear: function(can, msg) { can.onmotion.clear(can) }, _clear: function(can, msg) { can.onmotion.clear(can) },
_inner: function(can, msg) { can.onappend.table(can, msg), can.onappend.board(can, msg), can.onmotion.story.auto(can) }, _inner: function(can, msg) { can.onappend.table(can, msg), can.onappend.board(can, msg), can.onmotion.story.auto(can) },
_field: function(can, msg) { _field: function(can, msg) {
var opts = {}; can.page.SelectArgs(can, can._option, "", function(target) { var value = msg.Option(target.name); target.name && value && (opts[target.name] = value) }) var opts = {pod: msg.Option(ice.POD)}; can.page.SelectArgs(can, can._option, "", function(target) { var value = msg.Option(target.name); target.name && value && (opts[target.name] = value) })
var height = can.ConfHeight(); can.page.Select(can, can._output, html.TABLE, function(target) { height -= target.offsetHeight }) var height = can.ConfHeight(); can.page.SelectChild(can, can._output, html.TABLE, function(target) { height -= target.offsetHeight })
msg.Table(function(item) { can.onappend._plugin(can, item, {index: item.index, args: can.base.Obj(item.args||item.arg, []), height: can.base.Min(height, 200)}, function(sub, meta) { msg.Table(function(item) { can.onappend._plugin(can, item, {pod: msg.Option(ice.POD), index: item.index, args: can.base.Obj(item.args||item.arg, []), height: can.base.Min(height, 200)}, function(sub, meta) {
sub.Conf(can.base.Obj(item.conf)); if (sub.isSimpleMode()) { (function() { sub.ConfHeight(can.ConfHeight()/2) sub.Conf(can.base.Obj(item.conf)); if (sub.isSimpleMode()) { (function() { sub.ConfHeight(can.ConfHeight()/2)
var msg = can.request(); msg.Echo(sub.Conf(ice.MSG_RESULT)), can.onappend._output(sub, msg, sub.Conf(ctx.DISPLAY)) var msg = can.request(); msg.Echo(sub.Conf(ice.MSG_RESULT)), can.onappend._output(sub, msg, sub.Conf(ctx.DISPLAY))
})(); return } var opt = can.base.Obj(item[ice.OPT], []); sub.ConfWidth(can.ConfWidth()), can.page.style(can, sub._output, html.MAX_WIDTH, can.ConfWidth()) })(); return }; var opt = can.base.Obj(item[ice.OPT], [])
sub.run = function(event, cmds, cb) { var res = can.request(event, can.Option(), opts); for (var i = 0; i < opt.length; i += 2) { res.Option(opt[i], opt[i+1]) } sub.run = function(event, cmds, cb) { var res = can.request(event, can.Option(), opts); for (var i = 0; i < opt.length; i += 2) { res.Option(opt[i], opt[i+1]) }
can.run(event, (msg.Option("_index") == can._index? msg[ice.MSG_PREFIX]||[]: [ice.RUN, msg.Option("_index")]).concat(cmds), cb, true) can.run(event, (msg.Option("_index") == can._index? msg[ice.MSG_PREFIX]||[]: [ice.RUN, msg.Option("_index")]).concat(cmds), cb, true)
sub.onimport.size(sub, height, can.ConfWidth(), true)
} }
}) }) }) })
}, },
@ -187,11 +188,11 @@ Volcanos(chat.ONEXPORT, {
output: function(can, msg) {}, output: function(can, msg) {},
action: function(can, button, line) {}, action: function(can, button, line) {},
record: function(can, value, key, line) {}, record: function(can, value, key, line) {},
actionHeight: function(can) { return can.page.ClassList.has(can, can._target, "output")? 0: html.ACTION_HEIGHT }, actionHeight: function(can) { return can.page.ClassList.has(can, can._target, html.OUTPUT)? 0: html.ACTION_HEIGHT },
statusHeight: function(can) { return !can.page.isDisplay(can._status) || can._status.innerHTML == "" || (can._target.offsetHeight > 0 && can._status.offsetHeight == 0)? 0: html.ACTION_HEIGHT }, statusHeight: function(can) { return !can.page.isDisplay(can._status) || can._status.innerHTML == "" || (can._target.offsetHeight > 0 && can._status.offsetHeight == 0)? 0: html.ACTION_HEIGHT },
title: function(can, title) { can.isCmdMode() && can.user.title(title) }, title: function(can, title) { can.isCmdMode() && can.user.title(title) },
link: function(can) { var meta = can.Conf(), args = can.Option(); can.misc.Search(can, log.DEBUG) == ice.TRUE && (args[log.DEBUG] = ice.TRUE) link: function(can) { var meta = can.Conf(), args = can.Option(); can.misc.Search(can, log.DEBUG) == ice.TRUE && (args[log.DEBUG] = ice.TRUE)
args.cmd = meta.index||can.core.Keys(meta.ctx, meta.cmd), args.cmd == web.WIKI_WORD && (args.cmd = args.path) args.pod = meta.pod, args.cmd = meta.index||can.core.Keys(meta.ctx, meta.cmd), args.cmd == web.WIKI_WORD && (args.cmd = args.path)
return can.misc.MergePodCmd(can, args, true) return can.misc.MergePodCmd(can, args, true)
}, },
}) })

View File

@ -72,14 +72,13 @@ var mdb = {
} }
var web = {CHAT: "chat", var web = {CHAT: "chat",
SHARE: "share", SPACE: "space", DREAM: "dream", SHARE: "share", SPACE: "space", DREAM: "dream",
WEBSITE: "website", DRAW: "draw", PLAY: "play", CLEAR: "clear", REFRESH: "refresh", RESIZE: "resize", FILTER: "filter", WEBSITE: "website", DRAW: "draw", PLAY: "play", CLEAR: "clear", REFRESH: "refresh", RESIZE: "resize", FILTER: "filter", INPUT: "input",
CANCEL: "cancel", SUBMIT: "submit", UPLOAD: "upload", DOWNLOAD: "download", TOIMAGE: "toimage", CANCEL: "cancel", SUBMIT: "submit", UPLOAD: "upload", DOWNLOAD: "download", TOIMAGE: "toimage",
SHARE_CACHE: "/share/cache/", SHARE_LOCAL: "/share/local/", SHARE_CACHE: "/share/cache/", SHARE_LOCAL: "/share/local/",
GET: "GET", PUT: "PUT", POST: "POST", DELETE: "DELETE", GET: "GET", PUT: "PUT", POST: "POST", DELETE: "DELETE",
Accept: "Accept", ContentType: "Content-Type", ContentJSON: "application/json", ContentFORM: "application/x-www-form-urlencoded", Accept: "Accept", ContentType: "Content-Type", ContentJSON: "application/json", ContentFORM: "application/x-www-form-urlencoded",
VIDEO_WEBM: "video/webm", IMAGE_PNG: "image/png", VIDEO_WEBM: "video/webm",
INPUT: "input",
CODE_GIT_STATUS: "web.code.git.status", CODE_GIT_STATUS: "web.code.git.status",
CODE_XTERM: "web.code.xterm", CODE_XTERM: "web.code.xterm",
@ -237,6 +236,7 @@ var html = {PLUGIN_MARGIN: 10, ACTION_HEIGHT: 32, ACTION_MARGIN: 200,
DIV_CONTENT: "div.content", TABLE_CONTENT: "table.content", TABLE_LAYOUT: "table.layout", DIV_TOGGLE: "div.toggle", DIV_CONTENT: "div.content", TABLE_CONTENT: "table.content", TABLE_LAYOUT: "table.layout", DIV_TOGGLE: "div.toggle",
DIV_LAYOUT_HEAD: "div.layout.head", DIV_LAYOUT_FOOT: "div.layout.foot", DIV_LAYOUT_LEFT: "div.layout.left", DIV_LAYOUT_HEAD: "div.layout.head", DIV_LAYOUT_FOOT: "div.layout.foot", DIV_LAYOUT_LEFT: "div.layout.left",
DIV_FLOAT: "div.float", DIV_TOAST: "div.toast", DIV_CARTE: "div.carte", DIV_FLOAT: "div.float", DIV_TOAST: "div.toast", DIV_CARTE: "div.carte",
SPAN_NAME: "span.name",
DIV_LAYOUT: "div.layout", DIV_LAYOUT: "div.layout",
DIV_EXPAND: "div.expand", DIV_EXPAND: "div.expand",
} }
@ -366,7 +366,9 @@ try { if (typeof(window) == lang.OBJECT) { var meta = Volcanos.meta
case nfs.JS: var item = document.createElement(nfs.SCRIPT); item.src = url+v, item.onerror = cb, item.onload = cb, document.body.appendChild(item); break case nfs.JS: var item = document.createElement(nfs.SCRIPT); item.src = url+v, item.onerror = cb, item.onload = cb, document.body.appendChild(item); break
} } } }
window.onerror = function(message, source, lineno, colno, error) { window._version && alert([[source, lineno, colno].join(ice.DF), message].join(ice.NL)) } window.onerror = function(message, source, lineno, colno, error) { window._version && alert([[source, lineno, colno].join(ice.DF), message].join(ice.NL)) }
meta._init = function(can) { window.onerror = function(message, source, lineno, colno, error) { can.misc.Error(message, source, lineno, colno, error) } meta._init = function(can) { window.onerror = function(message, source, lineno, colno, error) {
meta.version? alert([message].concat(can.misc._stacks(0, error)).join(ice.NL)): can.misc.Error(message, ice.NL+[source, lineno, colno].join(ice.DF), error)
}
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||[])