1
0
forked from x/volcanos

opt inner.js

This commit is contained in:
harveyshao 2022-01-17 17:59:18 +08:00
parent 7fa7058f36
commit 04a094dbd8
6 changed files with 215 additions and 95 deletions

View File

@ -194,7 +194,9 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
can.core.ItemCB(input.onaction, function(key, cb) {
input._target[key] = function(event) { cb(event, input) }
}), skip? next(): can.core.CallFunc([input.onaction, "_init"], [input, item, [], next, input._target]);
can.core.ItemCB(item, function(key, cb) {
input._target[key] = function(event) { cb(event, input) }
});
(item.action||can.core.Value(meta, "feature.inputs")) && can.onappend.figure(input, item, input._target)
})
}; can.core.Next(can.base.Obj(meta.inputs, can.core.Value(can, "onimport.list")).concat(meta.type == chat.FLOAT? [{type: html.BUTTON, name: cli.CLOSE}]: []), add)
@ -240,7 +242,7 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
},
_output: function(can, msg, display, output) { display = display||chat.PLUGIN_TABLE_JS, output = output||can._output
Volcanos(display, {_follow: can.core.Keys(can._follow, display), _display: display, _target: output, _fields: can._target,
_option: can._option, _action: can._action, _output: can._output, _status: can._status,
_option: can._option, _action: can._action, _output: can._output, _status: can._status, _legend: can._legend,
Update: can.Update, Option: can.Option, Action: can.Action, Status: can.Status,
}, [display, chat.PLUGIN_TABLE_JS], function(table) { table.Conf(can.Conf())
table.run = function(event, cmds, cb, silent) { var msg = can.request(event)
@ -274,14 +276,14 @@ Volcanos("onappend", {help: "渲染引擎", list: [], _init: function(can, meta,
can.page.Modify(can, item, {draggable: true, _close: cbs,
onmouseenter: function(event) {
can.user.carte(event, can, kit.Dict(
cli.CLOSE, function(event) { close(item) },
"close tab", function(event) { close(item) },
"close other", function(event) {
can.page.Select(can, action, chat.DIV_TABS, function(_item) {
_item == item || close(_item)
})
},
"close all", function(event) { can.page.Select(can, action, chat.DIV_TABS, close) },
), [cli.CLOSE, "close other", "close all"])
), ["close tab", "close other", "close all"])
},
ondragstart: function(event) { var target = event.target; target.click()
action._drop = function(event, before) { action.insertBefore(target, before) }
@ -576,7 +578,7 @@ Volcanos("onlayout", {help: "页面布局", list: [], _init: function(can, targe
})
Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, target) {
},
focus: function(can, target) {
focus: function(can, target) { if (!target) { return }
target.setSelectionRange(0, -1), target.focus()
},
clear: function(can, target) {
@ -759,6 +761,71 @@ Volcanos("onmotion", {help: "动态特效", list: [], _init: function(can, targe
can.base.isFunc(cb) && cb()
})
},
selectTable: function(event, can, target, cb) {
if (event.ctrlKey) {
function select(order) {
var index = 0; return can.page.Select(can, can._output, html.TR, function(tr) {
if (can.page.ClassList.has(can, tr, html.HIDDEN)) { return }
if (!can.page.ClassList.set(can, tr, html.SELECT, order == index++)) { return tr}
can.base.isFunc(cb) && cb(tr)
can.Status("index", index-1)
return tr
}).length
}
switch (event.key) {
case "n":
var total = select(target._index)
select(target._index = ((target._index)+1) % total)
can.onkeypop.prevent(event)
break
case "p":
var total = select(target._index)
select(target._index = (target._index-1) < 0? total-1: (target._index-1))
can.onkeypop.prevent(event)
break
default: target._index = 0
}
}
},
selectTableInput: function(event, can, target, cb) {
if (event.ctrlKey) {
function select(order) { if (order == 0) { target.value = target._value }
var index = 0; return can.page.Select(can, can._output, html.TR, function(tr) {
if (can.page.ClassList.has(can, tr, html.HIDDEN)) { return }
can.page.ClassList.del(can, tr, html.SELECT); if (order != index++) { return tr }
can.page.ClassList.add(can, tr, html.SELECT), can.page.Select(can, tr, html.TD, function(td, index) {
target._value = target._value||target.value, index == 0 && (target.value = td.innerText)
}); return tr
}).length
}
switch (event.key) {
case "n":
var total = select(target._index)
select(target._index = ((target._index)+1) % total)
break
case "p":
var total = select(target._index)
select(target._index = (target._index-1) < 0? total-1: (target._index-1))
break
default: target._index = 0, target._value = ""
}
return
}
target._index = 0, target._value = ""
can.page.Select(can, can._output, html.TR, function(tr, index) {
var has = false; can.page.Select(can, tr, html.TD, function(td) {
has = has || td.innerText.indexOf(target.value)>-1
}), can.page.ClassList.set(can, tr, html.HIDDEN, !has && index != 0)
})
var total = can.page.Select(can, can._output, html.TR, function(tr) {
if (!can.page.ClassList.has(can, tr, html.HIDDEN)) { return tr}
}).length-1
total == 0 && can.base.isFunc(cb) && cb()
can.Status(kit.Dict(mdb.TOTAL, total, mdb.INDEX, target._index))
},
})
Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: function(can, target) {
document.body.onkeydown = function(event) { var msg = can.request(event)
@ -766,6 +833,7 @@ Volcanos("onkeypop", {help: "键盘交互", list: [], _focus: [], _init: functio
msg.Option("model", event.ctrlKey? "insert_ctrl": "insert")
return
}
if (event.metaKey) { return }
if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }
can.onengine.signal(can, "onkeydown", msg)
if (msg.Option(ice.MSG_HANDLE) == ice.TRUE) { return }

View File

@ -68,7 +68,6 @@ Volcanos("user", {help: "用户操作", agent: {
"list": "查看", "back": "返回", "run": "执行", "done": "完成", "share": "共享",
"edit": "编辑", "save": "保存", "copy": "复制", "show": "显示", "hide": "隐藏",
"project": "项目", "profile": "详情", "actions": "参数",
"find": "查找", "grep": "搜索",
"open": "打开", "close": "关闭",
"start": "启动", "stop": "停止",

View File

@ -18,28 +18,6 @@ Volcanos("onfigure", {help: "控件详情", list: [], key: {
})
},
_select: function(event, can, target) {
function select(order) { if (order == 0) { target.value = target._value }
var index = 0; return can.page.Select(can, can._output, html.TR, function(tr) {
if (can.page.ClassList.has(can, tr, html.HIDDEN)) { return }
can.page.ClassList.del(can, tr, html.SELECT); if (order != index++) { return tr }
can.page.ClassList.add(can, tr, html.SELECT), can.page.Select(can, tr, html.TD, function(td, index) {
target._value = target._value||target.value, index == 0 && (target.value = td.innerText)
}); return tr
}).length
}
switch (event.key) {
case "n":
var total = select(target._index)
select(target._index = ((target._index)+1) % total)
break
case "p":
var total = select(target._index)
select(target._index = (target._index-1) < 0? total-1: (target._index-1))
break
default: target._index = 0, target._value = ""
}
},
onfocus: function(event, can, meta, cb, target) { if (target._figure) { return } target._figure = {}; cb(function(can, cbs) {
target._figure = can.onlayout.figure(event, can, can._target, false, {top: can.page.offsetTop(target)+target.offsetHeight, left: can.page.offsetLeft(target)})
can.onfigure.key._show(can, meta, cbs, target)
@ -51,26 +29,13 @@ Volcanos("onfigure", {help: "控件详情", list: [], key: {
}) },
onkeydown: function(event, can, meta, cb, target, last) {
if (target._figure) { if (!(can = target._can)) { return }
if (event.ctrlKey) { can.onfigure.key._select(event, can, target) } else {
target._index = 0, target._value = ""
switch (event.key) { case lang.ENTER: can.close(); return }
can.page.Select(can, can._output, html.TR, function(tr, index) {
var has = false; can.page.Select(can, tr, html.TD, function(td) {
has = has || td.innerText.indexOf(target.value)>-1
}), can.page.ClassList.set(can, tr, html.HIDDEN, !has && index != 0)
})
}
var total = can.page.Select(can, can._output, html.TR, function(tr) {
if (!can.page.ClassList.has(can, tr, html.HIDDEN)) { return tr}
}).length-1
if (total == 0) {
switch (event.key) { case lang.ENTER: can.close(); return }
can.onmotion.selectTableInput(event, can, target, function() {
can.run(event, [ctx.ACTION, mdb.INPUTS, meta.name, target.value], function(msg) {
can.onfigure.key._init(can, msg, target), can.Status(mdb.TOTAL, msg.Length())
target._msg = msg
})
}
can.Status(kit.Dict(mdb.TOTAL, total, mdb.INDEX, target._index))
})
}
if (event.ctrlKey && ["n", "p"].indexOf(event.key) > -1) {

View File

@ -1,6 +1,6 @@
Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target) {
can.tabview = can.tabview||{}, can.tabview[can.Option(nfs.PATH)+ice.DF+can.Option(nfs.FILE)] = msg
can.history = can.history||[], can.toolkit = {}, can.plugins = {}
can.history = can.history||[], can.toolkit = {}, can.extentions = {}
can.onmotion.clear(can), can.onlayout.profile(can)
can.onimport._project(can, can.ui.project)
@ -48,17 +48,13 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
can.ui.toolkit = can.onappend.field(can, "toolkit", {}, can._output)
},
_session: function(can, msg) { can.onimport.sess(can, "", function() { can.onimport.sess(can, {
tool: can.core.Split(msg.OptionOrSearch("tool")).reverse(),
exts: can.core.Split(msg.OptionOrSearch("exts")).reverse(),
plug: can.core.Split(msg.OptionOrSearch("plug")).reverse(),
tabs: can.core.Split(msg.OptionOrSearch("tabs")),
}) }) },
_keydown: function(can) {
_keydown: function(can) { can.onkeypop._build(can)
can.user.mod.isCmd && can.onengine.listen(can, chat.ONKEYDOWN, function(event) {
var cb = can.onaction[kit.Dict(
"f", "打开", "t", "添加", "e", "扩展", "p", "插件",
"r", "执行", "v", "展示", "s", "保存",
lang.ESCAPE, "清屏",
)[event.key]]; can.base.isFunc(cb) && cb(event, can)
can._key_list = can.onkeypop._parse(event, can, "normal", can._key_list, can.ui.content)
})
},
@ -72,7 +68,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
}, true)
},
tabview: function(can, path, file, line, cb) { var key = path+ice.DF+file
if (can.tabview[key]) {
if (can.tabview[key]) { can.user.mod.isCmd && can.user.title(file)
can._msg && can._msg.Option(nfs.LINE, can.Option(nfs.LINE)), can._msg = can.tabview[key]
can.Option({path: path, file: file, line: line||can._msg.Option(nfs.LINE)||1})
return can._msg.Option(can.Option()), can.onsyntax._init(can, can._msg, cb)
@ -92,7 +88,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
// can.onappend.table(can, msg, null, can.ui.profile_output)
can.onappend.board(can, msg.Result(), can.ui.profile_output)
}
can.page.style(can, can.ui.profile_output, html.WIDTH, (can.Conf(html.WIDTH)-can.ui.project.offsetWidth)/2)
can.page.style(can, can.ui.profile_output, html.WIDTH, (can.ConfWidth()-can.ui.project.offsetWidth)/2)
can.onmotion.hidden(can, can.ui.profile, true), can.onimport.layout(can)
},
display: function(can, msg) {
@ -100,15 +96,16 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
// can.onappend.table(can, msg, null, can.ui.display_output)
can.onappend.board(can, msg.Result(), can.ui.display_output)
}
can.page.style(can, can.ui.display_output, html.HEIGHT, 200)
can.page.style(can, can.ui.display_output, html.HEIGHT, can.ConfHeight()/4)
can.onmotion.hidden(can, can.ui.display, true), can.onimport.layout(can)
},
toolkit: function(can, meta, cb) {
meta.opts = meta.opts||{repos: can.base.trimSuffix(can.base.trimPrefix(can.Option(nfs.PATH), "usr/"), ice.PS) }
can.onimport.plugin(can, meta, can.ui.toolkit.output, function(sub) {
sub.Conf(html.HEIGHT, can.Conf(html.HEIGHT)-4*html.ACTION_HEIGHT, html.WIDTH, can.Conf(html.WIDTH))
sub.page.style(sub, sub._output, html.MAX_HEIGHT, sub.Conf(html.HEIGHT))
sub.page.style(sub, sub._output, html.MAX_WIDTH, sub.Conf(html.WIDTH));
sub.ConfHeight(can.ConfHeight()-4*html.ACTION_HEIGHT), sub.ConfWidth(can.ConfWidth())
sub.page.style(sub, sub._output, html.MAX_HEIGHT, sub.ConfHeight())
sub.page.style(sub, sub._output, html.MAX_WIDTH, sub.ConfWidth())
sub.select = function() { return sub._legend.click(), sub }
var status = can.user.mod.isCmd? can._status: can.ui.toolkit.status
status.appendChild(sub._legend), sub._legend.onclick = function(event) {
@ -119,7 +116,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
}
can.onmotion.select(can, status, html.DIV_LEGEND, event.target)
can.onmotion.select(can, can.ui.toolkit.output, html.FIELDSET, sub._target)
can.page.Select(can, sub._option, html.OPTION_ARGS)[0].focus()
can.onmotion.focus(can, can.page.Select(can, sub._option, html.OPTION_ARGS)[0])
}, can.base.isFunc(cb) && cb(sub)
})
},
@ -130,7 +127,7 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
}, can.base.isFunc(cb) && cb(sub)
}, target)
},
layout: function(can) { var height = can.Conf(html.HEIGHT), width = can.Conf(html.WIDTH)
layout: function(can) { var height = can.ConfHeight(), width = can.ConfWidth()
can.page.style(can, can.ui.content, can.user.mod.isCmd? html.HEIGHT: html.MAX_HEIGHT, height)
if (can.ui.project.style.display != html.NONE) {
can.page.style(can, can.ui.project, html.HEIGHT, can.ui.content.offsetHeight)
@ -141,17 +138,15 @@ Volcanos("onimport", {help: "导入数据", _init: function(can, msg, cb, target
can.page.style(can, can.ui.content, html.WIDTH, width-can.ui.project.offsetWidth-can.ui.profile.offsetWidth-25)
can.page.style(can, can.ui.profile_output, html.HEIGHT, can.ui.content.offsetHeight-html.ACTION_HEIGHT)
},
plug: function(can, url, cb) {
can.require([url], function() {}, function(can, name, sub) { sub._init(can, can.base.ParseURL(sub._path), cb) })
exts: function(can, url, cb) {
can.require([url], function() {}, function(can, name, sub) { sub._init(can, can.base.ParseURL(sub._path), function(sub) {
can.extentions[url.split("?")[0]] = sub, can.base.isFunc(cb) && cb(sub)
}) })
},
sess: function(can, sess, cb) { sess = sess||can.base.Obj(localStorage.getItem("web.code.inner.sess"), {})
can.core.Next(sess.tool, function(item, next) {
can.onimport.toolkit(can, {index: item}, function(sub) { can.toolkit[item] = sub, next() })
}, function() {
can.core.Next(sess.plug, function(item, next) { can.onimport.plug(can, item, next) }, function() {
can.core.Next(sess.tabs, function(item, next) { var ls = item.split(ice.DF)
can.onimport.tabview(can, ls[0], ls[1], ls[2], next)
}, cb)
can.core.Next(sess.exts, function(item, next) { can.onimport.exts(can, item, next) }, function() {
can.core.Next(sess.plug, function(item, next) { can.onimport.toolkit(can, {index: item}, function(sub) { can.toolkit[item] = sub, next() }) }, function() {
can.core.Next(sess.tabs, function(item, next) { var ls = item.split(ice.DF); can.onimport.tabview(can, ls[0], ls[1], ls[2], next) }, cb)
})
})
},
@ -164,7 +159,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
can.parse = can.base.Ext(can.file), can.Status("模式", "normal")
can.onmotion.select(can, can._action, chat.DIV_TABS, msg._tab)
msg.Option(ctx.INDEX) && can.core.Timer(100, function() {
var input = can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]; input && input.focus()
can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0])
})
return can.file
}, can.ui.content, can.ui.profile_output, can.ui.display_output)) {
@ -174,7 +169,7 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
if (msg.Option(ctx.INDEX)) {
can.onimport.plugin(can, {index: msg.Option(ctx.INDEX)}, can.ui.content, function(sub) {
can.core.Timer(100, function() {
var input = can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0]; input && input.focus()
can.onmotion.focus(can, can.page.Select(can, can.ui.content, html.OPTION_ARGS)[0])
}), can.base.isFunc(cb) && cb()
})
return
@ -217,7 +212,36 @@ Volcanos("onsyntax", {help: "语法高亮", list: ["keyword", "prefix", "line"],
return line
},
})
Volcanos("onaction", {help: "控件交互", list: ["打开", "添加", "扩展", "插件", "保存"],
Volcanos("onkeypop", {help: "导入数据", _init: function(can, msg, cb, target) {
},
_mode: {
normal: {
escape: function(event, can, target) { can.onaction["清屏"](event, can) },
g: function(event, can, target) { can.onaction["搜索"](event, can) },
f: function(event, can, target) { can.onaction["打开"](event, can) },
t: function(event, can, target) { can.onaction["添加"](event, can) },
p: function(event, can, target) { can.onaction["插件"](event, can) },
e: function(event, can, target) { can.onaction["扩展"](event, can) },
q: function(event, can, target) { can.onaction["全屏"](event, can) },
r: function(event, can, target) { can.onaction["执行"](event, can) },
v: function(event, can, target) { can.onaction["展示"](event, can) },
s: function(event, can, target) { can.onaction["保存"](event, can) },
j: function(event, can, target) { can.onaction.scrollLine(can, 1) },
k: function(event, can, target) { can.onaction.scrollLine(can, -1) },
J: function(event, can, target) { can.onaction.scrollLine(can, 20) },
K: function(event, can, target) { can.onaction.scrollLine(can, -20) },
},
}, _engine: {},
})
Volcanos("onaction", {help: "控件交互", list: ["搜索", "打开", "添加", "插件", "扩展", "保存"],
"搜索": function(event, can) {
can.user.input(event, can, [[ctx.ACTION, nfs.TAGS, nfs.GREP, cli.MAKE], mdb.NAME], function(event, button, data, list, args) {
can.ui.search.Update({}, [ctx.ACTION, data.action, data.name])
})
},
"打开": function(event, can) {
can.user.input(event, can, [nfs.FILE], function(event, button, data, list, args) {
can.onimport.tabview(can, can.Option(nfs.PATH), data.file)
@ -228,19 +252,16 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "添加", "扩展",
can.onimport.tabview(can, can.Option(nfs.PATH), data.index, ctx.INDEX)
})
},
"扩展": function(event, can) {
"插件": function(event, can) {
can.user.input(event, can, [ctx.INDEX], function(event, button, data, list, args) {
var sub = can.toolkit[data.index]; if (sub) { sub._legend.click(); return }
can.onimport.toolkit(can, data, function(sub) { can.toolkit[data.index] = sub
sub._legend.click(), sub.page.Select(sub, sub._target, html.OPTION_ARGS)[0].focus()
})
var sub = can.toolkit[data.index]; if (sub) { sub.select(); return }
can.onimport.toolkit(can, data, function(sub) { can.toolkit[data.index] = sub.select() })
})
},
"插件": function(event, can) {
"扩展": function(event, can) {
can.user.input(event, can, ["url"], function(event, button, data, list, args) {
can.onimport.plug(can, data.url, function(sub) { can.plugins[data.url] = sub
sub._legend.click(), sub.page.Select(sub, sub._target, html.OPTION_ARGS)[0].focus()
})
var sub = can.extentions[data.url]; if (sub) { sub.select(); return }
can.onimport.exts(can, data.url, function(sub) { can.extentions[data.url] = sub.select() })
})
},
"保存": function(event, can) { can.onexport.sess(can), can.user.toastSuccess(can) },
@ -264,16 +285,46 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "添加", "扩展",
if (can.page.Select(can, can.ui.toolkit.status, "div.select", function(item) {
return item.click(), item
}).length > 0) { return }
if (can.page.Select(can, can.ui.toolkit.output, "fieldset.select", function(item) {
return can.onmotion.hidden(can, item), item
}).length > 0) { return }
can.onmotion.hidden(can, can.ui.profile)
can.onmotion.hidden(can, can.ui.display)
can.onimport.layout(can)
},
"全屏": function(event, can) {
if (can._action.style.display == html.NONE) {
can.onmotion.hidden(can, can._legend, true)
can.onmotion.hidden(can, can._option, true)
can.onmotion.hidden(can, can._action, true)
can.onmotion.hidden(can, can._status, true)
can.onmotion.hidden(can, can.ui.project, true)
can.ConfHeight(window.innerHeight-2*html.ACTION_HEIGHT)
can.onimport.layout(can)
return
}
can.onaction["清屏"](event, can)
can.onaction["清屏"](event, can)
can.onaction["清屏"](event, can)
can.onaction["清屏"](event, can)
can.onmotion.hidden(can, can.ui.project)
can.onmotion.hidden(can, can._status)
can.onmotion.hidden(can, can._action)
can.onmotion.hidden(can, can._option)
can.onmotion.hidden(can, can._legend)
can.ConfHeight(window.innerHeight)
can.onimport.layout(can)
},
back: function(event, can) { can.history.pop(); var last = can.history.pop()
last && can.onimport.tabview(can, last.path, last.file, last.line)
can.Status("跳转数", can.history.length)
},
scrollLine: function(can, count) { var size = 20
can.current.scroll(0, count*size)
},
appendLine: function(can, value) {
var ui = can.page.Append(can, can.ui.content, [{type: html.TR, list: [
{view: ["line unselectable", html.TD, ++can.max], onclick: function(event) {
@ -326,7 +377,7 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "添加", "扩展",
can.current.scroll(0, pos-can.current.window()/2)
}
var push = {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE)}
var push = {path: can.Option(nfs.PATH), file: can.Option(nfs.FILE), line: can.Option(nfs.LINE), text: can.current.text()}
can.base.Eq({path: push.path, file: push.file, line: push.line}, can.history[can.history.length-1]) || can.history.push(push)
can.Status("跳转数", can.history.length)
})
@ -335,7 +386,7 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "添加", "扩展",
// can.onkeymap && can.onkeymap.selectLine(can)
},
searchLine: function(event, can, value) { if (!can.ui.search) { return }
can.ui.search.Update(event, [ctx.ACTION, nfs.FIND, value.trim()])
can.ui.search.Update(event, [ctx.ACTION, nfs.TAGS, value.trim()])
},
favorLine: function(can, value) {
can.user.input(event, can, [{name: "zone", value: "hi"}, {name: "name", value: "hello"}], function(event, button, meta, list) {
@ -349,12 +400,12 @@ Volcanos("onaction", {help: "控件交互", list: ["打开", "添加", "扩展",
Volcanos("onexport", {help: "导出数据", list: ["文件数", "解析器", "文件名", "当前行", "跳转数", "标签数"],
sess: function(can) {
localStorage.setItem("web.code.inner.sess", JSON.stringify({
"tabs": can.onexport.tabs(can), "tool": can.onexport.tool(can), "plug": can.onexport.plug(can),
"tabs": can.onexport.tabs(can), "plug": can.onexport.plug(can), "exts": can.onexport.exts(can),
}))
},
tabs: function(can) { return can.core.Item(can.tabview, function(key, msg) { return key+ice.DF+msg.Option(nfs.LINE) }) },
tool: function(can) { return can.core.Item(can.toolkit) },
plug: function(can) { return can.core.Item(can.plugins) },
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)+"%"
},

View File

@ -1,23 +1,56 @@
Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { var history = []
Volcanos("onimport", {help: "导入数据", _init: function(can, args, cb) { var history = []; const SEARCH = "can.code.inner.search"
function show(msg, word) { if (!msg) { return } history.push(msg); var sub = msg._can; sub.Option("word", word||msg._word)
sub.onmotion.clear(sub), sub.onappend.table(sub, msg, function(value, key, index, line) {
return {text: ["", html.TD], list: [{text: [can.page.replace(can, value, ice.PWD, ""), html.DIV]}], onclick: function(event) {
line.line && can.onimport.tabview(can, can.Option(nfs.PATH), line.file.replace(ice.PWD, ""), parseInt(line.line))
}}
}, sub._output), sub.onappend._status(sub, msg.Option(ice.MSG_STATUS)), can.Status("标签数", msg.Length())
}, sub._output), sub.onappend.board(sub, msg.Result()), sub.onappend._status(sub, msg.Option(ice.MSG_STATUS)), can.Status("标签数", msg.Length())
}
can.onengine.plugin(can, "can.code.inner.search", shy("搜索", {}, [
{type: html.TEXT, name: "word", value: cli.MAIN}, {type: html.BUTTON, name: nfs.FIND}, {type: html.BUTTON, name: "last"},
], function(msg, cmds, cb) { can.misc.runAction(can, msg, cmds, cb, kit.Dict(
nfs.FIND, function(cmds) { msg.Option(kit.Dict(ice.MSG_HANDLE, ice.TRUE, ice.MSG_FIELDS, "file,line,text"))
can.onengine.plugin(can, SEARCH, shy("搜索", {}, [
{type: html.TEXT, name: "word", value: cli.MAIN, onkeydown: function(event, can) {
can.onmotion.selectTable(event, can.sup, event.target, function(tr) {
can.page.Select(can, tr, html.TD, function(td, index) { index == 0 && td.click() })
tr.scrollIntoView(), can._output.scrollTop -= 60
})
if (event.key == lang.ENTER) { can.sup.Update(event, [ctx.ACTION, event.ctrlKey? nfs.GREP: nfs.TAGS, can.sup.Option("word")]) }
if (event.key == lang.ESCAPE) { event.target.blur() }
}},
{type: html.TEXT, name: "filter", value: "", onkeydown: function(event, can) {
can.onmotion.selectTableInput(event, can.sup, event.target)
if (event.key == lang.ENTER) { can.sup.Update(event, [ctx.ACTION, event.ctrlKey? nfs.GREP: nfs.TAGS, can.sup.Option("word")]) }
if (event.key == lang.ESCAPE) { event.target.blur() }
}},
{type: html.BUTTON, name: nfs.TAGS},
{type: html.BUTTON, name: nfs.GREP},
{type: html.BUTTON, name: cli.MAKE},
{type: html.BUTTON, name: "history"},
{type: html.BUTTON, name: "last", _trans: "返回"},
], function(msg, cmds, cb) { if (can.misc.runAction(can, msg, cmds, cb, kit.Dict(
"history", function(cmds) {
can.core.List(can.history, function(item) {
msg.Push(nfs.FILE, item.file)
msg.Push(nfs.LINE, item.line)
msg.Push(mdb.TEXT, item.text)
})
show(msg)
},
nfs.TAGS, function(cmds) { msg.Option(kit.Dict(ice.MSG_HANDLE, ice.TRUE, ice.MSG_FIELDS, "file,line,text"))
can.run(msg._event, [ctx.ACTION, mdb.SEARCH, can.parse, cmds[0], can.Option(nfs.PATH)], function(msg) { var sub = msg._can
can.page.style(can, sub._output, html.MAX_HEIGHT, 200), show(msg, msg._word = cmds[0])
can.page.style(can, sub._output, html.MAX_HEIGHT, can.ConfHeight()/4), show(msg, msg._word = cmds[0])
can.page.ClassList.has(sub, sub._target, html.SELECT) || sub._legend.click()
can.onmotion.focus(can, msg._can._inputs["word"]._target)
}, true)
},
nfs.GREP, function(cmds) { msg.Option(kit.Dict(ice.MSG_HANDLE, ice.TRUE, ice.MSG_FIELDS, "file,line,text", nfs.PATH, can.Option(nfs.PATH)))
can.run(msg._event, [ctx.ACTION, nfs.GREP, cmds[0]], function(msg) { var sub = msg._can
can.page.style(can, sub._output, html.MAX_HEIGHT, can.ConfHeight()/4), show(msg, msg._word = cmds[0])
can.page.ClassList.has(sub, sub._target, html.SELECT) || sub._legend.click()
can.onmotion.focus(can, msg._can._inputs["word"]._target)
}, true)
},
"last", function(cmds) { history.pop(), show(history.pop()) },
)) }))
can.onimport.toolkit(can, {index: "can.code.inner.search"}, function(sub) {
))) { return } can.run(msg._event, cmds, function(msg) { show(msg) }, true) }))
can.onimport.toolkit(can, {index: SEARCH}, function(sub) {
can.ui.search = sub, can.base.isFunc(cb) && cb(sub)
})
}})

View File

@ -64,6 +64,7 @@ var cli = {
EXEC: "exec",
SHOW: "show",
MAIN: "main",
MAKE: "make",
RED: "red", GREEN: "green", BLUE: "blue",
YELLOW: "yellow", CYAN: "cyan", PURPLE: "purple", MAGENTA: "magenta",
@ -104,6 +105,7 @@ var nfs = {
DIR_ROOT: "dir_root",
FIND: "find", GREP: "grep",
SAVE: "save", LOAD: "load",
TAGS: "tags",
}
var tcp = {
HOST: "host", PORT: "port",
@ -333,6 +335,8 @@ var Volcanos = shy("火山架", {iceberg: "/chat/", volcano: "/frame.js", args:
getActionSize: function(cb) { return can.get("Action", "size", cb) },
search: function(event, cmds, cb) { return can.run && can.run(event, ["_search"].concat(cmds), cb, true) },
ConfHeight: function(value) { return can.Conf(html.HEIGHT, value) },
ConfWidth: function(value) { return can.Conf(html.WIDTH, value) },
Conf: function(key, value) { var res = can._conf
for (var i = 0; i < arguments.length; i += 2) {
res = can.core.Value(can._conf, arguments[i], arguments[i+1])