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

opt vimer.js

This commit is contained in:
harveyshao 2022-07-13 08:20:03 +08:00
parent 1019455633
commit 44983d30b6
10 changed files with 175 additions and 140 deletions

View File

@ -331,7 +331,7 @@ Volcanos(chat.ONAPPEND, {help: "渲染引擎", _init: function(can, meta, list,
can.onkeymap.input(event, can), can.onmotion.selectField(event, can)
break
case html.TEXTAREA:
switch (event.key) { case lang.TAB: can.onkeymap.insertText(event.target, ice.TB); can.onkeymap.prevent(event); break }
// switch (event.key) { case lang.TAB: can.onkeymap.insertText(event.target, ice.TB); can.onkeymap.prevent(event); break }
break
}
@ -541,12 +541,6 @@ Volcanos(chat.ONLAYOUT, {help: "页面布局", _init: function(can, target) { ta
Volcanos(chat.ONMOTION, {help: "动态特效", _init: function(can, target) {
window.addEventListener(html.ORIENTATIONCHANGE, function(event) { can.onengine.signal(can, html.ORIENTATIONCHANGE) })
can.onmotion.float.auto(can, target)
target.onclick = function(event) {
if (can.page.tagis(["input", "select", "textarea"], event.target)) { return }
can.page.Select(can, target, can.page.Keys("div.float", "fieldset.float"), function(item) {
can.page.Remove(can, item)
})
}
},
float: {_hash: {},
del: function(can, key) {
@ -604,7 +598,7 @@ Volcanos(chat.ONMOTION, {help: "动态特效", _init: function(can, target) {
if (pos) { item.scrollTo && item.scrollTo(0, pos-1); return item }
}).length > 0
},
delay: function(can, cb) { can.core.Timer(100, cb) },
delay: function(can, cb, interval) { can.core.Timer(interval||100, cb) },
focus: function(can, target) { if (!target) { return }
target.setSelectionRange && target.setSelectionRange(0, -1), target.focus()
},
@ -792,6 +786,10 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互", _focus: [], _init: function(can,
if (window.webview) {
if (event.target.tagName == "A") { can.user.open(event.target.href) }
}
if (can.page.tagis(["input", "select", "textarea"], event.target)) { return }
can.page.Select(can, document.body, can.page.Keys("fieldset.input.key.float"), function(item) {
can.page.Remove(can, item)
})
}
can.onkeymap._build(can), document.body.onkeydown = function(event) {
if (event.metaKey) { if (window.webview) {

View File

@ -84,6 +84,7 @@ Volcanos("user", {help: "用户操作", info: {}, agent: {
"plugin": "插件",
"prev": "上一页", "next": "下一页",
"trash": "删除",
"open": "打开", "close": "关闭",
"start": "启动", "stop": "停止",
"begin": "开始", "end": "结束",
@ -229,6 +230,7 @@ Volcanos("user", {help: "用户操作", info: {}, agent: {
return can.base.isString(item)? {view: html.ITEM, list: [{text: can.user.trans(can, item), onclick: function(event) {
can.user.isMobile && can.page.Remove(can, ui._target)
can.base.isFunc(cb) && cb(event, item, meta, index)
can.onkeymap.prevent(event)
}, onmouseenter: function(event) {
carte._float && can.page.Remove(can, carte._float._target)
} }] }: can.base.isArray(item)? {view: html.ITEM, list: [{text: can.user.trans(can, item[0])+" -> "}], onmouseenter: function(event) {
@ -258,7 +260,7 @@ Volcanos("user", {help: "用户操作", info: {}, agent: {
},
input: function(event, can, form, cb, button) { if (!form || form.length == 0) { return cb() }
var msg = can.request(event)
var msg = can.request(event); event = event._event||event
var ui = can.page.Append(can, document.body, [{view: [html.INPUT], style: {left: 0, top: 0}, list: [
{view: "content", list: [{view: [html.OPTION, html.TABLE], list: can.core.List(form, function(item) {
item = can.base.isString(item)? {type: html.TEXT, name: item}: item.length > 0? {type: html.SELECT, name: item[0], values: item.slice(1)}: item

View File

@ -115,7 +115,7 @@ Volcanos(chat.ONPLUGIN, {help: "注册插件",
})
}),
"alert": shy("提示", {}, ["text", "list", "back"], function(can, msg, cmds) {
can.user.alert(cmds[0])
cmds && cmds[0] && can.user.alert(cmds[0])
}),
"info": shy("信息", {}, ["text", "list", "back"], function(can, msg, cmds) {
msg.Echo("hello world")

View File

@ -16,12 +16,13 @@ fieldset.inner>div.output div.content td.text span.datatype { color:lightgreen;
fieldset.inner>div.output div.content td.text span.function { color:cyan; font-weight:bold; }
fieldset.inner>div.output div.content td.text span.constant { color:magenta; }
fieldset.inner>div.output div.content td.text span.string { color:magenta; }
fieldset.inner>div.output td.content iframe { border:0; }
fieldset.inner>div.output td.content>div.tabs { display:none; }
fieldset.inner>div.output td.content>div.path { display:none; }
fieldset.inner div.output fieldset.toolkit { background-color:#0e3369b3; position:absolute; bottom:0px; right:0px; }
fieldset.inner div.output fieldset.toolkit { position:absolute; bottom:0px; right:0px; }
fieldset.inner>div.output fieldset.toolkit>div.output>fieldset { display:none; }
fieldset.inner>div.output fieldset.toolkit>div.output>fieldset.select { display:block; }
fieldset.inner>div.output fieldset.toolkit>div.output>fieldset.select { background-color:#0e3369b3; color:white; display:block; }
fieldset.inner>div.status legend { background-color:#0d969f8a; padding:0px 10px; border-left:solid 2px red; height:30px; float:right; }
fieldset.inner>div.status legend.select { background-color:green; }
fieldset.inner>div.status legend:hover { background-color:green; }
@ -53,6 +54,8 @@ body.white.simple fieldset.inner>div.output div.content td.text span.string { co
body.white.simple fieldset.inner>div.output div.content td.text span.function { color:#795e26; }
body.white.simple fieldset.inner>div.output div.content td.text span.keyword { color:blue; }
body.white.simple>div.carte div.item:hover { background-color:#e3e6f1; }
body.mobile fieldset.inner>form.option input[name=file] { width:90px; }
body.mobile fieldset.plugin.inner div.action { display:none; }
body.mobile.landscape fieldset.plugin.inner div.action { display:contents; }

View File

@ -6,11 +6,12 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
can.onengine.plugin(can, can.onplugin)
can.onmotion.clear(can), can.onlayout.profile(can)
can.page.styleWidth(can, can.ui.project, 180)
can.page.styleWidth(can, can.ui.project, 240)
can.onimport._project(can, can.ui.project)
can.onimport._profile(can, can.ui.profile)
can.onimport._display(can, can.ui.display)
can.base.isFunc(cb) && cb(msg)
can.ui._content = can.ui.content
switch (can.Mode()) {
case "simple": can.onimport._simple(can); break
@ -130,41 +131,68 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
},
project: function(can, path) {
can.onimport.zone(can, [
{name: "source", _init: function(view) { var total = 0
function show(view) {
can.run(can.request({}, {dir_root: path, dir_deep: true}), [ice.PWD], function(msg) { var list = msg.Table()
can.core.List(list, function(item) { if (can.Option(nfs.FILE).indexOf(item.path) == 0) { item.expand = true } })
can.onimport.tree(can, list, nfs.PATH, ice.PS, function(event, item) {
can.onimport.tabview(can, path, item.path) // 显示文件
}, view), can.Status("文件数", total += msg.Length())
}, true)
}
if (path.length == 1) {
show(view)
} else {
var ui = can.onimport.zone(can, can.core.List(path, function(path) { return {name: path, _init: function(view) {
show(view)
}} }), view); can.onmotion.delay(can, function() { view.previousSibling.innerHTML = "" })
}
{name: "source", _init: function(target) { var total = 0
function show(target) { can.run(can.request({}, {dir_root: path, dir_deep: true}), [ice.PWD], function(msg) { var list = msg.Table()
can.core.List(list, function(item) { if (can.Option(nfs.FILE).indexOf(item.path) == 0) { item.expand = true } })
can.onimport.tree(can, list, nfs.PATH, ice.PS, function(event, item) {
can.onimport.tabview(can, path, item.path) // 显示文件
}, target), can.Status("文件数", total += msg.Length())
}, true) } if (path.length == 1) { return show(target) }
can.onimport.zone(can, can.core.List(path, function(path) { return {name: path, _init: function(target) { show(target) }} }), target)
can.onmotion.delay(can, function() { target.previousSibling.innerHTML = "" })
}},
{name: "module", _init: function(view) {
{name: "plugin", _init: function(target) {
can.onimport.tree(can, can.core.Item(can.onengine.plugin.meta, function(key) { return {index: can.base.trimPrefix(key, "can.")} }), ctx.INDEX, ice.PT, function(event, item) {
can.onimport.tabview(can, can.Option(nfs.PATH), can.core.Keys("can", item.index), ctx.INDEX) // 显示插件
}, target)
}},
{name: "module", _init: function(target) {
can.runAction(can.request({}, {fields: ctx.INDEX}), ctx.COMMAND, [mdb.SEARCH, ctx.COMMAND], function(msg) {
can.onimport.tree(can, msg.Table(), ctx.INDEX, ice.PT, function(event, item) {
can.onimport.tabview(can, can.Option(nfs.PATH), item.index, ctx.INDEX) // 显示模块
}, view)
}, target)
})
}},
{name: "plugin", _init: function(view) {
can.onimport.tree(can, can.core.Item(can.onengine.plugin.meta, function(key) { return {index: can.base.trimPrefix(key, "can.")} }), ctx.INDEX, ice.PT, function(event, item) {
can.onimport.tabview(can, can.Option(nfs.PATH), can.core.Keys("can", item.index), ctx.INDEX) // 显示插件
}, view)
}},
{name: "dreams", _init: function(target) { var call = arguments.callee
can.runAction({}, ice.RUN, [web.DREAM], function(msg) {
msg.Table(function(item) {
function carte(event) {
var list = []; switch (item.status) {
case "start": list = ["open", "stop"]; break
case "stop": list = ["start", "trash"]; break
}
can.user.carteRight(event, can, {}, list, function(event, action) {
can.runAction(can.request({}, item), ice.RUN, [web.DREAM, ctx.ACTION, action], function(msg) {
can.onmotion.clear(can, target), call(target)
})
})
}
var color = item.status == "start"? "": "gray"
can.page.Append(can, target, [{view: html.ITEM, list: [{text: [item.name, html.DIV], style: {color: color}, onmouseenter: carte}], onclick: function() {
can.onimport.tabview(can, can.Option(nfs.PATH), item.name, web.DREAM) // 显示空间
}}])
})
})
}, _menu: shy("", {
"create": function(event, zone) {
can.user.input(event, can, [mdb.NAME], function(list) {
can.runAction({}, ice.RUN, [web.DREAM, cli.START, list[0]], function(msg) {
can.onmotion.clear(can, zone._target), zone._init(zone._target), can.user.toastSuccess(can)
can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option(mdb.NAME), web.DREAM) // 显示空间
})
})
},
"refresh": function(event, zone) {
can.onmotion.clear(can, zone._target), zone._init(zone._target)
},
}, ["create", "refresh"], function() {})},
], can.ui.project)
},
history: function(can, push) {
can.base.Eq(push, can.history[can.history.length-1]) || can.history.push(push)
can.Status("跳转数", can.history.length)
return push
return can.Status("跳转数", can.history.length), push
},
tabview: function(can, path, file, line, cb, skip, skip2) { var key = can.onexport.keys(can, file, path)
if (can.isCmdMode()) { location.hash = file+ice.FS+(line||1) }
@ -174,16 +202,16 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
return can._msg.Option(can.Option()), can.onsyntax._init(can, can._msg, cb, skip2)
}
can.onimport.history(can, {path: path, file: file, line: line})
function show(msg) { var skip2 = skip; can.tabview[key] = msg
msg._tab = can.onimport.tabs(can, [{name: file.split(msg.Option(nfs.LINE) == ctx.INDEX? ice.PT: ice.PS).pop(), text: file}], function(event, meta) {
msg._tab = event.target
can.onimport.tabview(can, path, file, msg.Option(nfs.LINE), cb, false, skip2), cb = null, skip2 = false
can.onimport.tabs(can, [{name: file.split(line == ctx.INDEX? ice.PT: ice.PS).pop(), text: file}], function(event, meta) {
msg._tab = event.target, can.onimport.tabview(can, path, file, msg.Option(nfs.LINE), cb, false, skip2), cb = null, skip2 = false
}, function(item) { delete(can.tabview[key]) }, can.ui._tabs, function(item) {})
}
can.Option({path: path, file: file, line: line||1})
line == ctx.INDEX? show(can.request({}, {index: file, line: line})): can.run({}, [path, file], show, true)
can.Option(can.onimport.history(can, {path: path, file: file, line: line}))
line == ctx.INDEX? show(can.request({}, {index: file, line: line})):
line == web.DREAM? show(can.request({}, {index: file, line: line})):
can.run({}, [path, file], show, true)
},
profile: function(can, msg) {
var width = can.profile_size[can.onexport.keys(can)]||(can.ConfWidth()-can.ui.project.offsetWidth)/2
@ -200,8 +228,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
can.onmotion.toggle(can, can.ui.display, true), can.onimport.layout(can)
}), can.onmotion.toggle(can, can.ui.display, true), can.onimport.layout(can)
},
process: function(can, msg, target, width, height) {
can.onmotion.clear(can, target), can.user.toastSuccess(can)
process: function(can, msg, target, width, height) { can.onmotion.clear(can, target), can.user.toastSuccess(can)
if (msg.Option(ice.MSG_PROCESS) == "_field") {
msg.Table(function(meta) { meta.display = msg.Option(ice.MSG_DISPLAY)
can.onimport.plugin(can, meta, target, function(sub) { width && sub.ConfWidth(width), height && sub.ConfHeight(height), sub.Focus() })
@ -250,9 +277,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
},
}, [""])
Volcanos(chat.ONPLUGIN, {help: "注册插件",
"local": shy("按键", {}, ["mode", "key", ice.LIST, ice.BACK], function(msg, cmds) {
}),
"code.inner.keymap": shy("按键", {}, ["mode", "key", ice.LIST, ice.BACK], function(can, msg, cmds) {
"can.code.inner.keymap": shy("按键", {}, ["mode", "key", ice.LIST, ice.BACK], function(can, msg, cmds) {
can.core.Item(can.onkeymap._mode, function(mode, value) {
(!cmds[0] || cmds[0] == mode) && can.core.Item(value, function(key, func) {
if (cmds[0] == mode && cmds[1] == key) {
@ -272,9 +297,7 @@ Volcanos(chat.ONPLUGIN, {help: "注册插件",
}),
})
Volcanos(chat.ONSYNTAX, {help: "语法高亮", list: ["keyword", "prefix", "line"], _init: function(can, msg, cb, skip) {
if (can.isCmdMode()) {
can.ui._path.innerText = msg.Option(ctx.INDEX)? msg.Option(nfs.FILE): can.base.Path(msg.Option(nfs.PATH), msg.Option(nfs.FILE))
}
if (can.ui._path) { can.ui._path.innerText = msg.Option(ctx.INDEX)? msg.Option(nfs.FILE): can.base.Path(msg.Option(nfs.PATH), msg.Option(nfs.FILE)) }
if (can.onmotion.cache(can, function(cache_data) {
can.file && (cache_data[can.file] = {current: can.current, max: can.max,
@ -291,20 +314,44 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", list: ["keyword", "prefix", "line
can.onmotion.delay(can, function() { can.onimport.layout(can)
msg.Option(ctx.INDEX) && can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0])
})
can.page.Select(can, can._output, can.page.Keys("div.content", html.IFRAME), function(item) {
if (can.onmotion.toggle(can, item, item == msg._ui)) { can.ui.content = msg._ui }
})
return can.file
}, can.ui.content, can.ui.profile_output, can.ui.display_output) && !skip) {
}, can.ui._content, can.ui.profile_output, can.ui.display_output) && !skip) {
return can.onaction.selectLine(null, can, msg.Option(nfs.LINE)), can.base.isFunc(cb) && cb()
}
can.onmotion.clear(can, can.ui.content), can.onimport.layout(can)
if (msg.Option(ctx.INDEX)) { return can.onimport.plugin(can, {index: msg.Option(ctx.INDEX)}, can.ui.content, function(sub) {
can.page.style(can, sub._output, html.MAX_HEIGHT, sub.ConfHeight(can.ui.content.offsetHeight-2*html.ACTION_HEIGHT))
can.page.style(can, sub._output, html.MAX_WIDTH, sub.ConfWidth(can.ui.content.offsetWidth))
can.onmotion.delay(can, function() { sub.Focus() }), can.base.isFunc(cb) && cb()
sub.onaction.close = function() {
can.onaction.back({}, can), msg._tab._close()
if (msg.Option(ctx.INDEX)) {
if (msg.Option(nfs.LINE) == web.DREAM) {
if (msg._ui) {
can.page.Select(can, can._output, can.page.Keys("div.content", html.IFRAME), function(item) {
if (can.onmotion.toggle(can, item, item == msg._ui)) { can.ui.content = msg._ui }
})
return
}
can.ui.content = msg._ui = can.page.insertBefore(can, [{type: html.IFRAME, src: can.misc.MergeURL(can, {pod: msg.Option(nfs.FILE)}, true), width: can.ui.content.offsetWidth, height: can.ui.content.offsetHeight}], can.ui.content)
return can.onimport.layout(can)
}
}) }
can.onmotion.toggle(can, can.ui.content = msg._ui = can.ui._content, true)
return can.onimport.plugin(can, {index: msg.Option(ctx.INDEX)}, can.ui.content, function(sub) {
can.page.style(can, sub._output, html.MAX_HEIGHT, sub.ConfHeight(can.ui.content.offsetHeight-2*html.ACTION_HEIGHT))
can.page.style(can, sub._output, html.MAX_WIDTH, sub.ConfWidth(can.ui.content.offsetWidth))
can.onmotion.delay(can, function() { sub.Focus() }), can.base.isFunc(cb) && cb()
sub.onaction.close = function() { can.onaction.back({}, can), msg._tab._close() }
sub.onimport._open = function(sub, msg, _arg) { var url = can.base.ParseURL(_arg), ls = url.origin.split("/chat/pod/")
if (_arg.indexOf(location.origin) == 0 && ls.length > 1) {
return can.onimport.tabview(can, can.Option(nfs.PATH), ls[1].split("/")[0], web.DREAM), sub.Update() // 显示空间
}
return can.user.open(_arg), sub.Update()
}
})
}
can.onmotion.toggle(can, can.ui.content = msg._ui = can.ui._content, true)
function init(p) {
can.max = 0, can.core.List(can.ls = msg.Result().split(ice.NL), function(item) { can.onaction.appendLine(can, item) })
@ -327,8 +374,7 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", list: ["keyword", "prefix", "line
function wrap(type, str) { return type? '<span class="'+type+'">'+str+'</span>': str }
var p = can.onsyntax[can.parse]; if (!p) { return line } p = can.onsyntax[p.link]||p, p.split = p.split||{}
p.keyword && (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 = item.keyword||p.keyword[text]
item = can.base.isObject(item)? item: {text: item}; var text = item.text, type = item.keyword||p.keyword[text]
switch (item.type) { case html.SPACE: return text
case lang.STRING: return wrap(lang.STRING, item.left+text+item.right)
@ -336,12 +382,8 @@ Volcanos(chat.ONSYNTAX, {help: "语法高亮", list: ["keyword", "prefix", "line
}
}).join(""))
p.prefix && can.core.Item(p.prefix, function(pre, type) {
if (can.base.beginWith(line, pre)) { line = wrap(type, line) }
})
p.suffix && can.core.Item(p.suffix, function(end, type) {
if (can.base.endWith(line, end)) { line = wrap(type, line) }
})
p.prefix && can.core.Item(p.prefix, function(pre, type) { if (can.base.beginWith(line, pre)) { line = wrap(type, line) } })
p.suffix && can.core.Item(p.suffix, function(end, type) { if (can.base.endWith(line, end)) { line = wrap(type, line) } })
return line
},
})
@ -372,22 +414,14 @@ Volcanos(chat.ONKEYMAP, {help: "导入数据",
}, _engine: {},
})
Volcanos(chat.ONACTION, {help: "控件交互", list: ["搜索", "打开", "添加", "插件", "扩展"],
_trans: {width: "宽度", height: "高度", website: "网页"},
_trans: {load: "加载", link: "链接", width: "宽度", height: "高度", website: "网页"},
"搜索": function(event, can) {
can.user.input(event, can, [mdb.NAME, [ctx.ACTION, nfs.TAGS, nfs.GREP, cli.MAKE]], function(data) {
can.ui.search.Update({}, [ctx.ACTION, data.action, data.name])
})
},
"打开": function(event, can) {
can.user.input(event, can, [nfs.FILE], function(list) {
can.onimport.tabview(can, can.Option(nfs.PATH), list[0])
})
},
"添加": function(event, can) {
can.user.input(event, can, [ctx.INDEX], function(list) {
can.onimport.tabview(can, can.Option(nfs.PATH), list[0], ctx.INDEX)
})
},
"打开": function(event, can) { can.user.input(event, can, [nfs.FILE], function(list) { can.onimport.tabview(can, can.Option(nfs.PATH), list[0]) }) },
"添加": function(event, can) { can.user.input(event, can, [ctx.INDEX], function(list) { can.onimport.tabview(can, can.Option(nfs.PATH), list[0], ctx.INDEX) }) },
"插件": function(event, can) {
can.user.input(event, can, [ctx.INDEX], function(list) {
var sub = can.toolkit[list[0]]; if (sub) { sub.select(); return }
@ -400,9 +434,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: ["搜索", "打开", "添
can.onimport.exts(can, list[0], function(sub) { can.extentions[list[0]] = sub.select() })
})
},
sess: function(event, can) {
can.onexport.sess(can), can.user.toastSuccess(can)
},
sess: function(event, can) { can.onexport.sess(can), can.user.toastSuccess(can) },
load: function(event, can) {
var file = can.base.Path("/require/", can.Option(nfs.PATH), can.Option(nfs.FILE))
delete(Volcanos.meta.cache[file]), eval("\n_can_name = \""+file+"\"\n"+can.onexport.content(can)+"\n_can_name = \"\"\nconsole.log(\"once\")")
@ -415,7 +447,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: ["搜索", "打开", "添
can.onimport.profile(can, msg)
})
},
exec: function(event, can) { can.request(event, {_toast: "执行中..."})
exec: function(event, can) { can.request(event, {_toast: "执行中...", "some": "run"})
can.runAction(event, mdb.ENGINE, [can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function(msg) {
can.onimport.display(can, msg)
})
@ -459,7 +491,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: ["搜索", "打开", "添
}
if (s.indexOf("kit.") == 0) { s = s.replace("kit.", "toolkits.") }
if (s.indexOf(".") == 0) { s = s.slice(1) }
if (s.indexOf(ice.PT) == 0) { s = s.slice(1) }
can.onaction.searchLine(event, can, s)
}}
]}]); return ui.tr
@ -503,7 +535,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: ["搜索", "打开", "添
}
var push = can.onimport.history(can, {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()})
if (can.isCmdMode()) { location.hash = push.file+","+(push.line||1) }
if (can.isCmdMode()) { location.hash = push.file+ice.FS+(push.line||1) }
can.onaction._selectLine(event, can)
})
},
@ -521,17 +553,11 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: ["搜索", "打开", "添
},
})
Volcanos(chat.ONEXPORT, {help: "导出数据", list: ["文件数", "解析器", "文件名", "当前行", "跳转数", "标签数"],
sess: function(can) {
can.user.localStorage(can, "web.code.inner.sess", {"plug": can.onexport.plug(can), "exts": can.onexport.exts(can), "tabs": can.onexport.tabs(can)})
},
keys: function(can, file, path) { return (path||can.Option(nfs.PATH))+":"+(file||can.Option(nfs.FILE)) },
sess: function(can) { can.user.localStorage(can, "web.code.inner.sess", {"plug": can.onexport.plug(can), "exts": can.onexport.exts(can), "tabs": can.onexport.tabs(can)}) },
keys: function(can, file, path) { return (path||can.Option(nfs.PATH))+ice.DF+(file||can.Option(nfs.FILE)) },
tabs: function(can) { return can.core.Item(can.tabview, function(key, msg) { return key+ice.DF+msg.Option(nfs.LINE) }) },
plug: function(can) { return can.core.Item(can.toolkit) },
exts: function(can) { return can.core.Item(can.plugins) },
position: function(can, index, total) { total = total||can.max
return (parseInt(index))+ice.PS+parseInt(total)+" = "+parseInt((index)*100/total)+"%"
},
content: function(can) {
return can.page.Select(can, can.ui.content, "td.text", function(item) { return item.innerText }).join(ice.NL)
},
position: function(can, index, total) { total = total||can.max; return (parseInt(index))+ice.PS+parseInt(total)+" = "+parseInt((index)*100/total)+"%" },
content: function(can) { return can.page.Select(can, can.ui.content, "td.text", function(item) { return item.innerText }).join(ice.NL) },
})

View File

@ -1,6 +1,6 @@
Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) {
can.require(["inner.js"], function(can) { can.onimport.inner_init(can, msg, function() { can.undo = [], can.redo = []
can.onkeymap._build(can), can.onimport._input(can), can.onkeymap._plugin({}, can), can.base.isFunc(cb) && cb(msg)
can.onimport._input(can), can.onkeymap._build(can), can.onkeymap._plugin({}, can), can.base.isFunc(cb) && cb(msg)
}, target) }, function(can, name, sub) { name == chat.ONIMPORT && (can.onimport.inner_init = sub._init)
if (name == chat.ONACTION) { can._trans = can.base.Copy(can._trans||{}, sub._trans) }
@ -55,7 +55,7 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互",
},
},
normal: {
escape: function(event, can) { can.onkeymap._plugin(event, can) },
Escape: function(event, can) { can.onkeymap._plugin(event, can) },
ArrowLeft: function(event, can, target) { can.onkeymap.cursorMove(can, target, -1) },
ArrowRight: function(event, can, target) { can.onkeymap.cursorMove(can, target, 1) },
ArrowDown: function(event, can) { can.onaction.selectLine(event, can, can.current.next()) },
@ -174,8 +174,7 @@ Volcanos(chat.ONKEYMAP, {help: "键盘交互",
Volcanos(chat.ONACTION, {help: "控件交互", list: [nfs.SAVE, code.AUTOGEN, code.COMPILE, nfs.SCRIPT, chat.WEBSITE, web.DREAM, code.PUBLISH],
_run: function(event, can, button, args, cb) {
can.runAction(event, button, args, cb||function(msg) {
can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option(nfs.FILE))
can.onimport.project(can, can.Option(nfs.PATH)), can.user.toastSuccess(can, button)
can.onimport.tabview(can, can.Option(nfs.PATH), msg.Option(nfs.FILE)), can.ui.source.refresh()
})
},
_runs: function(event, can, button) { var meta = can.Conf(); can.request(event, {action: button})
@ -184,25 +183,22 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: [nfs.SAVE, code.AUTOGEN, co
})
},
save: function(event, can, button) { can.request(event, {file: can.Option(nfs.FILE), content: can.onexport.content(can)})
can.runAction(event, nfs.SAVE, [can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)], function() {
can.user.toastSuccess(can, button)
})
can.onaction._run(event, can, button, [can.parse, can.Option(nfs.FILE), can.Option(nfs.PATH)])
},
autogen: function(event, can, button) { can.onaction._runs(event, can, button) },
compile: function(event, can, button) { var toast0 = can.user.toastProcess(can, "编译中...")
can.runAction(event, button, [], function(msg) { toast0.close()
compile: function(event, can, button) { var toast = can.user.toastProcess(can, "编译中...")
can.runAction(can.request(event), button, [], function(msg) { toast.close()
if (msg.Length() == 0) { var toast1 = can.user.toastProcess(can, "重启中...")
can.core.Timer(3000, function() { toast1.close(), can.onaction["展示"]({}, can) })
can.onmotion.delay(can, function() { toast1.close(), can.onaction[cli.SHOW]({}, can) }, 3000)
} else { can.ui.search._show(msg) }
})
},
script: function(event, can, button) {
can.request(event, {file: "hi/hi.js"})
can.onaction._runs(event, can, button)
can.onaction._runs(can.request(event, {file: "hi/hi.js"}), can, button)
},
website: function(event, can, button) {
can.request(event, {file: "hi.zml"})
can.onaction._runs(event, can, button)
can.onaction._runs(can.request(event, {file: "hi.zml"}), can, button)
},
publish: function(event, can, button) {
can.runAction(event, button, [], function(msg) { can.user.toastConfirm(can, msg.Result(), button) })
@ -221,8 +217,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: [nfs.SAVE, code.AUTOGEN, co
})
})
})
can.request(event, {text: can.base.Format(list)})
can.runAction(event, button)
can.runAction(can.request(event, {text: can.base.Format(list)}), button)
},
_complete: function(event, can, target) { target = target||can.ui.complete
if (event == undefined) { return }
@ -304,7 +299,7 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: [nfs.SAVE, code.AUTOGEN, co
can.current.line.appendChild(can.ui.current), can.page.style(can, can.ui.current, html.LEFT, td.offsetLeft-1, html.WIDTH, can.ui.content.style.width)
if (event) {
if (event.type == "click" && can.mode != "insert") { can.onkeymap._insert(event, can)
can.core.Timer(10, function() { can.onaction._complete(event, can) })
can.onmotion.delay(can, function() { can.onaction._complete(event, can) })
}
can.ui.current.focus(), can.ui.content.scrollLeft -= 10000
can.onkeymap.cursorMove(can, can.ui.current, 0, (event.offsetX)/12-1)
@ -316,15 +311,13 @@ Volcanos(chat.ONACTION, {help: "控件交互", list: [nfs.SAVE, code.AUTOGEN, co
can.max++, can.page.Select(can, item, "td.line", function(item) { item.innerText = index+1 })
})
},
insertLine: function(can, value, before) {
var line = can.onaction.appendLine(can, value)
insertLine: function(can, value, before) { var line = can.onaction.appendLine(can, value)
before && can.ui.content.insertBefore(line, can.onaction._getLine(can, before))
return can.onaction.rerankLine(can), can.onaction._getLineno(can, line)
},
deleteLine: function(can, line) { line = can.onaction._getLine(can, line)
var next = line.nextSibling||line.previousSibling
can.page.Remove(can, line), can.onaction.rerankLine(can)
return next
return can.page.Remove(can, line), can.onaction.rerankLine(can), next
},
modifyLine: function(can, line, value) {
can.page.Select(can, can.ui.content, html.TR, function(item, index) {

View File

@ -86,7 +86,7 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
}]) }), can.onimport._display(can, task)
},
_display: function(can, task) { if (!task["extra.cmd"]) { return }
can.onappend.plugin(can, {type: chat.STORY, ctx: task["extra.ctx"], cmd: task["extra.cmd"], arg: task["extra.arg"]}, function(sub, meta) {
can.onappend.plugin(can, {type: "plug", ctx: task["extra.ctx"], cmd: task["extra.cmd"], arg: task["extra.arg"]}, function(sub, meta) {
sub.run = function(event, cmds, cb) { var msg = can.request(event, kit.Dict("task.pod", task["pod"], "task.zone", task.zone, "task.id", task.id))
can.runAction(event, ice.RUN, [task[mdb.ZONE], task[mdb.ID]].concat(cmds), cb)
}

View File

@ -1,7 +1,7 @@
Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, conf, cb, target) {},
_process: function(can, msg) {
msg.OptionStatus() && can.onmotion.clear(can, can._status) && can.onappend._status(can, can.base.Obj(msg.OptionStatus()))
return can.core.CallFunc([can.onimport, msg.OptionProcess()], {can: can, msg: msg})
return can.core.CallFunc([can.onimport, msg.OptionProcess()], {can: can, sub: can, msg: msg})
},
_location: function(can, msg, _arg) { can.user.jumps(_arg); return true },
@ -111,7 +111,7 @@ Volcanos(chat.ONACTION, {help: "交互操作", list: [
mdb.NAME, meta.index, mdb.TEXT, JSON.stringify(can.Input([], true)),
])
},
"打开链接": function(event, can) { var meta = can.Conf(), args = can.Option()
"打开链接": function(event, can) { var meta = can.Conf(), args = can.Option(); args.river = "", args.storm = ""
args.cmd = meta.index||can.core.Keys(meta.ctx, meta.cmd), args.cmd == "web.wiki.word" && (args.cmd = args.path)
can.user.isWeiXin? can.user.jumps(can.misc.MergeURL(can, args)): can.user.open(can.misc.MergeURL(can, args))
},

View File

@ -1,7 +1,11 @@
Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, target) {
can.user.isMobile && !can.user.isLandscape() && can.onmotion.hidden(can, can._action)
var cbs = can.onimport[can._args[ctx.STYLE]]; if (can.base.isFunc(cbs)) {
var cbs = can.onimport[can.Conf(ctx.STYLE)]; if (can.base.isFunc(cbs)) {
can.page.ClassList.add(can, target, can._args[ctx.STYLE])
can.core.CallFunc(cbs, {
can: can, msg: msg, target: target,
list: msg.Table(),
})
return cbs(can, msg, target)
}
@ -38,39 +42,44 @@ Volcanos(chat.ONIMPORT, {help: "导入数据", _init: function(can, msg, cb, tar
}]); return ui.first
},
zone: function(can, list, target) { var color = ["blue", "red", "cyan"]
return can.page.Append(can, target, can.core.List(list, function(zone, index) { return {view: "zone", list: [
{view: "name", inner: zone.name, style: {background: color[index%color.length]}, onclick: function() {
can.onmotion.toggle(can, event.target.nextSibling.nextSibling)
can.onmotion.toggle(can, event.target.nextSibling)
zone: function(can, list, target) { var color = ["blue", "red", "green"]
return can.page.Append(can, target, can.core.List(list, function(zone, index) { return {view: html.ZONE, list: [
{view: html.NAME, inner: zone.name, style: {background: color[index%color.length]}, onclick: function() {
can.onmotion.toggle(can, zone._action), can.onmotion.toggle(can, zone._target)
}, onmouseenter: function(event) {
can.user.carteRight(event, can, {
zone._menu? can.user.carteRight(event, can, zone._menu.meta, zone._menu.list, function(event, button, meta) {
meta[button](event, zone)
}): can.user.carteRight(event, can, {
"折叠": function() {
can.page.Select(can, event.target.nextSibling.nextSibling, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, false) })
can.page.Select(can, zone._target, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, false) })
},
"展开": function() {
can.page.Select(can, event.target.nextSibling.nextSibling, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, true) })
can.page.Select(can, zone._target, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, true) })
},
}, ["折叠", "展开"])
}, _init: function(item) { if (list.length > 1 && index > 0) { can.onmotion.delay(can, function() { item.click() }) } }},
{view: "action", _init: function(item) {
can.onappend._action(can, [{input: "type", onkeyup: function(event) {
can.page.Select(can, item.nextSibling, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, true) })
can.page.Select(can, item.nextSibling, html.DIV_ITEM, function(item) {
"刷新": function() { can.onmotion.clear(can, zone._target), zone._init(zone._target) },
}, ["折叠", "展开", "刷新"])
}},
{view: html.ACTION, _init: function(target) { zone._action = target
can.onappend._action(can, [{input: html.TEXT, onkeyup: function(event) {
can.page.Select(can, zone._target, html.DIV_LIST, function(item) { can.onmotion.toggle(can, item, true) })
can.page.Select(can, zone._target, html.DIV_ITEM, function(item) {
can.page.Select(can, item, "div.name", function(name) {
can.onmotion.toggle(can, item, name.innerText.indexOf(event.target.value) > -1)
})
})
}, onclick: function(event) {
can.onmotion.focus(can, event.target)
},_init: function(item) {
}, _init: function(target) {
can.onmotion.delay(can, function() {
can.page.styleWidth(can, item, item.parentNode.parentNode.parentNode.offsetWidth-32)
can.page.styleWidth(can, target, target.parentNode.parentNode.parentNode.offsetWidth-32)
})
}}], item, {})
}}], target, {})
}},
{view: "list", _init: function(item) {
can.base.isFunc(zone._init) && zone._init(item)
{view: html.ZONE, _init: function(target) { can.ui[zone.name] = zone
zone._target = target, zone.refresh = function() {
can.onmotion.clear(can, target), zone._init(target)
}
can.base.isFunc(zone._init) && zone._init(target)
}}
]} }))
},

View File

@ -240,16 +240,20 @@ var html = {
TOGGLE: "toggle",
PAGE: "page", TABS: "tabs",
LIST: "list", ITEM: "item",
MENU: "menu", NODE: "node",
ZONE: "zone", NAME: "name",
LIST: "list", ITEM: "item",
HIDE: "hide", SHOW: "show", AUTO: "auto",
HEAD: "head", LEFT: "left", MAIN: "main", FOOT: "foot",
PLUGIN: "plugin", LAYOUT: "layout", CONTENT: "content",
DIV_PAGE: "div.page",
DIV_TABS: "div.tabs",
DIV_ZONE: "div.zone",
DIV_LIST: "div.list",
DIV_ITEM: "div.item",
DIV_NAME: "div.name",
DIV_CODE: "div.code",
DIV_LAYOUT_HEAD: "div.layout.head",
DIV_LAYOUT_LEFT: "div.layout.left",